早就聽(tīng)說(shuō)微信支付文檔寫的不是很好,奈何沒(méi)想到簽名這一塊整整折磨了我2天時(shí)間。
網(wǎng)上招了一些資料但不是特別全面,因?yàn)?018年的微信支付跟之前的不太一樣。所以自己慢慢踩坑借鑒,終于做完了兩次簽名的過(guò)程。
其實(shí)很早的時(shí)候,就想寫技術(shù)blog了,之前因?yàn)閼泻筒说脑?,現(xiàn)在希望自己能一步一個(gè)腳印把這件事干好。
話題扯遠(yuǎn)了,我們正式開(kāi)始說(shuō)明一下微信支付的兩次簽名
第一次簽名應(yīng)該是后臺(tái)做的,因?yàn)轫?xiàng)目的實(shí)際情況,要求前端自己進(jìn)行簽名。
因?yàn)橐?qǐng)求統(tǒng)一下單接口才能獲得調(diào)起微信支付功能所需要的prepay_id

而請(qǐng)求這個(gè)接口又需要簽名,我調(diào)試支付時(shí)大多數(shù)時(shí)間都卡在了第一次簽名,因?yàn)槲臋n寫的太簡(jiǎn)單了。

很明顯的是,你首先要把算法寫對(duì)。算法如下:

這里的signParams的字典里放的是加密必須要的字段。注意,這里所需的字段是請(qǐng)求統(tǒng)一下單的接口里面的所有的字段(除開(kāi)要生成的sign),很多人都因?yàn)楸还俜轿臋n誤導(dǎo)了,少了一些字段去生成簽名,然后請(qǐng)求統(tǒng)一下單的接口,會(huì)報(bào)簽名失敗的錯(cuò)誤。

算法是首先字典轉(zhuǎn)成字符串,然后按照首字母順序排序,再加上密鑰的key
然后你會(huì)遇到第二個(gè)坑,這個(gè)密鑰key不是appSecret,而是API密鑰,需要在商戶平臺(tái)設(shè)置
最后再進(jìn)行MD5加密就行了
拿到正確的sign之后,就可以請(qǐng)求接口啦~

請(qǐng)求接口時(shí),需要注意兩點(diǎn):
1、需要對(duì)字典轉(zhuǎn)xml
? ? 轉(zhuǎn)xml有兩種方式,第一種可以自己組裝,第二種可以用XMLDictionary
2、請(qǐng)求的字段必須和簽名的字段一樣(除sign外)
? ? 不一樣鐵定報(bào)簽名失敗的錯(cuò)
我這邊用的是官方方法請(qǐng)求的,注意要使用POST請(qǐng)求,并且加上UTF-8
請(qǐng)求成功后,返回值會(huì)是這樣的:

如果你的result_code為FAIL,請(qǐng)根據(jù)錯(cuò)誤碼來(lái)尋找哪里的問(wèn)題
這樣你就拿到了prepay_id,可以進(jìn)行調(diào)起微信支付的操作了。

首先,接口的返回值格式是xml的,你需要將他轉(zhuǎn)成字典格式。我用的是開(kāi)源庫(kù)XMLDictionary
返回值里有用的幾個(gè)字段分別是:
appid、prepay_id、mch_id、nonce_str
都是跟自己傳的一一對(duì)應(yīng)的
其他要傳的字段
packge必須寫為Sign=WXPay
timeStamp必須是10位的時(shí)間戳
要傳sign不是返回值里的sign,而是第二次簽名需要生成的sign

還是老規(guī)矩,排序然后MD5加密最后加上API商戶密鑰
這樣你就可以成功調(diào)起微信支付啦~
