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

請求參數(shù)里帶Body參數(shù)(包體參數(shù)),如何計算簽名

更新時間:2024.08.22

為了方便大家理解,我們將使用測試的一對公私鑰,通過命令行形式調(diào)用"JSAPI下單接口 (opens new window)",一步一步介紹如何請求參數(shù)里帶Body參數(shù)(包體參數(shù)),如何計算簽名。強烈建議你使用測試的公私鑰,按照本文實操作一下,如果算出來的簽名和文檔的一致則說明計算無誤。實際業(yè)務(wù)中請?zhí)鎿Q為你的真實的參數(shù)。
alt text

# 1. 準備

商戶需要擁有一個微信支付商戶號,并通過超級管理員賬號登錄商戶平臺,獲取商戶API證書,可以參考如何獲取商戶API證書 (opens new window)。 商戶申請商戶 API 證書時,證書工具會生成商戶私鑰,并保存在本地證書文件夾的文件 apiclient_key.pem 中。私鑰也可通過工具從商戶的 p12 證書中導(dǎo)出。請妥善保管好商戶私鑰文件。請注意計算簽名需要用到的是商戶API證書而不是平臺證書,請不要搞混。

商戶號:1900007291

證書序列號:408B07E79B8269FEC3D5D3E6AB8ED163A6A380DB

API證書私鑰:你需要將以下文件保存為pem格式,為了避免大家和自己的真實的公私鑰混淆,此處將其保存為了apiclient_test_key.pem,這只是一個示例密鑰,實際上并不可用

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAptpm+qvIDCh/9wjU26SQCK26ogYkBhDrYxnAaw2JbbBsp1oD bHKk+1r381NeBUG2HEFAuU+Fr72u5ot3yKdzoF/FajAzQNKnm569/D3upKoi8mYB aST15Uig8j8qoUW1U217LL0jEHlSnHV3lcaDTXqDpTRR4Bfz9IqOgJgFZ8/oTfEo mSrjrLYef81Eyxr7ZIMQXEKKEK7V4UXKS0+/fDsiG/cXidhzt8UbTL9vqXqxM2+I DImyO+FAc/tkBG55LmzxPto1Nq0WbnZzRM/wTzrd0I/8NlevxtFbphg4evlHjFNI 7+GrqR87ViEwuAJJ9Je5QQjct5YJfFRWiZ5CMQIDAQABAoIBAGBi/GhEgezcHIg1 ltlHaFlLGuxsRbUnYwM9phVxnXk7GJlYe2/TjpERjPkIqOC6hBwwadZjJORP3FCc Mtc8PKRhjuZ377O7vU0915x2nnyLOGL1IE2AJ3iLi0ZFzTea0FPgg+5lWHM00s9F YI6qPcGtS41M+xtMWwZiYE3TBBRibHiY8ugGyaNAhiMKehyW05uApjlIF55wwCGx BkyESJpGRR/6853iHke6Ge+xVcMa9QmQdoH0QqL/8kT28PL568mJJr0Ow/83t4+d Pe70YPzKAxgUnaDsHJqO+b8qH69AEs8rTI5h2Mon6pH+bJT66KUoiXhn+Kf+4LSs henRP10CgYEA1QJSfuFOWVRjrg3N/rAIc/Ak84BTZavbyrkqBSuoTs9i/nMI/hOz VxpDntg7Bx2Tctl6sZO3GioTxKdc/YYaTKci1TKBbeginpsqEQVgwkMCy8HpvUmR fyAMqLwZC4h9+j+NiZtuoFJDTCgv+WYbasX+kWYEUM21bnSYuO7yEQsCgYEAyIdP r9uzqPgzN34Tmx+CNTa16VjhBh+zkBtXRLDLhWBeIYxoYNJARD98Pb1XZdvpkZZW Sk7MfaKo2/DomzyyyB/MbHWwAdFi3yb4y7uMJfyC1MzdUSNN3Vp579hJxHkJ+nN4 Ys76yfcEeVOLnvUT1Z0KKCdIWRdT1Lgi+X1itzMCgYBJUXlPzwGG4fNFj97d0X23 Wmt9nSgXkOYgi0eZbAOMzPmIF9R6kBFk49dur4Lx2g5Ms+r1gKC/0sfnIqxxX11i EQ1+UNoYGJUB/uql3TIG68XkmKR50P7RwRhaZBRC0gJ6xrFTMjsL2ATuC88niyvY vrn3FiRaI9RVZrDCxwxvLQKBgEXW4okEAqGBuAzGqztmkOnJoTehDdYdKmOxMgap cGiGdKJIjX3THDDoz3ONQyglnEZpTqpYoV3MTfU0BT8zt6x9bqwDnQY1D7NalmIW cqw0Mri8lQQSQKcsQLWo5aA466G/n5kCL1Qx5OwAjesRvhOyuvvbGpZ0ymyWqQ+t fLkDAoGATcul1L8y5D/wNVP1GXbXMZfBsFP3bbqy8c+Ashm6g8OLm2mGNntd5Z6h 1KkID7Yksh+dZ6t7XaPBtGACXX5Eryr537JVvdX8hAVCp5HVtaN/9VBVP8Ka2e4s VS/xeNgOMQ7uzhRPBJ8HiTmdI1nHhDnYQpGiBgQn0Z5RAkSvFMk=
-----END RSA PRIVATE KEY-----

# 2. 構(gòu)造簽名串

我們希望商戶的技術(shù)開發(fā)人員按照當前文檔約定的規(guī)則構(gòu)造簽名串。微信支付會使用同樣的方式構(gòu)造簽名串。如果商戶構(gòu)造簽名串的方式錯誤,將導(dǎo)致簽名驗證不通過。下面先說明簽名串的具體格式。

簽名串一共有5個部分,每一行為一個參數(shù)。結(jié)尾以\n(換行符,ASCII編碼值為0x0A)結(jié)束,包括最后一行。如果參數(shù)本身以\n結(jié)束,也需要附加一個\n。

1HTTP請求方法\n
2URL\n
3請求時間戳\n
4請求隨機串\n
5請求報文主體\n

以JSAPI下單接口為例,

第一步,獲取HTTP請求的方法

1POST

第二步,獲取請求的絕對URL,請注意需要去除域名部分。

1/v3/pay/transactions/jsapi

第三步,獲取發(fā)起請求時的系統(tǒng)當前時間戳,即格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現(xiàn)在的總秒數(shù),作為請求時間戳。微信支付會拒絕處理很久之前發(fā)起的請求,請商戶保持自身系統(tǒng)的時間準確。

1$ date +%s
21554208460

第四步,生成一個請求隨機串,我們推薦生成隨機數(shù)算法如下:調(diào)用隨機數(shù)函數(shù)生成,將得到的值轉(zhuǎn)換為字符串。這里,我們使用命令行直接生成一個。

1$ hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random
2593BEC0C930BF1AFEB40B4A08C8FB242

第五步,獲取請求中的請求報文主體(request body)。

你可以將所有參數(shù)放在一行,對應(yīng)的發(fā)起簽名請求的時候body參數(shù)也應(yīng)該放在一行。

你也可以將參數(shù)以多行計算簽名,對應(yīng)發(fā)起請求的時候body參數(shù)也要是多行。即你計算簽名時body是怎么樣的,你發(fā)起請求時body就應(yīng)該是怎么樣的。

這里以將所有參數(shù)放到一行做演示,如果你想了解將參數(shù)放在多行可以參考文末說明

1{"appid":"wxd678efh567hg6787","mchid":"1230000109","description":"Image形象店-深圳騰大-QQ公仔","out_trade_no":"1217752501201407033233368018","notify_url":"https://www.weixin.qq.com/wxpay/pay.php","amount":{"total":100,"currency":"CNY"},"payer":{"openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"}}

第六步,按照前述規(guī)則,構(gòu)造的請求簽名串如下:

1POST\n
2/v3/pay/transactions/jsapi\n
31554208460\n
4593BEC0C930BF1AFEB40B4A08C8FB242\n
5{"appid":"wxd678efh567hg6787","mchid":"1230000109","description":"Image形象店-深圳騰大-QQ公仔","out_trade_no":"1217752501201407033233368018","notify_url":"https://www.weixin.qq.com/wxpay/pay.php","amount":{"total":100,"currency":"CNY"},"payer":{"openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"}}\n

# 3. 計算簽名值

絕大多數(shù)編程語言提供的簽名函數(shù)支持對簽名數(shù)據(jù)進行簽名。強烈建議商戶調(diào)用該類函數(shù),使用商戶私鑰對待簽名串進行SHA256 with RSA簽名,并對簽名結(jié)果進行Base64編碼得到簽名值。

請注意處理單雙引號轉(zhuǎn)義問題,第二行的外層是單引號,則里面的參數(shù)不需要轉(zhuǎn)義,如果第二行最外層使用了雙引號,則body參數(shù)的雙引號都需要轉(zhuǎn)義

1$ echo -n -e \
2 'POST\n/v3/pay/transactions/jsapi\n1554208460\n593BEC0C930BF1AFEB40B4A08C8FB242\n{"appid":"wxd678efh567hg6787","mchid":"1230000109","description":"Image形象店-深圳騰大-QQ公仔","out_trade_no":"1217752501201407033233368018","notify_url":"https://www.weixin.qq.com/wxpay/pay.php","amount":{"total":100,"currency":"CNY"},"payer":{"openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"}}\n' \
3 | openssl dgst -sha256 -sign apiclient_test_key.pem \
4 | openssl base64 -A

得出的簽名值如下,你可以用一些校驗工具校驗?zāi)阃ㄟ^命令行或者你的代碼得到的簽名值是否和以下值一樣,一樣則表示計算過程無誤,如果不一致則請檢查簽名的參數(shù)是否一致、簽名串是否有嚴格換行等

1gEuexJ547PHFV77TQ6eiE4tphVYfWfUe1Wc2dBmVnoMYU2rl/M4zhw+b3vBhuMw6AC7pteNkryLA7UWU2h+umo0OdSuuLm1++O3NckQPCSfm6dypsjn4GYm84KMqXWFrhFmyxEwIdEJDr3w1UYfxOcu55OQupfLkrt/ZzuOspnliJFrPzGQFUk7lGqMMtpz3EfbDUNxnVsHblORg3hVmuYNmbGWnS2ovU30Y2Q+iKFDxzkaXBk8LTy6HzvxizRo6Q+J4SVM7O0hKXfgo1QdI68kpzNULb3EVBXlhTyPUzhkHzzLxECL1qHl3HH2hEv8++C+4wBlsagF3j/O6PABojA==

# 4. 設(shè)置HTTP頭

微信支付商戶API v3要求請求通過HTTP Authorization頭來傳遞簽名。Authorization由認證類型和簽名信息兩個部分組成。

下面我們使用命令行演示如何生成簽名。

1Authorization: 認證類型 簽名信息

具體組成為:

  1. 認證類型,目前為WECHATPAY2-SHA256-RSA2048

  2. 簽名信息

    • 發(fā)起請求的商戶(包括直連商戶、服務(wù)商或渠道商)的商戶號mchid
    • 商戶API證書序列號serial_no,用于聲明所使用的證書,注意這里是商戶API證書而不是平臺證書,請勿混用,如果不知道如何查看API證書序列號,可參考文檔文末的常見問題。
    • 請求隨機串nonce_str,和你上面構(gòu)造簽名串的隨機串要保持一致
    • 時間戳timestamp,和你上面構(gòu)造簽名串的時間戳要保持一致
    • 簽名值signature,上面算出來的簽名值

提示

注意:以上五項簽名信息,無順序要求。

Authorization頭的示例如下:(注意,示例因為排版可能存在換行,實際數(shù)據(jù)應(yīng)在一行)

1Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900007291",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="gEuexJ547PHFV77TQ6eiE4tphVYfWfUe1Wc2dBmVnoMYU2rl/M4zhw+b3vBhuMw6AC7pteNkryLA7UWU2h+umo0OdSuuLm1++O3NckQPCSfm6dypsjn4GYm84KMqXWFrhFmyxEwIdEJDr3w1UYfxOcu55OQupfLkrt/ZzuOspnliJFrPzGQFUk7lGqMMtpz3EfbDUNxnVsHblORg3hVmuYNmbGWnS2ovU30Y2Q+iKFDxzkaXBk8LTy6HzvxizRo6Q+J4SVM7O0hKXfgo1QdI68kpzNULb3EVBXlhTyPUzhkHzzLxECL1qHl3HH2hEv8++C+4wBlsagF3j/O6PABojA==",timestamp="1554208460",serial_no="408B07E79B8269FEC3D5D3E6AB8ED163A6A380DB"
alt text

最終我們可以組一個包含了簽名的HTTP請求了。

(1)請注意第六行的body參數(shù)必須在一行,不能換行,因為簽名計算簽名時body就是以一行來計算簽名的,這里發(fā)起請求時需要和簽名時的保持一致

(2)請注意Authorization的timestamp="1554208460",serial_no="408B07E79B8269FEC3D5D3E6AB8ED163A6A380DB"必須和你計算簽名是傳入的值是一致的

(3)此處只是一個示例,用于大家參考計算的格式,由于示例密鑰本身是不可用的,因此以下請求并不真正可用

1curl -X POST \
2 https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi \
3 -H 'Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900007291",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="gEuexJ547PHFV77TQ6eiE4tphVYfWfUe1Wc2dBmVnoMYU2rl/M4zhw+b3vBhuMw6AC7pteNkryLA7UWU2h+umo0OdSuuLm1++O3NckQPCSfm6dypsjn4GYm84KMqXWFrhFmyxEwIdEJDr3w1UYfxOcu55OQupfLkrt/ZzuOspnliJFrPzGQFUk7lGqMMtpz3EfbDUNxnVsHblORg3hVmuYNmbGWnS2ovU30Y2Q+iKFDxzkaXBk8LTy6HzvxizRo6Q+J4SVM7O0hKXfgo1QdI68kpzNULb3EVBXlhTyPUzhkHzzLxECL1qHl3HH2hEv8++C+4wBlsagF3j/O6PABojA==",timestamp="1554208460",serial_no="408B07E79B8269FEC3D5D3E6AB8ED163A6A380DB"' \
4 -H 'Accept: application/json' \
5 -H 'Content-Type: application/json' \
6 -d '{"appid":"wxd678efh567hg6787","mchid":"1230000109","description":"Image形象店-深圳騰大-QQ公仔","out_trade_no":"1217752501201407033233368018","notify_url":"https://www.weixin.qq.com/wxpay/pay.php","amount":{"total":100,"currency":"CNY"},"payer":{"openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"}}'

# 5、常見問題請參考

# (1)簽名驗簽常見問題詳見簽名驗證常見問題

# (2)以下演示body有多個參數(shù)時,如何以多行來計算簽名并且發(fā)起請求

# 1.構(gòu)造簽名串

依然以JSAPI下單接口為例,前四步保持不變,

第五步,獲取請求中的請求報文主體(request body)。

將參數(shù)以多行計算簽名,對應(yīng)發(fā)起請求的時候body參數(shù)也要是多行。即你計算簽名時body是怎么樣的,你發(fā)起請求時body就應(yīng)該是怎么樣的。

1{
2"appid":"wxd678efh567hg6787",
3"mchid":"1230000109",
4"description":"Image形象店-深圳騰大-QQ公仔",
5"out_trade_no":"1217752501201407033233368018",
6"notify_url":"https://www.weixin.qq.com/wxpay/pay.php",
7"amount":{"total":100,"currency":"CNY"},
8"payer":{"openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"}
9}

第六步,按照前述規(guī)則,構(gòu)造的請求簽名串如下,每一行的結(jié)尾以\n(換行符,ASCII編碼值為0x0A)結(jié)束,包括最后一行。如果參數(shù)本身以\n結(jié)束,也需要附加一個\n

1POST\n
2/v3/pay/transactions/jsapi\n
31554208460\n
4593BEC0C930BF1AFEB40B4A08C8FB242\n
5{\n
6"appid":"wxd678efh567hg6787",\n
7"mchid":"1230000109",\n
8"description":"Image形象店-深圳騰大-QQ公仔",\n
9"out_trade_no":"1217752501201407033233368018",\n
10"notify_url":"https://www.weixin.qq.com/wxpay/pay.php",\n
11"amount":{"total":100,"currency":"CNY"},\n
12"payer":{"openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"}\n
13}\n

# 2.計算簽名值

絕大多數(shù)編程語言提供的簽名函數(shù)支持對簽名數(shù)據(jù)進行簽名。強烈建議商戶調(diào)用該類函數(shù),使用商戶私鑰對待簽名串進行SHA256 with RSA簽名,并對簽名結(jié)果進行Base64編碼得到簽名值。

請注意處理單雙引號轉(zhuǎn)義問題,第二行的外層是單引號,則里面的參數(shù)不需要轉(zhuǎn)義,如果第二行最外層使用了雙引號,則body參數(shù)的雙引號都需要轉(zhuǎn)義

1$ echo -n -e \
2'POST\n/v3/pay/transactions/jsapi\n1554208460\n593BEC0C930BF1AFEB40B4A08C8FB242\n{\n"appid":"wxd678efh567hg6787",\n"mchid":"1230000109",\n"description":"Image形象店-深圳騰大-QQ公仔",\n"out_trade_no":"1217752501201407033233368018",\n"notify_url":"https://www.weixin.qq.com/wxpay/pay.php",\n"amount":{"total":100,"currency":"CNY"},\n"payer":{"openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"}\n}\n' \
3 | openssl dgst -sha256 -sign apiclient_test_key.pem \
4 | openssl base64 -A

得出的簽名值如下,你可以用一些校驗工具校驗?zāi)阃ㄟ^命令行或者你的代碼得到的簽名值是否和以下值一樣,一樣則表示計算過程無誤,如果不一致則請檢查簽名的參數(shù)是否一致、簽名串是否有嚴格換行等

1E7pP5rphKguQ29ql13Vxt2+lumoZxvV44SU5vTij9YeK6qdf9/iIKVGCH+XjZZl/ov2HS0BGHmXFzrP7IwLMknPWlmB8MHnTHz4vUpONUGcOboN++SDTaFLp+wbFOzp+qH3bFGpjJc5MRpUCpuGobVfP2/hXICyYOfkd/xtdCdFUwdkJI8cuGgLJvOw36X3y+6WIz1sTfrTrioNswbTot12h3zEI7waLVlneJ0V93zHAIyCD3RX36iee6wnA2bI1xYgGDM7AgEWuqAHx5lljo0uD7UyxnkJIoqfFrwLeR5Fg0PnAM9Ue0vlAfMgIkMmJjNdMo6PmiXcjRmuEky6f7g==

# 3.設(shè)置HTTP頭

1Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900007291",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="E7pP5rphKguQ29ql13Vxt2+lumoZxvV44SU5vTij9YeK6qdf9/iIKVGCH+XjZZl/ov2HS0BGHmXFzrP7IwLMknPWlmB8MHnTHz4vUpONUGcOboN++SDTaFLp+wbFOzp+qH3bFGpjJc5MRpUCpuGobVfP2/hXICyYOfkd/xtdCdFUwdkJI8cuGgLJvOw36X3y+6WIz1sTfrTrioNswbTot12h3zEI7waLVlneJ0V93zHAIyCD3RX36iee6wnA2bI1xYgGDM7AgEWuqAHx5lljo0uD7UyxnkJIoqfFrwLeR5Fg0PnAM9Ue0vlAfMgIkMmJjNdMo6PmiXcjRmuEky6f7g==",timestamp="1554208460",serial_no="408B07E79B8269FEC3D5D3E6AB8ED163A6A380DB"

# 4.發(fā)起請求

再次說明你計算簽名時body是怎么樣的,你發(fā)起請求時body就應(yīng)該是怎么樣的,因為這里計算簽名時body是多行的,發(fā)起請求時body也應(yīng)該是嚴格一致的

1curl -X POST \
2 https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi \
3 -H 'Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900007291",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="gEuexJ547PHFV77TQ6eiE4tphVYfWfUe1Wc2dBmVnoMYU2rl/M4zhw+b3vBhuMw6AC7pteNkryLA7UWU2h+umo0OdSuuLm1++O3NckQPCSfm6dypsjn4GYm84KMqXWFrhFmyxEwIdEJDr3w1UYfxOcu55OQupfLkrt/ZzuOspnliJFrPzGQFUk7lGqMMtpz3EfbDUNxnVsHblORg3hVmuYNmbGWnS2ovU30Y2Q+iKFDxzkaXBk8LTy6HzvxizRo6Q+J4SVM7O0hKXfgo1QdI68kpzNULb3EVBXlhTyPUzhkHzzLxECL1qHl3HH2hEv8++C+4wBlsagF3j/O6PABojA==",timestamp="1554208460",serial_no="408B07E79B8269FEC3D5D3E6AB8ED163A6A380DB"' \
4 -H 'Accept: application/json' \
5 -H 'Content-Type: application/json' \
6 -d '{
7"appid":"wxd678efh567hg6787",
8"mchid":"1230000109",
9"description":"Image形象店-深圳騰大-QQ公仔",
10"out_trade_no":"1217752501201407033233368018",
11"notify_url":"https://www.weixin.qq.com/wxpay/pay.php",
12"amount":{"total":100,"currency":"CNY"},
13"payer":{"openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"}
14}'