6

一. 微信公众号支付的流程

公众号的页面会在微信环境下打开,所以默认已经有登录态。openID、AppID、AppSecret 都能拿到,申请开通商家支付之后会有 PayKey 和 mch_id (商家帐号,类似 101000000 之类的数字)。

商家要完成一次支付需要首先完成下列步骤:

  1. PrePay 接口。

    获取 prepay_id (服务器端)。请求微信的统一下单接口(我们叫他 PrePay接口),生成 prepay_id。

  2. Wx.config 接口。

    根据 jssdk 的文档生成 wx.config 参数并注入到前端 js 中,请求 chooseWXPay 的权限。

  3. Pay.config 接口

    生成 pay.config 注入到前端页面的 js 中,然后调用 jssdk 中的 chooseWXPay 来唤起微信支付。

  4. 回调接口

    获取微信支付的回调(异步的),确认支付结果。

其中步骤 1、 2、 3 是最坑的。

二. 接口之间的关系

要唤起支付必须同时满足三个条件:

  1. 从接口 a 取到 prepay_id

  2. 发起支付的前端页面同时配置好正确的 wx.config 和 chooseWXPay

  3. 发起支付的前端页面配置过支付域名和目录信任

三. 为什么说官网文档是苟曰的

  1. PrePay 接口的 sign Hash 方法必须跟 pay.config 的 sign Hash 方法保持一致。推荐 MD5。

  2. PayConfig 的 sign 计算的时候要带上支付 Key ,就是商家支付后台设置的 pay key。

  3. Wx.config 中的 timestamp、noneStr 必须跟 PayConfig 中的 timestamp、noneStr 一致。

换句话说:

要用 chooseWXPay 唤起支付,必须保证 sign 的 Hash 方法同 PrePay 接口的 Hash 方法一致,同时
timestamp、noneStr 参数同 WXconfig 接口保持一致。

四. 官方文档中的坑:

  1. 参数遗漏

图片描述

遗漏了一个 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)
  1. 前后矛盾。

    支付文档中写到唤起的方式是: WeixinJSBridge.invoke ,但是 jssdk 中却是 chooseWXPay。

  2. 提示信息坑爹。

    choosewxpay fail 没有任何有价值的信息,同时微信web开发者工具无法唤起模拟唤起。

五. 教训和总结

  1. 微信前端的小明同学都说这个很坑。我打热线电话打不进去,找不到开发接口人,发邮件没人回复;

  2. 这种完全依赖第三方的功能,如果文档无法提供完整的信息,开发者很头大。

  3. 大公司内部的文档没有统一标准,jssdk 和微信支付属于不同的部门,互相之间权责不清。

以上证明: RTFM 名符其实。这篇文章背后消耗了很多的咖啡和香烟,各位如果觉得有帮助请打裳几毛。

EOF


Airy
2.4k 声望69 粉丝

github.com/airylinus


引用和评论

0 条评论