文档中心 通用协议 公共参数

公共参数

   关爱通开放平台接口请求参数包括:公共参数和私有参数,公共参数一样,具体如下表所示。

 (请求参数请注意空字符串和null是两种情况,请不要混淆)

参数名称 是否必须 参数类型 长度限制 描述
access_token string [32] 授权访问凭证,由token生成接口生成。此token有效期一小时,token接口每小时有调用次数限制,请注意缓存。
sign string [40] SHA1签名/RSA签名,见签名机制
timestamp string [10] 时间戳,其值为1970-1-01 00:00:00.000到当前时刻的时间距离,单位是秒,时区为GMT+8(东八区)。如1469691921。关爱通接口允许的时间戳偏差为5分钟,偏差超过5分钟的请求将被拒绝。
grant_type string 17 固定值:client_credential
version string 5 业务接口版本号,如1.0.0

签名机制

SHA1签名示例

把appsecret加入到接口的请求参数中,对参数名进行字典升序排列,把参数名和参数值直接拼接起来,对拼接形成的字符串进行SHA1计算,计算结果的小写即为签名参数sign的值。

签名生成的具体步骤为:

 1、将颁发的appsecret加入到请求参数中;

 2、对请求参数(包含appsecret)的key(参数名)进行字典升序排列;

 3、以&拼接排好序的参数,参数的形式为key=value(key和value去除首尾空格);

 4、计算步骤3生成结果的SHA1值,该值的小写即为签名参数sign的值。

注:

 1、签名时的所有参数,无须urlencode;

 2、请勿将appsecret参与到http请求传递中,它是双方保管的密钥,一旦泄露,请申请更换。

 3、编码统一使用UTF-8;

 4、key和value的首尾请不要有空格,不然容易出现签名错误。

示例1: token生成接口的sign参数生成示例
假设请求参数信息为:
grant_type:client_credential
appid:30000003
timestamp:1469691921
假设颁发的appsecret为:f4cc82386a1cdddcc98e4f53b1115a62

签名参数sign生成步骤:
1、将颁发的appsecret加入到请求参数中。加入appsecret的参数信息为:
grant_type:client_credential
appid:30000003
timestamp:1469691921
appsecret:f4cc82386a1cdddcc98e4f53b1115a62

2、对请求参数(包含appsecret)的key(参数名)进行字典升序排列。排好序的参数信息依次为:
appid:30000003
appsecret:f4cc82386a1cdddcc98e4f53b1115a62
grant_type:client_credential
timestamp:1469691921

3、以&拼接排好序的参数,参数的形式为key=value。拼接结果为:
appid=30000003&appsecret=f4cc82386a1cdddcc98e4f53b1115a62&
grant_type=client_credential&
timestamp=1469691921

4、计算步骤3生成结果的SHA1值,该值即为签名参数sign的值。步骤3的结果appid=30000003&
appsecret=f4cc82386a1cdddcc98e4f53b1115a62&
grant_type=client_credential&
timestamp=1469691921的SHA1值37215380cf57d3b19b3ca537ed6dbc3fda98552e即为sign的值。
即:sign=sha1(appid=30000003&
appsecret=f4cc82386a1cdddcc98e4f53b1115a62&
grant_type=client_credential&
timestamp=1469691921)
					
示例2:Content-Type:application/x-www-form-urlencoded的业务接口的sign参数生成示例
假设,接口的业务参数为:
key1:value1
key2:value2
key3:value3
系统参数为:
access_token: efab39effde9a19f08ba9717cd22a6f91b400bb0
timestamp:1469691921
version:1.0.0
颁发的appsecret为:f4cc82386a1cdddcc98e4f53b1115a62
则接口sign的生成步骤为:
1、将颁发的appsecret加入到请求参数中。加入appsecret的参数信息为:
key1:value1
key2:value2
key3:value3
access_token: efab39effde9a19f08ba9717cd22a6f91b400bb0
timestamp:1469691921
version:1.0.0
appsecret:f4cc82386a1cdddcc98e4f53b1115a62

2、对请求参数(包含appsecret)的key(参数名)进行字典升序排列。排好序的参数信息依次为:
access_token: efab39effde9a19f08ba9717cd22a6f91b400bb0
appsecret:f4cc82386a1cdddcc98e4f53b1115a62
key1:value1
key2:value2
key3:value3
timestamp:1469691921
version:1.0.0

3、以&拼接排好序的参数,参数的形式为key=value。拼接结果为:
access_token=efab39effde9a19f08ba9717cd22a6f91b400bb0&
appsecret=f4cc82386a1cdddcc98e4f53b1115a62&
key1=value1&key2=value2&key3=value3&
timestamp=1469691921&version=1.0.0

4、计算步骤3生成结果的SHA1值,该值即为签名参数sign的值。
sign=sha1(access_token=efab39effde9a19f08ba9717cd22a6f91b400bb0&
appsecret=f4cc82386a1cdddcc98e4f53b1115a62&
key1=value1&key2=value2&key3=value3&
timestamp=1469691921&version=1.0.0)
示例3:Content-Type:application/json的业务接口的sign参数生成示例
请求方式为POST,请求body为json字符串的接口,参数sign由接口的系统参数和_body=“接口业务参数”的键值对生成,示例如下:
假设,接口业务参数为:
	[{"dept_Code":"爱情部4","parent_code":"","name":"xmg测试","status":"1"}]
系统参数为:
access_token: efab39effde9a19f08ba9717cd22a6f91b400bb0
timestamp:1469691921
appsecret:f4cc82386a1cdddcc98e4f53b1115a62
version:1.0.0
则接口sign的生成步骤为:
1、将颁发的appsecret加入到请求参数中。加入appsecret的参数信息为:
access_token: efab39effde9a19f08ba9717cd22a6f91b400bb0
timestamp:1469691921
appsecret:f4cc82386a1cdddcc98e4f53b1115a62
version:1.0.0
_body:[{"dept_Code":"爱情部4","parent_code":"","name":"xmg测试","status":"1"}]

2、对请求参数(包含appsecret)的key(参数名)进行字典升序排列。排好序的参数信息依次为:
_body:[{"dept_Code":"爱情部4","parent_code":"","name":"xmg测试","status":"1"}]
access_token: efab39effde9a19f08ba9717cd22a6f91b400bb0
appsecret:f4cc82386a1cdddcc98e4f53b1115a62
timestamp:1469691921
version:1.0.0

3、以&拼接排好序的参数,参数的形式为key=value。拼接结果为:
_body=[{"dept_Code":"爱情部4","parent_code":"","name":"xmg测试","status":"1"}]&
access_token=efab39effde9a19f08ba9717cd22a6f91b400bb0&appsecret=f4cc82386a1cdddcc98e4f53b1115a62&
timestamp=1469691921&version=1.0.0

4、计算步骤3生成结果的SHA1值,该值即为签名参数sign的值。
sign=sha1(_body=[{"dept_Code":"爱情部4","parent_code":"","name":"xmg测试","status":"1"}]&
access_token=efab39effde9a19f08ba9717cd22a6f91b400bb0&appsecret=f4cc82386a1cdddcc98e4f53b1115a62&
timestamp=1469691921& version=1.0.0)
                    

RSA签名示例

将请求的参数名进行字典升序排列,把参数名和参数值直接拼接起来,对拼接形成的字符串+自己的私钥 调用rsa签名算法(SHA256WithRSA)生成 sign值。

签名生成的具体步骤为:

 1、准备自己保留的rsa私钥;

 2、对请求参数进行字典升序排列;

 3、以&拼接排好序的参数,参数的形式为key=value(key和value去除首尾空格);

 4、计算步骤3生成结果+自己的私钥 调用rsa签名算法(SHA256WithRSA)生成 sign值

注:

 1、签名时的所有参数,无须urlencode;

 2、编码统一使用UTF-8;

 3、key和value的首尾请不要有空格,不然容易出现签名错误。

4、rsa签名算法:SHA256WithRSA 加密前的明文最大长度247字节,解密密文最大长度为256字,秘钥长度为2048

5、对于不传值的字段或传值为空串的字段均不参与签名计算

示例1: token生成接口的sign参数生成示例
签名参数sign生成步骤:
1、假设私钥如下:
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC13p104FbV3jMxN7p2i50Jyl2KESj8Q8plxNhiX9hwvGxubiyBS88Da5CagKr30eKjKYMRuETDVcKvMxy7FJWnDnMviGd/pUHXHHAsd1/fwAvYzAUUCk2lDXxnIwXF7JWGN0/FmceWmSvFdABPhDlYyLKW0gs4IB+BawcMawuf44MjxhgnNuTaC7mcw0P1A+5eZ0UhJS26ll+1aZZOp6H1EGsXe0UtRorWW660irx1zSxq3u0m3VWODcLvZW/eQd3SvAEi+npvR0s+MCyyKxk8KHnbOjDBMJuggjCaVCC2HLJWcoLqVTo+6gcDvpdlUtVnq0AFaxU6YX/+/0O36GLvAgMBAAECggEBALQxheZ4I/Ewf54jLg8oUwaRR051pBsVe6KLfy0w83z3Y6Oia1wL5WbpG1PJahuyC5BHoAJdhVvYS9VUmgHN6lyjl4Kf7pPtA6gDGC0mdYp2eAZsVhe+AaIoE3sImz64IonhoZsRu0u+JT00qt4eDselyjRelhkc0rpidZBbOyBFGk4V+TN6lcsNrs470SRfqsOqevcYlrI+eOSkFv/pohDr6bu7eDGncJ4DoH+o4OF0ixK2qQZFZhvKfYRIbQgNKwkg4Zq0M14/oGlQ6X05sph83inNjHCqUnTRfi1Ytid6M3uil6lPpEdzkNQF9RK3u2MywDJgkbpgAsa4MxeoNUkCgYEA3DX10heLRr3FdQIJunnO7MOi1lxpKWX+kB8+aoXbWm0zOFvrauW6OtmaP9HJgAad/Erk8ijmEwXFqLnptS2PHvhd7KtJIGqgmkBslurtxHFkWOiY7xSN2OqhYZxl+X6R8sO0ijCYBPM4UGEUQ8bcXbADbIz/+SK0A/y99NU7WBMCgYEA021wnXQRUGGL9edumJWXWBkq64sPnXNuR5/M4AhdYFK1Amoax5dnx6oyujvy9AA8bcj1Ry18xaLnNaxm5U2YHAaJM029uxrjEo6igArnhtyEel6W1uTniZcxlUIZ1p1/jDr4JneUEMugNR8CbgwJw5BhLKheScldR/DhaC5nHTUCgYByfRd+EEGYGOgFKncWXWgIzrnliwwduup70dKonUlrHSUpIxklbaTCHgpFLfP+PPJ8jg+0GzFrKHAYhfgM+0/SwTxL5M3TLbysFdyfJitSG8YZN2zzuBL7eRlIX4DhEz4cIkXGJveSc0WO/LoFdulxSCavlCstQy6meAvms8nzwwKBgDtSNYq4CjOXawGv0aQWNMSPKy+zcMoonQSTnZQuRKTGD+uBgcoGfSPUaS8/qsczWcEj5U33QU7iiiTRHn2v68HRQ6WVZmqc/KE0S/vJE3UPYkxDRec9iolcVpkeVsmUnzjlQsLoQi8EMws0jCX8UrEATYOOKgZh7T5GI7hrbJsRAoGAIugfwe/6+80obuQZJsXFNA+2SUxvQD0I2AavXN5Z1GIgQOElewWPGpv4FhAWZY3xSThMnR1TopYyaPJGnugJFV5Gj1ytMl2+F2gSuPUdUr7gOxy5qzasi8Rc5WyMjxcxld9pNB2M0j2Z/nZX903N9c/TUt8NGUuOciCbEW/69dw=

请求参数:
grant_type:client_credential
appid:20110842
timestamp:1570700485

2、对请求参数的key(参数名)进行字典升序排列。排好序的参数信息依次为:
appid:20110842
grant_type:client_credential
timestamp:1570700485

3、以&拼接排好序的参数,参数的形式为key=value。拼接结果为:
appid=20110842&grant_type=client_credential×tamp=1570700485

4、计算步骤3生成结果data +自己的私钥privateKey调用rsa签名函数生成 sign值
生成签名如下:
log2ck+9BrMcIXnN2EMIC8290+RKqNAP/v/gT9nlISnq9zEhEgVlPT6rR0G9zcrMaT8e7c7uYDrOcTpdeBtCnuxEovhsdMFV8Qm534OVeNrQwb5v4pn1rcw24pBcO1nXR7y8ci1lCh1oENxyTkn9M+ThRldkJLvIdzIzUT0JTKmhpD3BtDwzNWo0kLouyV991IFHtDx6QPkbBY4m1yaqhzcj4P6acZZzQnRSyw8WiOett9CpHThH+qC41Vu3I63scSK9GpHrlGQ5Pk9em8fRCYj4g9HSFIguj1XSFpU6zLFrdPOuQQASfBr0PK/YnE19gyJ/DhK9391NKofV2iXdow==

签名代码如下:
public static String sign(String data, PrivateKey privateKey) throws Exception {
    byte[] keyBytes = privateKey.getEncoded();
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PrivateKey key = keyFactory.generatePrivate(keySpec);
    Signature signature = Signature.getInstance("SHA256WithRSA");
    signature.initSign(key);
    signature.update(data.getBytes());
    return new String(Base64.encodeBase64(signature.sign()));
}
public static PrivateKey getPrivateKey(String privateKey) throws Exception {
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
    return keyFactory.generatePrivate(keySpec);
}