开通声网消息通知后,声网通知服务器以 HTTPS POST 请求方法向你的服务器发送频道事件通知回调。数据格式为 JSON,字符编码为 UTF-8,签名算法为 HMAC/SHA1 或 HMAC/SHA256。
消息通知回调的 header
中包含以下字段:
字段名 | 值 |
---|---|
Content-Type |
application/json |
Agora-Signature |
声网用密钥(Secret)和 HMAC/SHA1 算法生成的签名值。你需要使用密钥(Secret)和 HMAC/SHA1 算法来验证该签名值。详见验证签名。 |
Agora-Signature-V2 |
声网用密钥(Secret)和 HMAC/SHA256 算法生成的签名值。你需要使用密钥(Secret)和 HMAC/SHA256 算法来验证该签名值。详见验证签名。 |
消息通知回调的请求包体包含以下字段:
字段 | 类型 | 描述 |
---|---|---|
noticeId |
String | 通知 ID,标识来自声网业务服务器的一次事件通知。 |
productId |
Number | 业务 ID。值为 1 表示实时通信业务。 |
eventType |
Number | 通知的事件类型。详见频道事件类型。 |
notifyMs |
Number | 声网消息服务器向你的服务器发送事件通知的 Unix 时间戳 (ms)。通知重试时该值会更新。 |
sid |
String | 会话 ID。 |
payload |
JSON Object | 通知事件的具体内容。payload 因 eventType 而异,详见频道事件类型。 |
消息通知回调的请求包体示例:
{
"sid": "C866467GVJJ54687",
"noticeId": "2000001428:4330:107",
"productId": 1,
"eventType": 101,
"notifyMs": 1611566412672,
"payload": {...}
}
声网消息通知服务可以通知实时音视频(RTC)业务中的以下频道事件:
eventType | event_name | 事件描述 |
---|---|---|
101 | channel create | 创建频道。 |
102 | channel destroy | 销毁频道。 |
103 | broadcaster join channel | 直播场景下,主播加入频道。 |
104 | broadcaster leave channel | 直播场景下,主播离开频道。 |
105 | audience join channel | 直播场景下,观众加入频道。 |
106 | audience leave channel | 直播场景下,观众离开频道。 |
107 | user join channel with communication mode | 通信场景下,用户加入频道。 该事件仅适用于 Legacy 产品的通信场景。对于 v4.x(v4.0.0 以及之后版本)产品的通信场景,你会收到 103 事件。 |
108 | user leave channel with communication mode | 通信场景下,用户离开频道。 该事件仅适用于 Legacy 产品的通信场景。对于 v4.x 产品的通信场景,你会收到 104 事件。 |
111 | client role change to broadcaster | 直播场景或 v4.x 产品的通信场景下,观众将角色切换为主播。 |
112 | client role change to audience | 直播场景 v4.x 产品的通信场景下,主播将角色切换为观众。 |
eventType
为 101
表示创建频道(第一个用户加入频道),payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
ts |
Number | 该事件在声网业务服务器上发生的 Unix 时间戳 (s)。 |
payload
示例:
{
"channelName": "test_webhook",
"ts": 1560396834
}
eventType
为 102 表示最后一个用户离开频道且频道销毁,payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
ts |
Number | 该事件在声网业务服务器上发生的 Unix 时间戳 (s)。 |
payload
示例:
{
"channelName": "test_webhook",
"ts": 1560399999
}
eventType
为 103
表示直播场景下主播加入频道,payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
uid |
Number | 主播在频道内的用户 ID。 |
platform |
Number | 主播设备所属平台:1 :Android 2 :iOS 5 :Windows 6 :Linux 7 :Web 8 :macOS 0 :其他平台 |
clientType |
Number | Linux 平台的主播端使用的业务类型,常见的返回值包括:3 :本地服务端录制 8 :小程序10 :云录制 该字段仅当 platform 为 6 时返回。 |
clientSeq |
Number | 序列号,标识该事件在 app 客户端上发生的顺序,可用于对同一用户的事件进行排序。详见维护用户在线状态。 |
ts |
Number | 该事件在业务服务器上发生的 Unix 时间戳 (s)。 |
account |
String | String 类型的用户 ID。 |
payload
示例:
{
"channelName": "test_webhook",
"uid": 12121212,
"platform": 1,
"clientSeq": 1625051030746,
"ts": 1560396843,
"account": "test"
}
eventType
为 104
表示直播场景下主播离开频道,payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
uid |
Number | 主播在频道内的用户 ID。 |
platform |
Number | 主播设备所属平台:1 :Android 2 :iOS 5 :Windows 6 :Linux 7 :Web 8 :macOS 0 :其他平台 |
clientType |
Number | Linux 平台的主播端使用的业务类型,常见的返回值包括:3 :本地服务端录制 8 :小程序 10 :云录制 该字段仅当 platform 为 6 时返回。 |
clientSeq |
Number | 序列号,标识该事件在 app 客户端上发生的顺序,可用于对同一用户的事件进行排序。详见维护用户在线状态。 |
reason |
Number | 主播离开频道的原因:1 :主播正常离开频道。2 :客户端与声网业务服务器连接超时。判断标准为声网 SD-RTN 超过 10 秒未收到该主播的任何数据包,或连接单台服务器 4 秒超时并在 1 秒内没有完成重连。3 :权限问题。如被运营人员通过踢人 RESTful API 踢出频道。4 :声网业务服务器内部原因。如声网业务服务器在调整负载,和客户端短暂断开连接,之后会重新连接。5 :主播切换新设备,迫使旧设备下线。9 :由于客户端有多个 IP 地址,SDK 主动与声网业务服务器断开连接并重连。此过程用户无感知。请检查用户是否存在多个公网 IP 或使用了 VPN。10 :由于网络连接问题,例如 SDK 超过 4 秒未收到来自声网业务服务器的任何数据包或 socket 连接错误,SDK 主动与声网业务服务器断开连接并重连。此过程用户无感知。请检查网络连接状态。999 :异常用户。例如,用户短时间内频繁登录登出频道会被判定为异常用户。Note:你的 app 服务端需要在收到 reason 为 999 的 104 事件 60 秒后调用踢人 API 将该用户踢出频道。否则,该用户再次加入频道后,可能无法收到相关事件通知。 0 :其他原因。 |
ts |
Number | 该事件在业务服务器上发生的 Unix 时间戳 (s)。 |
duration |
Number | 主播在频道内的时长 (s)。 |
account |
String | String 类型的用户 ID。 |
payload
示例:
{
"channelName": "test_webhook",
"uid": 12121212,
"platform": 1,
"clientSeq": 1625051030789,
"reason": 1,
"ts": 1560396943,
"duration": 600,
"account": "test"
}
eventType
为 105
表示直播场景下观众加入频道,payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
uid |
Number | 观众在频道内的用户 ID。 |
platform |
Number | 观众设备所属平台:1 :Android 2 :iOS 5 :Windows 6 :Linux 7 :Web 8 :macOS 0 :其他平台 |
clientType |
Number | Linux 平台的观众端使用的业务类型,常见的返回值包括:3 :本地服务端录制 8 :小程序10 :云录制 该字段仅当 platform 为 6 时返回。 |
clientSeq |
Number | 序列号,标识该事件在 app 客户端上发生的顺序,可用于对同一用户的事件进行排序。详见维护用户在线状态。 |
ts |
Number | 该事件在业务服务器上发生的 Unix 时间戳 (s)。 |
account |
String | String 类型的用户 ID。 |
payload
示例:
{
"channelName": "test_webhook",
"uid": 12121212,
"platform": 1,
"clientSeq": 1625051035346,
"ts": 1560396843,
"account": "test"
}
eventType
为 106
表示直播场景下观众离开频道,payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
uid |
Number | 观众在频道内的用户 ID。 |
platform |
Number | 观众设备所属平台:1 :Android 2 :iOS 5 :Windows 6 :Linux 7 :Web 8 :macOS 0 :其他平台 |
clientType |
Number | Linux 平台的观众端使用的业务类型,常见的返回值包括:3 :本地服务端录制 8 :小程序10 :云录制 该字段仅当 platform 为 6 时返回。 |
clientSeq |
Number | 序列号,标识该事件在 app 客户端上发生的顺序,可用于对同一用户的事件进行排序。详见维护用户在线状态。 |
reason |
Number | 观众离开频道的原因:1 :观众正常离开频道。2 :客户端与声网业务服务器连接超时。判断标准为声网 SD-RTN 超过 10 秒未收到该观众的任何数据包。3 :权限问题。如被运营人员通过踢人 RESTful API 踢出频道。4 :声网业务服务器内部原因。如声网业务服务器在调整负载,和客户端短暂断开连接,之后会重新连接。5 :观众切换新设备,迫使旧设备下线。9 :由于客户端有多个 IP 地址,SDK 主动与声网业务服务器断开连接并重连。此过程用户无感知。请检查用户是否存在多个公网 IP 或使用了 VPN。10 :由于网络连接问题,例如 SDK 超过 4 秒未收到来自声网业务服务器的任何数据包或 socket 连接错误,SDK 主动与声网业务服务器断开连接并重连。此过程用户无感知。请检查网络连接状态。999 :异常用户。例如,用户短时间内频繁登录登出频道会被判定为异常用户。Note:你的 app 服务端需要在收到 reason 为 999 的 106 事件 60 秒后调用踢人 API 将该用户踢出频道。否则,该用户再次加入频道后,可能无法收到相关事件通知。0 :其他原因。 |
ts |
Number | 该事件在业务服务器上发生的 Unix 时间戳 (s)。 |
duration |
Number | 观众在频道内的时长 (s)。 |
account |
String | String 类型的用户 ID。 |
payload
示例:
{
"channelName": "test_webhook",
"uid": 12121212,
"platform": 1,
"clientSeq": 1625051035390,
"reason": 1,
"ts": 1560396943,
"duration": 600,
"account": "test"
}
eventType
为 107
表示通信场景下用户加入频道,payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
uid |
Number | 用户在频道内的用户 ID。 |
platform |
Number | 用户设备所属平台:1 :Android 2 :iOS 5 :Windows 6 :Linux 7 :Web 8 :macOS 0 :其他平台 |
clientSeq |
Number | 序列号,标识该事件在 app 客户端上发生的顺序,可用于对同一用户的事件进行排序。详见维护用户在线状态。 |
ts |
Number | 该事件在业务服务器上发生的 Unix 时间戳 (s)。 |
account |
String | String 类型的用户 ID。 |
payload
示例:
{
"channelName": "test_webhook",
"uid": 12121212,
"platform": 1,
"clientSeq": 1625051035369,
"ts": 1560396834,
"account": "test"
}
eventType
为 108
表示通信场景下用户离开频道,payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
uid |
Number | 用户在频道内的用户 ID。 |
platform |
Number | 用户设备所属平台:1 :Android 2 :iOS 5 :Windows 6 :Linux 7 :Web 8 :macOS 0 :其他平台 |
clientSeq |
Number | 序列号,标识该事件在 app 客户端上发生的顺序,可用于对同一用户的事件进行排序。详见维护用户在线状态。 |
reason |
Number | 用户离开频道的原因:1 :用户正常离开频道。2 :客户端与声网业务服务器连接超时。判断标准为声网 SD-RTN 超过 10 秒未收到该用户的任何数据包。3 :权限问题。如被运营人员通过踢人 RESTful API 踢出频道。4 :声网业务服务器内部原因。如声网业务服务器在调整负载,和客户端短暂断开连接,之后会重新连接。5 :用户切换新设备,迫使旧设备下线。9 :由于客户端有多个 IP 地址,SDK 主动与声网业务服务器断开连接并重连。此过程用户无感知。请检查用户是否存在多个公网 IP 或使用了 VPN。10 :由于网络连接问题,例如 SDK 超过 4 秒未收到来自声网业务服务器的任何数据包或 socket 连接错误,SDK 主动与声网业务服务器断开连接并重连。此过程用户无感知。请检查网络连接状态。0 :其他原因。 |
ts |
Number | 该事件在业务服务器上发生的 Unix 时间戳 (s)。 |
duration |
Number | 用户在频道内的时长 (s)。 |
account |
String | String 类型的用户 ID。 |
payload
示例:
{
"channelName": "test_webhook",
"uid": 12121212,
"platform": 1,
"clientSeq": 1625051037369,
"reason": 1,
"ts": 1560496834,
"duration": 600,
"account": "test"
}
eventType
为 111
表示直播场景下观众上麦,即调用 setClientRole
将用户角色从观众切换为主播,payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
uid |
Number | 用户在频道内的用户 ID。 |
clientSeq |
Number | 序列号,标识该事件在 app 客户端上发生的顺序,可用于对同一用户的事件进行排序。详见维护用户在线状态。 |
ts |
Number | 该事件在业务服务器上发生的 Unix 时间戳 (s)。 |
account |
String | String 类型的用户 ID。 |
payload
示例:
{
"channelName": "test_webhook",
"uid": 12121212,
"clientSeq": 1625051035469,
"ts": 1560396834,
"account": "test"
}
eventType
为 112
表示直播场景下主播下麦,即调用 setClientRole
将用户角色从主播切换为观众,payload
中包含以下字段:
字段 | 数据类型 | 含义 |
---|---|---|
channelName |
String | 频道名。 |
uid |
Number | 用户在频道内的用户 ID。 |
clientSeq |
Number | 序列号,标识该事件在 app 客户端上发生的顺序,可用于对同一用户的事件进行排序。详见维护用户在线状态。 |
ts |
Number | 该事件在业务服务器上发生的 Unix 时间戳 (s)。 |
account |
String | String 类型的用户 ID。 |
payload
示例:
{
"channelName": "test_webhook",
"uid": 12121212,
"clientSeq": 16250510358369,
"ts": 1560496834,
"account": "test"
}