一. 微信公众号支付的流程前端
公众号的页面会在微信环境下打开,因此默认已经有登陆态。openID、AppID、AppSecret 都能拿到,申请开通商家支付以后会有 PayKey 和 mch_id (商家账号,相似 101000000 之类的数字)。golang
商家要完成一次支付须要首先完成下列步骤:web
PrePay 接口。服务器
获取 prepay_id (服务器端)。请求微信的统一下单接口(咱们叫他 PrePay接口),生成 prepay_id。微信
Wx.config 接口。app
根据 jssdk 的文档生成 wx.config 参数并注入到前端 js 中,请求 chooseWXPay 的权限。异步
Pay.config 接口工具
生成 pay.config 注入到前端页面的 js 中,而后调用 jssdk 中的 chooseWXPay 来唤起微信支付。微信支付
回调接口spa
获取微信支付的回调(异步的),确认支付结果。
其中步骤 一、 二、 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