You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:23:14