#接口安全說明
API簽名算法
**第一步**
除上傳的附件和數組參數外,其他請求參數內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意以下重要規則:
◆ 參數名ASCII碼從小到大排序(字典序);
◆ 如果參數的值為空不參與簽名;
◆ 參數名區分大小寫;
◆ 傳送的fwSignstr 參數不參與簽名,將生成的簽名與該fwSignstr 值作校驗。
**第二步**
在stringA最后拼接上key得到stringSignTemp字符串,并對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換為大寫,得到fwSignstr值signValue。
**示例如下:**
假設傳送的參數如下:
~~~
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
~~~
第一步:對參數按照key=value的格式,并按照參數名ASCII字典序排序如下:
~~~
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
~~~
第二步:拼接API密鑰:
~~~
stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key為商戶平臺設置的密鑰key
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5簽名方式
sign=hash_hmac("sha256",stringSignTemp,key).toUpperCase()="6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6" //注:HMAC-SHA256簽名方式
~~~
最終得到最終發送的數據:
~~~
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
fwSignstr: 9A0A8659F005D6984697E2CA0A9CF3B7
~~~
**微信支付API接口協議中包含字段nonce_str,主要保證簽名不可預測。我們推薦生成隨機數算法如下:調用隨機數函數生成,將得到的值轉換為字符串。**
*****
**簽名原理同微信**:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3
*****
**終端安全說明**
1.訪問API方式為POST;
2.訪問API必須加簽名;
3.簽名密鑰長度必須在50位及以上;**(推薦1024或2048位,使用openssl工具生成)**
4.任意涉及用戶信息的接口都要驗證用戶Token是否有效;
5.屏蔽惡意點擊操作;
6.使用TLS證書;
*****
**服務器端接口安全說明**
1.僅支持POST方式接收數據;
2.終端每次請求接口都必須驗簽;
3.簽名密鑰長度必須在50位及以上;**(推薦1024或2048位,使用openssl工具生成)**
4.任意涉及用戶信息的接口必須驗證用戶Token是否有效;
5.過濾1分鐘內惡請求的IP;
6.必須驗簽在線支付回調通知的數據;(驗證簽名及訂單金額)
7.用戶Token必須定時過期;
8.H5網頁以GET方式驗簽(或加密URL后綴參數);
9.使用TLS證書;