配置信息
超时重试
事件回调服务器在发送消息通知后,5秒内没有收到您的服务器的响应,即认为通知失败。首次通知失败后会立即重试,后续失败会以10秒的间隔继续重试,直到消息存续时间超过1分钟,不再重试。
事件回调消息格式
事件回调消息以 HTTP / HTTPS POST 请求发送给您的服务器,其中:
字符编码格式:UTF-8。
请求:body 格式为 JSON。
应答:HTTP STATUS CODE = 200,服务端忽略应答包具体内容,为了协议友好,建议客户应答内容携带 JSON: {"code":0}。
包体示例:下述为“启动 AI 转录与翻译 2.0”事件的包体示例。
{"EventGroupId": 14,"EventType": 1401,"CallbackTs": 1687770730166,"EventInfo": {"EventMsTs": 1622186275757,"TaskId": "xxx","RoomId": "1234","RoomIdType": 0,"RobotId": "trtc_partner_test_1","Payload": {"Status": 0}}}
参数说明
回调消息参数
事件回调消息的 header 中包含以下字段:
字段名 | 含义 |
Content-Type | application/json。 |
Sign | 签名值。 |
SdkAppId | 创建应用时控制台分配的 SdkAppId。 |
事件回调消息的 body 中包含以下字段:
字段名 | 类型 | 含义 |
EventGroupId | Number | 事件组 ID,转录事件组事件固定为14。 |
EventType | Number | 回调通知的事件类型。 |
CallbackTs | Number | 事件回调服务器向您的服务器发出回调请求的 Unix 时间戳,单位为毫秒。 |
EventInfo | JSON Object |
事件组 ID
字段名 | 值 | 含义 |
EVENT_GROUP_CLOUD_TRANSCRIPTION | 14 | 转录事件组。 |
事件类型
字段名 | 值 | 含义 |
EVENT_TYPE_CLOUD_TRANSCRIPTION_START | 1401 | 转录开始状态回调。 |
EVENT_TYPE_CLOUD_TRANSCRIPTION_STOP | 1402 | 转录任务结束状态回调。 |
EVENT_TYPE_CLOUD_TRANSCRIPTION_ASR_MSG | 1403 | 回调转录 ASR 的完整句子。 |
EVENT_TYPE_CLOUD_TRANSCRIPTION_TRANSLATE_MSG | 1404 | 回调转录翻译的完整句子。 |
EVENT_TYPE_CLOUD_TRANSCRIPTION_START
字段名 | 类型 | 含义 |
EventMsTs | Number | 事件发生的 Unix 时间戳,单位为毫秒。 |
TaskId | String | 任务 ID。 |
RoomId | String | TRTC 的房间 ID。 |
RoomIdType | Integer | 0:表示数字房间号。 1:表示字符串房间号。 |
RobotId | String | 机器人 ID。 |
Payload.Status | Number | 0:启动转录任务。 1:启动转录任务失败。 |
{"EventGroupId": 14,"EventType": 1401,"CallbackTs": 1687770730166,"EventInfo": {"EventMsTs": 1622186275757,"TaskId": "xxx","RoomId": "1234","RoomIdType": 0,"RobotId": "trtc_partner_test_1","Payload": {"Status": 0}}}
EVENT_TYPE_CLOUD_TRANSCRIPTION_STOP
字段名 | 类型 | 含义 |
EventMsTs | Number | 事件发生的 Unix 时间戳,单位为毫秒。 |
TaskId | String | 任务 ID。 |
RoomId | String | TRTC 的房间 ID。 |
RoomIdType | Integer | 0:表示数字房间号。 1:表示字符串房间号。 |
RobotId | String | 机器人 ID。 |
Payload.LeaveCode | Integer | 0:转录模块正常调用停止转录退出。 1:转录机器人被客户踢出房间。 2:客户解散房间。 3:服务器将转录机器人踢出。 4:服务器解散房间。 99:代表房间内除了转录机器人没有其他用户流,超过指定时间退出。 101:同一用户重复进入相同房间导致机器人退出。 |
{"EventGroupId": 14,"EventType": 1402,"CallbackTs": 1687770730166,"EventInfo": {"EventMsTs": 1622186275757,"TaskId": "xxx","RoomId": "1234","RoomIdType": 0,"RobotId": "trtc_partner_test_1","Payload": {"LeaveCode": 0}}}
EVENT_TYPE_CLOUD_TRANSCRIPTION_ASR_MSG
字段名 | 类型 | 含义 |
EventMsTs | Number | 事件发生的 Unix 时间戳,单位为毫秒。 |
TaskId | String | 任务 ID。 |
RoomId | String | TRTC 的房间 ID。 |
RoomIdType | Integer | 0:表示数字房间号。 1:表示字符串房间号。 |
RobotId | String | 机器人 ID。 |
Payload | JSON Object | 为 JSON 对象:
|
{"EventGroupId": 14,"EventType": 1403,"CallbackTs": 1687770730166,"EventInfo": {"EventMsTs": 1761568449890,"TaskId": "xxx","RoomId": "1234","RoomIdType": 0,"RobotId": "trtc_partner_test_1","Payload": {"UserId": "Trtc_User_0","Text": "Oh yeah? What's the ultimate predator? What's the ultimate predator? What's the enemy you harbor in your own heart? Who hates you? That's the ultimate predator.","StartTimeMs": 108,"EndTimeMs": 10568,"RoundId": "40c9e724-3268-4b66-a9ff-41ed44d8edb6","StartUtcMs": 1761568438912,"EndUtcMs": 1761568449372}}}
EVENT_TYPE_CLOUD_TRANSCRIPTION_TRANSLATE_MSG
字段名 | 类型 | 含义 |
EventMsTs | Number | 事件发生的 Unix 时间戳,单位为毫秒。 |
TaskId | String | 任务 ID。 |
RoomId | String | TRTC 的房间 ID。 |
RoomIdType | Integer | 0:表示数字房间号。 1:表示字符串房间号。 |
RobotId | String | 机器人 ID。 |
Payload | JSON Object | 为 JSON 对象:
|
{"EventGroupId": 14,"EventType": 1404,"CallbackTs": 1687770730166,"EventInfo": {"EventMsTs": 1761568449890,"TaskId": "xxx","RoomId": "1234","RoomIdType": 0,"RobotId": "trtc_partner_test_1","Payload": {"UserId": "Trtc_User_0","Text": "presume, was exactly the same way. ","TranslateMsg": [{"Language": "fr","Text": "Je suppose, c'était exactement la même chose."},{"Language": "zh","Text": "大概也是一模一样的。"}],"StartTimeMs": 108,"EndTimeMs": 10568,"RoundId": "40c9e724-3268-4b66-a9ff-41ed44d8edb6","StartUtcMs": 1761568438912,"EndUtcMs": 1761568449372}}}
计算签名
签名由 HMAC SHA256 加密算法计算得出,您的事件回调接收服务器收到回调消息后,通过同样的方式计算出签名,相同则说明是腾讯云的实时音视频的事件回调,没有被伪造。签名的计算如下所示:
//签名 Sign 计算公式中 key 为计算签名 Sign 用的加密密钥。Sign = base64(hmacsha256(key, body))
注意:
body 为您收到回调请求的原始包体,不要做任何转化,示例如下:
body="{\\n\\t\\"EventGroupId\\":\\t1,\\n\\t\\"EventType\\":\\t103,\\n\\t\\"CallbackTs\\":\\t1615554923704,\\n\\t\\"EventInfo\\":\\t{\\n\\t\\t\\"RoomId\\":\\t12345,\\n\\t\\t\\"EventTs\\":\\t1608441737,\\n\\t\\t\\"UserId\\":\\t\\"test\\",\\n\\t\\t\\"UniqueId\\":\\t1615554922656,\\n\\t\\t\\"Role\\":\\t20,\\n\\t\\t\\"Reason\\":\\t1\\n\\t}\\n}"
签名校验示例
import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;//# 功能:第三方回调sign校验//# 参数://# key:控制台配置的密钥key//# body:腾讯云回调返回的body体//# sign:腾讯云回调返回的签名值sign//# 返回值://# Status:OK 表示校验通过,FAIL 表示校验失败,具体原因参考Info//# Info:成功/失败信息public class checkSign {public static String getResultSign(String key, String body) throws Exception {Mac hmacSha256 = Mac.getInstance("HmacSHA256");SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");hmacSha256.init(secret_key);return Base64.getEncoder().encodeToString(hmacSha256.doFinal(body.getBytes()));}public static void main(String[] args) throws Exception {String key = "123654";String body = "{\\n" + "\\t\\"EventGroupId\\":\\t2,\\n" + "\\t\\"EventType\\":\\t204,\\n" + "\\t\\"CallbackTs\\":\\t1664209748188,\\n" + "\\t\\"EventInfo\\":\\t{\\n" + "\\t\\t\\"RoomId\\":\\t8489,\\n" + "\\t\\t\\"EventTs\\":\\t1664209748,\\n" + "\\t\\t\\"EventMsTs\\":\\t1664209748180,\\n" + "\\t\\t\\"UserId\\":\\t\\"user_85034614\\",\\n" + "\\t\\t\\"Reason\\":\\t0\\n" + "\\t}\\n" + "}";String Sign = "kkoFeO3Oh2ZHnjtg8tEAQhtXK16/KI05W3BQff8IvGA=";String resultSign = getResultSign(key, body);if (resultSign.equals(Sign)) {System.out.println("{'Status': 'OK', 'Info': '校验通过'}");} else {System.out.println("{'Status': 'FAIL', 'Info': '校验失败'}");}}}
# -*- coding: utf8 -*-import hmacimport base64from hashlib import sha256# 功能:第三方回调sign校验# 参数:# key:控制台配置的密钥key# body:腾讯云回调返回的body体# sign:腾讯云回调返回的签名值sign# 返回值:# Status:OK 表示校验通过,FAIL 表示校验失败,具体原因参考Info# Info:成功/失败信息def checkSign(key, body, sign):temp_dict = {}computSign = base64.b64encode(hmac.new(key.encode('utf-8'), body.encode('utf-8'), digestmod=sha256).digest()).decode('utf-8')print(computSign)if computSign == sign:temp_dict['Status'] = 'OK'temp_dict['Info'] = '校验通过'return temp_dictelse:temp_dict['Status'] = 'FAIL'temp_dict['Info'] = '校验失败'return temp_dictif __name__ == '__main__':key = '123654'body = "{\\n" + "\\t\\"EventGroupId\\":\\t2,\\n" + "\\t\\"EventType\\":\\t204,\\n" + "\\t\\"CallbackTs\\":\\t1664209748188,\\n" + "\\t\\"EventInfo\\":\\t{\\n" + "\\t\\t\\"RoomId\\":\\t8489,\\n" + "\\t\\t\\"EventTs\\":\\t1664209748,\\n" + "\\t\\t\\"EventMsTs\\":\\t1664209748180,\\n" + "\\t\\t\\"UserId\\":\\t\\"user_85034614\\",\\n" + "\\t\\t\\"Reason\\":\\t0\\n" + "\\t}\\n" + "}"sign = 'kkoFeO3Oh2ZHnjtg8tEAQhtXK16/KI05W3BQff8IvGA='result = checkSign(key, body, sign)print(result)
<?phpclass TlsEventSig {private $key = false;private $body = false;public function __construct( $key, $body ) {$this->key = $key;$this->body = $body;}private function __hmacsha256() {$hash = hash_hmac( 'sha256', $this->body, $this->key, true );return base64_encode( $hash);}public function genEventSig() {return $this->__hmacsha256();}}$key="789";$data="{\\n\\t\\"EventGroupId\\":\\t1,\\n\\t\\"EventType\\":\\t101,\\n\\t\\"CallbackTs\\":\\t1608086882372,\\n\\t\\"EventInfo\\":\\t{\\n\\t\\t\\"RoomId\\":\\t20222,\\n\\t\\t\\"EventTs\\":\\t1608086882,\\n\\t\\t\\"UserId\\":\\t\\"222222_phone\\"\\n\\t}\\n}";$api = new TlsEventSig($key, $data);echo $api->genEventSig();
package mainimport "fmt"import ("crypto/hmac""crypto/sha256""encoding/base64")func main () {var data = "{\\n\\t\\"EventGroupId\\":\\t1,\\n\\t\\"EventType\\":\\t101,\\n\\t\\"CallbackTs\\":\\t1608086882372,\\n\\t\\"EventInfo\\":\\t{\\n\\t\\t\\"RoomId\\":\\t20222,\\n\\t\\t\\"EventTs\\":\\t1608086882,\\n\\t\\t\\"UserId\\":\\t\\"222222_phone\\"\\n\\t}\\n}"var key = "789"//JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。fmt.Println(hmacsha256(data,key))}func hmacsha256(data string, key string) string {h := hmac.New(sha256.New, []byte(key))h.Write([]byte(data))return base64.StdEncoding.EncodeToString(h.Sum(nil))}