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

如何生成請求簽名

更新時間:2023.04.28

我們提供了微信支付API v3官方SDK(目前包含Java (opens new window)PHP (opens new window)Go (opens new window)三種語言版本),使用官方 SDK 調(diào)用微信支付接口,無需關(guān)心簽名生成和驗證,接入更方便。

商戶可以按照下述步驟生成請求的簽名。在本節(jié)的最后,我們準(zhǔn)備了多種常用編程語言的演示代碼供開發(fā)者參考。

微信支付API v3 要求商戶對請求進(jìn)行簽名,微信支付會在收到請求后進(jìn)行簽名的驗證。如果簽名驗證不通過,微信支付API v3將會拒絕處理請求,并返回401 Unauthorized。

# 1. 準(zhǔn)備

商戶需要擁有一個微信支付商戶號,并通過超級管理員賬號登錄商戶平臺,獲取商戶API證書。 商戶API證書的壓縮包中包含了簽名必需的私鑰和商戶證書。

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

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

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

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

我們通過在命令行中調(diào)用"獲取微信支付平臺證書"接口,一步一步向開發(fā)者介紹如何進(jìn)行請求簽名。按照接口文檔,獲取商戶平臺證書的URL為https://api.mch.weixin.qq.com/v3/certificates,請求方法為GET,沒有查詢參數(shù)。

第一步,獲取HTTP請求的方法(GET,POST,PUT)等

1GET

第二步,獲取請求的絕對URL,并去除域名部分得到參與簽名的URL。如果請求中有查詢參數(shù),URL末尾應(yīng)附加有'?'和對應(yīng)的查詢字符串。

1/v3/certificates

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

1$ date +%s
21554208460

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

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

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

  • 請求方法為GET時,報文主體為空。
  • 當(dāng)請求方法為POST或PUT時,請使用真實發(fā)送的JSON報文。
  • 圖片上傳API,請使用meta對應(yīng)的JSON報文。

對于下載證書的接口來說,請求報文主體是一個空串。

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

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

# 3. 計算簽名值

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

1$ echo -n -e \
2 "GET\n/v3/certificates\n1554208460\n593BEC0C930BF1AFEB40B4A08C8FB242\n\n" \
3 | openssl dgst -sha256 -sign apiclient_key.pem \
4 | openssl base64 -A
5 uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==

# 4. 設(shè)置HTTP頭

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

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

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

具體組成為:

  1. 認(rèn)證類型,目前為WECHATPAY2-SHA256-RSA2048
  2. 簽名信息
    • 發(fā)起請求的商戶(包括直連商戶、服務(wù)商或渠道商)的商戶號mchid
    • 商戶API證書序列號serial_no,用于聲明所使用的證書
    • 請求隨機(jī)串nonce_str
    • 時間戳timestamp
    • 簽名值signature

提示

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

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

1Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900009191",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==",timestamp="1554208460",serial_no="1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C"

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

1$curl https://api.mch.weixin.qq.com/v3/certificates -H 'Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900009191",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==",timestamp="1554208460",serial_no="1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C"'

# 5 演示代碼

開發(fā)者可以查看SDK相關(guān)章節(jié),獲取對應(yīng)語言的庫。如何在程序中加載私鑰,請參考證書和密鑰常見問題

計算簽名的示例代碼如下。

示例代碼

如果您的請求返回了簽名錯誤401 Unauthorized,請參考簽名常見問題

反饋
咨詢
目錄