公司的一個老項目需要接入微信支付,在接入的過程中,我通過了微信支付所要求的所有的驗收用例(首次接入是可以關注公衆號“微信支付商戶接入驗收助手”來查看驗收結果),但還是碰到了下面這個噁心的問題。
一、一個訂單要進行兩次簽名,一次是在調用統一創建訂單這個接口的時候進行如下簽名
待簽名的字符sb=appid=wx282be1b55c24ffc9&mch_id=1397448502&nonce_str=OkWAlNcf3rg4vXmS&prepay_id=wx24101539080287557f3439e31253661600&result_code=SUCCESS&return_code=SUCCESS&return_msg=OK&trade_type=JSAPI&key=a8dke2de0ak92ldqefyns23i7nxvde2d
使用的加密方式: MD5str=60226D8167A6F1140438BCC4BCB0B6BC。
二、訂單創建成功後要返回支付簽名這幾個參數給前端的getBrandWCPayRequest函數,以便做發起確認支付的操作,其中需要進行第二次簽名
待簽名的字符sb=appId=wx282be1b55c24ffc9&nonceStr=4f76f95244ca433883042764db61488a&package=prepay_id=wx24101539080287557f3439e31253661600&signType=MD5&timeStamp=1569291339&key=a8dke2de0ak92ldqefyns23i7nxvde2d
使用的加密方式: MD5str=E238F09BFCC834EDAC9A53EC1AE02F9D
WxPayVo = {"appId":"wx282be1b55c24ffc9","nonceStr":"OkWAlNcf3rg4vXmS","packages":"prepay_id=wx24101539080287557f3439e31253661600","paySign":"E238F09BFCC834EDAC9A53EC1AE02F9D","signType":"MD5","timeStamp":"1569291339"}
出現了一個巨大的坑,因爲這裏的參數我都是存在map裏面的,而微信這個傻逼在第一簽名的時候使用了nonce_str(仔細看第一次簽名的sb=...),在第二次簽名的時候卻使用了nonceStr(仔細看第二次簽名的sb=...),導致我的map裏面既有nonce_str 又有nonceStr,我在返回的時候,使用了nonce_str,導致我的簽名一直提示失敗,找了好久,才知道是這個問題。
所以你在出現這個問題的時候,是否是返回了第一個nonce_str而不是第二個nonceStr。
三、關於簽名的方式,有人說(https://blog.csdn.net/qq_35641337/article/details/79029664)微信不支持HMACSHA256簽名。因爲我在測試MD5簽名通過後,換成HMACSHA256簽名依然有用。