有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

DEMO

请参见 JS-SDK 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&timestamp=%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 string
if 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&timestamp=%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}&timestamp={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