微信扫码登录基于OAuth 2.0授权码模式,需用开放平台网站应用的AppID和AppSecret,严格匹配回调域名、校验state防CSRF,并分两步用code换取access_token再获取用户信息。

Beego 实现微信扫码登录,核心不是“调用微信 SDK”,而是用标准 OAuth 2.0 流程对接微信开放平台的 /qrconnect 接口。它和 GitHub、Google 登录逻辑一致,但微信对域名、协议、参数校验更严格,稍有偏差就卡在二维码不显示或回调 400。
微信扫码登录必须用开放平台网站应用,不是公众号
很多人卡在这一步:用公众号的 AppID 去请求 https://open.weixin.qq.com/connect/qrconnect,结果页面空白或提示“scope 参数错误”。这是因为:
- 公众号网页授权(
snsapi_base/snsapi_userinfo)只适用于微信内置浏览器,不支持扫码 - 扫码登录必须使用微信开放平台注册的“网站应用”,且 scope 固定为
snsapi_login - AppID 和 AppSecret 来自开放平台后台,和公众号完全隔离,不能混用
回调地址 redirect_uri 必须精确匹配开放平台配置
Beego 后端生成授权 URL 时,redirect_uri 参数值必须和你在微信开放平台「网站应用 → 修改」里填的「授权回调域」完全一致,包括:
- 协议(
http或https),开发环境用http://localhost:8080可以,但必须提前填进控制台 - 端口(
:8080不能省略) - 路径(如
/auth/wechat/callback,末尾斜杠要一致) - 不能带任何 query 参数(
?next=/dashboard会直接触发 400)
Beego 中推荐用 c.Ctx.Input.SiteURL() + "/auth/wechat/callback" 拼接,避免硬编码出错。
state 参数必须存 session 并严格校验
微信扫码流程没有内置 CSRF 防护,state 是唯一防伪造的手段。常见错误是只生成 state 却没存、或回调时从 query 取 state 却没比对 session:
让 AI 读懂微信公众号。自研 7 阶段提取管道,穿透反爬率 99.89%,Token 消耗降低 50%–87%。支持 ChatGPT、Claude、Perplexity、Gemini 等平台无缝引用。
- 登录入口路由(如
/auth/wechat/login)中:生成随机字符串,调用c.SetSession("wechat_state", state) - 回调路由(如
/auth/wechat/callback)中:先用c.GetString("state")获取 query 中的 state,再和c.GetSession("wechat_state")对比,不一致立即c.Abort("403") - 校验通过后,立刻
c.DelSession("wechat_state"),防止重放
漏掉任一环,上线后可能被恶意构造 callback URL 绕过登录直接注入用户态。
拿到 code 后换 token 和用户信息要分两步走
微信不支持用 code 一次性获取 openid + 用户信息,必须先换 token,再用 token 换 info:
- 第一步:POST
https://api.weixin.qq.com/sns/oauth2/access_token,传appid、secret、code、grant_type=authorization_code,返回access_token和openid - 第二步:GET
https://api.weixin.qq.com/sns/userinfo,传access_token和openid,返回nickname、headimgurl等(注意:此接口需用户已授权snsapi_login,否则返回errcode: 40003) - 不要尝试解析 id_token——微信不返回 JWT,
id_token字段不存在
Beego 中建议封装成两个独立 HTTP 请求,别合并;微信接口响应不稳定,需加超时和重试(比如 5s 超时,最多重试 1 次)。
最易被忽略的是:微信开放平台网站应用审核周期长(7 个工作日),且个人开发者无法认证。如果只是内部系统或测试用,别花 300 元认证,改用测试号或临时用他人已认证的 AppID —— 但生产环境上线前,必须完成企业资质认证和域名备案,否则扫码页直接 404。


















