C#对接腾讯会议API接口
申请会议API
申请需要提供企业执照,大概48小时之内就会收到反馈。邮件会包含AppId,SDKID(不一定有),SecretId,SecretKey四项信息。
SecretId:用于表示 API 调用者身份。
SecretKey:用于加密签名字符串和服务器端验证签名字符串的密钥。
AppId和SDKId不做赘述了。
接口公共参数
签名串生成规则
根据官方文档,我们能知道签名字段包含:X-TC-Nonce,X-TC-Timestamp,X-TC-Key.
其中需要注意X-TC-Key等于SecretId,而不是SecretKey
1、串联参数
headerString = "X-TC-Key=" + "AKIDz8krbsJ*********************XAMPLE" + "&X-TC-Nonce=" + 1234567 + "&X-TC-Timestamp=" + 1572168600
2、组签名串
以取消会议接口为例
首先先把签名串拼接好
/// <summary>
/// 拼接签名串
/// </summary>
/// <param name="httpMethod">请求方式</param>
/// <param name="secretId">secretId</param>
/// <param name="headerNonce"></param>
/// <param name="headerTimestamp"></param>
/// <param name="requestUri"></param>
/// <param name="requestBody"></param>
/// <returns></returns>
public static string HeaderString(string httpMethod, string secretId, int headerNonce, int headerTimestamp, string requestUri, string requestBody)
{
//签名顺序需要注意\n和&的拼接位置各不相同
return httpMethod + "\nX-TC-Key=" + secretId + "&X-TC-Nonce=" + headerNonce + "&X-TC-Timestamp=" + headerTimestamp + "\n" + requestUri + "\n" + requestBody;
}
3、生成对应的HttpWebRequest用于请求
然后把签名串和公共参数放到一起,最后生成一个HttpWebRequest,用于后续请求使用。
/// <summary>
/// 腾讯会议请求HttpWebRequest
/// </summary>
/// <param name="HTTPMethod">请求方式 GET/POST</param>
/// <param name="url"> 请求uri,eg:/v1/meetings</param>
/// <param name="parameter">请求体,没有的设为空串</param>
/// <param name="headerNonce">X-TC-Nonce请求头,随机数</param>
/// <param name="headerTimestam">X-TC-Timestamp请求头,当前时间的秒级时间戳</param>
/// <returns></returns>
public static HttpWebRequest TencentRequest(string HTTPMethod,string url, string parameter, int headerNonce, int headerTimestam)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ResServer.ServerUrl+url);
request.ContentType = "application/json";
request.Method = HTTPMethod;
request.Headers.Add("X-TC-Key", TencentUtil.SecretId);
request.Headers.Add("X-TC-Timestamp", headerTimestam.ToString());
request.Headers.Add("X-TC-Nonce", headerNonce.ToString());
request.Headers.Add("AppId", TencentUtil.AppId);
request.Headers.Add("SdkId", TencentUtil.SdkId); //如若有SdkId则必须要添加到
//拼接签名串,用于后续生成签名。
string stringToSign = HeaderString(HTTPMethod, TencentUtil.SecretId, headerNonce, headerTimestam, url, parameter); //HTTPMethod + headerString + ResServer.CreatMeetingUrl + meetJson;
//HMACSHA256——>16位字符——>Base64
string sanyue = SanyueUtil.ToBase64hmac(stringToSign, TencentUtil.SecretKey);
request.Headers.Add("X-TC-Signature", sanyue);
return request;
}
4、HttpWebRequest发起请求并接口返回结果
/// <summary>
/// 取消腾讯会议
/// </summary>
/// <param name="meeting">取消腾讯会议参数实体</param>
/// <param name="meetingId">腾讯会议唯一Id</param>
/// <returns></returns>
public static string CancelMeeting(CancelMeeting meeting,string meetingId)
{
string url = ResServer.CancelMeetingUrl + string.Format("/{0}/cancel", meetingId);
string retString = ""; //返回结果
int Nonce = SanyueUtil.GetNonce(); //正随机数
int time = SanyueUtil.GetUnixTimeStamp(DateTime.Now.ToString()); //当前时间戳
string meetJson = JsonUtil.SerializeObject(meeting); //会议实体类
HttpWebRequest request = TencentRequest("POST", url, meetJson, Nonce, time);
//序列化为字符串,可以使用自己项目中封装的json方法
using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream()))
{
dataStream.Write(meetJson);
dataStream.Close();
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string encoding = response.ContentEncoding;
if (encoding == null || encoding.Length < 1)
{
encoding = "UTF-8"; //默认编码
}
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
retString = reader.ReadToEnd();
return retString;
}
踩坑总结
可能会错的地方:
1、X-TC-Key等于SecretId,而不是SecretKey!!!!。
2、参数中时间类型要传10位数的时间戳!!!非13位的!
3、公共参数中,如果有SdkId就也把SdkId放在公共参数里。这点官方文档没有写明白,后来提交工单才整明白的。
4、签名串生成时,不要看懵,一定要挨个比对。有的地方使用“&”拼接,有的需要用“\n”拼接,不要写错!!!
如果有某些地方有不同看法或有错误,欢迎在评论区指出!!