早就聽說微信支付文檔寫的不是很好沿后,奈何沒想到簽名這一塊整整折磨了我2天時間闷游。
網(wǎng)上招了一些資料但不是特別全面惊奇,因為2018年的微信支付跟之前的不太一樣殉了。所以自己慢慢踩坑借鑒开仰,終于做完了兩次簽名的過程。
其實很早的時候,就想寫技術(shù)blog了众弓,之前因為懶和菜的原因恩溅,現(xiàn)在希望自己能一步一個腳印把這件事干好。
話題扯遠(yuǎn)了谓娃,我們正式開始說明一下微信支付的兩次簽名
第一次簽名應(yīng)該是后臺做的脚乡,因為項目的實際情況,要求前端自己進(jìn)行簽名滨达。
因為要請求統(tǒng)一下單接口才能獲得調(diào)起微信支付功能所需要的prepay_id
而請求這個接口又需要簽名奶稠,我調(diào)試支付時大多數(shù)時間都卡在了第一次簽名,因為文檔寫的太簡單了捡遍。
很明顯的是锌订,你首先要把算法寫對。算法如下:
這里的signParams的字典里放的是加密必須要的字段画株。注意辆飘,這里所需的字段是請求統(tǒng)一下單的接口里面的所有的字段(除開要生成的sign),很多人都因為被官方文檔誤導(dǎo)了谓传,少了一些字段去生成簽名蜈项,然后請求統(tǒng)一下單的接口爷辱,會報簽名失敗的錯誤锋谐。
算法是首先字典轉(zhuǎn)成字符串,然后按照首字母順序排序悍募,再加上密鑰的key
然后你會遇到第二個坑庸推,這個密鑰key不是appSecret常侦,而是API密鑰,需要在商戶平臺設(shè)置
最后再進(jìn)行MD5加密就行了
拿到正確的sign之后贬媒,就可以請求接口啦~
請求接口時聋亡,需要注意兩點:
1、需要對字典轉(zhuǎn)xml
? ? 轉(zhuǎn)xml有兩種方式际乘,第一種可以自己組裝坡倔,第二種可以用XMLDictionary
2、請求的字段必須和簽名的字段一樣(除sign外)
? ? 不一樣鐵定報簽名失敗的錯
我這邊用的是官方方法請求的脖含,注意要使用POST請求罪塔,并且加上UTF-8
請求成功后,返回值會是這樣的:
如果你的result_code為FAIL养葵,請根據(jù)錯誤碼來尋找哪里的問題
這樣你就拿到了prepay_id征堪,可以進(jìn)行調(diào)起微信支付的操作了。
首先关拒,接口的返回值格式是xml的佃蚜,你需要將他轉(zhuǎn)成字典格式庸娱。我用的是開源庫XMLDictionary
返回值里有用的幾個字段分別是:
appid、prepay_id谐算、mch_id熟尉、nonce_str
都是跟自己傳的一一對應(yīng)的
其他要傳的字段
packge必須寫為Sign=WXPay
timeStamp必須是10位的時間戳
要傳sign不是返回值里的sign,而是第二次簽名需要生成的sign
還是老規(guī)矩洲脂,排序然后MD5加密最后加上API商戶密鑰
這樣你就可以成功調(diào)起微信支付啦~