# 概述
在微信支付APIV3的所有接口交互中,都需要對【接口請求】或【回調(diào)通知】進行SHA256 with RSA算法簽名計算,保證支付安全;并且也強烈建議對【響應】和【回調(diào)】進行驗簽(部分接口不需要響應驗簽),保證響應數(shù)據(jù)來自微信支付且未經(jīng)第三方篡改。對于常見的APIv3接口簽名錯誤的問題,提供【簽名驗簽工具】,模擬微信支付進行簽名驗簽。
提示
- 本工具無法識別并提示錯誤參數(shù),計算結(jié)果需自行核對,不會主動糾正,可能產(chǎn)生無效的請求簽名。
- 若相應的必填參數(shù)未填寫時,本工具不會進行提醒。
- 該工具目前只支持Windows操作系統(tǒng),其他類型的操作系統(tǒng)暫不支持。
下面介紹工具詳細操作指引,協(xié)助你進行簽名計算和簽名驗證。
# 1. 如何下載簽名驗簽工具
下載地址:下載簽名驗簽工具 (opens new window)
1.1 打開時個別用戶可能會提示:找不到MSVCR120.dll文件,需要額外下載一下該文件,放置安裝目錄即可。
1.2 功能界面
# 2. 如何使用簽名驗簽工具
微信支付在簽名計算和簽名驗證中使用基于非對稱密鑰的SHA256-RSA的數(shù)字簽名算法,利用公鑰和私鑰的配對關(guān)系實現(xiàn)加密和解密。私鑰用于加密數(shù)據(jù),公鑰用于解密數(shù)據(jù)。由于私鑰的私密性,只有私鑰的擁有者才能生成有效的簽名,確保了信息的完整性和來源的可靠性。
下面列舉了微信支付常見場景的簽名/驗簽參數(shù)以及使用的證書:
簽名場景 | 微信支付APIv3接口 | 調(diào)起收銀臺 | 微信支付應答/回調(diào) |
---|---|---|---|
計算簽名證書 | 商戶API證書私鑰(商戶API證書獲取方法及功能介紹 (opens new window)) apiclient_key.pem | 商戶API證書私鑰(商戶API證書獲取方法及功能介紹 (opens new window)) apiclient_key.pem | 微信支付平臺證書私鑰(商戶無法持有/感知) |
簽名串格式 | HTTP請求方法\n URL\n 請求時間戳\n 請求隨機串\n 請求報文主體\n | 應用ID\n 時間戳\n 隨機字符串\n 擴展字符串\n | 應答時間戳\n 應答隨機串\n 應答報文主體\n |
簽名驗證證書 | 商戶API證書公鑰 apiclient_cert.pem | 商戶API證書公鑰 apiclient_cert.pem | 微信支付平臺證書公鑰(通過下載平臺證書 (opens new window)接口獲得) |
驗證方式 | 商戶可以使用其自身的商戶API證書私鑰(apiclient_key.pem)對待簽名串進行SHA256 with RSA簽名,并對簽名結(jié)果進行Base64編碼,從而獲得簽名值signature。 微信支付側(cè)會使用商戶API證書公鑰(apiclient_cert.pem)對商戶上送的簽名值進行解密驗簽,以確保請求的數(shù)據(jù)的完整性和真實性。 | 商戶可以使用其自身的商戶API證書私鑰(apiclient_key.pem)對待簽名串進行SHA256 with RSA簽名,并對簽名結(jié)果進行Base64編碼,從而獲得簽名值signature。 微信支付側(cè)會使用商戶API證書公鑰(apiclient_cert.pem)對商戶上送的簽名值進行解密驗簽,以確保請求的數(shù)據(jù)的完整性和真實性。 | 微信支付用微信支付平臺證書私鑰對【響應簽名串】進行SHA256 with RSA簽名,并對簽名結(jié)果進行Base64編碼得到簽名值。 商戶收到回調(diào)消息后,使用微信支付平臺證書公鑰對回調(diào)/響應消息中包含的【響應簽名串】進行解密驗簽。 |
# 3. 簽名驗證示例
# 3.1 微信支付APIv3接口
# 3.1.1 驗簽參數(shù)填寫
參數(shù) | 說明 | 示例 |
---|---|---|
選擇文件 | 請求微信支付API時使用商戶API證書私鑰(apiclient_key.pem)進行簽名,現(xiàn)使用工具模擬驗簽流程,所以驗簽文件需選擇商戶API證書公鑰(apiclient_cert.pem)進行簽名驗證。 | apiclient_cert.pem |
明文/驗簽串 | 所有APIv3請求的明文格式相同。 由5個部分組成,每一行尾部都需要填充換行符 \n,工具中不能出現(xiàn) \n 的字符文本,需使用回車鍵換行。 | POST /v3/pay/transactions/jsapi 1724060744 614275b63d789bd3a7a472c63d809552 {"time_expire":"2022-11-11T23:59:59+08:00","amount":{"total":1},"mchid":"1900006891","out_trade_no":"Tencentwechatpay0000457","settle_info":{"profit_sharing":false},"appid":"wx0036c37711cdfb99","description":"Image形象店-深圳騰大-QQ公仔","attach":"附加數(shù)據(jù)","notify_url":"https://www.weixin.qq.com/wxpay/pay.php","payer":{"openid":"ooejCjpfavMf1-KzCpQrKl_rzYZk"},"support_fapiao":false} |
簽名 | 使用明文計算得到的簽名值 | Ggewaqj5IovOiDUDzhGvOzSUDTv1nHwa1oX4AKyUCrQTXG3+p4VrmfWA8cRt3WiR+iOB/kSrWCbF+K2WhvhhWJSmrtaGy+5Sig3OSw+e+H38go6fc33ijr7p+l3xihMKSkU4r3YgluixXt/GVhxMCiFF5THj/VMyZuT4o3BE46eZMM52MovEcNRpI6CF5TseuXa87P+u56Lk8yvqOB2+Qy3Nf0aiezbAktr/wXP4mMh0ceB1g5Yv2Hk5wzERM2dZwogzyncOMef0BeebTwadR/OxPlbr7HyI816SJdefQUIszdFXEOo3xgR8UnzyXXX6NU/mnreGVLnC9U3Or8Sc6g== |
# 3.1.2 GET請求驗證示例(通過商戶單號查詢訂單狀態(tài))
1GET https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}?mchid={mchid}
請求內(nèi)容 | 值 |
---|---|
HTTP方法 | GET |
參與簽名的URL | /v3/pay/transactions/out-trade-no/Tencentwechatpay0000457?mchid=1900006891 |
簽名信息-請求時間戳 (參與簽名計算時使用的時間戳) | 1723789635 |
簽名信息-請求隨機串 (參與簽名計算時使用的隨機串) | 614275b63d789bd3a7a472c63d809552 |
明文/驗簽串 | GET /v3/pay/transactions/out-trade-no/Tencentwechatpay0000457?mchid=1900006891 1723793954 614275b63d789bd3a7a472c63d809552 |
簽名 | mm/2CMGxo5qDKNk1i7Szn0IiwAUPlfrpeCE1udNzEvUmohKYO8e40+3hNUTZVXwXUO4qOik/gqrPmXmppF37xa9aIe/oPzPLHaIpSCnDL1VBjl60ztc66kVkFQc/1LvYFwDzpsbnxq1B/DeMTTB6oXekfEDuZATI/erJ+B63BY+Cm6hKMDoPyaHn5hoFSTyfuLacxei+a0sPbFGGklDzr/vxh0Pta3Gp4vCvtnt7cmT+72h5Z7cijiYfw7JHzWt9VcK8Z1r9f6hMuYx6y2BIaEIcczZxq9fLxwRXZRYC2pRwUdrhADFHAUExm5oglZLgZ5QFc1dWijBGzVWzA40O7w== |
簽名驗證示例:
# 3.1.3 非GET請求驗證示例(以JSAPI下單接口為例)
請求微信支付APIv3接口時,簽名參數(shù)示例:
1POST https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
請求內(nèi)容 | 值 |
---|---|
HTTP方法 | POST |
參與簽名的URL | /v3/pay/transactions/jsapi |
簽名信息-請求時間戳 (參與簽名計算時使用的時間戳) | 1724062075 |
簽名信息-請求隨機串 (參與簽名計算時使用的隨機串) | 614275b63d789bd3a7a472c63d809552 |
請求Body | {"time_expire":"2022-11-11T23:59:59+08:00","amount":{"total":1},"mchid":"1900006891","out_trade_no":"Tencentwechatpay0000457","settle_info":{"profit_sharing":false},"appid":"wx0036c37711cdfb99","description":"Image形象店-深圳騰大-QQ公仔","attach":"附加數(shù)據(jù)","notify_url":"https://www.weixin.qq.com/wxpay/pay.php","payer":{"openid":"ooejCjpfavMf1-KzCpQrKl_rzYZk"},"support_fapiao":false} |
明文/驗簽串 | POST /v3//v3/pay/transactions/jsapi 1724062075 614275b63d789bd3a7a472c63d809552 {"time_expire":"2022-11-11T23:59:59+08:00","amount":{"total":1},"mchid":"1900006891","out_trade_no":"Tencentwechatpay0000457","settle_info":{"profit_sharing":false},"appid":"wx0036c37711cdfb99","description":"Image形象店-深圳騰大-QQ公仔","attach":"附加數(shù)據(jù)","notify_url":"https://www.weixin.qq.com/wxpay/pay.php","payer":{"openid":"ooejCjpfavMf1-KzCpQrKl_rzYZk"},"support_fapiao":false} |
簽名 | Ggewaqj5IovOiDUDzhGvOzSUDTv1nHwa1oX4AKyUCrQTXG3+p4VrmfWA8cRt3WiR+iOB/kSrWCbF+K2WhvhhWJSmrtaGy+5Sig3OSw+e+H38go6fc33ijr7p+l3xihMKSkU4r3YgluixXt/GVhxMCiFF5THj/VMyZuT4o3BE46eZMM52MovEcNRpI6CF5TseuXa87P+u56Lk8yvqOB2+Qy3Nf0aiezbAktr/wXP4mMh0ceB1g5Yv2Hk5wzERM2dZwogzyncOMef0BeebTwadR/OxPlbr7HyI816SJdefQUIszdFXEOo3xgR8UnzyXXX6NU/mnreGVLnC9U3Or8Sc6g== |
簽名驗證示例:
注意
APIv3接口請求 簽名驗證不通過 注意事項
- 嚴格按照驗簽參數(shù)填寫規(guī)則中進行參數(shù)填寫,注意驗簽文件選擇,明文格式內(nèi)容填寫,尾部需回車換行。否則簽名驗證結(jié)果無效。
- 請注意明文中用于簽名的時間戳和隨機串內(nèi)容是否和Authorization中的時間戳和隨機串內(nèi)容一致。
- 請注意明文中用于簽名的簽名值內(nèi)容是否和Authorization中的signature內(nèi)容一致。
- 檢查簽名的Body和實際代碼請求時使用的Body是否完全一致。當請求方法為POST或PUT時,請使用真實發(fā)送的JSON報文。
- 請注意區(qū)分GET和POST請求中明文內(nèi)容:
a. 請求方式不同(GET和POST均是大寫)
b. URL設置:GET請求注意帶上完整的路徑參數(shù)和查詢參數(shù)。
c. Body(簽名串明文第5項內(nèi)容不同):
請求方法為GET時,報文主體body是空的。所以展示出來GET請求隨機串后面需要2個回車,簽名串規(guī)則如下
如何生成請求簽名 - 若參數(shù)填寫沒問題,工具中簽名驗證通過,但接口仍然報簽名錯誤,則因為實際接口請求時使用的【證書】、【簽名信息】和【Body】與工具中參與簽名的參數(shù)信息不一致導致,需注意核對。
# 3.2 調(diào)起收銀臺
# 3.2.1 驗簽參數(shù)填寫
參數(shù) | 說明 | 示例 |
---|---|---|
選擇文件 | 請求微信支付API時使用商戶API證書私鑰(apiclient_key.pem)進行簽名,現(xiàn)使用工具模擬驗簽流程,所以驗簽文件需選擇商戶API證書公鑰(apiclient_cert.pem)進行簽名驗證。 | apiclient_cert.pem |
明文/驗簽串 | 由4個部分組成,每一行尾部都需要填充換行符 \n,工具中不能出現(xiàn) \n 的字符文本,需使用回車鍵換行。 | wxdce7996323956160 1723691310813 ff6ow9e1smvq3hg5qotr5m9q896i6nb7 wx15110833050799e86af8a2989edddf0001 |
簽名 | 計算得到的簽名值 | X+rmlGdyzHDBzd469iMPwajsxUPyTZf2BrROmdorJzVOcw/sDeUAkMc0iGMlOh4++//DtATW+qemIQ7MNWQxdD+MGOlWOgrSJ/zBBUTrzS/qSSaUeJ49Ah9c2+QEpfWfPpejWmLDqr83saGCkbHUxi0IVvLdZ12PkKgYh3ewn3TO1gq1GSMZTZbHSQ+5zbaBMaGnmE0ciwWUWkD6qGAYgrrni9j5MYNSODS2Dx3/p0Hq8QHhG5/J7rgKloL8xWwagkmeU9mvzovcyEHMggY+H7eS+KtH7KhyCUwKvziTkyyjwDMIsjanQXg7kGS5WAwhVEvJCfX1RADl4kpbmaSnJg== |
使用App支付、JSAPI支付和小程序支付時,下單成功后,需要對相關(guān)調(diào)起參數(shù)計算簽名,再通過JS SDK調(diào)起收銀臺。
調(diào)起收銀臺和請求APIv3接口時使用的簽名算法一致,主要的不同是需構(gòu)造出不同的簽名明文。
# 3.2.2 調(diào)起收銀臺驗證示例(App支付)
參數(shù) | 示例 |
---|---|
應用ID | wxdce7996323956160 |
簽名信息-請求時間戳 (參與簽名計算時使用的時間戳) | 1723691310813 |
簽名信息-請求隨機串 (參與簽名計算時使用的隨機串) | ff6ow9e1smvq3hg5qotr5m9q896i6nb7 |
預支付交易會話ID | wx15110833050799e86af8a2989edddf0001 |
明文/驗簽串 | wxdce7996323956160 1723691310813 ff6ow9e1smvq3hg5qotr5m9q896i6nb7 wx15110833050799e86af8a2989edddf0001 |
簽名 | X+rmlGdyzHDBzd469iMPwajsxUPyTZf2BrROmdorJzVOcw/sDeUAkMc0iGMlOh4++//DtATW+qemIQ7MNWQxdD+MGOlWOgrSJ/zBBUTrzS/qSSaUeJ49Ah9c2+QEpfWfPpejWmLDqr83saGCkbHUxi0IVvLdZ12PkKgYh3ewn3TO1gq1GSMZTZbHSQ+5zbaBMaGnmE0ciwWUWkD6qGAYgrrni9j5MYNSODS2Dx3/p0Hq8QHhG5/J7rgKloL8xWwagkmeU9mvzovcyEHMggY+H7eS+KtH7KhyCUwKvziTkyyjwDMIsjanQXg7kGS5WAwhVEvJCfX1RADl4kpbmaSnJg== |
簽名驗證示例:
注意
調(diào)起收銀臺 簽名驗證不通過 注意事項
- 嚴格按照驗簽參數(shù)填寫規(guī)則中進行參數(shù)填寫,注意驗簽文件選擇、明文格式內(nèi)容填寫、行尾需回車換行。否則簽名驗證結(jié)果無效。
- 請注意明文中用于簽名的時間戳和隨機串內(nèi)容是否與傳遞給前端的時間戳和隨機串內(nèi)容一致。
- 應用ID需要下單參數(shù)中appid和實際調(diào)起的應用一致。App調(diào)起則是App的應用ID;JSAPI公眾號調(diào)起,傳遞調(diào)起的公眾號的應用ID。
- 如果是JSAPI支付,明文中需要傳遞【訂單詳情拓展字符串】,格式要加“prepay_id=”前綴,如
prepay_id=wx201410272009395522657a690389285100
- 若工具驗簽通過,但調(diào)起仍然報簽名支付驗證失敗排查:參數(shù)和證書正確,工具校驗結(jié)果一定是正確的;請注意打印對比,前后端簽名和發(fā)起支付請求的實際數(shù)據(jù)參數(shù)名稱和參數(shù)內(nèi)容是否完全一致。
# 3.3 微信支付應答/回調(diào)
由于用于消息加密的微信支付平臺證書私鑰僅為微信支付側(cè)所持有,商戶無法獨立創(chuàng)建消息以進行回調(diào)驗證測試。因此,商戶僅能通過實際的線上應答/回調(diào)請求來獲取相應參數(shù)以完成測試。
# 3.3.1 驗簽參數(shù)填寫
參數(shù) | 說明 | 示例 |
---|---|---|
選擇文件 | 響應/回調(diào)請求頭Headers會包含使用的驗簽證書序列號Wechatpay-Serial,根據(jù)該證書序列號選擇對應的證書 | 微信平臺證書(公鑰) 1、通過下載平臺證書 (opens new window)接口獲得 ciphertext ,使用APIv3 (opens new window)密鑰,可以從ciphertext解密出平臺證書的明文。證書明文需自行保存為PEM文件格式;2、首次下載證書,可以使用微信支付提供的證書下載工具 (opens new window),該工具會自動下載解密證書到指定位置(PEM文件格式) |
明文/驗簽串 | 由3個部分組成,每一行尾部都需要填充換行符 \n,工具中不能出現(xiàn) \n 的字符文本,需使用回車鍵換行。 | 1724231603 D4PJYH8323444WUNiUs5O1jorgGif5ykEs {"id":"da2b8a7f-dad3-5f69-b5eb-2446b94543","create_time":"2024-08-16T15:00:03+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"Zkwzt1znCk78U2/xRl2ZVHlwaxcTg02MWN/36VW3cTFGJJWCDucckbqEPFCt5HIAwuhz1+oVbI1NJDqqmdfJAKSeZvDWivzgkLehZSI211qZhPruF8+/Oo8fuEmTigQo6BL1XUDUKSyegcYphyU+hFayU6gXAa7hatmbOr36dALy5Ijb+o6f+VDJ33A77lGgFP5xD1IhaqLkaYnDseBxot5bn3fwtASpNN176VKnKDb4co5E73kJzgtF3qPZTv40Nud0qakFHjs8h7NI7/hKKZVRL8wd3NHXLFfWGlq11GBjpH4Pm7OtZMifdHEa2pxZDiiYnAdO49cx1EMToN+0cdKv4dxWLxsy4wJhja44zaIfaViGSxbOojo1017C1eNQvfLraEqRnASvkilb/MQUPhLNM93PI1I20M6rrsKMNsF0U3IKYHvay+r9V+twrzXuHbgBWWVUtxVwvpIEzuPkJ756zRK5mf/XOLyotW4E42DBVgJZ+11OyTY8aSANWUl2G4zJoVlQJgHgNy0JNF2w0/7kU02o6fkDp81lOP7QU/4PeyzIqchDoqqhxKGOfMrun+V6/avn+tcZ2qIK+2etIZ4NwTun6G/Q2Cn8hRUwcXU28eWJvMrFeg==","associated_data":"transaction","nonce":"Oiyu5riw0HOJ"}} |
簽名 | 響應/回調(diào) 請求頭中的簽名值Wechatpay-Signature | ZTp6+tGGBDoh+6dnG9fFQFStlBqgtqozfACJ2bwHKB6yRn0qIaIgWUcT72Ylhyjzh9c3nvTG2xbeSyY4TclAVbSz4z2aLnR6h0VBXhDxIqcuR+m1lVed9WcE0Yebb496gh7vctrRtJXTb+wZ6pdtqJ+Z/XqZn/rz7o16IQIxdHrBnIotkEzJ56stwPsrcuOf/dQOY3enkv3cfMSLRfMkto70xfzIYu+Hr7M5FIbSiMviIgPp+gvF4O0BsEXxSYTIuTQ4GISYlLplirv4tNVCqcZEB5Mb/vK0xWtO0oIEAPwA8Y5qqVAj6FPdPPaCxGqbdR6Qmvf55N+KRWisfA6RLQ== |
# 3.3.2 微信通知回調(diào)驗證示例(支付通知)
以某次支付成功后支付回調(diào)通知HTTP 報文為例:
請求頭
1Content-Length: 9232Wechatpay-Nonce: D4PJYH8323444WUNiUs5O1jorgGif5ykEs3Wechatpay-Signature: ZTp6+tGGBDoh+6dnG9fFQFStlBqgtqozfACJ2bwHKB6yRn0qIaIgWUcT72Ylhyjzh9c3nvTG2xbeSyY4TclAVbSz4z2aLnR6h0VBXhDxIqcuR+m1lVed9WcE0Yebb496gh7vctrRtJXTb+wZ6pdtqJ+Z/XqZn/rz7o16IQIxdHrBnIotkEzJ56stwPsrcuOf/dQOY3enkv3cfMSLRfMkto70xfzIYu+Hr7M5FIbSiMviIgPp+gvF4O0BsEXxSYTIuTQ4GISYlLplirv4tNVCqcZEB5Mb/vK0xWtO0oIEAPwA8Y5qqVAj6FPdPPaCxGqbdR6Qmvf55N+KRWisfA6RLQ==+p4VrmfWA8cRt3WiR+iOB/kSrWCbF+K2WhvhhWJSmrtaGy+5Sig3OSw+e+H38go6fc33ijr7p+l3xihMKSkU4r3YgluixXt/GVhxMCiFF5THj/VMyZuT4o3BE46eZpp7RMovEcNRpI6CF5TseuXa87P+u56Lk8yvqOB2+Qy3Nf0aiezbAktr/wXP4mMh0ceB1g5Yv2Hk5wzERM2dZwogzyncOMef0BeebTwadR/OxPlbr7HyI816SJdefQUIszdFXEOo3xgR8UnzyXXX6NU/mnreGVLnC9U3Or8Sc6g=4Wechatpay-Timestamp: 17242316035Wechatpay-Serial: 5157F09EFDC960DE15EBE81A47057A7232F1B8E16Wechatpay-Signature-Type: WECHATPAY2-SHA256-RSA20487Connection: keep-alive8Content-Type: application/json9User-Agent: Mozilla/4.0
請求體
1{"id":"da2b8a7f-dad3-5f69-b5eb-2446b94543","create_time":"2024-08-16T15:00:03+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"Zkwzt1znCk78U2/xRl2ZVHlwaxcTg02MWN/36VW3cTFGJJWCDucckbqEPFCt5HIAwuhz1+oVbI1NJDqqmdfJAKSeZvDWivzgkLehZSI211qZhPruF8+/Oo8fuEmTigQo6BL1XUDUKSyegcYphyU+hFayU6gXAa7hatmbOr36dALy5Ijb+o6f+VDJ33A77lGgFP5xD1IhaqLkaYnDseBxot5bn3fwtASpNN176VKnKDb4co5E73kJzgtF3qPZTv40Nud0qakFHjs8h7NI7/hKKZVRL8wd3NHXLFfWGlq11GBjpH4Pm7OtZMifdHEa2pxZDiiYnAdO49cx1EMToN+0cdKv4dxWLxsy4wJhja44zaIfaViGSxbOojo1017C1eNQvfLraEqRnASvkilb/MQUPhLNM93PI1I20M6rrsKMNsF0U3IKYHvay+r9V+twrzXuHbgBWWVUtxVwvpIEzuPkJ756zRK5mf/XOLyotW4E42DBVgJZ+11OyTY8aSANWUl2G4zJoVlQJgHgNy0JNF2w0/7kU02o6fkDp81lOP7QU/4PeyzIqchDoqqhxKGOfMrun+V6/avn+tcZ2qIK+2etIZ4NwTun6G/Q2Cn8hRUwcXU28eWJvMrFeg==","associated_data":"transaction","nonce":"Oiyu5riw0HOJ"}}
驗簽參數(shù)
參數(shù) | 說明 | 示例 |
---|---|---|
應答/回調(diào)時間戳 | 簽名信息-請求時間戳 應答/回調(diào) 請求頭Headers獲取 Wechatpay-Timestamp | 1724231603 |
應答/回調(diào)隨機字符串 | 簽名信息-隨機字符串 應答/回調(diào) 請求頭Headers中獲取 Wechatpay-Nonce | D4PJYH8323444WUNiUs5O1jorgGif5ykEs |
應答/回調(diào)報文主體 | 請使用原始報文主體執(zhí)行驗簽。如果您使用了某個框架,要確保它不會篡改報文主體。對報文主體的任何篡改都會導致驗證失敗。 | {"id":"da2b8a7f-dad3-5f69-b5eb-2446b94543","create_time":"2024-08-16T15:00:03+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"Zkwzt1znCk78U2/xRl2ZVHlwaxcTg02MWN/36VW3cTFGJJWCDucckbqEPFCt5HIAwuhz1+oVbI1NJDqqmdfJAKSeZvDWivzgkLehZSI211qZhPruF8+/Oo8fuEmTigQo6BL1XUDUKSyegcYphyU+hFayU6gXAa7hatmbOr36dALy5Ijb+o6f+VDJ33A77lGgFP5xD1IhaqLkaYnDseBxot5bn3fwtASpNN176VKnKDb4co5E73kJzgtF3qPZTv40Nud0qakFHjs8h7NI7/hKKZVRL8wd3NHXLFfWGlq11GBjpH4Pm7OtZMifdHEa2pxZDiiYnAdO49cx1EMToN+0cdKv4dxWLxsy4wJhja44zaIfaViGSxbOojo1017C1eNQvfLraEqRnASvkilb/MQUPhLNM93PI1I20M6rrsKMNsF0U3IKYHvay+r9V+twrzXuHbgBWWVUtxVwvpIEzuPkJ756zRK5mf/XOLyotW4E42DBVgJZ+11OyTY8aSANWUl2G4zJoVlQJgHgNy0JNF2w0/7kU02o6fkDp81lOP7QU/4PeyzIqchDoqqhxKGOfMrun+V6/avn+tcZ2qIK+2etIZ4NwTun6G/Q2Cn8hRUwcXU28eWJvMrFeg==","associated_data":"transaction","nonce":"Oiyu5riw0HOJ"}} |
明文/驗簽串 | 由3個部分組成,每一行尾部都需要填充換行符 \n,工具中不能出現(xiàn) \n 的字符文本,需使用回車鍵換行。 | 1724231603 D4PJYH8323444WUNiUs5O1jorgGif5ykEs {"id":"da2b8a7f-dad3-5f69-b5eb-2446b94543","create_time":"2024-08-16T15:00:03+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"Zkwzt1znCk78U2/xRl2ZVHlwaxcTg02MWN/36VW3cTFGJJWCDucckbqEPFCt5HIAwuhz1+oVbI1NJDqqmdfJAKSeZvDWivzgkLehZSI211qZhPruF8+/Oo8fuEmTigQo6BL1XUDUKSyegcYphyU+hFayU6gXAa7hatmbOr36dALy5Ijb+o6f+VDJ33A77lGgFP5xD1IhaqLkaYnDseBxot5bn3fwtASpNN176VKnKDb4co5E73kJzgtF3qPZTv40Nud0qakFHjs8h7NI7/hKKZVRL8wd3NHXLFfWGlq11GBjpH4Pm7OtZMifdHEa2pxZDiiYnAdO49cx1EMToN+0cdKv4dxWLxsy4wJhja44zaIfaViGSxbOojo1017C1eNQvfLraEqRnASvkilb/MQUPhLNM93PI1I20M6rrsKMNsF0U3IKYHvay+r9V+twrzXuHbgBWWVUtxVwvpIEzuPkJ756zRK5mf/XOLyotW4E42DBVgJZ+11OyTY8aSANWUl2G4zJoVlQJgHgNy0JNF2w0/7kU02o6fkDp81lOP7QU/4PeyzIqchDoqqhxKGOfMrun+V6/avn+tcZ2qIK+2etIZ4NwTun6G/Q2Cn8hRUwcXU28eWJvMrFeg==","associated_data":"transaction","nonce":"Oiyu5riw0HOJ"}} |
簽名 | 應答/回調(diào) 請求頭Headers中獲取Wechatpay-Signature | ZTp6+tGGBDoh+6dnG9fFQFStlBqgtqozfACJ2bwHKB6yRn0qIaIgWUcT72Ylhyjzh9c3nvTG2xbeSyY4TclAVbSz4z2aLnR6h0VBXhDxIqcuR+m1lVed9WcE0Yebb496gh7vctrRtJXTb+wZ6pdtqJ+Z/XqZn/rz7o16IQIxdHrBnIotkEzJ56stwPsrcuOf/dQOY3enkv3cfMSLRfMkto70xfzIYu+Hr7M5FIbSiMviIgPp+gvF4O0BsEXxSYTIuTQ4GISYlLplirv4tNVCqcZEB5Mb/vK0xWtO0oIEAPwA8Y5qqVAj6FPdPPaCxGqbdR6Qmvf55N+KRWisfA6RLQ==+p4VrmfWA8cRt3WiR+iOB/kSrWCbF+K2WhvhhWJSmrtaGy+5Sig3OSw+e+H38go6fc33ijr7p+l3xihMKSkU4r3YgluixXt/GVhxMCiFF5THj/VMyZuT4o3BE46eZpp7RMovEcNRpI6CF5TseuXa87P+u56Lk8yvqOB2+Qy3Nf0aiezbAktr/wXP4mMh0ceB1g5Yv2Hk5wzERM2dZwogzyncOMef0BeebTwadR/OxPlbr7HyI816SJdefQUIszdFXEOo3xgR8UnzyXXX6NU/mnreGVLnC9U3Or8Sc6g= |
簽名驗證示例:
注意
微信支付通知/回調(diào) 簽名驗證不通過 排查思路
- 嚴格按照驗簽參數(shù)填寫規(guī)則中進行參數(shù)填寫,注意驗簽文件選擇,明文格式內(nèi)容填寫,行尾需回車換行。否則簽名驗證結(jié)果無效。
- 請注意,驗證應答和通知回調(diào)的簽名應使用微信支付平臺證書,而非商戶 API 證書。使用商戶 API 證書將驗證失敗。
- 在驗證簽名前,您應先檢查 HTTP 頭 Wechatpay-Serial 的內(nèi)容是否跟商戶當前所持有的微信支付平臺證書的序列號一致。若不一致,請重新獲取證書。否則,簽名的私鑰和證書不匹配,將驗證失敗。
- 為了確保商戶系統(tǒng)的安全,微信支付會在極少數(shù)應答或通知回調(diào)中生成錯誤簽名,以探測商戶系統(tǒng)是否正確地驗證了簽名。 商戶系統(tǒng)不應對探測流量進行特殊處理,而應將其視為正常的應答或通知回調(diào),并對其簽名進行驗證。 在排查問題時,您可以通過查看簽名值中的 WECHATPAY/SIGNTEST/ 前綴快速判斷是否為探測流量。所有用于探測目的的簽名值都會包含此前綴。
- 若參數(shù)正確、工具驗簽通過,但響應和回調(diào)依然驗簽失敗:請檢查代碼中實際驗簽使用的參數(shù)(body是否有轉(zhuǎn)義、亂碼)、微信平臺證書是否與簽名工具中一致。
# 4 生成簽名示例
除了驗簽,我們還可以通過簽名/驗簽工具,直接生成對應明文的簽名值。因為SHA256和RSA的算法都是固定的,所以使用同樣的私鑰對同樣的明文(簽名串)計算后得到的簽名值是相同的。
- 驗證證書匹配關(guān)系。
我們可以用私鑰簽名后生成簽名值,公鑰驗簽,根據(jù)結(jié)果判斷使用的簽名證書apiclient_key.pem(私鑰)和驗簽證書apiclient_cert.pem(公鑰)是否匹配,驗證代碼計算簽名的過程是否正確。 - 校驗請求簽名的正確性。
工具生成后的簽名值,可以用于直接去請求接口,調(diào)試校驗自己代碼請求時使用的各參數(shù)和工具中計算簽名時使用的各參數(shù)是否一致。
# 4.1 驗證證書匹配關(guān)系
對于有多套有效商戶API證書的商戶,請求接口時簽名私鑰文件apiclient_key.pem和證書序列號容易傳錯,但是無法確定自己使用的是否為同一套公私鑰,可以使用該工具進行驗證。
也可使用 證書查看工具 (opens new window) 查看商戶API證書公鑰apiclient_cert.pem的證書序列號進行輔助確認。
# 4.2 校驗請求簽名的正確性
您可以在工具上填入指定的參數(shù),生成請求簽名,以及校驗請求簽名的正確性。生成簽名示例參考 請求參數(shù)里帶Body參數(shù)(包體參數(shù)),如何計算簽名
- 按接口規(guī)則構(gòu)建明文/驗簽串,通過簽名/驗簽工具用apiclient_key.pem私鑰證書生成簽名signature
- 再根據(jù)Authorization的組成規(guī)則,結(jié)合驗簽串的內(nèi)容和生成的signature,構(gòu)建一個Authorization字符串,可以直接使用Authorization去請求接口。
注意
- 工具生成的簽名值一定是對應apiclient_key.pem和明文參數(shù)生成的正確簽名值。如果代碼仍然報錯,需要自己檢查簽名過程中使用的參數(shù)是否和工具中保持一致,如signature和Body是否一致,如參數(shù)大小寫等。
- 空格、格式、轉(zhuǎn)義、解析、或者環(huán)境等原因改變都會導致最終請求時微信支付側(cè)的驗簽失敗。