1. 程式人生 > >關於微信H5公眾號支付我們踩過的坑(get_brand_wcpay_request:fail)(防止更多人踩坑)

關於微信H5公眾號支付我們踩過的坑(get_brand_wcpay_request:fail)(防止更多人踩坑)

最近公司有了一個新的需求,學生在購買課時的時候,需要讓家長或者朋友代付。這樣的話我首先想到的就是微信的H5支付(微信內建瀏覽器呼叫支付模組)。當時想用這個支付的原因因為是前端程式碼十分簡單。。
然而恰恰是因為自己選擇了這個方法,讓自己連續兩天陷入了困境。
下面是正文跟程式碼截圖
首先咱們先來看下H5的支付文件說明
微信官方的H5支付文件
咱們新手或者寫過微信支付的童鞋都不難看懂 其實十分簡單,需要的入參跟說明一目瞭然。但是H5支付的大前提很重要,就是需要使用者的openid,不然你在呼叫微信統一下單的時候(其中交易型別:trade_type = JSAPI)它們會返回你說確實openid這個引數。問題是這個引數我們從哪來呢?
我直接搜一些資料貼給大家;
據我所知目前有兩個方式:
1.微信OAuth網頁授權。服務號(訂閱號不行)可以在公眾號後臺開通微信OAuth網頁授權,使用者在網頁中進行授權操作時你會得到使用者的openid
2.接入伺服器。微信允許接入伺服器進行開發,配置好接入伺服器(參考微信的開發文件)後,使用者發給公眾號的訊息全部會以一個xml表單的形式被轉發到你的伺服器上。
我使用的是第一種方式,其實很簡單,大家可以參考微信的demo

微信H5demo
其中參考example/WxPay.JsApiPay.php裡面的GetOpenid方法。
這樣獲取到openid再去呼叫統一下單介面就沒問題,如果再有其他問題,可以打日誌看微信返回錯誤,一般這個地方的返回錯誤比較明顯,很容易查到原因。最坑也是最淚崩的是以後的錯誤型別。
我們看到我們呼叫統一介面成功之後會返現微信返回的結果裡面有這些東西
統一下單之後我們拿到的東西
從結果裡面我們不難看出呼叫微信支付的demo裡面要的幾個引數我們全部有了,包括sign簽名(這是一個坑)。這樣的話 我們只需要把這些引數返回給客戶端直接組合資料應該就能成功了。
此時我們把資料返回給客戶端 ,客戶端組合資料如下
前端程式碼

我們測試之後發現。微信返回的是支付簽名驗證失敗,一般通用錯誤型別會返回get_brand_wcpay_request:fail。這個時候 我又去看了一下文件,那個時間戳是十位,js這種方法是13位精確到毫秒的,於是我切割字串,獲得十位時間戳,這個時候再去測試仍然跟上次錯誤一樣。於是我慢慢的冷靜下來。開始在網上瘋狂查資料。查詢問題在哪?網上的答案一般是支付授權目錄的問題,其實這個我早就設定好了的。沒有問題的。於是我又一遍的啃起了他的官方文件,結合他們的demo重新理了一遍思路。原來文件裡面幾個引數中只有package這個引數會用統一下單返回的資料,真是中國文化博大精深啊,玩文字遊戲啊。
於是我猜想那麼統一介面返回的sign也不能用樓。難不成所謂的sign是統一下單返回的結果重新用md5去生成麼?
我只能去測試驗證我的結論了。不多說,貼程式碼

這組程式碼是我從統一訂單返回結果之後 按照文件的說明,(大小寫別寫錯),重新生成了sign,然後返回客戶端,包括時間戳也返回。這樣的話再去測試,它不會再報get_brand_wcpay_request:fail。它會給我報了另外一個錯誤,提示我說當前頁面為註冊,同時彈了url出來(這一步,如果童鞋在公眾號設定。微信支付-》支付授權目錄)填寫過的話,應該就沒其他問題了。可以忽略。
基本上H5內建瀏覽器呼叫微信支付模組就是這些東西。主要的坑在於簽名。微信返回的錯誤型別是最坑爹的,全是通用的,根本不能快速定位。
—————-我走過最多的坑位就是微信的套路
ps:如果還有問題的話,可以留言諮詢我。
TIP:大家做支付的時候,不管是微信 還是支付寶 或者其他,有了報錯,大家可以同事在ios跟安卓上面都看看,因為同一個錯誤在不同系統上面呈現的形式不一樣,也許這一個不一樣就會解除你好幾天的疑惑。

如果你覺得對你有用,那就請點個贊,寫個評論吧。