版权控制
版本号 | 更新内容 | 更新人 | 更新时间 |
Ver1.8 | 更新账号绑定接口说明与内容接入接口说明 | 楼玄 | 2020-09-11 |
Ver1.7 | 增加测试用例 | 炼剑 | 2020-05-08 |
Ver1.6 | 创建订单中增加字段 | 炼剑 | 2020-04-01 |
Ver1.5 | 增加产品说明内容 | 楼玄 | 2020-02-06 |
Ver1.4 | 返回值格式增加统一错误码,增加连续续费会员能力 | 炼剑 | 2020-02-04 |
Ver1.3 | 增加附录,详细举例加密方式,加密相关入参微 | 楼玄 | 2019-10-03 |
Ver1.2 | getAuthCodeByMobile 新增参数,防网络流量重放攻击 | 楼玄 | 2019-09-29 |
Ver1.1 | 更新小程序接口能力 | 楼玄 | 2019-09-25 |
Ver1.0 | 接口文档对外输出 | 楼玄 | 2019-08-01 |
说明:
- 使用app_key和sign进行鉴权。app_key和app_secret双方进行约定,不会进行app_secret的传输,认证除外。
- 返回数据为json格式
- 具体安全验证算法用户可自己设计,例如:每个request 都带上一个时间戳和随机串,然后生成一个签名字段。
- 专辑和商品必须是一一对应。不存在一对多和多对一情况。
- 由于各种原因auth协议存在登陆状态失效到情况,请明确到告知登陆状态失效到错误码,错误码例如:40001,在返回值到json中用code表示,参见附录
- 所有标准GET方法都会进行一次URLEncode,处理时需要注意;oauth相关的接口参数会进行一次URLEncode。
- 请明确提供一个错误码表示登录态错误或token无效,如:40001
- 请提供相关测试用例输出输入和校验结果。测试用例见 附录:测试用例模板
1.天猫精灵账号绑定
1-1 APP绑定登录
概述
采用通用的 OAuth2.0 开放授权协议,可以让 AliGenie 在不获取合作方用户名和密码的前提下,访问用户授权的资源,协议规范可以访问 OAuth2.0 官方网站:https://oauth.net/2/
产品说明:


鉴权流程
(1)AliGenie 在开发商开放平台或者其他第三方平台注册一个应用,获取到相应的 Client id 和 Client secret
(2)AliGenie 应用向开发商 OAuth2.0 服务发起一个授权请求
(3)开发商 OAuth2.0 服务向用户展示一个授权页面,用户可进行登陆授权
(4)用户授权 AliGenie 客户端应用后,进行回跳到 AliGenie 的回调地址上并带上 code 相关参数
(5)AilGenie 回调地址上根据code会去合作方 Oauth 的服务上换取 access_token
(6)通过 access_token,天猫精灵设备控制时通过该 access_token 进行访问合作方的服务
运行流程
OAuth2.0的运行流程

(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,向客户端开放资源。
开放平台配置OAuth2

请求API
(A) 用户打开授权链接进行授权
例:
参数说明:
redirect_uri: AliGenie 平台的回调地址,该地址会加上 AliGenie 的参数进行 urlEncode,所以合作方务必做好参数返回的兼容性
client_id: 在合作方上注册的应用 Id
response_type: 响应方式为 code
state: 表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
注:示例中的链接 API (https://xxx.com/auth/authorize) 为开放平台中的账户授权链接字段。
(B) 通过 code 换取合作方访问令牌
例:
https://XXXXX/token?grant_type=authorization_code&client_id=XXXXX&client_secret=XXXXXX&code=XXXXXXXX
请求方法: POST
参数说明:
client_id: 在合厂商平台上注册的应用 Id
grant_type: 授权类型 authorization_code
client_secret: 在厂商平台上注册应用的 secret
code: 授权登陆后回调 AliGenie 的地址返回的 code
redirect_uri: AliGenie 回调地址
注:示例中的链接 API ( https://XXXXX/token) 为开放平台中的 Access Token Url 字段
通过 code 换取 access_token 响应结构如下(响应格式 application/json):
| 字段 | 类型 | 解释说明 |
| access_token | String | 访问token(响应正确时必传递) |
| refresh_token | String | 进行刷新access_token的刷新token (响应正确时必传递) |
| expires_in | long | 过期时间时长(响应正确时必传递) |
| error | String | 错误响应码 (响应错误时必传递) |
| error_description | String | 错误详情 (响应错误时必传递) |
正常响应:
{ "access_token": "XXXXXX", "refresh_token": "XXXXXX", "expires_in":17600000 }
错误响应:
{ "error":"errorCode", "error_description":"description" }
注: access_token 有效期请设置成 1 天以上(2-3天最佳)
(C) 通过 refresh_token 刷新 access_token(请确保厂商自己的刷新功能是完善的)
例:
请求方法: POST
参数说明:
grant_type:更新access_token的授权方式为refresh_token
client_id: 在厂商平台上注册的应用Id
client_secret:在厂商平台上注册应用的secret
refresh_token: 上一次授权获取的refresh_token
注:示例中的链接API( https://XXXXX/token) 为开放平台中的Access Token Url 字段。
更新 access_token 响应结构如下(响应格式 application/json):
| 字段 | 类型 | 解释说明 |
| access_token | String | 访问token(响应正确时必传递) |
| refresh_token | String | 进行刷新access_token的刷新token (响应正确时必传递) |
| expires_in | long | 过期时间时长(响应正确时必传递) |
| error | String | 错误响应码 (响应错误时必传递) |
| error_description | String | 错误详情 (响应错误时必传递) |
正常响应:
{ "access_token": "XXXXXX", "refresh_token": "XXXXXX", "expires_in":17600000 }
错误响应:
{ "error":"errorCode", "error_description":"description" }
注意事项:
获取 access_token 或者刷新 access_token 出现错误情况时 http response status code 请返回 200 ,接入方的内部异常请接入方自行包装异常信息
1-2 手淘小程序绑定
因淘宝不允许直接打开三方的H5页面,故手淘小程序的绑定登录页是由天猫精灵制作H5页面,用户输入手机号后调用合作伙伴的服务。
产品说明:

技术说明:
运行流程

开放平台配置

请求API
(6) 根据mobile获取auth_code
例:
请求方法: POST
参数说明:
grant_type:auth_code的授权方式为getAuthCodeByMobile
client_id: 在厂商平台上注册的应用Id
client_secret:在厂商平台上注册应用的secret
mobile: 用户的手机号
返回数据:
响应结构如下(响应格式 application/json):
字段 | 类型 | 说明 |
auth_code | String | |
(8) 根据accessToken 获取nickName
例:
https://xxxxx.com/ali/tao/getNickName?access_token=xxxxxxxxx
请求方法: POST
参数说明:
access_token:访问授权的accessToken
返回数据:
响应结构如下(响应格式 application/json):
字段 | 类型 | 说明 |
nickname | String | |
产品说明:


技术说明:标准OAuth2.0协议,acess_token有效期定义为一个月。
- 获取访问令牌:
- http method: GET or POST(建议使用post请求):POST 请求 param 在 body 中;
- Content-Type: application/x-www-form-urlencoded
- Accept: application/json
- response http status code: 不成功返回非 200;
- 入参:
- app_key
- app_secret 换取token接口直接使用app_secret,不要加签
- grant_type 授权模式,固定值"authorization_code"
- code 临时授权码
- redirect_url OAuth2重定向地址
- 返回值
- access_token 标准令牌,以后所有访问中使用access_token进行交互
- expires_in 访问令牌的失效时间,单位s
- refresh_token 刷新令牌,用于刷新访问令牌,永久有效
- user_id 用户在贵公司唯一标示,可用于充值
- nickname 用户昵称信息
请求参数例子:
param:
app_key=XXXXXX&&auth_code=XXXXXXX&grant_type=authorization_code&app_secret=XXXXXXX
正常返回结果(httpResponse.getStatusLine().getStatusCode() == 200):
{
"code": 0,
"data": {
"access_token": "XXXXXXXXXX",
"expires_in": 25927600,
"refresh_token": "XXXXXXX"
},
"msg": ""
}
异常情况:(httpResponse.getStatusLine().getStatusCode() != 200)
{
"code": 501,
"msg": "error message"
}
- 刷新访问令牌:
- http method: POST:POST 请求 param 在 body 中;
- Content-Type: application/x-www-form-urlencoded
- Accept: application/json
- response http status code: 不成功返回非 200;
- 入参:
- app_key
- app_secret 换取token接口直接使用app_secret,不要加签
- grant_type 授权模式,固定值"refresh_token"
- refresh_token 刷新令牌参数,从获取访问令牌中返回,永久有效
- redirect_uri OAuth2回调地址
- 返回值
- access_token 标准令牌,以后所有访问中使用access_token进行交互
- expires_in 访问令牌的失效时间,单位s
- refresh_token 刷新令牌,用于刷新访问令牌
请求参数例子:
param:
app_key=XXXXXXX&grant_type=refresh_token&refresh_token=XXXXX&app_secret=XXXXXX
正常返回结果(httpResponse.getStatusLine().getStatusCode() == 200):
{
"code": 0,
"data": {
"access_token": "XXXXXXXXXX",
"expires_in": 25927600,
"refresh_token": "XXXXXXX"
},
"msg": ""
}
2.获取用户信息
2-1 获取用户基本信息
产品说明:

技术说明:
HTTP method: GET
参数:
- 入参:
- app_key
- access_token
- request_id
- timestamp
- sign
- 返回值
- code 错误码,公共参数,参考附录
- msg 错误信息,公共参数,参考附录
- data 返回结果,公共参数,参考附录
- id 用户唯一标志id,充值时可根据此字段进行索引并查到
- nickname 用户nick
- is_vip 是否vip
- vip_expired vip过期时间,Unix毫秒数时间戳
http://xxxx.com/api/getUserInfo?app_key=xxx&access_token=xxxxx&request_id=xxx×tamp=xxx&sign=xxx { "code":0, "msg":"", "data": { "id":"fdasfeafdasfeafew", "nickname":"xxx", "is_vip":"false", "vip_expired":"" } }
测试用例
变量:access_token
2.1.1 token错误
输入:错误或过期的token
输出:{ "code":40001, "msg":"token无效或过期,需要重新登录"}
2.1.2 非VIP用户
输入:非VIP用户的token
输出:
{ "code":0, "msg":"", "data": { "id":"fdasfeafdasfeafew", "nickname":"xxx", //请检查nickname与贵公司nickname的一致性 "is_vip":"false", //false "vip_expired":"" //空 } }
2.1.3 VIP用户
输入:VIP用户的token
输出:
{ "code":0, "msg":"", "data": { "id":"fdasfeafdasfeafew", "nickname":"xxx", //请检查nickname与贵公司nickname的一致性 "is_vip":"true", //true "vip_expired":"1651977303000" //大于当前时间,且未13位时间戳 } }
2-2 获取用户订阅(收藏信息):
产品说明:

技术说明:
HTTP method: GET
参数:
- 入参:
- app_key 公共参数,参考附录
- access_token 公共参数,参考附录
- request_id 公共参数,参考附录
- timestamp 公共参数,参考附录
- sign 公共参数,参考附录
- page_size 分页大小
- cur_page 当前页,从1开始
- 返回值
- code 错误码,公共参数,参考附录
- msg 错误信息,公共参数,参考附录
- data 返回结果,公共参数,参考附录
- total_count 总数
- list 信息列表
- id 专辑ID
- album_title 专辑title
- cover_url 封面图
- timestamp 更新时间,Unix毫秒数时间戳
- announcer_nick 主播nick
- is_paid 是否付费 true
http://xxxx.com/api/getSubscribeAlbum?app_key=xxx&access_token=xxxxx&request_id=xxx×tamp=xxx&page_size=10&cur_page=1&sign=xxx { "code":0, "msg":"", "data": { "total_count": 83, "list": [ { "id":"专辑ID" "album_title": "", "cover_url": "" "timestamp": "", "announcer_nick":"", "is_paid":true } ] } }
测试用例:
变量:access_token
2.2.1 token错误
输入:错误或过期的token
输出:{ "code":40001, "msg":"token无效或过期,需要重新登录"}
2.2.2 用户收藏为空
输入:收藏为空的用户token
输出:
{ "code":0, "msg":"", "data": { "total_count": 0, //检验总个为0 "list": [] } }
2.2.3 用户收藏不为空
输入:收藏非空的用户token
输出:
{ "code":0, "msg":"", "data": { "total_count": 83, //请校验数量 "list": [ { "id":"123" "album_title": "这是一个专辑名", //请校验专辑名 "cover_url": "xxxxx.img" //请校验封面点击可访问 "timestamp": "", //13位时间戳 "announcer_nick":"xxxxx", //请校验需要显示的主播名 "is_paid":true //请校验是否是付费内容 true/false } ] } }
2-3 获取已购专辑信息,包括单篇购买内容所在专辑
产品说明:

技术说明:
HTTP method: GET
参数:
- 入参:
- app_key 公共参数,参考附录
- access_token 公共参数,参考附录
- request_id 公共参数,参考附录
- timestamp 公共参数,参考附录
- sign 公共参数,参考附录
- page_size 分页大小
- cur_page 当前页,从1开始
- 返回值
- code 错误码,公共参数,参考附录
- msg 错误信息,公共参数,参考附录
- data 返回结果,公共参数,参考附录
- total_count 总数
- list 信息列表
- id 专辑id
- album_title 专辑title
- cover_url 封面图
- timestamp 更新时间,Unix毫秒数时间戳
- announcer_nick 主播nick
- is_paid 是否付费,此处为true
- sell_mode 1-单篇售卖;2-整本售卖
http://xxxx.com/api/getBoughtAlbum?app_key=xxx&access_token=xxxxx&request_id=xxx×tamp=xxx&page_size=10&cur_page=1&sign=xxx { "code":0, "msg":"", "data": { "total_count": 83, "list": [ { "id":"专辑ID" "album_title": "", "cover_url": "" "timestamp": "", "announcer_nick":"", "is_paid":true, "sell_mode":"1" } ] } }
测试用例:
变量:access_token
2.3.1 token错误
输入:错误或过期的token
输出:{ "code":40001, "msg":"token无效或过期,需要重新登录"}
2.3.2 用户已购专辑为空
输入:已购专辑为空的用户token
输出:
{ "code":0, "msg":"", "data": { "total_count": 0, //检验总个为0 "list": [] } }
2.3.3 用户已购专辑非空
输入:已购专辑非空的用户token
输出:
{ "code":0, "msg":"", "data": { "total_count": 12, //请校验数量 "list": [ { "id":"123" "album_title": "这是一个专辑名", //请校验专辑名 "cover_url": "xxxxx.img" //请校验封面点击可访问 "timestamp": "", //13位时间戳 "announcer_nick":"xxxxx", //请校验需要显示的主播名 "is_paid":true //请校验是否是付费内容 true/false "sell_mode":"2" //请校验售卖类型的准确性 } ] } }
2.3.4 用户单独购买专辑中的内容(如果贵公司存在此种售卖模式)
输入:单独购买专辑中的内容的用户token
输出:
{ "code":0, "msg":"", "data": { "total_count": 12, //请校验单独购买专辑中的内容时,在已购专辑中会进行透出 "list": [ { "id":"123" "album_title": "这是一个专辑名", //请校验专辑名 "cover_url": "xxxxx.img" //请校验封面点击可访问 "timestamp": "", //13位时间戳 "announcer_nick":"xxxxx", //请校验需要显示的主播名 "is_paid":true //请校验是否是付费内容 true/false "sell_mode":"1" //请校验售卖模式,1表示可以单独购买专辑中的内容 } ] } }
2-4 获取用户是否已经购买专辑
产品说明:

技术说明:
HTTP method: GET
参数:
- 入参:
- app_key 公共参数,参考附录
- access_token 公共参数,参考附录
- request_id 公共参数,参考附录
- timestamp 公共参数,参考附录
- sign 公共参数,参考附录
- ids 专辑id 列表,上限为30
- 返回值 List
- code 错误码,公共参数,参考附录
- msg 错误信息,公共参数,参考附录
- data 返回结果,公共参数,参考附录
- list
- id 专辑id
- bought_status true/false 说明:如果传入的id是无效id,返回false,请不要报错
http://xxxx.com/api/getAlbumBoughtStatus?app_key=xxx&access_token=xxxxx&request_id=xxx×tamp=xxx&ids=111,222,333&sign=xxx { "code":0, "msg":"", "data": { "list": [ { "id":"专辑ID" "bought_status": "true", } ] } }
测试用例:
变量:access_token、ids
2.4.1 token错误
输入:错误或过期的token
输出:{ "code":40001, "msg":"token无效或过期,需要重新登录"}
2.4.2 用户购买过专辑
输入:
ids=<已购的专辑id>,<未购买的专辑id>,<错误的专辑id> 请根据实际情况进行替换<>之间的值
输出:
{ "code":0, "msg":"", "data": { "list": [ //请确认是按照传入顺序返回的,个数也对等 { "id":"<已购的专辑id>" //请根据实际情况进行替换<>之间的值,已购 "bought_status": "true", //请校验 true }, { "id":"<未购买的专辑id>" //请根据实际情况进行替换<>之间的值,未购 "bought_status": "false", //请校验 false }, { "id":"<错误的专辑id>" //请根据实际情况进行替换<>之间的值,不正确的专辑id "bought_status": "false", //请校验 false } ] } }
2-5 获取用户是否已经购买声音(用于单篇购买)
产品说明:

技术说明:
HTTP method: GET
参数:
- 入参:
- app_key 公共参数,参考附录
- access_token 公共参数,参考附录
- request_id 公共参数,参考附录
- timestamp 公共参数,参考附录
- sign 公共参数,参考附录
- ids 内容id列表,上限为30
- 返回值 List
- code 错误码,公共参数,参考附录
- msg 错误信息,公共参数,参考附录
- data 返回结果,公共参数,参考附录
- list
- id 内容id
- bought_status true/false 说明:如果传入的id是无效id,返回false,请不要报错
http://xxxx.com/api/getContentBoughtStatus?app_key=xxx&access_token=xxxxx&request_id=xxx×tamp=xxx&ids=111,222,333&sign=xxx { "code":0, "msg":"", "data": { "list": [ { "id":"专辑ID" "bought_status": "true", } ] } }
测试用例:
变量:access_token、ids
2.5.1 token错误
输入:错误或过期的token
输出:{ "code":40001, "msg":"token无效或过期,需要重新登录"}
2.5.2 用户购买过专辑
输入:
ids=<已购的内容id>,<未购买的内容id>,<错误的内容id> 请根据实际情况进行替换<>之间的值
输出:
{ "code":0, "msg":"", "data": { "list": [ //请确认是按照传入顺序返回的,个数也对等 { "id":"<已购的内容id>" //请根据实际情况进行替换<>之间的值,已购 "bought_status": "true", //请校验 true }, { "id":"<未购买的内容id>" //请根据实际情况进行替换<>之间的值,未购 "bought_status": "false", //请校验 false }, { "id":"<错误的内容id>" //请根据实际情况进行替换<>之间的值,不正确的内容id "bought_status": "false", //请校验 false } ] } }
3.内容资源拉取与说明
3-1 接入文档
音频内容接入文档:https://open.taobao.com/api.htm?docId=52000&docType=2
3-2 付费内容变更说明

3-3 专辑结构说明

3-4 试听设置说明

4.会员自动续订业务(根据实际需要进行提供)
产品说明:

技术说明:
- 用户是否可以开通连续自动续费服务:
说明:如果不提供此服务仅校验在天猫精灵是否开通了自动续费服务,此接口不需要登陆态token
HTTP method: GET
参数:
- 入参:
- app_key 公共参数,参考附录
- request_id 公共参数,参考附录
- timestamp 公共参数,参考附录
- sign 公共参数,参考附录
- user_id 用户唯一标志符,即获取oauth2.0令牌环时返回的用户user_id
- 返回值 List
- code 错误码,公共参数,参考附录
- msg 错误信息,公共参数,参考附录
- data 返回结果,公共参数,参考附录
- status 1-可开通 2-不可开通
- 用户是否可享受自动续费的首月优惠
说明:如果不提供此服务仅校验在天猫精灵是否享受过此优惠,此接口不需要登陆态token
HTTP method: GET
参数:
- 入参:
- app_key 公共参数,参考附录
- request_id 公共参数,参考附录
- timestamp 公共参数,参考附录
- sign 公共参数,参考附录
- user_id 用户唯一标志符,即获取oauth2.0令牌环时返回的用户user_id
- 返回值 List
- code 错误码,公共参数,参考附录
- msg 错误信息,公共参数,参考附录
- data 返回结果,公共参数,参考附录
- status 1-可开通 2-不可开通
5.创建订单
产品说明:

技术说明:
HTTP method: POST
参数:
- 入参:
- app_key 公共参数,参考附录
- access_token 公共参数,参考附录
- request_id 公共参数,参考附录
- timestamp 公共参数,参考附录
- sign 公共参数,参考附录
- item_type 1.分集购买付费声音, 2.整张购买付费专辑。3会员
- ids 专辑id 列表,单篇内容可以列表,整本专辑不能批量,如果是会员,这里是会员商品ID
- order_id 我方订单号唯一码,用于唯一去重
- auth_type 认证状态 1-token认证;2-uid认证
- paid_done_time 用户付款时间(相对准确) 13位时间戳, 长整型 ,举例:1583467215000
- profit_fee 分成价格,字符串,单位元 举例:"9.00"
- actual_fee 用户实际支付价格,字符串,单位元 举例:"18.00"
- 返回值
- code 错误码,公共参数,参考附录
- msg 错误信息,公共参数,参考附录
- data 返回结果,公共参数,参考附录
- order_no 贵公司订单号
- order_status 贵公司订单状态 2-成功
- order_gmt 订单创建时间
说明:
order_id作为去重标识,由于各种原因可能会出现order_id重复同步的情况,如果发现应存在order_id的成功记录,直接返回成功并填充对应order_no、order_status和order_gmt信息
执行逻辑伪代码
//1.执行权益动作之前做幂等处理防止重复赋权造成咨询 if (order_id 存在 && status = 2(成功)) { return result = success (成功); } //2.执行真实动作,会员可以复购,专辑和内容不可以复购 if (item_type == 3 (会员充值)) { 加会员时长 } if(item_type == 1 or item_type == 2 (专辑或内容)) { if (已购) { result = failed (不能重复购买) } else { 为该用户增加权益 } } //3.记录订单执行状态,为1步骤校验使用 记录order_id信息和执行状态 //4.返回执行结果 return 执行结果
测试用例:
5.1.1 token错误
输入:错误或过期的token
输出:{ "code":40001, "msg":"token无效或过期,需要重新登录"}
5.1.2 错误的ids
输入:
错误的会员id
输出:
充值错误
5.1.3 相同order_id连续充值两次,此逻辑关系到财务阶段,请务必保持统一
- 第一次充值
输入:
order_id:123456
其他参数都填充正确
输出:
{ "code":0, "msg":"", "data": { "order_no": "2222222222", "order_status": "2" //成功请确保是2 "order_gmt":1557282903000 } }
- 第二次充值
输入:
order_id:123456
其他参数都填充正确
输出:
{ "code":0, "msg":"", "data": { "order_no": "2222222222", //请确保和第一次相同 "order_status": "2" //成功请确保是2 "order_gmt":1557282903000 //请确保和第一次相同 } }
5.1.4 已购的专辑or内容重复购买(无论从天猫精灵渠道还是贵公司渠道,注意此时order_id一定不同哦)
输出:
{ "code": 非0, //此处一定要现实错误哦,不然会引起客诉 "msg":"已经购买过,请勿重复购买" }
附录:公共参数与加密算法说明举例
入参公共参数:
app_key: 双方约定的appkey,会在每次的请求中进行传输
app_secret: 双方约定的秘钥,用于生成签名参数。
request_id: 每次请求发送的唯一id,用于问题排查和防止流量重放攻击
timestamp: unix时间戳的长整型,单位ms
sign:签名值。用户可自己定义签名算法。例如:sign=MD5(appkey+secret+requestId+str(timestamp))
返回公共参数:
标准JSON格式。
code:错误码,成功为0
msg:错误信息
data:返回数据。
错误码说明:
登陆态失效:40001
附录:测试用例说明
用例 | 输入报文 | 输出报文 | 是否符合预期 | 详细说明 | 备注 |
2.1.1 token错误 | |||||
2.1.2 非VIP用户 | http://xxxx.com/api/getUserInfo?app_key=xxx&access_token=xxxxx&request_id=xxx×tamp=xxx&sign=xxx | { "code":0, "msg":"", "data": { "id":"1234", "nickname":"xxx", "is_vip":"false", "vip_expired":"" } } | 是 | 1.nickname一致 2.is_vip:false 3.vip_expired空 | |
2.1.3 VIP用户 | |||||
2.2.1 token错误 | |||||
2.2.3 用户收藏不为空 | |||||
2.3.1 token错误 | |||||
2.3.2 用户已购专辑为空 | |||||
2.3.3 用户已购专辑非空 | |||||
2.4.1 token错误 | |||||
2.4.2 用户购买过专辑 | |||||
2.5.1 token错误 | |||||
2.5.2 用户购买过专辑 | |||||
5.1.1 token错误 | |||||
5.1.2 错误的ids | |||||
5.1.3 相同order_id连续充值两次,此逻辑关系到财务阶段,请务必保持统一 | |||||
5.1.4 重复购买专辑or内容,order_id不同 |





