背景
很多用户是通过公众号推文或朋友圈分享点进官网的,此时是微信内置浏览器(不是 Safari/Chrome)。此前这种情况登录体验很差:
- 微信里扫二维码登录,需要切到系统浏览器,很多用户直接放弃
- 未登录用户打开付费课时,只能看到"请登录"提示,没有顺畅的登录入口
新的流程
- 检测浏览器 UserAgent:含
MicroMessenger→ 是微信内置浏览器 - 登录页和付费课时未登录态额外显示「微信一键登录」按钮
- 按钮点击后跳转公众号授权 URL(scope=snsapi_userinfo)
- 用户在微信弹窗点「允许」后回跳到
/api/auth/wechat/oa/callback - 后端用 code 换取 access_token,拉取 openid + unionid + 用户信息
- 通过 unionid 查找/创建本站用户,签发 token,重定向回原页面
统一身份
同一个微信用户可能在多个端使用:
- 小程序
ruankao-miniprogram-2026 - 公众号「软考找老孙」
- 官网
www.guoruankao.com
这三端授权拿到的 openid 是不同的(小程序 openid ≠ 公众号 openid),但 unionid 相同。后端以 unionid 为统一身份主键,无论从哪个入口登录,拿到的都是同一个用户账号和已开通课程。
使用场景举例
- 用户 A 在小程序里买了冲刺合集,后来在公众号推文点开 /courses/chongci-heji/lessons/200
- 之前:看到"请登录"提示,不会扫码,直接退出
- 现在:点「微信一键登录」→ 授权 → 回跳课时页 → 直接看到已开通的付费内容
安全注意
- OA 回调路由做了 code 重放防护、state 校验
- snsapi_userinfo 只授权一次后端持有 access_token,不回传前端
- 首版先走测试路由
/wechat-oa-test验证 unionid 绑定正确再切正式路由