RTFM:騰訊微信公衆號H5頁面使用微信支付爬坑記

一. 微信公衆號支付的流程前端

公衆號的頁面會在微信環境下打開,因此默認已經有登陸態。openID、AppID、AppSecret 都能拿到,申請開通商家支付以後會有 PayKey 和 mch_id (商家賬號,相似 101000000 之類的數字)。golang

商家要完成一次支付須要首先完成下列步驟:web

  1. PrePay 接口。服務器

    獲取 prepay_id (服務器端)。請求微信的統一下單接口(咱們叫他 PrePay接口),生成 prepay_id。微信

  2. Wx.config 接口。app

    根據 jssdk 的文檔生成 wx.config 參數並注入到前端 js 中,請求 chooseWXPay 的權限。異步

  3. Pay.config 接口工具

    生成 pay.config 注入到前端頁面的 js 中,而後調用 jssdk 中的 chooseWXPay 來喚起微信支付。微信支付

  4. 回調接口spa

    獲取微信支付的回調(異步的),確認支付結果。

其中步驟 一、 二、 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

相關文章
相關標籤/搜索