学习给API加上签名加密验证功能,摘抄了腾讯支付的说明书文档
————————————————————————————————————————————————————————————————
为了提高传输过程参数的防篡改性,必须使用签名参数sig。
- 签名参数sig生成的步骤
第1步: 把需要包含在签名中的参数按key升序排序。 具体需要包含哪些参数,见各接口参数说明中关于sig的描述。
第2步: 把排序后的key和它对应的value拼接成一个字符串。
第3步: 把分配给商家的appkey拼接在第2步得到的字符串后面。
第4步: 计算第3步字符串的md5值,使用md5值的16进制字符串作为sig的内容。
2. 示例
原始请求信息
应用ID:appid=600
商户appkey=4dd1af55f7f140ac8827518472af3d87
原始请求:
http://openapi.pengyou.qq.com/v2/r/qzone/qz_get_balance?
appid=600&
appkey=HWAffC6MK1DQ5ztm&
appname=app600&
device=0&
openid=00000000000000000000000000000009&
openkey=1111111111446414117133E71111111111C50AE4A7111111&
ts=1300444184&
userip=112.90.139.30
查询时需要包含在签名里的参数:appid,appkey,appname,openid,openkey,ts。
下面开始生成sig:
第1步: 将参数按key升序排序
得到:appid,appkey,appname,openid,openkey,ts
第2步: 把所有键值对字符串拼接成一个字符串得到:
appid600appkeyHWAffC6MK1DQ5ztmappnameapp600openid00000000000000000000000000000009
openkey1111111111446414117133E71111111111C50AE4A7111111ts1300444184
第3步: 把分配给商家的appkey拼接在第2步骤得到的字符串后面得到:
appid600appkeyHWAffC6MK1DQ5ztmappnameapp600openid00000000000000000000000000000009
openkey1111111111446414117133E71111111111C50AE4A7111111ts1300444184
HWAffC6MK1DQ5ztm
第4步: 计算第3步骤字符串的md5值
md5
(appid600appkeyHWAffC6MK1DQ5ztmappnameapp600openid00000000000000000000000000000009
openkey1111111111446414117133E71111111111C50AE4A7111111ts1300444184
HWAffC6MK1DQ5ztm)
得到:
sig=eddf71eaa362748beda2cca96a4786ff
加签名后的请求串
http://openapi.pengyou.qq.com/v2/r/qzone/qz_get_balance?
appid=600&
appkey=HWAffC6MK1DQ5ztm&
appname=app600&
device=0&
openid=00000000000000000000000000000009&
openkey=1111111111446414117133E71111111111C50AE4A7111111&
ts=1300444184&
userip=112.90.139.30&
sig=4d7c026abf32d84cc8afb9f36d365e28
FAQ
-
为什么总是返回“1000:请求参数数错误”?
-
生成sig的时候:
(1)第一步中,把device也作为签名的因子了。注意sig生成时具体需要包含哪些参数,见各接口参数说明中关于sig的描述。
(2)第二步中,拼接字符串时,没有将key排序后,再进行key-value字符串拼接。
(3)第二步中,拼接字符串时,把‘=’,‘&’也放签名原串里面了。注意只拼接key和它对应的value。
建议开发者按照API接口示例中的HTTP请求源串自行生成sig,然后和示例中的sig进行比对,如果不同,说明生成过程有误,请按步骤仔细检查,重新生成。 -
测试环境和正式环境下OpenAPI的IP地址是不一样的,测试联调的IP是119.147.19.43,不要联调到正式环境上。
-
如果上述原因都排除,还是出现请求参数错误,请联系腾讯社区开放平台服务团队的支付API技术支持人员,提供同一次请求里面的信息:
(1)HTTP请求源串。
(2)实现签名时,做md5前的原串和md5后的签名。 -
如果参数中包含URI非法字符,是应该先做urlencode,还是先生成签名?
服务后台会先对请求包进行URL解码,再对解码后的sig进行校验,因此请先按照上面的步骤生成sig签名值,然后再对请求进行urlencode。