4 數字簽名

為了保證數據傳輸過程中的數據真實性和完整性,我們需要對數據進行數字簽名,在接收簽名數據之後進 行簽名校驗。 數字簽名有兩個步驟,先按一定規則拼接要簽名的原始串,再選擇具體的演算法和密鑰計算出簽名結果。 一般失敗的結果不簽名.

4.1 簽名原始串

無論是請求還是應答,簽名原始串按以下方式組裝成字串:

1、除 sign 字段外,所有參數按照字段名的 ascii 碼從小到大排序後使用 QueryString 的格式(即 key1=value1&key2=value2…)拼接而成,空值不傳遞,不參與簽名組串。

2、簽名原始串中,字段名和字段值都採用原始值,不進行 URLEncode。

3、平臺返回的應答或通知消息可能會由於升級增加參數,請驗證應答簽名時注意允許這種情況

舉例:

調用某個接口,接口有如下字段:

<xml> 
<body><![CDATA[測試支付]]></body> 
<mch_create_ip><![CDATA[127.0.0.1]]></mch_create_ip> 
<mch_id><![CDATA[7551000001]]></mch_id> 
<nonce_str><![CDATA[1409196838]]></nonce_str> 
<notify_url><![CDATA[http://227.0.0.1:9001/javak/]]></notify_url> 
<out_trade_no><![CDATA[141903606228]]></out_trade_no> 
<service><![CDATA[pay.weixin.native]]></service> <sign><![CDATA[77979B4EA45CAF9A8E2E1A90F0F0E61B]]></sign> 
<total_fee><![CDATA[1]]></total_fee> 
</xml> 

正確的簽名字段排序為:

body=測試支付&mch_create_ip=127.0.0.1&mch_id=7551000001&nonce_str=
1409196838&notify_url=http://227.0.0.1:9001/javak/&out_trade_no=
141903606228&service=pay.weixin.native&tot al_fee=1

4.2 簽名演算法

目前只支持 MD5。

MD5 是一種摘要生成演算法,通過在簽名原始串後加上商戶通信密鑰的內容,進行MD5運算,形成的摘要字串即為簽名結果。為了方便比較,簽名結果統一轉換為大寫字元。注意:簽名時將字串轉化成位元組流時指定的編碼字元集應與參數 charset 一致。

MD5 簽名計算公式:

sign = Md5(原字串&key=商戶密鑰). toUpperCase

如:假設以下為 XML 傳入參數:

<xml> 
<body><![CDATA[測試支付]]></body> 
<mch_create_ip><![CDATA[127.0.0.1]]></mch_create_ip> 
<mch_id><![CDATA[7551000001]]></mch_id> 
<nonce_str><![CDATA[1409196838]]></nonce_str> 
<notify_url><![CDATA[http://227.0.0.1:9001/javak/]]></notify_url> 
<out_trade_no><![CDATA[141903606228]]></out_trade_no> 
<service><![CDATA[pay.weixin.native]]></service> 
<sign><![CDATA[77979B4EA45CAF9A8E2E1A90F0F0E61B]]></sign> 
<total_fee><![CDATA[1]]></total_fee>
</xml>
假設商戶密鑰為:9d101c97133837e13dde2d32a5054abb 

i:經過 a 過程 URL 鍵值對字典序排序後的字串 string1 為: 
body=測試支付 &mch_create_ip=127.0.0.1&mch_id=7551000001&nonce_str=1409196838&notify_url=
http://227.0.0.1:9001/javak/&out_trade_no=141903606228&service=pay.weixin.native&total_fee=1

ii:經過 b 過程後得到 sign 為: 
sign=md5(string1&key=9d101c97133837e13dde2d32a5054abb).toUpperCase 
=md5(body=測試支付&mch_create_ip=127.0.0.1&mch_id=7551000001&nonce_str=1409196838&notify_url=
http://227.0.0.1:9001/javak/&out_trade_no=141903606228&service=pay.weixin.native&total_fee=	
1&key=9d101c97133837e13dde2d32a5054abb).toUpperCase()="77979B4EA45CAF9A8E2E1A90F0F0E61B"