视频一区二区三区自拍_千金肉奴隷1985未删减版在线观看_国产成人黄色视频在线播放_少女免费播放片高清在线观看_国产精品v欧美精品v

如何使用簽名/驗簽工具

更新時間:2024.08.22

# 概述

在微信支付APIV3的所有接口交互中,都需要對【接口請求】或【回調(diào)通知】進行SHA256 with RSA算法簽名計算,保證支付安全;并且也強烈建議對【響應】和【回調(diào)】進行驗簽(部分接口不需要響應驗簽),保證響應數(shù)據(jù)來自微信支付且未經(jīng)第三方篡改。對于常見的APIv3接口簽名錯誤的問題,提供【簽名驗簽工具】,模擬微信支付進行簽名驗簽。

提示

  1. 本工具無法識別并提示錯誤參數(shù),計算結(jié)果需自行核對,不會主動糾正,可能產(chǎn)生無效的請求簽名。
  2. 若相應的必填參數(shù)未填寫時,本工具不會進行提醒。
  3. 該工具目前只支持Windows操作系統(tǒng),其他類型的操作系統(tǒng)暫不支持。

下面介紹工具詳細操作指引,協(xié)助你進行簽名計算和簽名驗證。

# 1. 如何下載簽名驗簽工具

下載地址:下載簽名驗簽工具 (opens new window)

1.1 打開時個別用戶可能會提示:找不到MSVCR120.dll文件,需要額外下載一下該文件,放置安裝目錄即可。
alt text

1.2 功能界面
alt text

# 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==

簽名驗證示例:
alt text

# 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==

簽名驗證示例:
alt text

注意

APIv3接口請求 簽名驗證不通過 注意事項

  1. 嚴格按照驗簽參數(shù)填寫規(guī)則中進行參數(shù)填寫,注意驗簽文件選擇,明文格式內(nèi)容填寫,尾部需回車換行。否則簽名驗證結(jié)果無效。
  2. 請注意明文中用于簽名的時間戳和隨機串內(nèi)容是否和Authorization中的時間戳和隨機串內(nèi)容一致。
  3. 請注意明文中用于簽名的簽名值內(nèi)容是否和Authorization中的signature內(nèi)容一致。
  4. 檢查簽名的Body和實際代碼請求時使用的Body是否完全一致。當請求方法為POST或PUT時,請使用真實發(fā)送的JSON報文。
  5. 請注意區(qū)分GET和POST請求中明文內(nèi)容:
    a. 請求方式不同(GET和POST均是大寫)
    b. URL設置:GET請求注意帶上完整的路徑參數(shù)和查詢參數(shù)。
    c. Body(簽名串明文第5項內(nèi)容不同):
    請求方法為GET時,報文主體body是空的。所以展示出來GET請求隨機串后面需要2個回車,簽名串規(guī)則如下
    如何生成請求簽名
  6. 若參數(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==

簽名驗證示例:
alt text

注意

調(diào)起收銀臺 簽名驗證不通過 注意事項

  1. 嚴格按照驗簽參數(shù)填寫規(guī)則中進行參數(shù)填寫,注意驗簽文件選擇、明文格式內(nèi)容填寫、行尾需回車換行。否則簽名驗證結(jié)果無效。
  2. 請注意明文中用于簽名的時間戳和隨機串內(nèi)容是否與傳遞給前端的時間戳和隨機串內(nèi)容一致。
  3. 應用ID需要下單參數(shù)中appid和實際調(diào)起的應用一致。App調(diào)起則是App的應用ID;JSAPI公眾號調(diào)起,傳遞調(diào)起的公眾號的應用ID。
  4. 如果是JSAPI支付,明文中需要傳遞【訂單詳情拓展字符串】,格式要加“prepay_id=”前綴,如prepay_id=wx201410272009395522657a690389285100
  5. 若工具驗簽通過,但調(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: 923
2Wechatpay-Nonce: D4PJYH8323444WUNiUs5O1jorgGif5ykEs
3Wechatpay-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: 1724231603
5Wechatpay-Serial: 5157F09EFDC960DE15EBE81A47057A7232F1B8E1
6Wechatpay-Signature-Type: WECHATPAY2-SHA256-RSA2048
7Connection: keep-alive
8Content-Type: application/json
9User-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=

簽名驗證示例:
alt text

注意

微信支付通知/回調(diào) 簽名驗證不通過 排查思路

  1. 嚴格按照驗簽參數(shù)填寫規(guī)則中進行參數(shù)填寫,注意驗簽文件選擇,明文格式內(nèi)容填寫,行尾需回車換行。否則簽名驗證結(jié)果無效。
  2. 請注意,驗證應答和通知回調(diào)的簽名應使用微信支付平臺證書,而非商戶 API 證書。使用商戶 API 證書將驗證失敗。
  3. 在驗證簽名前,您應先檢查 HTTP 頭 Wechatpay-Serial 的內(nèi)容是否跟商戶當前所持有的微信支付平臺證書的序列號一致。若不一致,請重新獲取證書。否則,簽名的私鑰和證書不匹配,將驗證失敗。
  4. 為了確保商戶系統(tǒng)的安全,微信支付會在極少數(shù)應答或通知回調(diào)中生成錯誤簽名,以探測商戶系統(tǒng)是否正確地驗證了簽名。 商戶系統(tǒng)不應對探測流量進行特殊處理,而應將其視為正常的應答或通知回調(diào),并對其簽名進行驗證。 在排查問題時,您可以通過查看簽名值中的 WECHATPAY/SIGNTEST/ 前綴快速判斷是否為探測流量。所有用于探測目的的簽名值都會包含此前綴。
  5. 若參數(shù)正確、工具驗簽通過,但響應和回調(diào)依然驗簽失敗:請檢查代碼中實際驗簽使用的參數(shù)(body是否有轉(zhuǎn)義、亂碼)、微信平臺證書是否與簽名工具中一致。

# 4 生成簽名示例

除了驗簽,我們還可以通過簽名/驗簽工具,直接生成對應明文的簽名值。因為SHA256和RSA的算法都是固定的,所以使用同樣的私鑰對同樣的明文(簽名串)計算后得到的簽名值是相同的。

  1. 驗證證書匹配關(guān)系。
    我們可以用私鑰簽名后生成簽名值,公鑰驗簽,根據(jù)結(jié)果判斷使用的簽名證書apiclient_key.pem(私鑰)和驗簽證書apiclient_cert.pem(公鑰)是否匹配,驗證代碼計算簽名的過程是否正確。
  2. 校驗請求簽名的正確性。
    工具生成后的簽名值,可以用于直接去請求接口,調(diào)試校驗自己代碼請求時使用的各參數(shù)和工具中計算簽名時使用的各參數(shù)是否一致。

# 4.1 驗證證書匹配關(guān)系

對于有多套有效商戶API證書的商戶,請求接口時簽名私鑰文件apiclient_key.pem和證書序列號容易傳錯,但是無法確定自己使用的是否為同一套公私鑰,可以使用該工具進行驗證。

也可使用 證書查看工具 (opens new window) 查看商戶API證書公鑰apiclient_cert.pem的證書序列號進行輔助確認。

alt text

# 4.2 校驗請求簽名的正確性

您可以在工具上填入指定的參數(shù),生成請求簽名,以及校驗請求簽名的正確性。生成簽名示例參考 請求參數(shù)里帶Body參數(shù)(包體參數(shù)),如何計算簽名

  1. 按接口規(guī)則構(gòu)建明文/驗簽串,通過簽名/驗簽工具用apiclient_key.pem私鑰證書生成簽名signature
  2. 再根據(jù)Authorization的組成規(guī)則,結(jié)合驗簽串的內(nèi)容和生成的signature,構(gòu)建一個Authorization字符串,可以直接使用Authorization去請求接口。
alt text

注意

  1. 工具生成的簽名值一定是對應apiclient_key.pem和明文參數(shù)生成的正確簽名值。如果代碼仍然報錯,需要自己檢查簽名過程中使用的參數(shù)是否和工具中保持一致,如signature和Body是否一致,如參數(shù)大小寫等。
  2. 空格、格式、轉(zhuǎn)義、解析、或者環(huán)境等原因改變都會導致最終請求時微信支付側(cè)的驗簽失敗。