众包系统接口调用流程
接入椿耀平台
椿耀平台分发以下数据,作为请求的握手凭证
access_key: 接入身份标识 shipper_code: 注册公司标识 secret: 密钥,例 mUPNIDoUbsXcQF9Qtm3UnA==
公共参数
公共参数是调用任何API都需传入的参数,目前支持的公共参数有:
名称 | 类型 | 是否必须 | 描述 |
---|---|---|---|
access_key | String | 是 | 接入身份标识 |
shipper_code | String | 是 | 注册公司标识 |
sign | String | 是 | API参数签名结果,签名算法参照后续介绍 |
timestamp | String | 是 | 客户系统发起请求的时间戳(单位毫秒),例 1467883065579。 |
业务参数
API调用除了必须包含公共参数外,如果API本身有业务级的参数也必须传入,每个API的业务级参数请考API文档说明。
调用流程
1、生成签名摘要。参与生成签名摘要的参数有 shipper_code, access_key, timestamp,业务参数。 2、加密。 需要加密的参数有 shipper_code,业务参数。
签名算法
为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,签名大体过程如下:
-
对所有API请求参数(包括公共参数和业务参数,不包括sign参数),根据参数名称的ASCII码表的倒序排序。如:foo=1, bar=2, foo_bar=3, foobar=4排序后的顺序是foobar=4,foo_bar=3, foo=1, bar=2
-
将排序好的参数名和参数值拼装在一起,根据上面的示例得到的结果为: foobar4foo_bar3foo1bar2
-
拼接好的字符串必须采用 UTF-8 编码,并在其前后拼接 secret 密钥后,再进行信息摘要。信息摘要使用MD5算法。 如:
MD5(secret + foobar4foo_bar3foo1bar2 + secret )
- 将摘要得到的字节流结果以16进制表示。MD5使用128位长度算法,使用16进制表示后,签名的固定长度为32个16进制字符。
代码示例
JAVA :
// 第一步:参数逆序处理
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys, Collections.reverseOrder());
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
query.append(secret);// 前后拼接密钥
for (String key : keys) {
String value = params.get(key);
if (StringUtils.areNotEmpty(key, value)){
query.append(key).append(value);
}
}
query.append(secret);// 前后拼接密钥
// 第三步:使用MD5加密 commons-codec库
byte[] bytes = Md5Crypt.md5Crypt(query.toString().getBytes("UTF-8"));
// 第四步:把二进制转化为大写的十六进制字符
String sign = Hex.encodeHexString(bytes).toUpperCase();
调用示例
具体步骤如下:
1. 准备参数值
公共参数:
- access_key = "gsh56123456"
- shipper_code = "hjabc"
- timestamp = "1467883065579"
2. ASCII 逆序排列
- timestamp = "1467883065579"
-
shipper_code = "hjabc"
- access_key = "gsh56123456"
3. 参数拼接
- 拼接结果:timestamp1467883065579shipper_codehjabcplate粤A11111noGSH201703011232amount2500access_keygsh56123456
4. 生成签名
-
String sign = HEX(MD5( secret + "timestamp1467883065579shipper_codehjabcplate粤A11111noGSH201703011232amount2500access_keygsh56123456" + secret ))
- 最终签名值为 66987CB115214E59E6EC978214934FB8
5. shipper_code和业务参数加密
- 注:access_key, timestamp, sign 不要加密
- 采用AES加密标准
- AES用户密钥由平台生成发放给客户
-
// 用户密钥 String secret = "mUPNIDoUbsXcQF9Qtm3UnA=="; // 业务参数JSON串 String json = "{no:'GSH201703011232',plate:'粤A11111',amount:'2500'}"; String shipper_code = "hjabc"; // AES加密,得到业务密文 javax.crypto库 String ciphertext1 = AES.encypt(json,secret); String ciphertext2 = AES.encypt(shipper_code,secret);
5. 发起HTTP请求
所有参数和值使用UTF-8编码后,通过POST发送请求 http传,放到body键值对拼接的形式