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

body參數(shù)為空的,如何計(jì)算簽名

更新時(shí)間:2024.08.22

為了方便大家理解,我們將使用測(cè)試的一對(duì)公私鑰,通過(guò)命令行形式調(diào)用"獲取微信支付平臺(tái)證書(shū) (opens new window)"接口,一步一步介紹如何請(qǐng)求方法為GET,請(qǐng)求參數(shù)里不帶Path參數(shù)(路徑參數(shù))或Query參數(shù)(查詢參數(shù)),如何計(jì)算簽名。強(qiáng)烈建議你使用測(cè)試的公私鑰,按照本文實(shí)際操作一下,如果算出來(lái)的簽名和文檔的一致則說(shuō)明計(jì)算無(wú)誤。實(shí)際業(yè)務(wù)中請(qǐng)?zhí)鎿Q為你的真實(shí)的參數(shù)。

# 1. 準(zhǔn)備

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

商戶號(hào):1900007291

證書(shū)序列號(hào):408B07E79B8269FEC3D5D3E6AB8ED163A6A380DB

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

-----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ù)開(kāi)發(fā)人員按照當(dāng)前文檔約定的規(guī)則構(gòu)造簽名串。微信支付會(huì)使用同樣的方式構(gòu)造簽名串。如果商戶構(gòu)造簽名串的方式錯(cuò)誤,將導(dǎo)致簽名驗(yàn)證不通過(guò)。下面先說(shuō)明簽名串的具體格式。

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

1HTTP請(qǐng)求方法\n
2URL\n
3請(qǐng)求時(shí)間戳\n
4請(qǐng)求隨機(jī)串\n
5請(qǐng)求報(bào)文主體\n

以獲取微信支付平臺(tái)證書(shū)接口為例,

第一步,獲取HTTP請(qǐng)求的方法

1GET

第二步,獲取請(qǐng)求的絕對(duì)URL,請(qǐng)注意需要去除域名部分。如果請(qǐng)求中有查詢參數(shù),URL末尾應(yīng)附加有'?'和對(duì)應(yīng)的查詢字符串。

1/v3/certificates

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

1$ date +%s
21554208460

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

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

第五步,獲取請(qǐng)求中的請(qǐng)求報(bào)文主體(request body)。

對(duì)于下載證書(shū)的接口來(lái)說(shuō),請(qǐng)求報(bào)文主體是一個(gè)空串,只需要附加一個(gè)\n即可。

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

1GET\n
2/v3/certificates\n
31554208460\n
4593BEC0C930BF1AFEB40B4A08C8FB242\n
5\n

# 3. 計(jì)算簽名值

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

1$ echo -n -e \
2 'GET\n/v3/certificates\n1554208460\n593BEC0C930BF1AFEB40B4A08C8FB242\n\n' \
3 | openssl dgst -sha256 -sign apiclient_test_key.pem \
4 | openssl base64 -A

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

1JNEITrKv8DWEtBJGZtxG9ARa+eIZDIn1Ht3MQM5j9jP77TtHdfCqLjpwevfWftBuaGMfEdiu2sWYtLvnZIoLW3FH10OVCBzKncid5xClTwav8JX+uDeGBBX8w64iHvFyuQj8ukZT+F1AFJii8hmXLD8Os90thnL0bfJYLo/4K237TH4dEd44NTH9ElFb/ykrvv9RBs+mCNpy5IUe2Qxhba3d3RiMqhWK2sSr3tsVzQihJ0TPMnjWqoU2W5Y/v3rBFDmLhqe0ZW6A4vyvjmiR0v/8XEI25Py4PNyZXszsdl4j0zLqelUJxGEMUBhYg1LIoDPjYMlA9HV1yKD6+JYZJA==

# 4. 設(shè)置HTTP頭

微信支付商戶API v3要求請(qǐng)求通過(guò)HTTP Authorization頭來(lái)傳遞簽名。Authorization由認(rèn)證類型和簽名信息兩個(gè)部分組成。

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

1Authorization: 認(rèn)證類型 簽名信息

具體組成為:

  1. 認(rèn)證類型,目前為WECHATPAY2-SHA256-RSA2048

  2. 簽名信息

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

提示

注意:以上五項(xiàng)簽名信息,無(wú)順序要求。

Authorization頭的示例如下:(注意,示例因?yàn)榕虐婵赡艽嬖趽Q行,實(shí)際數(shù)據(jù)應(yīng)在一行)

1Authorization: WECHATPAY2-SHA256-RSA2048 mchid="123456789",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="JNEITrKv8DWEtBJGZtxG9ARa+eIZDIn1Ht3MQM5j9jP77TtHdfCqLjpwevfWftBuaGMfEdiu2sWYtLvnZIoLW3FH10OVCBzKncid5xClTwav8JX+uDeGBBX8w64iHvFyuQj8ukZT+F1AFJii8hmXLD8Os90thnL0bfJYLo/4K237TH4dEd44NTH9ElFb/ykrvv9RBs+mCNpy5IUe2Qxhba3d3RiMqhWK2sSr3tsVzQihJ0TPMnjWqoU2W5Y/v3rBFDmLhqe0ZW6A4vyvjmiR0v/8XEI25Py4PNyZXszsdl4j0zLqelUJxGEMUBhYg1LIoDPjYMlA9HV1yKD6+JYZJA==",timestamp="1554208460",serial_no="1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C"
alt text

最終我們可以組一個(gè)包含了簽名的HTTP請(qǐng)求了。

1$curl https://api.mch.weixin.qq.com/v3/certificates -H 'Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900009191",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="JNEITrKv8DWEtBJGZtxG9ARa+eIZDIn1Ht3MQM5j9jP77TtHdfCqLjpwevfWftBuaGMfEdiu2sWYtLvnZIoLW3FH10OVCBzKncid5xClTwav8JX+uDeGBBX8w64iHvFyuQj8ukZT+F1AFJii8hmXLD8Os90thnL0bfJYLo/4K237TH4dEd44NTH9ElFb/ykrvv9RBs+mCNpy5IUe2Qxhba3d3RiMqhWK2sSr3tsVzQihJ0TPMnjWqoU2W5Y/v3rBFDmLhqe0ZW6A4vyvjmiR0v/8XEI25Py4PNyZXszsdl4j0zLqelUJxGEMUBhYg1LIoDPjYMlA9HV1yKD6+JYZJA==",timestamp="1554208460",serial_no="1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C"'

# 5、常見(jiàn)問(wèn)題

簽名驗(yàn)證常見(jiàn)問(wèn)題