微信网页授权与开放平台扫码登录 (WeChat Web OAuth)
两种机制别混淆
| 公众号网页授权 | 开放平台网站应用扫码登录 | |
|---|---|---|
| 使用场景 | 微信内置浏览器内(H5)授权登录 | 桌面/PC 网站"微信扫码"登录 |
| 权限门槛 | 需已认证服务号;个人订阅号不行 | 需已认证开放平台账号(企业,约300元/年)+网站应用审核 |
| 授权域名 | 后台"网页授权域名", 需已ICP备案 | 授权回调域名, 需已ICP备案 |
| 本地开发 | 测试号即可,免备案 | 无免费测试通道 |
结论:生产环境两者都免不了 ICP备案。但本地 demo 用测试号 (sandbox) 完全可行。
测试号(Sandbox Test Account)本地调试
- 入口:
mp.weixin.qq.com/debug/cgi-bin/sandboxinfo,微信扫码登录即得 appID/appsecret。 - 测试号后台"体验接口权限表 → 网页授权获取用户基本信息 → 修改",填授权回调域名。
- 桌面微信测:填
127.0.0.1;手机测:填电脑局域网IP(如192.168.1.5)。 - 授权回调域名不能带端口;但
redirect_uri里带:3000端口是允许的。
OAuth2.0 流程(服务端必须)
浏览器 → open.weixin.qq.com/connect/oauth2/authorize?appid&redirect_uri&scope&state#wechat_redirect
← 微信把浏览器 302 回 redirect_uri?code=xxx
服务端 → api.weixin.qq.com/sns/oauth2/access_token (用 appid+secret+code 换 access_token/openid)
服务端 → api.weixin.qq.com/sns/userinfo (可选,拿用户信息)关键:微信服务器从不主动连你的回调,只靠用户浏览器跳转,所以本地 localhost 能跑通;appsecret 只允许在服务端换 token,严禁暴露前端。
坑(Pitfalls)
- 网页授权必须在微信内置浏览器打开;普通桌面浏览器会报"请在微信客户端中打开链接"。电脑微信测法:把链接发到"文件传输助手"再点开。
- 测试号
snsapi_userinfo需先关注测试号(测试号页面有关注二维码),否则授权页报错;snsapi_base静默授权只拿 openid,无需关注。 - 2021-10 起"网页授权能力调整":snsapi_userinfo 不再返回头像昵称,以 openid 等基础字段为主。
- code 5 分钟有效、一次性,换 access_token 失败多数是 code 过期或域名不匹配。
- 若测试号后台拒绝填 IP/127.0.0.1(个别情况),fallback 用内网穿透(natapp/cpolar 免费隧道域名)。
本地 Demo(已按需删除,可随时重建)
- 做法:写一个零依赖 Node(>=18) http server 即可,不需要 npm install。根页给出 snsapi_base / snsapi_userinfo 两个入口,/callback 用 appid+secret+code 换 access_token 再拉 userinfo。
- 步骤:填 APPID/SECRET →
node server.js→ 微信内置浏览器打开http://<host>:3000→ 选静默/授权两种 scope。 - 注意:授权回调域名配置不能带端口,redirect_uri 里的
:3000允许;appsecret 只在服务端换 token。
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Web