简要描述
云学堂直播平台会对直播室的推流状态,直播回看视频路径,直播加会统计生成,礼物赠送记录进行通知回调。
通知类型
通知类型 | 描述 | 通知体 |
---|---|---|
SessionStatusChanged | 直播会话状态改变时触发 | UTF8的Json结构体 |
StreamingStatusChanged | 直播流状态改变时触发 | UTF8的Json结构体 |
RecordFileGenerated | 录制文件生成时触发 | UTF8的Json结构体 |
GiftPrecentDetail | 礼物赠送记录直播结束时触发 | UTF8的Json结构体 |
AttendeeStatisticsGenerated | 加会纪录生成触发 | UTF8的Json结构体 |
通知格式
通过HTTP或者HTTPS请求将通知消息POST到配置的通知接口
公共字段说明
名称 | 类型 | 描述 |
---|---|---|
roomId | String | 直播间id |
sessionId | String | 直播场次id |
notifyTime | String | 回调时间 yyyy-MM-ddThh:mm:ssZ |
type | String | 回调类型(SessionStatusChanged-状态改变、StreamingStatusChanged-状态改变、RecordFileGenerated-录像文件生成记录、GiftPrecentDetail-直播礼物赠送记录、AttendeeStatisticsGenerated-直播加会统计生成通知) |
sign | String | 签名(详见签名算法) |
body | Object | 消息体,详见Body体字段说明 |
Body体字段说明
类型:SessionStatusChanged 或 StreamingStatusChanged, 直播会话状态或直播流状态改变时触发
名称 | 类型 | 描述 |
---|---|---|
body.previous | String | 改变前状态(ONGOING-直播中;STREAMING-直播中;NO_SOURCE-无直播源;READY-就绪;PAUSED-暂停) |
body.current | String | 改变后状态(ONGOING-直播中;STREAMING-直播中;NO_SOURCE-无直播源;READY-就绪;PAUSED-直播流结束;ZHIBO_CLOSED-直播结束) |
响应Body体示例
{
"roomId": "3dec025c-49a0-4f15-921b-836cf8532271",
"sessionId": "7f8e8ddf-48d5-4876-9a17-c298e00c8fd9",
"body": {
"previous": "READY",
"current": "ONGOING"
},
"notifyTime": "2017-01-10T01:29:04Z",
"type": "SessionStatusChanged",
"sign": "5f4ee21fc17c42c583a470509cf235fd"
}
或
{
"roomId": "3dec025c-49a0-4f15-921b-836cf8532271",
"sessionId": "7f8e8ddf-48d5-4876-9a17-c298e00c8fd9",
"body": {
"previous": "NO_SOURCE",
"current": "STREAMING"
},
"notifyTime": "2017-01-10T01:29:04Z",
"type": "StreamingStatusChanged",
"sign": "5f4ee21fc17c42c583a470509cf235fd"
}
类型:RecordFileGenerated, 录制文件生成时触发
名称 | 类型 | 描述 |
---|---|---|
body.bucket | String | bucket标识 |
body.key | String | 录制文件储存地址 |
body.createTime | String | 录制文件生成时间 |
body.format | String | 录制文件格式 |
body.recordingFile | Object | 回看文件信息 |
body.recordingFile.filePath | String | 回看文件地址,如:https://ljliveo-test.yxt.com/play-test.yunxuetang.com.cn/app90/1e428fce90864cb588364a8c49fa7c11/recording_20161230164845_20161230164849.mp4 |
body.recordingFile.duration | long | 录像时长,单位:秒(s) |
body.recordingFile.startTime | String | 录像开始时间,如:2016-12-29 09:21:33 |
body.recordingFile.endTime | String | 录像结束时间,如:2016-12-29 09:23:31 |
响应Body体示例
{
"roomId": "3dec025c-49a0-4f15-921b-836cf8532271",
"sessionId": "7f8e8ddf-48d5-4876-9a17-c298e00c8fd9",
"body": {
"bucket": "yxtliveo-test",
"key": "play-test.yunxuetang.com.cn/app90/3dddb5c985dc4c15aca62e2fc6734ab8/recording_20170110092905_20170110094520.mp4",
"createTime": "2017-01-10T01:45:33Z",
"format": "mp4",
"recordingFile": {
"duration": 54,
"endTime": "2017-04-12 17:39:59",
"filePath": "https://ljliveo-test.yxt.com/play-test.yunxuetang.com.cn/app90/556dd52a77cb49f68bb9431a1d93405d/recording_20170412173905_20170412173959.mp4",
"startTime": "2017-04-12 17:39:05"
}
},
"notifyTime": "2017-01-10T01:45:33Z",
"type": "RecordFileGenerated",
"sign": "5f4ee21fc17c42c583a470509cf235fd"
}
类型:GiftPrecentDetail, 礼物赠送记录直播结束时触发
名称 | 类型 | 描述 |
---|---|---|
body.datas[].pid | String | 赠送记录pid |
body.datas[].giftId | String | 礼物pid |
body.datas[].giftName | String | 礼物名称 |
body.datas[].sessionId | String | 直播场次id |
body.datas[].unitPoint | int | 单价积分 |
body.datas[].prdPoint | int | 使用产线积分 |
body.datas[].fromUserId | String | 推流或观看客户端系统版本 |
body.datas[].toUserId | String | 推流或观看客户端版本号 |
body.datas[].quantity | int | 赠送数量 |
body.datas[].totalPoint | int | 总积分(产线可忽略) |
body.datas[].createTime | String | 赠送发生时间 |
响应Body体示例
{
"roomId": "2a51eb78-9d65-49cc-bc7f-3ccb182dde47",
"sessionId": "7f8e8ddf-48d5-4876-9a17-c298e00c8fd9",
"body": {
"datas": [
{
"createTime": "2017-06-20 12:06:04.0",
"fromUserId": "fddd324b-16f9-43b4-96ad-16a91e31133f",
"giftId": "33d8eed4-a983-4776-b2a3-2d374e5432d5",
"giftName": "火箭",
"pid": "aa308c6f-3f85-4d7e-8d51-fb8ed9130c56",
"prdPoint": 500,
"quantity": 1,
"sessionId": "8c593e4e-2fac-4965-a64b-c42632a8ed8d",
"toUserId": "5a23d8f1-6f92-44a2-85c3-e4e3e01ed4ad",
"totalPoint": 500,
"unitPoint": 500
},
{
"createTime": "2017-06-20 12:05:59.0",
"fromUserId": "fddd324b-16f9-43b4-96ad-16a91e31133f",
"giftId": "33d8eed4-a983-4776-b2a3-2d374e5432d5",
"giftName": "火箭",
"pid": "f72b380e-fe44-40b1-aa46-da836107cfd3",
"prdPoint": 500,
"quantity": 1,
"sessionId": "8c593e4e-2fac-4965-a64b-c42632a8ed8d",
"toUserId": "5a23d8f1-6f92-44a2-85c3-e4e3e01ed4ad",
"totalPoint": 500,
"unitPoint": 500
}
]
},
"notifyTime": "2017-06-20 12:06:25",
"type": "GiftPrecentDetail",
"sign": "33C55FEDF212CA967BE317A03798BA4B"
}
类型:AttendeeStatisticsGenerated, 加会纪录生成触发
Body空,收到通知请通过API:产线获取某直播间参会签到明细(http://open.ljlive.cn/23 ) 获取
响应Body体示例
{
"roomId": "3dec025c-49a0-4f15-921b-836cf8532271",
"sessionId": "7f8e8ddf-48d5-4876-9a17-c298e00c8fd9",
"body": {},
"notifyTime": "2017-01-10T01:29:04Z",
"type": "AttendeeStatisticsGenerated",
"sign": "5f4ee21fc17c42c583a470509cf235fd"
}
签名算法
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
第二步,在stringA最后拼接上key(每个机构的sk)得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
详情参见微信支付签名算法:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
修改历史
- 2018-02-12 增加回调字段:sessionId