公共传递参数

参数名

类型

必选

描述

app_id

string


调用方身份ID,接口提供方用此来识别调不同的调用者,该参数是API基本规范的一部分,请详见API公共规范。

sign_type

string


签名类型:MD5,RSA2

sign

string

是 

一次接口调用的签名值,服务器端 “防止 伪装请求/防篡改/ 防重发” 识别的重要依据。

timestamp

Int

时间戳(long Timestamp = DateTime.Now.Ticks;)

 

method

string


/user/info.json

 

1.筛选并排序

获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除sign字段,剔除值为空的参数,并按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。

2.拼接

将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。

 

3.调用签名函数

使用各自语言对应的SHA256WithRSA(对应sign_type为RSA2)或SHA1WithRSA(对应sign_type为RSA)签名函数利用商户私钥对待签名字符串进行签名,并进行Base64编码。

4.把生成的签名赋值给sign参数,拼接到请求参数中。

 

 

后端代码可以增加一个时间戳的时效性判断,比如时间戳必须是当前时间的前后半小时内(可与token的过时机制一致,如果涉及到资金,可能还要缩短时间限制,并且在业务上还要做调整,比如转账,先生成一个转账订单,然后再发起一个转账请求,判断是否已转账,这样可以防止重复提交攻击,如果是app,还可以增加登录会话中提交有效),这样可以防止重复提交攻击。

 

 每次请求目标接口前,先使用签名的方法,获取一个验证码(基于会话,这个验证码在服务端的会话中,是一个指定的变量,同一会话,都是从这个变量中取),然后把这个验证码加入到目标接口参数中;因为验证码用过后就会换一个,目标接口请求完后,验证码失效,请求失败,可防止重复提交攻击。