Telegram小程序数据哈希校验错误排查:格式与代码问题求助
Telegram Web App 哈希校验失败排查(Go语言)
你的哈希校验失败主要有几个核心问题,逐一排查:
函数名字符错误
你的函数名СheckTelegramAuth首字母是西里尔字母С(并非英文的C),这会导致代码调用时出现函数找不到的问题,虽然可能不是哈希计算错误的直接原因,但必须修正。User JSON格式不符合Telegram规范
Telegram要求生成校验字符串时,user字段的JSON必须是紧凑无空格格式(无任何空格、换行或缩进)。你当前提供的校验字符串中,user的JSON存在逗号后的空格(例如"id":377742748,"first_name"),这会直接导致哈希计算结果不一致。正确的
userJSON格式应该是:{"id":377742748,"first_name":"Марк","last_name":"Аникин","username":"corray9","language_code":"en","allows_write_to_pm":true}注意:逗号后无空格,整个JSON为紧凑结构。
initData处理的潜在问题
使用url.ParseQuery解码initData是正确的,但要确保解码后得到的user值和Telegram前端传递的原始紧凑JSON完全一致,不要对其进行任何格式化操作(比如用json.MarshalIndent处理)。
修正后的代码
import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "fmt" "net/url" "os" "sort" "strings" ) // 修正函数名为英文首字母C func CheckTelegramAuth(initData string) bool { data, err := url.ParseQuery(initData) if err != nil { fmt.Println("Error parsing initData:", err) return false } var keys []string for k := range data { keys = append(keys, k) } sort.Strings(keys) var dataCheckStrings []string for _, k := range keys { if k != "hash" { // 直接使用解码后的值,不修改JSON格式 dataCheckStrings = append(dataCheckStrings, fmt.Sprintf("%s=%s", k, data.Get(k))) } } dataCheckString := strings.Join(dataCheckStrings, "\n") fmt.Println(dataCheckString) // 生成secretKey的逻辑符合Telegram规范 h := hmac.New(sha256.New, []byte(os.Getenv("BOT_TOKEN"))) h.Write([]byte("WebAppData")) secretKey := h.Sum(nil) h = hmac.New(sha256.New, secretKey) h.Write([]byte(dataCheckString)) calculatedHash := hex.EncodeToString(h.Sum(nil)) return calculatedHash == data.Get("hash") }
额外验证步骤
- 检查前端传递的
initData中的user字段,确认是紧凑无空格的JSON(可在前端打印window.Telegram.WebApp.initData查看)。 - 确保
BOT_TOKEN环境变量配置正确,无多余空格或换行。 - 打印生成的
dataCheckString,对比Telegram官方示例格式,确认键值对排序正确、格式为key=value且无额外空格。
内容的提问来源于stack exchange,提问作者Mark Anikin
相关产品推荐
相关产品推荐

