一. 微信公衆號支付的流程前端
公衆號的頁面會在微信環境下打開,因此默認已經有登陸態。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