#接口安全说明
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证书;