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

簽名相關(guān)問題

更新時(shí)間:2023.04.28

# 如何在程序中加載私鑰

推薦使用微信支付提供的SDK。你也可以查看下列編程語言的示例代碼。

示例代碼

# 1. 為什么請(qǐng)求返回401 Unauthorized?

請(qǐng)根據(jù)報(bào)文中的message信息,在下表中找到錯(cuò)誤的原因和對(duì)應(yīng)的解決方案。

錯(cuò)誤描述 原因 解決方案
商戶未設(shè)置APIv3密鑰。 商戶未設(shè)置APIv3密鑰 請(qǐng)登錄商戶平臺(tái)設(shè)置APIv3密鑰
商戶未申請(qǐng)過證書。 商戶未申請(qǐng)過API證書 請(qǐng)參考什么是商戶API證書?如何獲取商戶API證書? (opens new window)
商戶證書序列號(hào)有誤。 使用了錯(cuò)誤的商戶證書,或者使用了已經(jīng)失效的歷史的商戶證書,或者獲取的商戶證書序列號(hào)有誤 請(qǐng)檢查商戶證書序列號(hào),登錄商戶平臺(tái)【API安全】->【API證書】->【查看證書】,可查看商戶API證書序列號(hào)。
商戶證書已過期。 使用了已經(jīng)過期的商戶證書和私鑰 請(qǐng)到商戶平臺(tái)重新申請(qǐng)證書后,使用新申請(qǐng)的證書
商戶證書已作廢。 使用了商戶主動(dòng)作廢的商戶證書和私鑰 請(qǐng)到商戶平臺(tái)重新申請(qǐng)證書后,使用新申請(qǐng)的證書
錯(cuò)誤的簽名,導(dǎo)致驗(yàn)簽失敗。 使用了錯(cuò)誤的商戶私鑰,或簽名串構(gòu)造不正確 請(qǐng)見下一問題
HTTP頭Authorization值格式錯(cuò)誤 缺少 Authorization頭,或其格式不正確 請(qǐng)檢查上送的 Authorization
HTTP頭Authorization認(rèn)證類型不正確 不支持 Authorization中聲明的簽名算法 請(qǐng)檢查上送的 Authorization,目前僅支持WECHATPAY2-SHA256-RSA2048
HTTP頭Authorization中的timestamp與發(fā)起請(qǐng)求的時(shí)間不得超過5分鐘 Authorization頭中的時(shí)間戳timestamp所示時(shí)間距離當(dāng)前時(shí)間超過5分鐘 請(qǐng)檢查系統(tǒng)時(shí)間是否準(zhǔn)確,或者獲取時(shí)間的邏輯是否正確
已更換證書,請(qǐng)使用新證書 商戶主動(dòng)重新申請(qǐng)了商戶API證書 請(qǐng)使用新申請(qǐng)的商戶API證書

# 2. 如何定位“錯(cuò)誤的簽名,導(dǎo)致驗(yàn)簽失敗”的錯(cuò)誤?

為了方便商戶定位簽名問題,微信支付對(duì)于驗(yàn)簽失敗的請(qǐng)求,會(huì)在應(yīng)答的錯(cuò)誤詳情detail中加入驗(yàn)簽信息。

  • method,HTTP請(qǐng)求方法
  • url,請(qǐng)求的URL
  • truncated_sign_message,微信支付驗(yàn)簽時(shí)使用的簽名串(換行符顯示成\n)。為了方便查看,我們對(duì)最后的請(qǐng)求報(bào)文主體做了截?cái)?/li>
  • sign_message_length,微信支付驗(yàn)簽時(shí)使用的簽名串的字節(jié)長度
1{
2"code": "SIGN_ERROR",
3"message": "錯(cuò)誤的簽名,驗(yàn)簽失敗",
4"detail": {
5 "field": "signature",
6 "issue": "sign not match",
7 "location": "authorization",
8 "sign_information": {
9 "method": "GET",
10 "url": "/payscore/user-service-state?service_id=500001&appid=wxeaf7bf1de621b0c2&openid=oWm9Z5JQwgV7BKAQUeKsUMVSjTpQ",
11 "truncated_sign_message": "GET\n/payscore/user-service-state?service_id=500001&appid=wxeaf7bf1de621b0c2&openid=oWm9Z5JQwgV7BKAQUeKsUMVSjTpQ\n1559194069\n18a427e78d2344e1a71156a2690cc4d6\n\n",
12 "sign_message_length": 157
13 }
14}
15}

建議商戶開發(fā)者在程序中輸出自行組裝的簽名串及其字節(jié)長度,并將其與微信支付返回的驗(yàn)簽信息進(jìn)行詳細(xì)對(duì)比。以下是一些常見的錯(cuò)誤:

# 簽名串的最后一行沒有附加換行符

  • 如果請(qǐng)求報(bào)文主體為空(如GET請(qǐng)求),最后一行應(yīng)為一個(gè)換行符。

# 簽名串中的參數(shù),跟實(shí)際請(qǐng)求的參數(shù)不一致

  • 手工拼接的URL,和實(shí)際請(qǐng)求發(fā)送的不一致。我們建議的實(shí)現(xiàn)是,使用HTTP庫構(gòu)造請(qǐng)求對(duì)象或者URL對(duì)象,再使用相應(yīng)的方法取得URL。
  • 簽名和設(shè)置Authorization頭時(shí),使用了前后生成的兩個(gè)時(shí)間戳。
  • 簽名和設(shè)置Authorization頭時(shí),使用了前后生成的兩個(gè)不同的隨機(jī)串。
  • 簽名和請(qǐng)求時(shí),使用了前后兩次序列化的JSON串作為請(qǐng)求主體。

注意

商戶的開發(fā)者可以將關(guān)鍵參數(shù)生成并保存在變量中,簽名和發(fā)送請(qǐng)求時(shí)統(tǒng)一使用,避免前后生成的信息不一致。

# 文本的編碼不一致

生成簽名串使用了非UTF-8編碼或者未設(shè)置具體編碼。

# 構(gòu)建簽名串順序不對(duì)

構(gòu)建簽名串沒有按照文檔要求的順序進(jìn)行構(gòu)建。

# 使用了錯(cuò)誤的商戶私鑰

開發(fā)者可以使用如下的openssl命令檢查私鑰和商戶證書中的modulus(p、q兩個(gè)大素?cái)?shù)的乘積)是否一致。如果兩者一致,那么私鑰和證書是成對(duì)的。

1$ openssl x509 -noout -modulus -in 1900009191_20180326_cert.pem
2Modulus=C6D43C87B991...
3$ openssl rsa -noout -modulus -in 1900009191_20180326_key.pem
4Modulus=C6D43C87B991...

注意

  1. modulus長度為2048位,輸出為512個(gè)字節(jié)。
  2. 檢查密鑰匹配前,請(qǐng)先查看證書序列號(hào),檢查是否是正確的商戶證書。

# 3. 為什么微信支付的回調(diào)缺少簽名的幾個(gè)HTTP頭?

微信支付的回調(diào),在HTTP頭部包含了以下四個(gè)HTTP頭:

  • Wechatpay-Timestamp
  • Wechatpay-Nonce
  • Wechatpay-Signature
  • Wechatpay-Serial

某些代理服務(wù)器或CDN服務(wù)提供商,轉(zhuǎn)發(fā)時(shí)會(huì)“過濾”微信支付擴(kuò)展的HTTP頭,會(huì)導(dǎo)致驗(yàn)簽的應(yīng)用層無法取到微信支付的簽名信息。遇到這種情況時(shí),建議商戶調(diào)整代理服務(wù)器配置,或者通過直連的方式接受微信支付的回調(diào)。