开发指南
开发前必读
开发文档阅读说明
- 服务端API开放了与音频文件相关的获取与通知接口,开发者通过调用相关接口,实现数据接收和数据通知,通过目录导航可以快速预览,目录树按功能块聚合归类,如歌曲接口、标签接口、通知接口等。
- 文档的阅读次序,建议先阅读一遍开发指南重点阅读接口公共参数说明、接口摘要(sign)生成、接口请求参数内容(content)的生成。然后就可以独立查看各个功能块文档说明。
- 接口说明格式如下:
请求方式:GET/POST
请求地址:{domain}/track/listen?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明: ...
返回结果: ...
返回参数说明: ...
- 请求方式,标注接口调用的HTTP方法
- 请求地址 ,参数中{}中的变量,表示为需要替换的变量,根据实际获取值更新
接口公共参数说明
- 服务端所有的GET请求接口统一传参要求如下表格
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
appKey | string | 是 | 接口调用方身份标识 |
timestamp | long | 是 | 接口请求时间戳(毫秒级) |
sign | string | 是 | 各接口的请求参数经一定规则生成的摘要 |
content | string | 是 | 各接口的请求参数经一定规则生成的内容 |
version | int | 是 | 接口版本,如各接口未说明,传1 |
- 所有接口请求失效时间1分钟
接口摘要(sign)生成
- 接口摘要的主要作用是为了校验调用方的摘要生成规则是否正确
- 服务端会将调用方传过来的加密内容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
则生成的content值为:CCo+rDCB3hx9KQN/grgdk277xW9GAjJweANzvkQpqmLZfZOFp0pYq3YQaszmaIod
接口调用流程
- 查看调用接口的请求参数
- 生成接口摘要(sign)
- 生成接口请求参数内容(content)
- 调用具体的业务API接口
接口说明
标签接口(已作废)
标签信息
获取标签信息
请求方式:GET
请求地址:{domain}/tag?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
timestamp | long | 是 | 时间戳,必须与公共参数内的时间戳相等(毫秒级) |
page | int | 否 | 当前页数 |
size | int | 否 | 单页数据条数 |
不传分页参数,返回所有标签
返回结果
{
"msg": "",
"data": {
"total": 914,
"records": [
{
"uid": "WGsyCVLec",
"name": "轻音乐"
}
]
},
"status": 200
}
返回参数说明:
参数 | 类型 | 说明 |
---|---|---|
msg | string | 错误说明 |
data | map | 标签总条数和标签列表详情(见records) |
status | int | 状态码,200为成功 |
records:
参数 | 类型 | 说明 |
---|---|---|
uid | string | 标签uid |
name | string | 标签名称 |
歌曲接口
歌曲试听
获取歌曲试听链接
请求方式:GET
请求地址:{domain}/track/listen?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
timestamp | long | 是 | 时间戳,必须与公共参数内的时间戳相等(毫秒级) |
uid | string | 是 | 歌曲的uid |
返回结果
{
"msg": "",
"data": "https://convert-sh.oss-cn-shanghai.aliyuncs.com/6941331497272/HKC371805341_water_audio.mp3?Expires=1606867233&OSSAccessKeyId=LTAI4G1bA6Jw6CsNyYaP6Rkk&Signature=zG7oIR9MrZ29Oy4mdM3NXeda%2BWU%3D",
"status": 200
}
返回参数说明:
参数 | 类型 | 说明 |
---|---|---|
msg | string | 错误说明 |
data | string | 试听链接 |
status | int | 状态码,200为成功 |
歌曲下载
获取歌曲下载链接
请求方式:GET
请求地址:{domain}/track/link?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
timestamp | long | 是 | 时间戳,必须与公共参数内的时间戳相等(毫秒级) |
uid | string | 是 | 歌曲的uid |
download | int | 否 | 返回链接是否直接下载,默认为0 (0 不直接下载 1 直接下载) |
返回结果
{
"msg": "",
"data": "https://convert-sh.oss-cn-shanghai.aliyuncs.com/6941331497272/HKC371805341_320.mp3?Expires=1660363336&OSSAccessKeyId=LTAI4G1bA6Jw6CsNyYaP6Rkk&Signature=8eW%2BctujbjeOPta3Ye8W%2B9KR87E%3D",
"status": 200
}
返回参数说明:
参数 | 类型 | 说明 |
---|---|---|
msg | string | 错误说明 |
data | string | 下载链接 |
status | int | 状态码,200为成功 |
歌曲搜索
根据不同条件搜索歌曲
请求方式:GET
请求地址:{domain}/track/search?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
timestamp | long | 是 | 时间戳,必须与公共参数内的时间戳相等(毫秒级) |
tags | array<string> | 否 | 标签的uid |
name | string | 否 | 歌曲名称(非模糊搜索) |
page | int | 否 | 当前页数(第一页为0) |
size | int | 否 | 单页数据条数 |
trackUid | array<string> | 否 | 歌曲uid列表 |
type | emuns | 否 | 歌曲类型枚举值例如 MUSIC,查询全部不传此参数 |
歌曲类型枚举值参数说明:
枚举 | 说明 |
---|---|
MUSIC | 音乐 |
SOUND_EFFECT | 音效 |
SAMPLE | 采样 |
BEATS | beats |
LYRICS | 词曲 |
返回结果
{
"msg": "",
"data": {
"total": 1,
"record": [
{
"name": "Samsara",
"uid": "Tsb7hqsIY",
"artist": "[\"Studio Cutz\"]",
"composer": "[\"Josh Crocker\"]",
"lyricist": "[]",
"isrc": "HKC371805341",
"upc": "6941331497272",
"bpm": 119,
"fileSize": 0,
"duration": 121,
"cover": "http://kanjian-library.oss-cn-shanghai.aliyuncs.com/6941331497272/cover.png",
"wavePicUrl": "http://library.kanjian.com/6941331497272/HKC371805341_wave.png",
"tag": [
{
"uid": "HpB7VC2sP",
"name": "长短视频"
},
{
"uid": "LCXNrlKu7",
"name": "摇滚"
}
],
"description": "",
"language": "其他语言"
}
]
},
"status": 200
}
返回参数说明:
参数 | 类型 | 说明 |
---|---|---|
msg | string | 错误说明 |
data | map | 歌曲总条数total以及歌曲属性信息(见record) |
status | int | 状态码,200为成功 |
record:
参数 | 类型 | 说明 |
---|---|---|
name | string | 歌曲名 |
uid | string | 歌曲 UID |
artist | string | 艺人(JSON字符串) |
composer | string | 曲作者(JSON字符串) |
lyricist | string | 词作者(JSON字符串) |
isrc | string | 歌曲唯一编码 |
upc | string | 专辑唯一编码 |
bpm | int | 音乐速度,值越高速度越快 |
fileSize | int | 文件大小 |
duration | int | 时长 |
cover | string | 封面图片 URL |
wavePicUrl | string | 波形图 URL |
tag | array | 歌曲标签数组,标签uid和标签名称(无数据时为空数组,不会为null) |
description | string | 音频的简短描述 |
language | string | 语言 |
通知接口
下载通知
调用方用户每下载一次音频,需要将音频的 uid 发送到此接口,方便我方运营根据统计数据调整运营策略
请求方式:GET
请求地址:{domain}/notice/download?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
timestamp | long | 是 | 时间戳,必须与公共参数内的时间戳相等(毫秒级) |
uid | string | 是 | 歌曲的uid |
返回结果
{
"msg": "",
"data": null,
"status": 200
}
返回参数说明:
参数 | 类型 | 说明 |
---|---|---|
msg | string | 错误说明 |
data | string | 成功默认返回null |
status | int | 状态码,200为成功 |
播放通知
调用方用户每 试听 一次音频,需要将音频的 uid 发送到此接口,方便我方运营根据统计数据调整运营策略
请求方式:GET
请求地址:{domain}/notice/play?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
timestamp | long | 是 | 时间戳,必须与公共参数内的时间戳相等(毫秒级) |
uid | string | 是 | 歌曲的uid |
返回结果
{
"msg": "",
"data": null,
"status": 200
}
返回参数说明:
参数 | 类型 | 说明 |
---|---|---|
msg | string | 错误说明 |
data | string | 成功默认返回null |
status | int | 状态码,200为成功 |
订单通知
调用方用户每购买一次音频,需要将音频的 uid 发送到此接口,方便我方运营根据统计数据调整运营策略
请求方式:GET
请求地址:{domain}/notice/order?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
timestamp | long | 是 | 时间戳,必须与公共参数内的时间戳相等(毫秒级) |
uid | string | 是 | 歌曲的uid |
返回结果
{
"msg": "",
"data": null,
"status": 200
}
返回参数说明:
参数 | 类型 | 说明 |
---|---|---|
msg | string | 错误说明 |
data | string | 成功默认返回null |
status | int | 状态码,200为成功 |
上传统计数据
此接口方便调用方按照固定周期统计下载、播放、订单数据时进行通知调用
请求方式:GET
请求地址:{domain}/notice/statistics?appKey={appKey}&content={content}&sign={sign}×tamp={timestamp}&version={version}
请求参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
timestamp | long | 是 | 时间戳,必须与公共参数内的时间戳相等(毫秒级) |
download | Integer | 否 | 0-非直接获取下载文件 1-直接获取下载文件 不传默认为0 |
play | int | 是 | 播放量 |
orders | int | 是 | 订单量 |
startTime | long | 是 | 此次记录开始时间 |
endTime | long | 是 | 此次记录截止时间 |
返回结果
{
"msg": "",
"data": null,
"status": 200
}
返回参数说明:
参数 | 类型 | 说明 |
---|---|---|
msg | string | 错误说明 |
data | string | 成功默认返回null |
status | int | 状态码,200为成功 |