DEMO
前端 JS-API 签名工具
协助开发者对 JS-API 使用前通过 Config 接口注入权限验证配置的签名校验。
单击下方按钮即可前往腾讯会议前端 JS-API 签名工具:
前端 JS-API 签名示例代码
提供了三种代码示例给开发者参考。
Go 代码示例
/*** 生成签名** @param corpId 企业ID* @param sdkId 应用ID* @param timestamp 生成签名的时间对应秒级时间戳* @param nonceStr 接入方后台随机生成的字符串* @param sourceUrl 需要初始化JS_SDK的当前页面地址(不要转码)* @param ticket 接入方后台请求会议后台获取的JS_SDK Ticket* @return sign签名,配置参数签名*/func DoSignature(corpId string, sdkId string, timestamp string, nonceStr string, sourceUrl string, ticket string) string {url := DoPreUrl(sourceUrl)fmt.Println(url)plainText := fmt.Sprintf("corp_id=%s&sdk_id=%s×tamp=%s&nonce_str=%s&url=%s&ticket=%s",corpId, sdkId, timestamp, nonceStr, url, ticket)fmt.Println(plainText)sign := fmt.Sprintf("%x", sha256.Sum256([]byte(plainText)))fmt.Println(sign)return sign}/*** 预处理url* 1、url字段包含协议头、域名、路径、Query参数,不包含位置参数。如:https://www.baidu.com/search?a=1&b=2* 2、若当前url最后带有#号,例如https://www.baidu.com/search/#/* 由于#号是代表一个锚点,计算签名的时候,腾讯会议侧会忽略#号和#号后面的,故接入方也需要用代码处理,忽略掉#号和#号后面的,最终url应该为https://www.baidu.com/search/** @param sourceUrl 需要初始化JS_SDK的当前页面地址(不要转码)* @return url 预处理之后的url*/func DoPreUrl(sourceUrl string) string {rawUrl, _ := url.Parse(sourceUrl)var url stringif len(rawUrl.RawQuery) > 0 {url = fmt.Sprintf("%v://%v%v?%v", rawUrl.Scheme, rawUrl.Host, rawUrl.Path, rawUrl.RawQuery)} else {url = fmt.Sprintf("%v://%v%v", rawUrl.Scheme, rawUrl.Host, rawUrl.Path)}return url}
Java 代码示例
/*** 生成签名** @param corpId 企业ID* @param sdkId 应用ID* @param timestamp 生成签名的时间对应秒级时间戳* @param nonceStr 接入方后台随机生成的字符串* @param sourceUrl 需要初始化JS_SDK的当前页面地址(不要转码)* @param ticket 接入方后台请求会议后台获取的JS_SDK Ticket* @return sign签名,配置参数签名*/public static String DoSignature(String corpId ,String sdkId ,String timestamp,String nonceStr,String sourceUrl,String ticket ) {String url = DoPreUrl(sourceUrl);String plainText = String.format("corp_id=%s&sdk_id=%s×tamp=%s&nonce_str=%s&url=%s&ticket=%s",corpId, sdkId, timestamp, nonceStr, url, ticket);MessageDigest messageDigest;String sign = "";try {messageDigest = MessageDigest.getInstance("SHA-256");messageDigest.update(plainText.getBytes("UTF-8"));sign = bytesToHex(messageDigest.digest());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}return sign;}/*** 预处理url* 1、url字段包含协议头、域名、路径、Query参数,不包含位置参数。如:https://www.baidu.com/search?a=1&b=2* 2、若当前url最后带有#号,例如https://www.baidu.com/search/#/* 由于#号是代表一个锚点,计算签名的时候,腾讯会议侧会忽略#号和#号后面的,故接入方也需要用代码处理,忽略掉#号和#号后面的,最终url应该为https://www.baidu.com/search/** @param sourceUrl 需要初始化JS_SDK的当前页面地址(不要转码)* @return url 预处理之后的url*/public static String DoPreUrl(String sourceUrl) {URL rawUrl = null;try {rawUrl = new URL(sourceUrl);} catch (MalformedURLException e) {e.printStackTrace();}String url;if (rawUrl.getQuery() != null && rawUrl.getQuery() != "") {url = String.format("%s://%s%s?%s", rawUrl.getProtocol(), rawUrl.getHost(), rawUrl.getPath(), rawUrl.getQuery());} else {url = String.format("%s://%s%s", rawUrl.getProtocol(), rawUrl.getHost(), rawUrl.getPath());}return url;}static char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};/*** 转Hex* @param bytes* @return Hex*/static String bytesToHex(byte[] bytes) {char[] buf = new char[bytes.length * 2];int index = 0;for (byte b : bytes) {buf[index++] = HEX_CHAR[b >>> 4 & 0xf];buf[index++] = HEX_CHAR[b & 0xf];}return new String(buf);}
Python 代码示例
# 加签def sign(corp_id, sdk_id, timestamp, nonce_str, url, ticket):tobeSig = "corp_id={0}&sdk_id={1}×tamp={2}&nonce_str={3}&url={4}&ticket={5}".format(corp_id, sdk_id, timestamp, nonce_str, preUrl(url), ticket)signature = data_sha = hashlib.sha256(tobeSig.encode('utf-8')).hexdigest()return signature.encode('utf-8')# url预处理def preUrl(sourceUrl):rawURL = urlparse(sourceUrl)s = ''if len(rawURL.query) > 0:s = "{0}://{1}{2}?{3}".format(rawURL.scheme, rawURL.netloc, rawURL.path, rawURL.query)else:s = "{0}://{1}{2}".format(rawURL.scheme, rawURL.netloc, rawURL.path)print(s)return s