一、配置信息
实时音视频 TRTC 控制台支持自助配置回调信息,配置完成后即可接收事件回调通知。详细操作指引请参见 回调配置。
注意:你需要提前准备以下信息并在控制台完成 回调配置。
二、超时重试
事件回调服务器在发送消息通知后,5秒内没有收到你的服务器的响应,即认为通知失败。首次通知失败后会立即重试,后续失败会以10秒的间隔继续重试,直到消息存续时间超过1分钟,不再重试。
三、回调接口
你可以提供一个接收回调的 HTTP/HTTPS 服务网关来订阅回调消息。当相关事件发生时,云录制系统会回调事件通知到你的消息接收服务器。
四、事件回调消息格式
事件回调消息以 HTTP/HTTPS POST 请求发送给你的服务器,其中:
·字符编码格式:UTF-8。
·请求:body 格式为 JSON。
·应答:HTTP STATUS CODE = 200,服务端忽略应答包具体内容,为了协议友好,建议客户应答内容携带 JSON: {"code":0}。
·包体示例:下述为事件类型是“305”的包体示例,其他事件类型的示例可参见下文具体的事件信息说明。
{ "EventGroupId": 3, "EventType": 305, "CallbackTs": 1752580150082, "EventInfo": { "RoomId": "635055", "EventTs": 1752580150, "EventMsTs": 1752580150081, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 0 } }}
五、事件回调消息的 header 中包含以下字段:
| 字段名 | 值 |
| Content-Type | application/json |
| Sign | 签名值 |
| SdkAppId | SDK 应用 ID 值 |
六、事件回调消息的 body 中包含以下字段:
| 字段名 | 类型 | 含义 |
| EventGroupId | Number | 事件组 ID, 云端录制固定为3,页面录制固定为8 |
| EventType | Number | 回调通知的事件类型 |
| CallbackTs | Number | 事件回调服务器向你的服务器发出回调请求的 Unix 时间戳,单位为毫秒 |
| EventInfo | JSON Object | 事件信息 |
七、事件类型说明:
| 字段名 | 类型 | 含义 |
| EVENT_TYPE_CLOUD_RECORDING_RECORDER_START | 301 | 云端录制模块启动 |
| EVENT_TYPE_CLOUD_RECORDING_RECORDER_STOP | 302 | 云端录制模块退出 |
| EVENT_TYPE_CLOUD_RECORDING_UPLOAD_START | 303 | 云端录制文件上传任务启动,仅在选择对象存储时回调 |
| EVENT_TYPE_CLOUD_RECORDING_FILE_INFO | 304 | 云端录制 生成 m3u8 索引文件,第一次生成并且上传成功后回调,仅在通过 API 录制 选择对象存储时回调 |
| EVENT_TYPE_CLOUD_RECORDING_UPLOAD_STOP | 305 | 云端录制文件上传结束,仅在通过 API 录制 选择对象存储时回调 |
| EVENT_TYPE_CLOUD_RECORDING_FAILOVER | 306 | 云端录制发生迁移,原有的录制任务被迁移到新负载上时触发 |
| EVENT_TYPE_CLOUD_RECORDING_FILE_SLICE | 307 | 云端录制 生成 m3u8 索引文件(切出第一个 ts 切片)生成后回调,仅在通过 API 录制 选择对象存储时回调 |
| EVENT_TYPE_CLOUD_RECORDING_DOWNLOAD_IMAGE_ERROR | 309 | 云端录制下载解码图片文件发生错误 |
| EVENT_TYPE_CLOUD_RECORDING_MP4_STOP | 310 | 云端录制 MP4 录制任务结束,仅在通过 API录制 选择对象存储时回调(控制台开启自动录制,选择授权给点播的 cos 作为存储时,请关注311事件) |
| EVENT_TYPE_CLOUD_RECORDING_VOD_COMMIT | 311 | 云端录制 VOD 录制任务上传媒体资源完成,在选择云点播时和通过控制台自动录制存储至 cos 时回调(录制文件结束后携带点播索引信息,请订阅此类型回调事件) |
| EVENT_TYPE_CLOUD_RECORDING_VOD_STOP | 312 | 云端录制 VOD 录制任务结束,仅在选择云点播时回调 |
注意:301 – 309区间的回调状态为实时录制的中间状态,可以更加清晰的知晓录制任务的进行过程并记录状态,实际录制文件上传到点播成功会回调311事件,整体任务结束回调312事件。
八、事件信息说明:
| 字段名 | 类型 | 含义 |
| RoomId | String/Number | 房间名(类型与客户端房间号类型一致) |
| EventTs | Number | 事件发生的 Unix 时间戳,单位为秒 (不建议使用该字段,建议使用EventMsTs) |
| EventMsTs | Number | 事件发生的 Unix 时间戳,单位为毫秒 |
| UserId | String | 录制机器人的用户 ID |
| TaskId | String | 录制 ID,一次云端录制任务唯一的 ID |
| Payload | JsonObject | 根据不同事件类型定义不同 |
·事件类型为301(EVENT_TYPE_CLOUD_RECORDING_RECORDER_START)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 0:代表录制模块启动成功1:代表录制模块启动失败 |
{ "EventGroupId": 3, "EventType": 301, "CallbackTs": 1622186275913, "EventInfo": { "RoomId": "635055", "EventTs": "1622186275", "EventMsTs": 1622186275757, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 0 } }}
·事件类型为302(EVENT_TYPE_CLOUD_RECORDING_RECORDER_STOP)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| LeaveCode | Number | 0:代表录制模块正常调用停止录制退出1:录制机器人被客户踢出房间2:客户解散房间3:服务器将录制机器人踢出4:服务器解散房间99:代表房间内除了录制机器人没有其他用户流,超过指定时间退出100:房间超时退出101:同一用户重复进入相同房间导致机器人退出 |
{ "EventGroupId": 3, "EventType": 302, "CallbackTs": 1622186354806, "EventInfo": { "RoomId": "635055", "EventTs": "1622186354", "EventMsTs": 1622186275757, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "LeaveCode": 0 } }}
·事件类型为303(EVENT_TYPE_CLOUD_RECORDING_UPLOAD_START)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 0:代表上传模块正常启动 1:代表上传模块初始化失败。 |
{ "EventGroupId": 3, "EventType": 303, "CallbackTs": 1752580200339, "EventInfo": { "RoomId": "635055", "EventTs": 1752580146, "EventMsTs": 1752580146201, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 0 } } }
·事件类型为304(EVENT_TYPE_CLOUD_RECORDING_FILE_INFO )时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| FileList | String | 生成的 M3U8 文件名 |
{ "EventGroupId": 3, "EventType": 304, "CallbackTs": 1752580146476, "EventInfo": { "RoomId": "635055", "EventTs": 1752580146, "EventMsTs": 1752580146474, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "FileList": "1400704311_635055__UserId_s_dHVmdGpk__UserId_e_main_audio.m3u8" } } }
·事件类型为305(EVENT_TYPE_CLOUD_RECORDING_UPLOAD_STOP)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 0:代表此次录制上传任务已经完成,所有的文件均已上传到指定的第三方云存储 1:代表此次录制上传任务已经完成,但至少有一片文件滞留在服务器或者备份存储上 2:代表滞留在服务器或者备份存储上的文件已经恢复上传到指定的第三方云存储注意:305代表 HLS 文件上传结束事件 |
{ "EventGroupId": 3, "EventType": 305, "CallbackTs": 1752580150082, "EventInfo": { "RoomId": "635055", "EventTs": 1752580150, "EventMsTs": 1752580150081, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 0 } } }
·事件类型为306(EVENT_TYPE_CLOUD_RECORDING_FAILOVER)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 0:代表此次迁移已经完成 |
{ "EventGroupId": 3, "EventType": 306, "CallbackTs": 1622191989674, "EventInfo": { "RoomId": "20015", "EventTs": 1622191989, "EventMsTs": 1622186275757, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 0 } }}
·事件类型为307(EVENT_TYPE_CLOUD_RECORDING_FILE_SLICE)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| FileName | String | m3u8 文件名 |
| UserId | String | 录制文件对应的用户 ID |
| TrackType | String | 音视频类型 audio/video/audio_video |
| BeginTimeStamp | String | 录制开始时,服务器Unix时间戳(毫秒) |
{ "EventGroupId": 3, "EventType": 307, "CallbackTs": 1752580145235, "EventInfo": { "RoomId": "635055", "EventTs": "1752580145", "EventMsTs": 1752580145170, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "FileName": "1400704311_635055__UserId_s_dHVmdGpk__UserId_e_main_audio.m3u8", "UserId": "tuftjd", "TrackType": "audio", "BeginTimeStamp": 1752580135170 } }}
·事件类型为309(EVENT_TYPE_CLOUD_RECORDING_DOWNLOAD_IMAGE_ERROR)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Url | String | 下载失败的 URL |
{ "EventGroupId": 3, "EventType": 309, "CallbackTs": 1622191989674, "EventInfo": { "RoomId": "20015", "EventTs": 1622191989, "EventMsTs": 1622186275757, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Url": "https://query******1b35638507c58999a9e7077c7edc2738a896106f" } }}
·事件类型为310(EVENT_TYPE_CLOUD_RECORDING_MP4_STOP)时 Payload 的定义:
注意:说明:
注意:310 是上传 MP4 文件到客户指定第三方云存储 COS 完成后的回调事件,一个任务对应一个310事件(一个事件中对应本次任务中所有的录制文件信息)
| 段名 | 类型 | 含义 |
| Status | Number | 0:代表此次录制 MP4 任务已经正常退出,所有的文件均已上传到指定的第三方云存储 1:代表此次录制 MP4 任务已经正常退出,但至少有一片文件滞留在服务器或者备份存储上 2:代表此次录制 MP4 任务异常退出(可能原因是拉取 cos 的 hls 文件失败) |
| FileList | Array | 所有生成的 MP4 文件名 |
| FileMessage | Array | 所有生成的 MP4 文件信息 |
| FileName | String | MP4 文件名 |
| UserId | String | MP4 文件对应的用户 ID(当录制模式为混流模式时,此字段为空) |
| TrackType | String | audio 音频 / video 纯视频 / audio_video 音视频 |
| MediaId | String | 主辅流标识,main 代表主流(摄像头),aux 代表辅流(屏幕分享),mix 代表混流录制 |
| StartTimeStamp | Number | MP4 文件开始的 Unix 时间戳(毫秒) |
| EndTimeStamp | Number | MP4 文件结束的 Unix 时间戳(毫秒) |
{ "EventGroupId": 3, "EventType": 310, "CallbackTs": 1622191965320, "EventInfo": { "RoomId": "635055", "EventTs": 1622191989, "EventMsTs": 1622186275757, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 0, "FileList": ["1400704311_635055__UserId_s_dHVmdGpk__UserId_e_main.mp4"], "FileMessage": [ { "FileName": "1400704311_635055__UserId_s_dHVmdGpk__UserId_e_main.mp4", "UserId": "user2", "TrackType": "audio_video", "MediaId": "main", "StartTimeStamp": 1622186279145, "EndTimeStamp": 1622186282145 } ] } }}
·事件类型为311(EVENT_TYPE_CLOUD_RECORDING_VOD_COMMIT)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 0:代表本录制文件正常上传至点播平台1:代表本录制文件滞留在服务器或者备份存储上2:代表本录制文件上传点播任务异常 |
| UserId | String | 本录制文件对应的用户 ID(当录制模式为合流模式时,此字段为空) |
| TrackType | String | audio 音频 / video 纯视频 / audio_video 音视频 |
| MediaId | String | 主辅流标识,main 代表主流(摄像头),aux 代表辅流(屏幕分享),mix 代表混流录制 |
| FileId | String | 本录制文件在点播平台的唯一 ID |
| VideoUrl | String | 本录制文件在点播平台的播放地址 |
| CacheFile | String | 本录制文件对应的 MP4/HLS 文件名 |
| StartTimeStamp | Number | 本录制文件开始的 UNIX 时间戳(毫秒) |
| EndTimeStamp | Number | 本录制文件结束的 UNIX 时间戳(毫秒) |
| Errmsg | String | status 不为0时,对应的错误信息 |
上传成功的回调:
{ "EventGroupId": 3, "EventType": 311, "CallbackTs": 1622191965320, "EventInfo": { "RoomId": "20015", "EventTs": 1622191965, "EventMsTs": 1622186275757, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 0, "TencentVod": { "UserId": "user2", "TrackType": "audio_video", "MediaId": "main", "FileId": "5145403691953718116", "VideoUrl": "http://1500013742***/f0.mp4", "CacheFile": "1400704311_635055__UserId_s_dHVmdGpk__UserId_e_main.mp4", "StartTimeStamp": 1622186279153, "EndTimeStamp": 1622186282153 } } }}
上传失败的回调:
{ "EventGroupId": 3, "EventType": 311, "CallbackTs": 1622191965320, "EventInfo": { "RoomId": "20015", "EventTs": 1622191965, "EventMsTs": 1622186275757, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 1, "Errmsg": "vod service stop", "TencentVod": { "UserId": "user1", "TrackType": "audio_video", "CacheFile": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE" } } }}
注意:说明:
注意:录制完成收到311回调后到文件上传完成,根据你本次录制文件的大小不同可能需等待30s – 3min。
·事件类型为312(EVENT_TYPE_CLOUD_RECORDING_VOD_STOP)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 0:代表本次上传 VOD 任务已经正常退出1:代表本次上传 VOD 任务异常退出 |
{ "EventGroupId": 3, "EventType": 312, "CallbackTs": 1622191965320, "EventInfo": { "RoomId": "20015", "EventTs": 1622191965, "EventMsTs": 1622186275757, "UserId": "user1", "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 0 } }}
九、页面录制事件类型:
| 字段名 | 类型 | 含义 |
| EVENT_TYPE_WEB_RECORDER_START | 801 | 页面录制模块启动 |
| EVENT_TYPE_WEB_RECORDER_STOP | 802 | 页面录制模块退出 |
| EVENT_TYPE_WEB_RECORDER_STATUS_UPDATE | 803 | 页面录制模块录制状态更新 |
| EVENT_TYPE_WEB_RECORDER_RESOURCE_LIMIT | 804 | 页面录制任务资源受限,结束录制任务,仅在录制时长超限、录制分辨率超限时回调 |
十、页面录制事件信息说明:
| 字段名 | 类型 | 含义 |
| EventMsTs | Number | 事件发生的 Unix 时间戳,单位为毫秒 |
| TaskId | String | 录制 ID,一次页面录制任务唯一的 ID |
| Payload | JsonObject | 根据不同事件类型定义不同 |
| EventMessage | String | 对应Status的事件信息描述 |
·事件类型为801(EVENT_TYPE_WEB_RECORDER_START)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 1:代表页面录制模块启动成功2:代表页面录制模块启动失败3:代表录制过程中异常退出4:代表录制任务已迁移5:代表录制任务异常,停止录制 |
| EventMessage | String | Success:页面录制模块启动成功,开始录制StartRecording error:页面录制模块启动失败Goto url timeout:录制页面访问超时Exception error, exit task:录制异常结束Chrome exception, exit task:Chrome异常退出,录制结束Recording tasks have been migrated:录制任务已迁移Page load timeout:页面加载超时 |
{ "EventGroupId": 8, "EventType": 801, "CallbackTs": 1622186275913, "EventInfo": { "EventMsTs": 1622186275757, "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 1, "EventMessage": "Success" } }}
注意:说明:
注意:收到状态码为5的801回调时,录制任务将被终止,并不再重试,请你及时联系业务人员进行排查。
·事件类型为802(EVENT_TYPE_WEB_RECORDER_STOP)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 1:代表本次页面录制任务正常结束 |
| EventMessage | String | Success:页面录制模块正常调用停止录制退出 |
{ "EventGroupId": 8, "EventType": 802, "CallbackTs": 1622186275913, "EventInfo": { "EventMsTs": 1622186275757, "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 1, "EventMessage": "Success" } }}
注意:说明:
注意:收到802回调说明页面录制任务已完成,实际录制文件上传完成会回调311事件,整体完成回调312事件。
·事件类型为803(EVENT_TYPE_WEB_RECORDER_STATUS_UPDATE)时 Payload 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 1:代表页面录制任务页面刷新 2:代表页面录制任务暂停录制3:代表页面录制任务恢复录制 |
| EventMessage | String | PageRefresh:刷新录制页面RecordPaused:录制任务暂停RecordResume:录制任务恢复Page load timeout:页面加载超时 |
{ "EventGroupId": 8, "EventType": 803, "CallbackTs": 1622186275913, "EventInfo": { "EventMsTs": 1622186275757, "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 1, "EventMessage": "PageRefresh" } }}
·事件类型为804(EVENT_TYPE_WEB_RECORDER_RESOURCE_LIMIT)时 Status 的定义:
| 字段名 | 类型 | 含义 |
| Status | Number | 1:代表本次页面录制任务达到设定的最大录制时间,结束录制 2:代表本次页面录制任务的录制页面中出现了超过设定的最大录制分辨率的视频流,结束录制 |
| EventMessage | String | Over time limit:录制时长达到设定的最大录制时长,自动结束录制 Over resolution limit:录制任务中出现超过最大分辨率限制的视频源,自动结束录制 |
{ "EventGroupId": 8, "EventType": 804, "CallbackTs": 1622186275913, "EventInfo": { "EventMsTs": 1622186275757, "TaskId": "-m9-bVVU7id***K-m928oZWQndiborbEWH3zY-lIXlprc-gQvQE", "Payload": { "Status": 1, "EventMessage": "Over time limit" } }}
注意:说明:
注意:收到804回调状态码为2时,请检查录制过程中是否出现超出分辨率限制(1920*1080)的视频流。
十一、计算签名
签名由 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}"
十二、签名校验示例
JavaPythonPHPGolangimport 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_dict else: 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))}