腾讯会议事件订阅签名验证失败

背景

最近在对接腾讯会议这块,前期磕磕绊绊算走过来。对接到会议事件(webhook)这块死活验签不通过。打日志发现,C#的生成的签名和腾讯返回的签名是不一样呢,首先确认了一下token是不是一样的,确认token是完全一样的。最终没办法拿到java的示例跑一下看看。哇塞!为什么和服务器生成一毛一样。(暗自窃喜)这个肯定是C#的代码示例有问题。向腾讯那边的人反馈,他确认后,让我提交工单,让腾讯那边的改一下就行。万万没想到,这个客服只会让我确认两个问题,

  1. 时间戳必须在计算机的五分钟内(这个根本不可能,验签工作时我做的,我压根没有判断有没有小于五分钟)
  2. token是不是一致(这个在上诉中已经确认,肯定一样的)

刚好我今天腾出空来,好好看看这个是什么问题

排查问题

根据腾讯文档上的签名生成规则来分析。
在这里插入图片描述
在这个四个步骤里面,按照字典排序最有可能出现问题。没明确表示是按照哪种算法排序。
然后我就把断点打在这里看数组:

java代码

在这里插入图片描述

C#代码

在这里插入图片描述
发现了两块代码中token和data的顺序并不一样。
现在问题已经明确是C#的排序和java的字符串排序不一样导致

解决办法

把这块代码

 string[] arr = { token, timestamp, nonce, data };
 Array.Sort(arr);

替换成如下代码

 var arr = new List<string> { token, timestamp, nonce, data };
 arr.Sort(string.CompareOrdinal);

完整代码示例:

 public static string CalSignature(string token, string timestamp, string nonce, string data)
 {
      var arr = new List<string> { token, timestamp, nonce, data };
        arr.Sort(string.CompareOrdinal);
        var toSign = new StringBuilder();
        for (int i = 0; i < arr.Count; i++)
        {
            toSign.Append(arr[i]);
        }
        var buffer = Encoding.UTF8.GetBytes(toSign.ToString());
        var signData = SHA1.Create().ComputeHash(buffer);
        var sb = new StringBuilder();
        foreach (var t in signData)
        {
            sb.Append(t.ToString("x2"));
        }
        return sb.ToString();
}

后续

事情解决完了,我还把相关的解决思路。发给腾讯客服了,客服没有道歉,只说会把情况反应到技术上。这么人性的客服那肯定一星好评送上是吧

引用

java中的默认排序规则,C#中列表,集合排序Sort,OrderBy与Java排序规则默认不一致…

### 实现腾讯会议登录授权 要在 UniApp 中实现腾讯会议的登录授权,主要涉及以下几个方面: #### 1. 准备工作 确保项目满足特定环境要求。微信 App iOS 版本需不低于 7.0.9,Android 版本应至少为 7.0.8;小程序的基础库版本则要达到 2.10.0 或以上[^3]。 #### 2. 获取应用凭证 前往腾讯云官网注册并创建应用程序实例,获取 `appid` 和 `secretKey` 等必要参数用于后续接口调用验证身份合法性。 #### 3. 配置服务器端 在服务器端设置 OAuth 授权回调 URL 并保存至腾讯开放平台管理后台。当用户同意授权后会跳转至此链接携带 code 参数返回给前端页面以便换取 access_token 完成最终认证过程。 #### 4. 编写客户端代码 下面是一个简单的示例展示了如何利用 uni-app 进行腾讯会议 API 登录授权请求: ```javascript // main.js 文件内定义全局方法方便各处调用 export default function loginWithTencentMeeting() { const appId = 'YOUR_APP_ID'; // 替换成自己的 appid let redirectUrlEncoded = encodeURIComponent('https://yourdomain.com/callback'); window.location.href=`https://openapi.qcloud.com/v2/index.php?Action=GetToken&app_id=${appId}&redirect_uri=${redirectUrlEncoded}`; } ``` 此段脚本实现了重定向到腾讯提供的第三方登录界面让用户输入账户密码完成鉴权操作之后再由浏览器自动拉起指定好的 callback 页面继续处理业务逻辑。 需要注意的是实际开发过程中还需要考虑安全性因素比如防止 CSRF 攻击等问题,在生产环境中建议采用 HTTPS 协议传输数据以及对敏感信息做加密保护措施等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值