接上一篇,对接微信支付流程比较简单,但是有一些小坑需要注意,所以相比上一篇,这篇才是重点。
一、获取用户的openId:
微信获取用户的openId的文档是这个:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842,最开始我的想法是全部在后端实现,全部直接http请求。后来发现它的第一个地址是一个页面,必须要完整的打开它才行,而它的文档里面也有说:
所以在获取用户openId的时候,不能直接用简单的http请求,需要前端打开对应的页面,才能获取到code,然后才能获取用户的openId。
二、微信内H5调起支付:
微信内H5调起支付的文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6,里面已经有js的示例代码了。一般流程是后端生成需要的数据给前端,前端调用示例代码就能唤起微信支付了,但是因为微信公众号文档里面也有关于支付的,导致很多人以为在调用支付方法之前还要实现config去获取微信配置。其实是不需要的,直接调用支付方法就可以了。
三、签名问题:
这个是最多人吐槽的地方,在使用JSAPI支付的过程中,一共会有两次生成签名的地方:一次是调用统一下单API,需要生成签名;还有一次是微信内H5调起支付时,需要生成签名。这两次生成签名的方式要一致,这个问题在微信的签名校验工具里面是检验不出来的:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1(传说以前在文档中没有提到过,不过现在好了,文档已经明确写到了)。
签名方法如果是直接用微信支付的SDK,还需要注意一点就是,WXconfig对象的构造方法里面没有signType字段,signType是根据正式环境还是沙箱环境去确定的,至今我没搞懂SDK为什么要这样设计。