文档

版权控制

版本号

更新内容

更新人

更新时间

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/

产品说明:

123.001.jpeg

123.002.jpeg


鉴权流程

(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的运行流程

image.png

(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,向客户端开放资源。


开放平台配置OAuth2

image.png


请求API

(A) 用户打开授权链接进行授权

例:

https://xxx.com/auth/authorize?redirect_uri=https%3A%2F%2Fopen.bot.tmall.com%2Foauth%2Fcallback%3FskillId%3D11111111%26token%3DXXXXXXXXXX&client_id=XXXXXXXXX&response_type=code&state=111


参数说明:

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_tokenString访问token(响应正确时必传递)
refresh_tokenString进行刷新access_token的刷新token (响应正确时必传递)
expires_inlong过期时间时长(响应正确时必传递)
errorString错误响应码  (响应错误时必传递)
error_descriptionString错误详情 (响应错误时必传递)


正常响应:

{
  "access_token": "XXXXXX",
  "refresh_token": "XXXXXX",
  "expires_in":17600000
  }


错误响应:

{
  "error":"errorCode",
  "error_description":"description"
 }


注: access_token 有效期请设置成 1 天以上(2-3天最佳)


(C) 通过 refresh_token 刷新 access_token(请确保厂商自己的刷新功能是完善的)

例:

https://XXXXX/token?grant_type=refresh_token&client_id=XXXXX&client_secret=XXXXXX&refresh_token=XXXXXX


请求方法: 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_tokenString访问token(响应正确时必传递)
refresh_tokenString进行刷新access_token的刷新token (响应正确时必传递)
expires_inlong过期时间时长(响应正确时必传递)
errorString错误响应码  (响应错误时必传递)
error_descriptionString错误详情 (响应错误时必传递)


正常响应:

{
  "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页面,用户输入手机号后调用合作伙伴的服务。

产品说明:

123.003.jpeg

技术说明:

运行流程

image.png


开放平台配置

image.png


请求API

(6) 根据mobile获取auth_code

例:

https://xxxxx.com/ali/tao/getAuthCodeByMobile?grant_type=getAuthCodeByMobile&client_id=XXXXX&client_secret=XXXXXX&mobile=xxxxxx


请求方法: 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







产品说明:

123.001.jpeg

123.002.jpeg


技术说明:标准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           用户昵称信息

 

请求参数例子:


https://host/api


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      刷新令牌,用于刷新访问令牌


请求参数例子:


https://host/api


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 获取用户基本信息

产品说明:

123.004.jpeg

技术说明:

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&timestamp=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 获取用户订阅(收藏信息):

产品说明:

123.005.jpeg

技术说明:

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&timestamp=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 获取已购专辑信息,包括单篇购买内容所在专辑

产品说明:

123.006.jpeg

技术说明:

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&timestamp=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 获取用户是否已经购买专辑

产品说明:

123.007.jpeg

技术说明:

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&timestamp=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 获取用户是否已经购买声音(用于单篇购买)

产品说明:

123.008.jpeg

技术说明:

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&timestamp=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 付费内容变更说明

123.009.jpeg

3-3 专辑结构说明

123.010.jpeg


3-4 试听设置说明

123.011.jpeg


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

产品说明:

123.012.jpeg

技术说明:

  • 用户是否可以开通连续自动续费服务:

说明:如果不提供此服务仅校验在天猫精灵是否开通了自动续费服务,此接口不需要登陆态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.创建订单

产品说明:

123.012.jpeg

技术说明:

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&timestamp=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不同