使用JSSDK实现微信支付

最近开发微信支付功能时,遇到很多坑,很是一番折腾,本文将记录那些踩过的坑和一些心得。

在文章的开头讲解一些在微信公众平台的配置,这是成功实现微信支付的前提。
在微信的支付授权目录页面的提示说只要精确到二级或者三级目录就可以了,但是实际上是不对的。
翻阅支付开发文档时就会发现,支付的授权目录要和调起支付的页面精确匹配,文档和表单提示的差异实在让人困惑,
这一点不得不让人吐槽。而我在实际开发中发现,要同时配置精确支付目录和精确支付目录的上一级目录才能正确的调起支付。

另外一个需要注意的配置项是在实现签名时要传入的参数,包括appidkeymch_id。其中app_id为接受支付的公众号的id,
‘key’为商户平台的key, mch_id为商户平台的id,一个常见的错误是误将app_secret作为key传入。

为了开发的方便,选择已有的轮子weixin_authorizewx_pay,关于这两个gem的使用可以参阅项目文档,比较详细了。

这里主要讲一下可能会踩的坑。
在生成prepay_id的时候,需要传入notify_url,也就是支付成功后的回调地址。notify_url是不能带有参数的,因为微信会
在通知支付结果时将notify_url的传入参数给截掉。比如传入的是a.html?id=3,最后变成了a.html。如果需要传递参数可以在参数
放在out_trade_no中,我在开发的时候将多个不同场景下的支付都交给同一个action处理,支付回调也是。这个时候就需要区分到底是
来自哪一个场景下的支付,解决方案是在out_trade_no中加一个前缀来进行区分。

另外一个不太常见的场景就是多个公众号公用同一个支付号的场景。这个时候就要获取用户在支付号下的open_id,这里可以选择通过网页授权的形式
获取open_id。这里也有一个回调地址,同样的,微信在返回的时候也会截取掉redirect_uri后面的参数,如果你传入多个参数,返回时只剩下一个。
所以如果你在支付的页面需要传递多个参数的话,可以将open_id参数的获取提前到一个不需要传递参数的页面进行。在多公众号公用同一个支付号的场景下,所有的参数如app_idapp_secretmch_idkey都必须是支付号。