2015-05-12 17:02:33 xb12369 阅读数 12042
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8027 人正在学习 去看看 秦子恒

第一步:填写服务器配置

兵车未动,粮草先行,首先你得有台服务器,80端口未被占用~

想必这里的api大家都看过的


说明:URL填写你服务器80端口的URL,比如楼主的是(http://******/weixinTest.jspx),这里还需要与微信握手,以确保次连接有效;

            Token数字和英文组成的字符串,最大长度为32字符,比如楼主的是xb12369;

            EncodingAESKey直接用后面的随机生成,到目前为止还没用用到这个;


第二步:验证服务器地址的有效性


刚才也说过,微信会校验你的URL是否有效,那么接下来开始正式握手!!!



说明:1,字典排序

ArrayList list = new ArrayList();
				list.add(token);
				list.add(timestamp);
				list.add(nonce);

				Collections.sort(list, new SpellComparator());


/**
	 * 汉字拼音排序比较器
	 */
	static class SpellComparator implements Comparator{
		public int compare(Object o1, Object o2) {
			try {
				// 取得比较对象的汉字编码,并将其转换成字符串
				String s1 = new String(o1.toString().getBytes("GB2312"), "ISO-8859-1");
				String s2 = new String(o2.toString().getBytes("GB2312"), "ISO-8859-1");
				// 运用String类的 compareTo()方法对两对象进行比较
				return s1.compareTo(s2);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return 0;
		}
	}


2,sha1加密,关于这种加密,百度一下到处都是

//将三个参数字符串拼接成一个字符串进行sha1加密
				String digest = new SHA1Utils().getDigestOfString(temp.getBytes());


3,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

之前就一直卡在这里,没有搞清楚啥叫原样返回,后面终于弄明白了,然来是要printwriter到微信

if(digest.equalsIgnoreCase(signature)){
					try{
						System.out.println("我成功了~~~~");
						//开发者通过检验signature对请求进行校验(下面有校验方式)。
						//若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

						PrintWriter out = response.getWriter();
						out.print(echostr);
						out.flush();
						out.close();

						System.out.println("这次你再改成功改了吧~~~");
					}catch (Exception e) {
						e.printStackTrace();
					}
				}else{
					System.out.println("sha1加密后:" +digest+ "微信返回的是:"+signature);
				}

部分代码如下,仅供参考:



认证通过后,微信公共平台将会得到一个AppID,AppSecret,有了这两个你就可以往下高更深入的东西了!!!

2018-10-04 03:50:46 Stone_0811 阅读数 124
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8027 人正在学习 去看看 秦子恒

.net mvc 局部视图的一些tips

一般来说写jssdk的wx.config这段js的时候 要每个页面都要引入js文件来设置调用jssdk接口,html里要引入一下js,Controller层需要用微信接口的地方也要调用jssdk的service,同时要传一个action的url进去进行sha1加密什么的,觉得重复代码太多了,突然想起还有个局部视图的东西,可以一个Controller一个局部页来进行代码复用。

这里简单写了个demo
视图页和局部页的action

public class JsSdkController : Controller
{
    
    public ActionResult Index()
    {
        return View();
    }


    public ActionResult JsSdkPartial()
    {

        string x = Request.Url.ToString();

        return View();
    }
}

视图页的html

@{
    Layout = null;
}

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        aaaaaaaaaaaaaaaaaaaaa
    </div>
    @Html.Action("jssdkpartial","jssdk")
    <div>
        bbbbbbbbbbbbbbbbbbbbbbbbbbb
    </div>
</body>
</html>

局部页的html

<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js" type="text/javascript"></script>}
hello world

局部页写jssdk相关的js代码 需要用到jssdk的视图页则用@Html.Action(actionName,ControllerName,new {args})来引入局部页,达成html和Controller以及js的复用。

重点来了,jssdk需要当前调用接口的页面的url来进行sha1加密验证,那么局部页本身也是有action和url的 直接访问局部页也是没有问题的,那么当前页面调用了局部页,局部页的request.url的结果是局部页还是布局页的url呢? 我这里做了一个测试,结论:直接访问局部页的话,url就是当前url,但是如果访问视图页,也就是调用局部页的页面,那么局部页的action的request.url的值是当前页面的url,而不是局部页的url,这样的话需要用jssdk的页面只需要写一句html.action来引入局部页就ok了,不需要在视图页的action里增加任何代码。

SHA1加密

private static string Sha1(string orgStr)
        {
            SHA1 sha1 = SHA1.Create();
            byte[] bytes = sha1.ComputeHash(System.Text.Encoding.Default.GetBytes(orgStr));
            return BitConverter.ToString(bytes).Replace("-", "").ToLower();
        }

生成Unix时间戳

private string CreateTimeStamp()
        {
            DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, 0);
            long totalSeconds = Convert.ToInt64((DateTime.Now - dt).TotalSeconds);

            return totalSeconds.ToString();
        }

从文件中读取json

public static JObject ReadJsonByFile(string filePath)
        {
            StreamReader file = File.OpenText(filePath);
            JsonTextReader jsonTextReader = new JsonTextReader(file);
            JObject jObject = (JObject)JToken.ReadFrom(jsonTextReader);
            return jObject;
        }
2014-08-01 22:51:00 weixin_30855099 阅读数 9
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8027 人正在学习 去看看 秦子恒

不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼。于是今天兴致来潮,想做一个试试。

首先找到了开发者文档,看了看,蛮简单的。(公众号早已申请,有兴趣可以关注看看:zyjsoft)

第一步(提供接口,供微信调用,由于是HTTP请求,于是我用MVC模式做了一个简单的接口):

 //认证接口
        public ActionResult WeiXin(string signature, string timestamp, string nonce, string echostr)
        {
            //暂不验证
            return Content(echostr);
        }

        //接收/回复 消息接口
        [HttpPost]
        public ActionResult WeiXin()
        {
         //xxxx
      }

从文档中看出,认证时使用GET方式请求接口地址,发送消息时使用POST方式请求接口地址,因此写了以上两个Action来处理

接口地址为:http://182.92.104.112/wx/open/weixin

暂时未认证,大家可以试着玩玩~~~

第二步 接收和响应消息 

接下来看怎么接收和响应数据:

从官方文档抄来:

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。各消息类型的推送XML数据包结构如下
===文本消息(接收)
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应
===文本消息(响应)
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

 

看上去也是蛮简单的,就是按照指定XML格式解析、构成就OK了。

代码很快就写完了(具体实现代码就不贴上来了,主要就是实现POST的那个Action,也比较简单),开始测试:

Test-1:失败(响应空字符串,原因:未取到参数,因为取Xml的数据包是通过Request.InputStream来取的,而并非Forms)…… 改……

Test-2:失败(响应正确,微信客户端可无法接收到消息。原因:可能字段顺序与官方不相同)……改……

Test-3:失败(响应正确,微信客户端仍无法接收到消息。原因:可能是返回MIME类型需要text/xml和Encoding需要UTF8)……改……

Test-4:失败(响应正确、顺序正确、Encoding正确、MIDE类型正确,可就是收不到消息)……没改的了,能改的都改了,就是不出来

表示测试一次非常麻烦啊:编译=>发布=>再测试

以下是官方在线测试工具响应结果:

每个字符都对了,跟官方例子完全一致,就是不知道哪里出问题了,网上的资料都是说要么少几个字符、要么格式不对什么的。

最后找了很久……了很久……很久……久…… 仔细叮着那几句简单的代码看,最后终于在代码中找到了个巨坑:

发现这个巨坑后我怀疑跟什么字段顺序、IMIE类型没有丝毫关系,之前改的都是做无用功罢了

为了让大家能搜索到这个问题,将这个巨坑放在下一篇文章讲解……

 

转载于:https://www.cnblogs.com/yzeng/p/3885937.html

2017-03-23 14:42:30 chengmin1989 阅读数 1527
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8027 人正在学习 去看看 秦子恒

微信的开发文档没有服务器端的demo,然后我就找了一些资料做了一下,没想到一次就成功了,记录一下。

第一步获取prepay_id

UnifiedOrder uo = new UnifiedOrder();
uo.appid = appid;
uo.mch_id = mch_id;
uo.nonce_str = tenpay.getNoncestr();
uo.body = "我是微信支付";
uo.out_trade_no = orders.OrderId.ToString();
uo.total_fee = Convert.ToInt32(Consume*100);
uo.spbill_create_ip = System.Web.HttpContext.Current.Request.UserHostAddress;
uo.notify_url = notify_url;
uo.trade_type = "APP";

string prepayid = tenpay.getPrepay_id(uo, key);
getPrepay_id方法

public string getPrepay_id(Com.TenPay.UnifiedOrder order, string key)
        {
            string prepay_id = "";
            string post_data = getUnifiedOrderXml(order, key);
            string request_data = PostXmlToUrl(UnifiedPayUrl, post_data);
            SortedDictionary<string, string> requestXML = GetInfoFromXml(request_data);
            foreach (KeyValuePair<string, string> k in requestXML)
            {
                if (k.Key == "prepay_id")
                {
                    prepay_id = k.Value;
                    break;
                }
            }
            return prepay_id;
        }

第二步:获取签名

                        SortedDictionary<string, string> sParams = new SortedDictionary<string, string>();
                        string noncestr = tenpay.getNoncestr();
                        string currenttime = tenpay.getTimestamp();

                        sParams.Add("appid", appid);
                        sParams.Add("partnerid", mch_id);
                        sParams.Add("prepayid", prepayid);

                        sParams.Add("noncestr", noncestr);
                        sParams.Add("timestamp", currenttime);
                        sParams.Add("package", "Sign=WXPay");

                        string sign = tenpay.getsign(sParams, key);

这个基本上完成了,然后把这些参数传给客户端,客户端负责调起支付


2017-07-23 19:23:42 Weigoliath 阅读数 2805
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8027 人正在学习 去看看 秦子恒

上一篇写了在公众号微信支付的,现在接着写退款的,退款的话其实根据官方提供的Demo可以很好理解他的整个过程,就是一个调用微信申请退款接口的过程。
请求参数如下:
这里写图片描述
appid是你的公众账号ID;mch_id是你的商户号;nonce_str是一个随机生成的字符串;out_trade_no是商户订单号;transaction_id是微信订单号;out_refund_no是随机生成的商户退款单号; refund_fee是要申请退款的金额,微信支持一个订单可以多次退款;total_fee是这个订单的金额;sign是签名。
在cshtml页面中通过用户输入获取transaction_id、out_trade_no、total_fee、refund_fee这几个参数,并把这几个参数传到控制器。
在控制器中的代码如下:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
假如退款成功微信会返回如下结果:
这里写图片描述
以下字段在return_code为SUCCESS的时候有返回如下XML数据:
这里写图片描述

所以大概流程是这样。下面说一下有几点很容易错的地方需要注意:
第一点:
需要去自己的微信商户平台中的api安全栏下载证书,这个证书是自己的独一无二的,
1、要把这个证书放入代码中,在post传输的时候要用。
2、把这个整数导入操作系统中。假如你是用自己的电脑搭建的IIS上挂网站,就把证书导入自己的计算机,假如在云服务器里面挂网站,就是把证书导入你的云服务器的操作系统里面。
第二点
将自己的写好的站点挂到IIS里面时,要改其对应站点程序池的高级设置,允许其加载用户配置文件。
这里写图片描述

至此微信退款也完成了。

没有更多推荐了,返回首页