本文写于 2018-03-28
1. 参考微信官方流程
参考:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
2. 准备资源
- 注册申请(略)成功后可以拿到和设置的信息。
你需要准备的东西:(4样!)
公众账号ID (Appid)
公众号商户号 (mch_id)
-
apisign key API密钥 (签名时要用!)
设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置。
我用md5命令生成:
echo -n "mySignKey" | md5
-
H5 支付域名(只需要配置顶级域名)
产品中心->我的产品->H5支付->开发配置->支付配置->H5支付域名
3. 开发流程
流程有点多。其实总结起来就是一句话。用户点击你提供的链接,把钱给微信,微信异步通知公众号(你),公众号(你)接到通知处理后给用户反馈。
注意,这里涉及三个角色。
- 用户
- 微信支付平台
- 公众号开发人员(你!)
你的开发任务就在于这样一个场景:
用户已经在微信旁边等你的页面了,微信也等着你发下单请求。
你(公众号)的开发细节总览:
提供页面给用户点击支付。
地址如下: http://pay.yourdomain.com/order/pay?userId=9527用户点击之后,你的后台要生成一个预支付的的订单,发给微信统一下单API。
参考统一下单:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1
预支付订单格式如下:
<xml>
<appid>wx2421b1c4370ec43b</appid>
<attach>附加数据</attach>
<body>H5支付测试</body>
<mch_id>10000100</mch_id>
<nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
<notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
<openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
<spbill_create_ip>14.23.150.211</spbill_create_ip>
<total_fee>1</total_fee>
<trade_type>MWEB</trade_type>
<scene_info>{"h5_info": {"type":"IOS","app_name": "王者荣耀","package_name": "com.tencent.tmgp.sgame"}}</scene_info>
<sign>0CB01533B8C1EF103065174F50BCA001</sign>
</xml>
这里需要注意的是:
2.1 scene_info 中的wap_url 域名必须和上文中准备的H5支付域名匹配。(否则报错: 商家存在未配置的参数,请联系商家解决)
2.2 sgin 签名是计算出来的。用的是上文准备好的API密钥。计算错误是无法下单成功的。(参考这里https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=4_3 )
2.3 spbill_create_ip的ip要正确的获取。(否则报错:网络环境未能通过安全验证,请稍后再试)
2.4 通知地址要设置一个能访问且能处理的地址,用来处理微信回调。(要不然你怎么知道充值成功了呢!)
- 微信通过验证后会给你一个包含支付地址信息给你
支付地址格式如下:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
<sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
<trade_type><![CDATA[MWEB]]></trade_type>
<mweb_url><![CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2016121516420242444321ca0631331346&package=1405458241]]></mweb_url>
</xml>
你的后台会接收支付信息,把"mweb_url"对应的地址发给用户,用户点击之后直接跳转到微信。
用户点击 mweb_url 对应的地址,就能跳转微信。用户进入微信,输入支付密码。支付成功。微信会通知公众号(你)。
也就是步骤2中你配置的notify_url。接收到的是一个XML。你拿到通知。最好应该再去微信查询这个订单。验证订单的真伪。
参考查询订单:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_2&index=2
也是要用API秘钥签名的。基本没啥难度了。如果订单是真的,表示钱到账了,准备发货给用户吧。
9.流程结束。
PS:
1.隐去很多小细节。坑算是比较少的,跟着错误提示来调试即可。
2.只是记录。写的不完整。
代码参考:
GitHub: (后面再补!)