实时音视频 TRTC 控制台支持自助配置回调信息,配置完成后即可接收事件回调通知。详细操作指引请参见 回调配置。在配置回调信息前,您需提前准备计算签名的 密钥 key,由您自定义一个最大32个字符的 key,以大小写字母及数字组成。
本文档将帮助您在计算签名后,如何校验签名进行示例。
计算签名
签名由 HMAC SHA256 加密算法计算得出,您的事件回调接收服务器收到回调消息后,通过同样的方式计算出签名,相同则说明是腾讯云的实时音视频的事件回调,没有被伪造。签名的计算如下所示:
//签名 Sign 计算公式中 key 为计算签名 Sign 用的加密密钥。Sign = base64(hmacsha256(key, body))
注意
body 为您收到回调请求的原始包体,不要做任何转化,需要完整保留\\n\\t转移字符,示例如下:
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";// 请确保 body 为您收到回调请求的原始包体,不要做任何转化,需要完整保留\\n\\t转移字符,示例如下:? ? ? ? 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_dict?if __name__ == '__main__':? ? key = '123654'# 请确保 body 为您收到回调请求的原始包体,不要做任何转化,需要完整保留\\n\\t转移字符,示例如下:? ? 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)
<?php?class 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";// 请确保 body 为您收到回调请求的原始包体,不要做任何转化,需要完整保留\\n\\t转移字符,示例如下:$body="{\\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, $body);echo $api->genEventSig();
package mainimport "fmt"import ("crypto/hmac""crypto/sha256""encoding/base64")?func main () {// 请确保 body 为您收到回调请求的原始包体,不要做任何转化,需要完整保留\\n\\t转移字符,示例如下:var body= "{\\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(body,key))}?func hmacsha256(body string, key string) string {h := hmac.New(sha256.New, []byte(key))h.Write([]byte(body))return base64.StdEncoding.EncodeToString(h.Sum(nil))}
?