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

如何使用簽名/驗(yàn)簽工具

更新時(shí)間:2024.08.22

# 概述

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

提示

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

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

# 1. 如何下載簽名驗(yàn)簽工具

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

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

1.2 功能界面
alt text

# 2. 如何使用簽名驗(yàn)簽工具

微信支付在簽名計(jì)算和簽名驗(yàn)證中使用基于非對(duì)稱密鑰的SHA256-RSA的數(shù)字簽名算法,利用公鑰和私鑰的配對(duì)關(guān)系實(shí)現(xiàn)加密和解密。私鑰用于加密數(shù)據(jù),公鑰用于解密數(shù)據(jù)。由于私鑰的私密性,只有私鑰的擁有者才能生成有效的簽名,確保了信息的完整性和來源的可靠性。

下面列舉了微信支付常見場(chǎng)景的簽名/驗(yàn)簽參數(shù)以及使用的證書:

簽名場(chǎng)景 微信支付APIv3接口 調(diào)起收銀臺(tái) 微信支付應(yīng)答/回調(diào)
計(jì)算簽名證書 商戶API證書私鑰(商戶API證書獲取方法及功能介紹 (opens new window))
apiclient_key.pem
商戶API證書私鑰(商戶API證書獲取方法及功能介紹 (opens new window))
apiclient_key.pem
微信支付平臺(tái)證書私鑰(商戶無法持有/感知
簽名串格式 HTTP請(qǐng)求方法\n
URL\n
請(qǐng)求時(shí)間戳\n
請(qǐng)求隨機(jī)串\n
請(qǐng)求報(bào)文主體\n
應(yīng)用ID\n
時(shí)間戳\n
隨機(jī)字符串\n
擴(kuò)展字符串\n
應(yīng)答時(shí)間戳\n
應(yīng)答隨機(jī)串\n
應(yīng)答報(bào)文主體\n
簽名驗(yàn)證證書 商戶API證書公鑰
apiclient_cert.pem
商戶API證書公鑰
apiclient_cert.pem
微信支付平臺(tái)證書公鑰(通過下載平臺(tái)證書 (opens new window)接口獲得)
驗(yàn)證方式 商戶可以使用其自身的商戶API證書私鑰(apiclient_key.pem)對(duì)待簽名串進(jìn)行SHA256 with RSA簽名,并對(duì)簽名結(jié)果進(jìn)行Base64編碼,從而獲得簽名值signature。

微信支付側(cè)會(huì)使用商戶API證書公鑰(apiclient_cert.pem)對(duì)商戶上送的簽名值進(jìn)行解密驗(yàn)簽,以確保請(qǐng)求的數(shù)據(jù)的完整性和真實(shí)性。
商戶可以使用其自身的商戶API證書私鑰(apiclient_key.pem)對(duì)待簽名串進(jìn)行SHA256 with RSA簽名,并對(duì)簽名結(jié)果進(jìn)行Base64編碼,從而獲得簽名值signature。

微信支付側(cè)會(huì)使用商戶API證書公鑰(apiclient_cert.pem)對(duì)商戶上送的簽名值進(jìn)行解密驗(yàn)簽,以確保請(qǐng)求的數(shù)據(jù)的完整性和真實(shí)性。
微信支付用微信支付平臺(tái)證書私鑰對(duì)【響應(yīng)簽名串】進(jìn)行SHA256 with RSA簽名,并對(duì)簽名結(jié)果進(jìn)行Base64編碼得到簽名值。

商戶收到回調(diào)消息后,使用微信支付平臺(tái)證書公鑰對(duì)回調(diào)/響應(yīng)消息中包含的【響應(yīng)簽名串】進(jìn)行解密驗(yàn)簽。

# 3. 簽名驗(yàn)證示例

# 3.1 微信支付APIv3接口

# 3.1.1 驗(yàn)簽參數(shù)填寫

參數(shù) 說明 示例
選擇文件 請(qǐng)求微信支付API時(shí)使用商戶API證書私鑰(apiclient_key.pem)進(jìn)行簽名,現(xiàn)使用工具模擬驗(yàn)簽流程,所以驗(yàn)簽文件需選擇商戶API證書公鑰(apiclient_cert.pem)進(jìn)行簽名驗(yàn)證。 apiclient_cert.pem
明文/驗(yàn)簽串 所有APIv3請(qǐng)求的明文格式相同。

由5個(gè)部分組成,每一行尾部都需要填充換行符 \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}
簽名 使用明文計(jì)算得到的簽名值 Ggewaqj5IovOiDUDzhGvOzSUDTv1nHwa1oX4AKyUCrQTXG3+p4VrmfWA8cRt3WiR+iOB/kSrWCbF+K2WhvhhWJSmrtaGy+5Sig3OSw+e+H38go6fc33ijr7p+l3xihMKSkU4r3YgluixXt/GVhxMCiFF5THj/VMyZuT4o3BE46eZMM52MovEcNRpI6CF5TseuXa87P+u56Lk8yvqOB2+Qy3Nf0aiezbAktr/wXP4mMh0ceB1g5Yv2Hk5wzERM2dZwogzyncOMef0BeebTwadR/OxPlbr7HyI816SJdefQUIszdFXEOo3xgR8UnzyXXX6NU/mnreGVLnC9U3Or8Sc6g==

# 3.1.2 GET請(qǐng)求驗(yàn)證示例(通過商戶單號(hào)查詢訂單狀態(tài))

1GET https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}?mchid={mchid}
請(qǐng)求內(nèi)容
HTTP方法 GET
參與簽名的URL /v3/pay/transactions/out-trade-no/Tencentwechatpay0000457?mchid=1900006891
簽名信息-請(qǐng)求時(shí)間戳
(參與簽名計(jì)算時(shí)使用的時(shí)間戳)
1723789635
簽名信息-請(qǐng)求隨機(jī)串
(參與簽名計(jì)算時(shí)使用的隨機(jī)串)
614275b63d789bd3a7a472c63d809552
明文/驗(yàn)簽串 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==

簽名驗(yàn)證示例:
alt text

# 3.1.3 非GET請(qǐng)求驗(yàn)證示例(以JSAPI下單接口為例)

請(qǐng)求微信支付APIv3接口時(shí),簽名參數(shù)示例:

1POST https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
請(qǐng)求內(nèi)容
HTTP方法 POST
參與簽名的URL /v3/pay/transactions/jsapi
簽名信息-請(qǐng)求時(shí)間戳
(參與簽名計(jì)算時(shí)使用的時(shí)間戳)
1724062075
簽名信息-請(qǐng)求隨機(jī)串
(參與簽名計(jì)算時(shí)使用的隨機(jī)串)
614275b63d789bd3a7a472c63d809552
請(qǐng)求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}
明文/驗(yàn)簽串 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==

簽名驗(yàn)證示例:
alt text

注意

APIv3接口請(qǐng)求 簽名驗(yàn)證不通過 注意事項(xiàng)

  1. 嚴(yán)格按照驗(yàn)簽參數(shù)填寫規(guī)則中進(jìn)行參數(shù)填寫,注意驗(yàn)簽文件選擇,明文格式內(nèi)容填寫,尾部需回車換行。否則簽名驗(yàn)證結(jié)果無效。
  2. 請(qǐng)注意明文中用于簽名的時(shí)間戳和隨機(jī)串內(nèi)容是否和Authorization中的時(shí)間戳和隨機(jī)串內(nèi)容一致。
  3. 請(qǐng)注意明文中用于簽名的簽名值內(nèi)容是否和Authorization中的signature內(nèi)容一致。
  4. 檢查簽名的Body和實(shí)際代碼請(qǐng)求時(shí)使用的Body是否完全一致。當(dāng)請(qǐng)求方法為POST或PUT時(shí),請(qǐng)使用真實(shí)發(fā)送的JSON報(bào)文。
  5. 請(qǐng)注意區(qū)分GET和POST請(qǐng)求中明文內(nèi)容:
    a. 請(qǐng)求方式不同(GET和POST均是大寫)
    b. URL設(shè)置:GET請(qǐng)求注意帶上完整的路徑參數(shù)和查詢參數(shù)。
    c. Body(簽名串明文第5項(xiàng)內(nèi)容不同):
    請(qǐng)求方法為GET時(shí),報(bào)文主體body是空的。所以展示出來GET請(qǐng)求隨機(jī)串后面需要2個(gè)回車,簽名串規(guī)則如下
    如何生成請(qǐng)求簽名
  6. 若參數(shù)填寫沒問題,工具中簽名驗(yàn)證通過,但接口仍然報(bào)簽名錯(cuò)誤,則因?yàn)閷?shí)際接口請(qǐng)求時(shí)使用的【證書】、【簽名信息】和【Body】與工具中參與簽名的參數(shù)信息不一致導(dǎo)致,需注意核對(duì)。

# 3.2 調(diào)起收銀臺(tái)

# 3.2.1 驗(yàn)簽參數(shù)填寫

參數(shù) 說明 示例
選擇文件 請(qǐng)求微信支付API時(shí)使用商戶API證書私鑰(apiclient_key.pem)進(jìn)行簽名,現(xiàn)使用工具模擬驗(yàn)簽流程,所以驗(yàn)簽文件需選擇商戶API證書公鑰(apiclient_cert.pem)進(jìn)行簽名驗(yàn)證。 apiclient_cert.pem
明文/驗(yàn)簽串 4個(gè)部分組成,每一行尾部都需要填充換行符 \n,工具中不能出現(xiàn) \n 的字符文本,需使用回車鍵換行 wxdce7996323956160
1723691310813
ff6ow9e1smvq3hg5qotr5m9q896i6nb7
wx15110833050799e86af8a2989edddf0001
簽名 計(jì)算得到的簽名值 X+rmlGdyzHDBzd469iMPwajsxUPyTZf2BrROmdorJzVOcw/sDeUAkMc0iGMlOh4++//DtATW+qemIQ7MNWQxdD+MGOlWOgrSJ/zBBUTrzS/qSSaUeJ49Ah9c2+QEpfWfPpejWmLDqr83saGCkbHUxi0IVvLdZ12PkKgYh3ewn3TO1gq1GSMZTZbHSQ+5zbaBMaGnmE0ciwWUWkD6qGAYgrrni9j5MYNSODS2Dx3/p0Hq8QHhG5/J7rgKloL8xWwagkmeU9mvzovcyEHMggY+H7eS+KtH7KhyCUwKvziTkyyjwDMIsjanQXg7kGS5WAwhVEvJCfX1RADl4kpbmaSnJg==

使用App支付、JSAPI支付和小程序支付時(shí),下單成功后,需要對(duì)相關(guān)調(diào)起參數(shù)計(jì)算簽名,再通過JS SDK調(diào)起收銀臺(tái)。

調(diào)起收銀臺(tái)和請(qǐng)求APIv3接口時(shí)使用的簽名算法一致,主要的不同是需構(gòu)造出不同的簽名明文。

# 3.2.2 調(diào)起收銀臺(tái)驗(yàn)證示例(App支付)

參數(shù) 示例
應(yīng)用ID wxdce7996323956160
簽名信息-請(qǐng)求時(shí)間戳
(參與簽名計(jì)算時(shí)使用的時(shí)間戳)
1723691310813
簽名信息-請(qǐng)求隨機(jī)串
(參與簽名計(jì)算時(shí)使用的隨機(jī)串)
ff6ow9e1smvq3hg5qotr5m9q896i6nb7
預(yù)支付交易會(huì)話ID wx15110833050799e86af8a2989edddf0001
明文/驗(yàn)簽串 wxdce7996323956160
1723691310813
ff6ow9e1smvq3hg5qotr5m9q896i6nb7
wx15110833050799e86af8a2989edddf0001
簽名 X+rmlGdyzHDBzd469iMPwajsxUPyTZf2BrROmdorJzVOcw/sDeUAkMc0iGMlOh4++//DtATW+qemIQ7MNWQxdD+MGOlWOgrSJ/zBBUTrzS/qSSaUeJ49Ah9c2+QEpfWfPpejWmLDqr83saGCkbHUxi0IVvLdZ12PkKgYh3ewn3TO1gq1GSMZTZbHSQ+5zbaBMaGnmE0ciwWUWkD6qGAYgrrni9j5MYNSODS2Dx3/p0Hq8QHhG5/J7rgKloL8xWwagkmeU9mvzovcyEHMggY+H7eS+KtH7KhyCUwKvziTkyyjwDMIsjanQXg7kGS5WAwhVEvJCfX1RADl4kpbmaSnJg==

簽名驗(yàn)證示例:
alt text

注意

調(diào)起收銀臺(tái) 簽名驗(yàn)證不通過 注意事項(xiàng)

  1. 嚴(yán)格按照驗(yàn)簽參數(shù)填寫規(guī)則中進(jìn)行參數(shù)填寫,注意驗(yàn)簽文件選擇、明文格式內(nèi)容填寫、行尾需回車換行。否則簽名驗(yàn)證結(jié)果無效。
  2. 請(qǐng)注意明文中用于簽名的時(shí)間戳和隨機(jī)串內(nèi)容是否與傳遞給前端的時(shí)間戳和隨機(jī)串內(nèi)容一致。
  3. 應(yīng)用ID需要下單參數(shù)中appid和實(shí)際調(diào)起的應(yīng)用一致。App調(diào)起則是App的應(yīng)用ID;JSAPI公眾號(hào)調(diào)起,傳遞調(diào)起的公眾號(hào)的應(yīng)用ID。
  4. 如果是JSAPI支付,明文中需要傳遞【訂單詳情拓展字符串】,格式要加“prepay_id=”前綴,如prepay_id=wx201410272009395522657a690389285100
  5. 若工具驗(yàn)簽通過,但調(diào)起仍然報(bào)簽名支付驗(yàn)證失敗排查:參數(shù)和證書正確,工具校驗(yàn)結(jié)果一定是正確的;請(qǐng)注意打印對(duì)比,前后端簽名和發(fā)起支付請(qǐng)求的實(shí)際數(shù)據(jù)參數(shù)名稱和參數(shù)內(nèi)容是否完全一致。

# 3.3 微信支付應(yīng)答/回調(diào)

由于用于消息加密的微信支付平臺(tái)證書私鑰僅為微信支付側(cè)所持有,商戶無法獨(dú)立創(chuàng)建消息以進(jìn)行回調(diào)驗(yàn)證測(cè)試。因此,商戶僅能通過實(shí)際的線上應(yīng)答/回調(diào)請(qǐng)求來獲取相應(yīng)參數(shù)以完成測(cè)試。

# 3.3.1 驗(yàn)簽參數(shù)填寫

參數(shù) 說明 示例
選擇文件 響應(yīng)/回調(diào)請(qǐng)求頭Headers會(huì)包含使用的驗(yàn)簽證書序列號(hào)Wechatpay-Serial,根據(jù)該證書序列號(hào)選擇對(duì)應(yīng)的證書 微信平臺(tái)證書(公鑰)
1、通過下載平臺(tái)證書 (opens new window)接口獲得ciphertext,使用APIv3 (opens new window)密鑰,可以從ciphertext解密出平臺(tái)證書的明文。證書明文需自行保存為PEM文件格式;
2、首次下載證書,可以使用微信支付提供的證書下載工具 (opens new window),該工具會(huì)自動(dòng)下載解密證書到指定位置(PEM文件格式)
明文/驗(yàn)簽串 3個(gè)部分組成,每一行尾部都需要填充換行符 \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"}}
簽名 響應(yīng)/回調(diào) 請(qǐng)求頭中的簽名值Wechatpay-Signature ZTp6+tGGBDoh+6dnG9fFQFStlBqgtqozfACJ2bwHKB6yRn0qIaIgWUcT72Ylhyjzh9c3nvTG2xbeSyY4TclAVbSz4z2aLnR6h0VBXhDxIqcuR+m1lVed9WcE0Yebb496gh7vctrRtJXTb+wZ6pdtqJ+Z/XqZn/rz7o16IQIxdHrBnIotkEzJ56stwPsrcuOf/dQOY3enkv3cfMSLRfMkto70xfzIYu+Hr7M5FIbSiMviIgPp+gvF4O0BsEXxSYTIuTQ4GISYlLplirv4tNVCqcZEB5Mb/vK0xWtO0oIEAPwA8Y5qqVAj6FPdPPaCxGqbdR6Qmvf55N+KRWisfA6RLQ==

# 3.3.2 微信通知回調(diào)驗(yàn)證示例(支付通知)

以某次支付成功后支付回調(diào)通知HTTP 報(bào)文為例:

請(qǐng)求頭

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

請(qǐng)求體

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"}}

驗(yàn)簽參數(shù)

參數(shù) 說明 示例
應(yīng)答/回調(diào)時(shí)間戳 簽名信息-請(qǐng)求時(shí)間戳
應(yīng)答/回調(diào) 請(qǐng)求頭Headers獲取Wechatpay-Timestamp
1724231603
應(yīng)答/回調(diào)隨機(jī)字符串 簽名信息-隨機(jī)字符串
應(yīng)答/回調(diào) 請(qǐng)求頭Headers中獲取Wechatpay-Nonce
D4PJYH8323444WUNiUs5O1jorgGif5ykEs
應(yīng)答/回調(diào)報(bào)文主體 請(qǐng)使用原始報(bào)文主體執(zhí)行驗(yàn)簽。如果您使用了某個(gè)框架,要確保它不會(huì)篡改報(bào)文主體。對(duì)報(bào)文主體的任何篡改都會(huì)導(dǎo)致驗(yàn)證失敗。 {"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"}}
明文/驗(yàn)簽串 3個(gè)部分組成,每一行尾部都需要填充換行符 \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"}}
簽名 應(yīng)答/回調(diào) 請(qǐng)求頭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=

簽名驗(yàn)證示例:
alt text

注意

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

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

# 4 生成簽名示例

除了驗(yàn)簽,我們還可以通過簽名/驗(yàn)簽工具,直接生成對(duì)應(yīng)明文的簽名值。因?yàn)镾HA256和RSA的算法都是固定的,所以使用同樣的私鑰對(duì)同樣的明文(簽名串)計(jì)算后得到的簽名值是相同的。

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

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

對(duì)于有多套有效商戶API證書的商戶,請(qǐng)求接口時(shí)簽名私鑰文件apiclient_key.pem和證書序列號(hào)容易傳錯(cuò),但是無法確定自己使用的是否為同一套公私鑰,可以使用該工具進(jìn)行驗(yàn)證。

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

alt text

# 4.2 校驗(yàn)請(qǐng)求簽名的正確性

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

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

注意

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