曾经有一项需求,是从移动端的H5页面请求微信支付功能。微信的文档写地较为混乱,在这里写个防坑指南。
支付的坑
1.微信支付的文档不止一个。
在官方的文档里,有一段简单的关于微信支付的说明。调用
wx.chooseWXPay
方法启用。但是在这个文档之下,有另一个开发文档微信支付开发文档这个文档里也有一个支付调用的方法
weixinJSBridge
,但是只能在微信浏览器里使用,非常不方便。本人测试从未成功过,所以建议放弃。
2.wx.chooseWXPay
方法的传入参数和签名
该方法发起请求时是没有
appId
参数的,但是在生成paySign
签名的时候,需要有appId
和它的值。这里的I是大写的i。生成
paySign
的时候的timeStamp
是大写的,和传入的参数不一样,传入的是小写。
3.服务端的工作?!
由于微信文档里没有说明哪些是前端工作哪些是后端,所以在一开始开发时我做了很多服务端做的事。比如生成
signature
,paySign
.两者不一样。生成签名的工作前端也是可以做的,但是要发起很多异步请求,处理非常多的回调,简直是回调地狱,而且不安全。最后服务端的伙伴处理了第一个签名。
注意两个
access_token
的不同。
微信公众号的准备工作
1.微信公众号开通微信支付功能。
微信公众平台 微信支付-开发配置里配置支付授权目录。
- 正式授权目录可以添加多个,测试时只能添加一个。
- 不允许添加端口。只支持默认80端口。
- 目录即为调用微信支付空间的页面所在的目录。
- 将个人的微信号加到支付的白名单里,只有白名单里的用户才可以支付,但没想到付的是真钱。
同一个页面里,选择开发者配置,找到接口权限表。
- 网页授权用户基本信息。
- 这个
url
是用户回调的url
,即开启微信支付控件页面的url
,这个值即是redirect_url
的值。 - 要记得
encodeUrl
转码。
进入公众号设置,功能设置
- 对
js
安全域名做设置。 - 这个值只能设置一个且似乎改动次数有限制。所以要小心改动。
- 上线前记得切换。
- 对
开发者中心里的配置项。
- 获取
appId
,secret
等相关信息。 - 还有
mch_id
和key
。 - 这些数据都不推荐写在前端页面里。
- 获取
使用步骤
打开微信页面,从服务端的回调
url
里获取access_token
,openId
. 须服务端通过code
验证等,然后返回。获取
wx.config
配置需要的signature
, 传递随机数nonceStr
,时间戳timestamp
等参数给服务端生成签名。wx.config
接口注入权限验证配置——通过signature
等验证后。通过
openId
获取prepay_id
。前端生成另一个签名
paySign
, 然后调用wx.ready
里wx.chooseWXPay
的方法调起支付。
Show Your the Code
1 | // ES6、jquery结合的写法. |
- 虽然这里有很多回调,代码也略凌乱,但它work了!
- 当然有更好的方案,但紧急需求要求下这是较快的实现方式了。再次对接可让生成签名的工作移交服务端!
- PS:经过这次对接微信支付文档后,对微信的开发失去了信心。然后对微信推出的小程序也坚持保守态度。
参考: * [接入微信支付流程清晰版](http://www.cnblogs.com/sunshq/p/5035163.html)
评论