密钥方式接入
文档的阅读次序,建议先阅读一遍开发指南重点阅读接口公共参数说明、接口摘要(sign)生成、接口请求参数内容(content)的生成。然后就可以独立查看各个功能块文档说明。
接口说明格式如下:
请求方式:GET/POST
请求地址:{domain}/track/listen?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明: ...
返回结果: ...
返回参数说明: ...
请求地址 ,参数中{}中的变量,表示为需要替换的变量,根据实际获取值更新
接口公共参数说明
服务端所有的GET请求接口统一传参要求如下表格
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
appKey | string | 是 | 接口调用方身份标识 |
timestamp | long | 是 | 接口请求时间戳(毫秒级) |
sign | string | 是 | 各接口的请求参数经一定规则生成的摘要 |
content | string | 是 | 各接口的请求参数经一定规则生成的内容 |
version | int | 是 | 各接口版本,如各接口未说明,传1所有接口请求失效时间1分钟 |
接口摘要的主要作用是为了校验调用方的摘要生成规则是否正确
服务端会将调用方传过来的加密内容content解密后,拿到请求参数进行sign生成并与调用方传过来的sign值进行比对
生成规则:根据各接口说明文档的传参说明,将各个接口需要传递的参数放到Map结构中,并按照Map中的key进行排序,然后将参数的key和value拼接成Get请求的参数形式,进行MD5加密,生成sign
以下为java生成sign代码参考
public String sort(Map params) {
List<Map.Entry<String, Object>> argList = new LinkedList<Map.Entry<String,Object>>();
argList.addAll(params.entrySet());
Collections.sort(argList, Map.Entry.comparingByKey());
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, Object> item : argList) {
String key = item.getKey();
String val = String.valueOf(item.getValue());
if (!(val == "" || val == null)) {
sb.append(key + "=" + val + "&");
}
}
return SecureUtil.md5(sb.toString());
}
以下为给定具体参数生成的sign值示例,调式时可以以此为参考
假设请求接口为 /track/link
给定歌曲uid:Tsb7hqAIZ
给定系统当前时间戳:1652336117133
则生成的sign值为:ea838de5a1c23c1eae0583688b288c1d
接口请求参数内容(content)的生成
服务端会根据调用方的身份查询配置给调用方的私钥对传过来的content进行解密,从而获取到调用接口的请求参数
生成规则:根据各接口说明文档的传参说明,将各个接口需要传递的参数放到Map结构中,将放到map后的参数转换为json字符串,开发者根据给到的私钥(appSecret)对请求参数进行AES加密,之后进行base64得到content
以下为java生成content代码参考
import org.apache.tomcat.util.buf.HexUtils;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
/**
* requestParamsJson 转换为json字符串的请求参数
*/
public String encrypt(String requestParamsJson, String appSecret) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
byte[] bs = HexUtils.fromHexString(appSecret);
Key key = new SecretKeySpec(bs,"AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] p = requestParamsJson.getBytes("UTF-8");
byte[] result = cipher.doFinal(p);
String content = Base64Encoder.encode(result);
return content;
}
以下为给定具体参数生成的content值示例,调式时可以以此为参考
假设请求接口为 /track/link
给定歌曲uid:Tsb7hqAIZ
给定系统当前时间戳:1652336117133
给定的密钥: 25f12398d9f99adc27128734804b7721
那么入参requestParamsJson的值为{"uid":"Tsb7hqAIZ","timestamp":1652336117133}
appSecret的值为25f12398d9f99adc27128734804b7721时
则生成的content值为:CCo+rDCB3hx9KQN/grgdk277xW9GAjJweANzvkQpqmLZfZOFp0pYq3YQaszmaIod
接口调用流程
查看调用接口的请求参数
生成接口摘要(sign)
生成接口请求参数内容(content)
调用具体的业务API接口
修改于 2024-02-01 11:51:33