C#对接腾讯会议API接口

申请会议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”拼接,不要写错!!!

如果有某些地方有不同看法或有错误,欢迎在评论区指出!!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值