You need to enable JavaScript to run this app.
文档中心
实时音视频

实时音视频

复制全文
下载 pdf
服务端回调
回调消息通知
复制全文
下载 pdf
回调消息通知
如果你希望在你的 RTC 应用的业务服务端直接获取 RTC 的使用状态,你可以使用消息通知服务。开通消息通知服务后,当指定的事件发生时,你的应用的业务服务端会收到来自 RTC 服务端的消息通知。本文主要介绍如何接收回调消息、回调 URL 要求、回调消息格式及如何验证回调签名等。​
工作原理​
​Image​​
接收消息通知​
实现方式​
  1. 填写回调相关信息:​
  • 回调事件:你希望接收的回调事件。支持的事件,参考 消息事件参考。​
  • 回调 URL:您的业务服务器地址(URL),用于接收回调通知消息。关于 URL 要求,参考回调 URL 要求。​
  • 回调密钥:输入的秘钥将被用来对回调信息进行签名。若您需要对接收到的 JSON 进行防伪造验签,参考验证回调签名。​
开通服务后,当你订阅的事件发生时,你指定的 URL 地址会收到 HTTP(s) 调用。调用中包含相关的事件信息,参考回调消息格式。​
说明​
首次配置或修改回调 URL 后,下发至全网节点通常需要 3~5 分钟 的生效时间。此时间窗内触发的事件可能仍会发往旧地址或漏发。​
回调 URL 要求​
您提供的接收服务端 URL 必须满足以下条件:​
  • URL 必须公网可访问。​
  • URL 必须以域名开头,支持 HTTP 或 HTTPS。如果 URL 为 HTTPS 域名,该域名必须配备合法受信任的 SSL 证书。​
  • URL 必须同时支持响应 GET 和 POST 请求:​
  • GET 请求:用于 RTC 服务端进行连通性检测。添加回调时,服务端会先对该 URL 发起一次 GET 请求以检测其可用性。如果 URL 不支持 GET 请求将返回错误。​
  • POST 请求:用于接收 RTC 服务端投递的事件回调。​
回调响应与重试​
  • 接收回调响应的 HTTP 状态码为 200 时,RTC 服务端即认为回调成功;状态码不为 200,或响应时间超过 5 秒,都视为回调失败,RTC 服务端会重试。重试最多 2 次(总计回调不超过 3 次)。​
  • 不保证回调事件的唯一性。建议你使用 EventId 对事件回调进行去重。​
  • 不保证回调消息严格按照事件发生的先后顺序到达你的服务器。你可以通过 EventTime 在你的服务端排序处理。​
回调消息格式​
当你设置关注的回调事件发生时,RTC 服务端会向你指定接收回调的 URL 地址发起 HTTP 请求。回调信息包含在 Request Body 中,以 JSON 格式呈现。具体字段如下:​
关于目前支持消息回调的事件(EventType)和对应的事件内容 (EventData),参看 消息事件参考。​
​
​
参数名​
类型​
描述​
示例值​
EventType​
String​
事件类型。​
VoiceChat​
EventData​
String​
具体的事件内容,格式为转义后的 JSON 字符串。​
{"AppId":"60e6f66f...","RoomId":"tob_voicechat..."}​
EventTime​
String​
事件触发时间,采用 ISO-8601 格式,精确到秒,携带时区信息((±HH:MM 或 Z)。​
2026-06-30T10:17:29+08:00​
EventId​
String​
事件唯一标识 ID,具有全局唯一性,可用于请求去重和链路追踪。​
58cfad16-xxxx-xxxx-xxxx-4e****c8​
AppId​
String​
RTC 应用的唯一标识。​
60****ef00​
Version​
String​
回调协议的版本号。​
2020-12-01​
Signature​
String​
回调请求的签名,用于验证请求的合法性与完整性。​
2a4b16981f7c94...​
BusinessId​
String​
业务标识 ID,用于区分不同业务。​
空字符串表示未指定​
Nonce​
String​
签名随机数(4位字符串),用于防止重放攻击​
NGuR​
​
验证回调签名​
RTC 会为服务端回调签名。如果你想确认来源是否是火山引擎以及内容是否被篡改,你可以验证回调签名;否则,你可以忽略回调签名。​
签名算法​
RTC 服务端发起回调时,会使用你设置的回调密钥对回调签名。你可以参考以下签名算法进行验签:​
  1. 创建参数字符数组。​
  • 将用户回调密钥SecretKey和接收到回调字段值:EventType、EventData、EventTime、EventId、Version、AppId、Nonce、SecretKey 组成数组:​
  • ​
    type Event struct {​
    EventType string `json:"EventType"`​
    EventData string `json:"EventData"`​
    EventTime string `json:"EventTime"`​
    EventId string `json:"EventId"`​
    AppId string `json:"AppId"`​
    Version string `json:"Version"` ​
    Nonce string `json:"Nonce"`​
    Signature string `json:"Signature"`​
    }​
    ​
    var event Event​
    ​
    data := []string{​
    event.EventType,​
    event.EventData,​
    event.EventTime,​
    event.EventId,​
    event.AppId,​
    event.Version,​
    event.Nonce,​
    secretKey,​
    }​
    ​
  • 示例 : [EventTypeVal EventDataVal EventTimeVal EventIdVal VersionVal AppIDVal NonceVal SecretKeyVal]​
  1. 按字母序排列字符数组:​
  • ​
    SortedData = Sort(data)​
    ​
  • 示例 : [AppIDVal EventDataVal EventIdVal EventTimeVal EventTypeVal NonceVal SecretKeyVal VersionVal]​
  1. 将排序后字符数组元素直接拼接成字符串得到 PayloadData:​
  • ​
    PayloadData=Join(SortedData)​
    ​
  • 示例 : [AppIDValEventDataValEventIdValEventTimeValEventTypeValNonceValSecretKeyValVersionVal]​
  1. 对拼接好的字符串进行 SHA256 哈希算法:​
  • ​
    HashData=Hash(PayloadData)​
    ​
  • 示例 : [20 170 104 20 32 203 70 171 95 29 138 214 172 154 178 31 52 30 169 219 249 213 35 112 89 195 196 192 231 49 48 15]​
  1. 进行十六进制编码,得到回调签名:​
  • ​
    Signature=HexEncode(HashData)​
    ​
  • 示例 : 14aa681420cb46ab5f1d8ad6ac9ab21f341ea9dbf9d5237059c3c4c0e731300f​
签名算法示例​
RTC 提供了 Golang 和 Java 语言的示例代码,你可以参考以下示例进行验签:​
SecretKey 是你在控制台上配置的回调密钥。​
​
Golang
Java
​
​
import (​
"crypto/sha256"​
"fmt"​
"sort"​
"strings"​
)​
​
func main() {​
event := &Event{​
EventType: "RoomCreate",​
EventData: "{\"RoomId\":\"room1\",\"Timestamp\":1679383924691}",​
EventTime: "2023-03-21T15:32:04+08:00",​
EventId: "123456",​
Version: "2020-12-01",​
AppId: "appId",​
Nonce: "aaBc",​
Signature: "1c7200723842eff514b65fc3f065597432bbb4249e10d33db79b3853d05f3691",​
}​
​
secretKey := "1234"​
ok := CheckSignature(event, secretKey)​
fmt.Printf("the result is %t", ok)​
}​
​
type Event struct {​
EventType string `json:"EventType"`​
EventData string `json:"EventData"`​
EventTime string `json:"EventTime"`​
EventId string `json:"EventId"`​
AppId string `json:"AppId"`​
Version string `json:"Version"`​
Signature string `json:"Signature"`​
Nonce string `json:"Nonce"`​
}​
​
func CheckSignature(event *Event, secretKey string) bool {​
data := []string{​
event.EventType,​
event.EventData,​
event.EventTime,​
event.EventId,​
event.AppId,​
event.Version,​
event.Nonce,​
secretKey,​
}​
sort.Strings(data)​
payload := strings.Join(data, "")​
hashData := sha256.Sum256([]byte(payload))​
signature := fmt.Sprintf("%x", hashData)​
fmt.Println("sign:" + signature)​
return signature == event.Signature​
}​
​
​
​
最近更新时间:2026.09.21 16:24:28
这个页面对您有帮助吗?
有用
有用
无用
无用