C#中Telegram小程序initData校验现成方案及斜杠问题咨询
Telegram小程序initData校验的C#解决方案及斜杠问题处理
现成方案
C#没有官方原生的Telegram WebApp校验函数,但可以严格遵循Telegram官方校验规则自行实现,也可以借助第三方NuGet包(比如Telegram.Bot库)简化开发,核心逻辑仍需贴合官方规范。
斜杠导致哈希不匹配的原因及解决
你的问题核心是checkString的构造不符合Telegram要求,并非单纯转义斜杠,需严格按以下规则处理参数:
- 先将initData中的所有键值对按键名升序排序
- 每个键值对格式化为
key=value形式,value直接使用原始值(包括斜杠,无需额外转义) - 用**换行符
\n**连接所有格式化后的键值对,得到最终的checkString
如果构造checkString时未遵守排序规则,或错误处理了value的原始字符,就会导致哈希匹配失败。
修正后的示例代码
using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; public class TelegramInitDataValidator { public bool ValidateInitData(string botToken, Dictionary<string, string> initDataParams, string providedHash) { // 按键名升序排序参数 var sortedParams = new SortedDictionary<string, string>(initDataParams); // 构造校验字符串:跳过hash字段,用换行连接key=value var checkStringBuilder = new StringBuilder(); foreach (var kvp in sortedParams) { if (kvp.Key == "hash") continue; checkStringBuilder.AppendLine($"{kvp.Key}={kvp.Value}"); } string checkString = checkStringBuilder.ToString().TrimEnd('\n'); // 计算校验密钥:HMAC-SHA256("WebAppData", bot_token) byte[] secretKey; using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes("WebAppData"))) { secretKey = hmac.ComputeHash(Encoding.UTF8.GetBytes(botToken)); } // 计算校验字符串的哈希值 string computedHash; using (var hmac = new HMACSHA256(secretKey)) { byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(checkString)); computedHash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); } // 对比哈希值 return computedHash == providedHash; } }
关键注意事项
- 键值对必须按升序排序,这是校验成功的核心前提
- 保留value的原始字符,无需对斜杠等特殊字符做转义
- 必须用换行符分隔键值对,不能使用其他分隔符
- 密钥计算逻辑不能搞反:用"HMAC-SHA256"算法,以"WebAppData"为密钥,输入bot token生成secretKey
内容的提问来源于stack exchange,提问作者none
相关产品推荐
相关产品推荐

