包含完整功能模块: - 设备激活(直销激活码模式 + 代销免激活码模式) - 微信支付 + 天卡订单 - 天卡池管理 + 异步橘视厅SDK激活 - 第三方合作伙伴接口(代销模式) - 签名鉴权(appKey/appSecret + nonce防重放) - 天卡消耗(事务 + 幂等 + 并发控制) - 媒资接口(三级授权过滤) - 审计日志 - 定价策略(3层:门店 > 渠道 > 平台) - 分账(微信分账 + 分润规则) - Docker部署(含Redis容器)
6.1 KiB
6.1 KiB
第三方合作伙伴 App 测试需求
1. 目标
验证代销模式完整链路:EPG启动App -> init -> checkBenefits -> SDK初始化 -> 获取播放地址 -> 播放
2. App 定位
Android TV 应用,由第三方 EPG 通过 Intent 传参启动。App 不负责支付,仅负责:
- 设备初始化(获取 sign)
- 查询天卡权益(获取 thirdCardNo)
- 橘视厅 SDK 初始化
- 内容浏览与播放
3. 启动方式
3.1 EPG 传参启动(Intent)
Intent action: com.pukka.mediaapp.PARTNER_LAUNCH
Extras:
- mac (String, 设备MAC)
- wifiMac (String, WiFi MAC, 可选)
- deviceSn (String, 设备SN, 可选)
- deviceUid (String, 设备UID, 可选)
至少传一个设备标识(mac/wifiMac/deviceSn/deviceUid)。
3.2 手动输入模式(调试用)
App 提供一个输入页面,可手动输入设备标识,方便无 EPG 环境时测试。
4. 后端接口
4.1 配置
后端地址: http://58.220.83.58:8084 (可配置)
4.2 设备初始化
POST /api/jst/init
Content-Type: application/json
Body: { "mac": "xx", "wifiMac": "xx", "deviceSn": "xx", "deviceUid": "xx" }
(不传 activationCode -> 代销模式)
成功返回:
{
"code": 0,
"msg": "success",
"data": { "device": { "deviceId": 9, "roomNo": null } },
"sign": "Base64编码的sign字符串"
}
失败返回:
{
"code": 400,
"msg": "设备未注册,请先通过合作伙伴天卡消耗接口激活设备",
"data": {}
}
4.3 查询天卡权益
POST /api/jst/checkBenefits
Header: sign: <上一步获取的sign>
成功返回:
{
"code": 0,
"msg": "success",
"data": {
"status": "ACTIVE", // ACTIVE=已激活 UNBOUND=未绑定/激活中
"thirdCardNo": "DKMMqjJKgpdwUahip5l4hGzjS", // 播放凭证
"cardNo": "CEB6258DB4AD6B06",
"expireAt": "2026-07-24 19:33:14"
}
}
4.4 轮询策略
checkBenefits 可能返回 status: "UNBOUND"(异步激活未完成),需要轮询:
- 轮询间隔:2秒
- 轮询超时:5分钟
- 收到
ACTIVE后停止轮询
4.5 心跳续期(可选)
POST /api/jst/heartBeat
Header: sign: <sign>
建议每 30 分钟调用一次,防止 sign 过期(24小时有效)。
5. 橘视厅 SDK 初始化
5.1 SDK 配置
AGCODE = "1100101010200492358120169"
TENANT = "huashitv"
ACCESSER = "JSTASJD"
SECRET = "kMeWsBu0QsTXpnft"
SERVICE_COMBO_CODE = "1100121010200494755850172"
5.2 初始化流程
checkBenefits 返回 ACTIVE 后,用 thirdCardNo 作为 uid 初始化 SDK:
JetsenxSdk.init(
context,
agcode = AGCODE,
mac = <设备MAC>,
uid = thirdCardNo, // 关键:用 thirdCardNo 作为 uid
tenant = TENANT,
secret = SECRET,
accesser = ACCESSER,
utype = "2", // uid非MAC格式时用"2",MAC格式用"3"
"",
serviceComboCode = SERVICE_COMBO_CODE,
callback = ...
)
5.3 SDK 库文件
app/libs/
- JetsenxSdk-api-future-release-v1.23.aar
- NewTVSDK-v4.0.3-app-lite.jar
- arm64-v8a/libnewtvsdk.so
- armeabi-v7a/libnewtvsdk.so
6. 内容浏览与播放
6.1 内容列表(可选)
可调后端媒资接口获取内容列表:
GET /openapi/partner/media/list?catalogid=xxx&pageindex=1&pagesize=20
Header: appKey/timestamp/nonce/sign (合作伙伴签名鉴权)
或直接用橘视厅媒资接口(App 已有 ApiConfig 配置)。
6.2 获取播放地址
SDK 初始化成功后,用节目 code 获取播放地址:
// 1. 获取 productCode
JetsenxSdk.getAllAssetPrices(accesser, secret, callback)
// 2. 获取播放地址
JetsenxSdk.getVideoUrls(productCode, programCode, callback)
// 或免费内容
JetsenxSdk.getFreeVideoUrls(programCode, callback)
6.3 播放
用获取到的 videoUrl 播放(可用 ExoPlayer 或项目中已有的 HyMediaPlayer)。
7. 页面结构(最小化)
页面1: 启动页/输入页
- 显示传入的设备标识(或手动输入)
- "初始化"按钮
- 显示 init 结果(sign, deviceId)
页面2: 权益查询页
- 自动轮询 checkBenefits
- 显示 status (ACTIVATING -> ACTIVE)
- 显示 thirdCardNo, expireAt
- ACTIVE 后自动初始化 SDK
- 显示 SDK init 结果
页面3: 播放测试页
- 输入 programCode(或从内容列表选择)
- "获取播放地址"按钮
- 显示播放地址
- "播放"按钮
- 视频播放区域
8. 测试场景
场景1: 完整流程(正常)
前置: 第三方已调 consume 接口,设备已绑定天卡
1. EPG传参启动App (mac=AA:BB:CC:DD:EE:01)
2. App调 init -> 返回 sign
3. App调 checkBenefits -> 返回 ACTIVE + thirdCardNo
4. App用 thirdCardNo 初始化 SDK -> 成功
5. App获取播放地址 -> 成功
6. App播放视频 -> 正常播放
场景2: 异步激活等待
前置: 第三方刚调完 consume,异步激活尚未完成
1. App调 init -> 返回 sign
2. App调 checkBenefits -> 返回 UNBOUND
3. App轮询 (每2秒)
4. N秒后 checkBenefits -> 返回 ACTIVE + thirdCardNo
5. App用 thirdCardNo 初始化 SDK -> 成功
场景3: 设备未注册
前置: 第三方未调 consume
1. App调 init -> 返回 400 "设备未注册"
2. App显示错误提示
场景4: 天卡过期
前置: 天卡已过期
1. App调 init -> 返回 sign
2. App调 checkBenefits -> 返回 UNBOUND
3. App显示"天卡已过期,请联系第三方续费"
9. 本次测试凭证
后端地址: http://58.220.83.58:8084
设备标识: mac=AA:BB:CC:DD:EE:01, deviceSn=TEST-SN-001, deviceUid=TEST-UID-001
deviceId: 9
sign: (通过 init 动态获取)
thirdCardNo: DKMMqjJKgpdwUahip5l4hGzjS
expireAt: 2026-07-24 19:33:14
10. 关键注意事项
- 不传 activationCode:代销模式 init 不传 activationCode,后端按设备标识查找
- 设备标识一致性:consume 和 init 必须用相同的设备标识,否则找不到设备
- thirdCardNo 不暴露给第三方:thirdCardNo 由 App 通过 checkBenefits 获取,不经过 EPG
- sign 24小时有效:长时间运行需定期心跳续期
- SDK utype:uid 为 MAC 格式用 "3",非 MAC 格式用 "2"(thirdCardNo 通常是非 MAC 格式 -> "2")