[Feature] 微信扫码登录(网站应用 OAuth2.0) #1718

Open
opened 2026-09-05 16:45:40 +08:00 by xiaoxia · 0 comments
Owner

背景

微信开放平台「网站应用」已审核通过,接入网站应用微信扫码登录。AppID/AppSecret/回调域已由项目负责人配置到服务器环境变量(WECHAT_APP_ID / WECHAT_APP_SECRET),凭证不入库不入代码

产品规则(已与负责人确认)

  1. 新用户:微信扫码授权后自动创建账号并登录;首次登录强制先填写昵称(微信新应用不返回真实昵称头像,头像用默认),不填不进系统;手机号不强制,后续到「用户设置」自行绑定。
  2. 老用户:在「账号设置」点「绑定微信」扫码关联,同一账号邮箱+微信都可登录;支持解绑。
  3. 用户唯一标识以 unionid 为准(为后续小程序/多端统一打基础),openid 一并存储。
  4. 扫码授权 scope:snsapi_login。

后端要求

  • GET /api/v1/auth/wechat/login?redirect=<来源>&bind=<0|1>:拼装微信授权跳转(state 防 CSRF,state 内含来源环境/前端回跳地址,支持 staging 回跳)。
  • GET /api/v1/auth/wechat/callback:code 换 access_token、拉用户信息(unionid/openid);已绑定用户直接签发本站登录 token;未绑定 unionid:登录流程自动建号(标记 needs_profile),绑定流程要求已登录态则关联当前账号。
  • 微信 access_token 等凭证只存服务端/缓存,不下发前端。
  • 账号绑定/解绑接口:POST /api/v1/auth/wechat/bindDELETE /api/v1/auth/wechat/bind(需登录态)。
  • 用户表加 wechat_unionid/wechat_openid/wechat_nickname 字段(migration),unionid 唯一索引。
  • 单测:新用户建号+强制昵称、老用户绑定/解绑、unionid 冲突、state 校验。

前端要求

  • 登录页新增「微信登录」按钮 → 跳后端授权 → 扫码 → 回调后登录态落地。
  • 新微信用户首次登录进入「填写昵称」引导页,填完才进主界面。
  • 账号设置页:微信绑定状态 + 「绑定微信/解绑」按钮(绑定走扫码确认);手机号绑定入口预留(后续做)。

部署/配置

  • 微信后台授权回调域:xiaoxiajianji.com(已配)。回调接口走生产主域名 /api/v1/auth/wechat/callback,staging 测试通过 state 参数回跳 staging 前端,部署发布专家验证域名可达。
  • AppSecret 配置为服务器环境变量,由部署发布专家操作,不写进仓库。

验收

  • staging/生产:微信扫码新用户建号→强制填昵称→进入;邮箱老用户绑定微信后可扫码登录同一账号;解绑后不能再登录;CI 全绿。
## 背景 微信开放平台「网站应用」已审核通过,接入网站应用微信扫码登录。AppID/AppSecret/回调域已由项目负责人配置到服务器环境变量(WECHAT_APP_ID / WECHAT_APP_SECRET),**凭证不入库不入代码**。 ## 产品规则(已与负责人确认) 1. **新用户**:微信扫码授权后自动创建账号并登录;**首次登录强制先填写昵称**(微信新应用不返回真实昵称头像,头像用默认),不填不进系统;手机号不强制,后续到「用户设置」自行绑定。 2. **老用户**:在「账号设置」点「绑定微信」扫码关联,同一账号邮箱+微信都可登录;支持解绑。 3. 用户唯一标识以 **unionid** 为准(为后续小程序/多端统一打基础),openid 一并存储。 4. 扫码授权 scope:snsapi_login。 ## 后端要求 - `GET /api/v1/auth/wechat/login?redirect=<来源>&bind=<0|1>`:拼装微信授权跳转(state 防 CSRF,state 内含来源环境/前端回跳地址,支持 staging 回跳)。 - `GET /api/v1/auth/wechat/callback`:code 换 access_token、拉用户信息(unionid/openid);已绑定用户直接签发本站登录 token;未绑定 unionid:登录流程自动建号(标记 needs_profile),绑定流程要求已登录态则关联当前账号。 - 微信 access_token 等凭证只存服务端/缓存,不下发前端。 - 账号绑定/解绑接口:`POST /api/v1/auth/wechat/bind`、`DELETE /api/v1/auth/wechat/bind`(需登录态)。 - 用户表加 wechat_unionid/wechat_openid/wechat_nickname 字段(migration),unionid 唯一索引。 - 单测:新用户建号+强制昵称、老用户绑定/解绑、unionid 冲突、state 校验。 ## 前端要求 - 登录页新增「微信登录」按钮 → 跳后端授权 → 扫码 → 回调后登录态落地。 - 新微信用户首次登录进入「填写昵称」引导页,填完才进主界面。 - 账号设置页:微信绑定状态 + 「绑定微信/解绑」按钮(绑定走扫码确认);手机号绑定入口预留(后续做)。 ## 部署/配置 - 微信后台授权回调域:xiaoxiajianji.com(已配)。回调接口走生产主域名 /api/v1/auth/wechat/callback,staging 测试通过 state 参数回跳 staging 前端,部署发布专家验证域名可达。 - AppSecret 配置为服务器环境变量,由部署发布专家操作,不写进仓库。 ## 验收 - staging/生产:微信扫码新用户建号→强制填昵称→进入;邮箱老用户绑定微信后可扫码登录同一账号;解绑后不能再登录;CI 全绿。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: xiaoxia/xiaoxia-saas#1718