微信小程序token校验成功的关键是:get请求必须严格按字典序拼接token、timestamp、nonce后sha1签名,并原样返回echostr,不得添加空格、换行或json包装。

直接能跑通微信小程序后台接口的关键,在于 GET /wechat/callback 路由必须严格按微信签名规则校验参数,且返回 echostr 时不能带任何额外字符(包括换行、空格、JSON包装)。
微信校验接口为什么总返回 404 或空白?
常见原因是 Gin 路由未正确注册或路径不匹配。微信后台填的 URL 必须和 engine.GET() 的路径完全一致,且只接受 GET 请求。
- 检查是否用了
router.InitApiRouter(r)类似调用,而不是只写了路由但没挂载到 engine - 确保路径不含尾部斜杠,比如微信填的是
https://api.example.com/wechat,代码里就得写engine.GET("/wechat", ...),不能写/wechat/ - Gin 默认不自动处理 root 路径重定向,
/wechat/和/wechat是两个不同路由 - 如果用了 Nginx 反向代理,确认 proxy_pass 末尾是否多加了
/导致路径被截断
signature 校验失败的三个典型原因
微信发来的 signature 是对 token、timestamp、nonce 三者字典序拼接后 SHA1 加密的结果。任何一环出错都会导致比对失败。
微信公众号推文写作与发布助手。支持深度文章撰写(1500+ 字)、智能配图搜索、API 配置引导、草稿箱上传、一键排版等全流程功能。 每篇文章默认 1500 字以上,配备 1 张相关配图(放在第一段后),包含清晰的分段标题结构。
-
token必须和微信后台填写的**完全一致**(区分大小写、无空格),硬编码在代码里时容易手抖多敲一个字符 - 排序必须用
sort.Strings([]string{token, timestamp, nonce}),不是[]string{timestamp, nonce, token}这种固定顺序 - 拼接字符串时不能加逗号、空格或换行,例如
token + timestamp + nonce是错的,必须是排序后连起来:strings.Join(tempArray, "") - SHA1 结果要用
hex.EncodeToString(h.Sum(nil)),不是h.Sum([]byte(""))—— 后者会多拼一个空字节,导致哈希值错误
如何安全地管理 token 和 AppID/Secret?
把 token 写死在 handler 里是临时方案,上线前必须抽离。微信的 AppID 和 AppSecret 更不能硬编码。
- 用
viper读取 YAML 配置文件,例如config.yaml中定义wechat.token: "my_token_123" - 启动时校验必填字段是否存在,缺失则 panic,避免运行时才发现配置错误
- 敏感字段如
AppSecret不要打日志,log.Printf("token=%s", token)这类语句必须删除 - 开发环境可用本地 config.yaml,生产环境建议通过环境变量注入,例如
WECHAT_TOKEN=xxx,viper 支持自动绑定
最常被忽略的一点:微信校验只发生在你首次提交 URL 到公众号/小程序后台时,之后所有消息推送都是 POST 请求,走另一套解密逻辑。别指望同一个 handler 处理全部流量——GET 仅用于接入验证,POST 才是真正收发消息的通道。










