云端播放器运行过程中,会以 POST 方式向回调地址
发起 HTTP 请求,请求包体为 JSON 格式。
回调地址请联系 ZEGO 技术支持进行配置。
回调的相关参数,ZEGO 会在之后的迭代计划中,持续优化更新(例如:新增字段、或新增某些字段的参数取值)。开发者在接入时,请避免将代码写死,造成后期更新后,无法兼容新版本。
参数 | 类型 | 描述 |
---|---|---|
AppId | Number | ZEGO 给开发者 APP 的唯一标识。 |
RoomId | String | 房间 ID。 |
PlayerId | String | 云端播放器唯一标识 ID。 |
EventType | Number | 事件通知类型。
|
Nonce | String | 随机数,用于检验串计算。 |
Timestamp | String | 回调发送时的 Unix 时间戳(秒),用于检验串计算。 |
Signature | String | 检验串,验证回调发送方身份。 |
EventTime | Number | 事件在云端播放服务器上发生的 Unix 时间戳(毫秒),开发者可根据该字段判断回调顺序。 |
Detail | Object | 事件详细信息。根据 EventType 取值不同,该回调参数的成员不同。 |
EventType
为 1 时 Detail
成员列表如下:
参数 | 类型 | 描述 |
---|---|---|
CreateTime | Number | 云端播放器创建成功的 Unix 时间戳(秒)。 |
PlayTime | Number | 云端播放器开始播放媒体流的 Unix 时间戳(秒)。 |
MaxIdleTime | Number | 云端播放器处于空闲状态的最大时长(秒),即媒体流为非播放状态的最大时长。 |
StreamUrl | String | 媒体资源的地址。 |
EventType
为 2 时 Detail
成员列表如下:
参数 | 类型 | 描述 |
---|---|---|
PlayTime | Number | 云端播放器开始播放媒体流的 Unix 时间戳(秒)。 |
Reason | Number | 云端播放器销毁的原因。
|
EventType
为 3 时 Detail
成员列表如下:
参数 | 类型 | 描述 |
---|---|---|
Status | Number | 云端播放器的状态。
|
EventType
为 4 时 Detail
成员列表如下:
参数 | 类型 | 描述 |
---|---|---|
Code | Number | 异常类型。
|
云端播放器检测到上述异常事件后,内部会自动进行重试。如果短时间内多次收到该类异常回调通知,开发者需要检查资源服务器访问是否正常、或做其它容错处理。
以下是调用 CreatePlayer 接口创建云端播放器成功的回调示例。
{
"AppId": 123456789,
"RoomId": "room_12",
"PlayerId": "XXXXXX",
"PlayerName": "XXXXXX",
"EventType": 1,
"Nonce": "abcdd22113",
"Timestamp": "1681221510",
"Signature": "XXXXXXX",
"EventTime": 1681221510034,
"Detail": {
"CreateTime": 1681221508,
"PlayTime": 1681221508,
"MaxIdleTime": 30,
"StreamUrl": "https://your-bucket.oss-cn-shanghai.aliyuncs.com/video/test.mp4"
}
}
返回 HTTP status code 为 2XX (例如 200)表示成功,其他响应都表示失败。
如果 ZEGO 服务器没有收到响应,会立刻尝试重试,最多进行 2 次重试。若第 2 次重试后仍然失败,将不再重试,该回调丢失。
为提高数据安全性,开发者在收到 ZEGO 服务端发出的回调时,进行本地签名计算,并与 signature 进行对比,判断该请求是否合法。
请参考以下方式,校验回调请求的发起来源是否为 ZEGO 云端播放器。
开发者需要将自行计算出的 signature 值,与回调结果中的 signature 值进行对比,判断两者是否一致,以此来验证请求的发起方是否为 ZEGO 云端播放器。
自行计算 signature 的流程如下图:
以下示例代码用于生成和检验 signature。
$signature = $_POST["signature"];
$timestamp = $_POST["timestamp"];
$nonce = $_POST["nonce"];
$secret = callbacksecret;//后台获取的callbacksecret
$tmpArr = array($secret, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
} else {
return false;
}
// 从请求参数中获取到 signature, timestamp, nonce
String signature = request.getParameter("signature");
long timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
// 后台获取的callbacksecret
String secret = callbacksecret;
String[] tempArr = {secret, ""+timestamp, nonce};
Arrays.sort(tempArr);
String tmpStr = "";
for (int i = 0; i < tempArr.length; i++) {
tmpStr += tempArr[i];
}
tmpStr = org.apache.commons.codec.digest.DigestUtils.sha1Hex(tmpStr);
return tmpStr.equals(signature);
$timestamp = 1470820198;
$nonce = 123412;
$secret = 'secret';
排序拼接后需要加密的原始串为:1234121470820198secret
加密的结果为:5bd59fd62953a8059fb7eaba95720f66d19e4517
联系我们
文档反馈