一. 微信公众号支付的流程
公众号的页面会在微信环境下打开,所以默认已经有登录态。openID、AppID、AppSecret 都能拿到,申请开通商家支付之后会有 PayKey 和 mch_id (商家帐号,类似 101000000 之类的数字)。
商家要完成一次支付需要首先完成下列步骤:
-
PrePay 接口。
获取 prepay_id (服务器端)。请求微信的统一下单接口(我们叫他 PrePay接口),生成 prepay_id。
-
Wx.config 接口。
根据 jssdk 的文档生成 wx.config 参数并注入到前端 js 中,请求 chooseWXPay 的权限。
-
Pay.config 接口
生成 pay.config 注入到前端页面的 js 中,然后调用 jssdk 中的 chooseWXPay 来唤起微信支付。
-
回调接口
获取微信支付的回调(异步的),确认支付结果。
其中步骤 1、 2、 3 是最坑的。
二. 接口之间的关系
要唤起支付必须同时满足三个条件:
从接口 a 取到 prepay_id
发起支付的前端页面同时配置好正确的 wx.config 和 chooseWXPay
发起支付的前端页面配置过支付域名和目录信任
三. 为什么说官网文档是苟曰的
PrePay 接口的 sign Hash 方法必须跟 pay.config 的 sign Hash 方法保持一致。推荐 MD5。
PayConfig 的 sign 计算的时候要带上支付 Key ,就是商家支付后台设置的 pay key。
Wx.config 中的 timestamp、noneStr 必须跟 PayConfig 中的 timestamp、noneStr 一致。
换句话说:
要用 chooseWXPay 唤起支付,必须保证 sign 的 Hash 方法同 PrePay 接口的 Hash 方法一致,同时
timestamp、noneStr 参数同 WXconfig 接口保持一致。
四. 官方文档中的坑:
参数遗漏
遗漏了一个 key (商家支付后台设置的支付 key)
正确的参数模板:
signTemp := "appId=%s&nonceStr=%s&package=%s&signType=%s&timeStamp=%d&key=%s"
signString := fmt.Sprintf(signTemp, payObj.AppID, noneStr, "prepay_id=" + prePayID, signType, ts, payObj.PayKey)
logs.GetLogger().Println(signString)
paySign := util.MD5Sum(signString)
-
前后矛盾。
支付文档中写到唤起的方式是: WeixinJSBridge.invoke ,但是 jssdk 中却是 chooseWXPay。
-
提示信息坑爹。
choosewxpay fail 没有任何有价值的信息,同时微信web开发者工具无法唤起模拟唤起。
五. 教训和总结
微信前端的小明同学都说这个很坑。我打热线电话打不进去,找不到开发接口人,发邮件没人回复;
这种完全依赖第三方的功能,如果文档无法提供完整的信息,开发者很头大。
大公司内部的文档没有统一标准,jssdk 和微信支付属于不同的部门,互相之间权责不清。
以上证明: RTFM 名符其实。这篇文章背后消耗了很多的咖啡和香烟,各位如果觉得有帮助请打裳几毛。
EOF
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。