微信支付接口開發(fā)的安全規(guī)范
來源:原創(chuàng) 時間:2017-10-31 瀏覽:0 次1、簽名算法------(簽名校驗工具)
簽名生成的通用步驟如下:
第一步,設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意以下重要規(guī)則:
-
◆ 參數(shù)名ASCII碼從小到大排序(字典序);
-
◆ 如果參數(shù)的值為空不參與簽名;
-
◆ 參數(shù)名區(qū)分大小寫;
-
◆ 驗證調(diào)用返回或微信主動通知簽名時,傳送的sign參數(shù)不參與簽名,將生成的簽名與該sign值作校驗。
-
◆ 微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉(zhuǎn)換為大寫,得到sign值signValue。
key設(shè)置路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置
舉例:
假設(shè)傳送的參數(shù)如下:
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
第一步:對參數(shù)按照key=value的格式,并按照參數(shù)名ASCII字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接API密鑰:
stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"
最終得到最終發(fā)送的數(shù)據(jù):
<xml>
<appid>wxd930ea5d5a258f4f</appid>
<mch_id>10000100</mch_id>
<device_info>1000<device_info>
<body>test</body>
<nonce_str>ibuaiVcKdpRxkhJA</nonce_str>
<sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>
</xml>
2、生成隨機數(shù)算法
微信支付API接口協(xié)議中包含字段nonce_str,主要保證簽名不可預測。我們推薦生成隨機數(shù)算法如下:調(diào)用隨機數(shù)函數(shù)生成,將得到的值轉(zhuǎn)換為字符串。
3、商戶證書
(1)獲取商戶證書
微信支付接口中,涉及資金回滾的接口會使用到商戶證書,包括退款、撤銷接口。商家在申請微信支付成功后,收到的相應郵件后,可以按照指引下載API證書,也可以按照以下路徑下載:微信商戶平臺(pay.weixin.qq.com)-->賬戶中心-->賬戶設(shè)置-->API安全-->證書下載 。證書文件有四個,分別說明如下:
表4.2:證書文件說明
證書附件 | 描述 | 使用場景 | 備注 |
---|---|---|---|
pkcs12格式 (apiclient_cert.p12、 |
包含了私鑰信息的證書文件,為p12(pfx)格式,由微信支付簽發(fā)給您用來標識和界定您的身份 | 撤銷、退款申請API中調(diào)用 | windows上可以直接雙擊導入系統(tǒng),導入過程中會提示輸入證書密碼,證書密碼默認為您的商戶ID(如:10010000) |
以下兩個證書在PHP環(huán)境中使用:
證書附件 | 描述 | 使用場景 | 備注 |
---|---|---|---|
CA證書 (rootca.pem) |
微信支付api服務(wù)器上也部署了證明微信支付身份的服務(wù)器證書,您在使用api進行調(diào)用時也需要驗證所調(diào)用服務(wù)器及域名的真實性 | 該文件為簽署微信支付證書的權(quán)威機構(gòu)的根證書,可以用來驗證微信支付服務(wù)器證書的真實性 | 部分工具已經(jīng)內(nèi)置了若干權(quán)威機構(gòu)的根證書,無需引用該證書也可以正常進行驗證,這里提供給您在未內(nèi)置所必須根證書的環(huán)境中載入使用 |
證書pem格式 (apiclient_cert.pem) |
從apiclient_cert.p12中導出證書部分的文件,為pem格式,請妥善保管不要泄漏和被他人復制 | PHP等不能直接使用p12文件,而需要使用pem,為了方便您使用,已為您直接提供 | 您也可以使用openssl命令來自己導出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem |
證書密鑰pem格式 (apiclient_key.pem) |
從apiclient_key.pem中導出密鑰部分的文件,為pem格式 | PHP等不能直接使用p12文件,而需要使用pem,為了方便您使用,已為您直接提供 | 您也可以使用openssl命令來自己導出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem |
(2)使用商戶證書
-
◆ apiclient_cert.p12是商戶證書文件,除PHP外的開發(fā)均使用此證書文件。
-
◆ 商戶如果使用.NET環(huán)境開發(fā),請確認Framework版本大于2.0,必須在操作系統(tǒng)上雙擊安裝證書apiclient_cert.p12后才能被正常調(diào)用。
-
◆ 商戶證書調(diào)用或安裝都需要使用到密碼,該密碼的值為微信商戶號(mch_id)
-
◆ PHP開發(fā)環(huán)境請使用商戶證書文件apiclient_cert.pem和apiclient_key.pem ,rootca.pem是CA證書。
各版本的調(diào)用實例請參考微信支付提供的Demo外鏈。
(3)商戶證書安全
證書文件不能放在web服務(wù)器虛擬目錄,應放在有訪問權(quán)限控制的目錄中,防止被他人下載。商戶服務(wù)器要做好病毒和木馬防護工作,不被非法侵入者竊取證書文件。
4、商戶回調(diào)API安全
在普通的網(wǎng)絡(luò)環(huán)境下,HTTP請求存在DNS劫持、運營商插入廣告、數(shù)據(jù)被竊取,正常數(shù)據(jù)被修改等安全風險。商戶回調(diào)接口使用HTTPS協(xié)議可以保證數(shù)據(jù)傳輸?shù)陌踩?。所以微信支付建議商戶提供給微信支付的各種回調(diào)采用HTTPS協(xié)議。請參考:HTTPS搭建指南。