Files
websopy-mp/.workbuddy/memory/2026-04-12.md
赵忠林 2ae30ac692 feat(invite): 支持已登录用户直接加入应用
- 后端accept接口code参数改为可选,支持通过Authorization头识别登录用户
- 已登录用户加入时不再弹手机号授权,前端调用新增的doJoinAppForLoggedInUser方法
- 未注册用户仍通过手机号授权码code加入,调用doJoinAppForNewUser方法
- 拆分前端加入逻辑,新增handleConfirmJoin统一处理已登录加入流程
- 优化按钮交互,已登录状态下按钮变为普通点击,移除协议强制勾选
- 错误处理和状态提示完善,加入成功后自动跳转首页
2026-04-12 11:56:11 +08:00

6.0 KiB
Raw Blame History

2026-04-12 工作记录

任务:优化邀请加入应用按钮逻辑

需求描述

loginByOpenId 返回有用户数据(已登录)时,不显示手机号授权按钮,直接显示「确认加入」普通按钮; loginByOpenId 返回未注册时才走 getPhoneNumber 授权分支。

解决方案

完全重写 invite/index.tsx,核心逻辑:

按钮渲染逻辑

{isLoggedIn ? (
  // 已登录:普通按钮,直接加入,携带 Authorization 头
  <Button onClick={handleConfirmJoin}>确认加入</Button>
) : (
  // 未注册:手机号授权按钮(兜底,实际大多已被重定向到 login 页)
  <Button open-type="getPhoneNumber" onGetPhoneNumber={handleGetPhoneNumber}>微信手机号快速加入</Button>
)}

handleJoinApp 统一入口

  • useToken 参数:已登录用户,请求头加 Authorization: Bearer xxx
  • phoneCode 参数:未注册用户,请求体加 code/encryptedData/iv

文件修改

  • src/passport/invite/index.tsx - 完整重写,区分已登录/未注册两种按钮状态

任务:未注册用户在邀请页内完成授权注册,不跳登录页

需求

  • loginByOpenId 未注册 → 在页面内显示「微信手机号授权」按钮
  • 授权成功 → 调用 loginByMpWxPhone 注册/登录 → 自动执行加入应用
  • 不再跳转 passport/login 页面

关键逻辑

  1. checkLoginStatus:已注册 isLoggedIn=true未注册 isLoggedIn=false两种情况都显示邀请页
  2. 未注册按钮:open-type="getPhoneNumber"handleGetPhoneNumber
    • 授权码调 SERVER_API_URL/wx-login/loginByMpWxPhone 完成注册登录
    • 保存 token → isLoggedIn=true → 立即调 doJoinApp
  3. 已注册按钮:普通 onClickhandleConfirmJoindoJoinApp(access_token)
  4. doJoinApp:统一加入接口,请求头带 Authorization: Bearer {access_token}

文件修改

  • src/passport/invite/index.tsx - 完整重写(彻底移除跳登录页逻辑)

修复:「授权码不能为空」报错

问题

已登录用户点「确认加入」时,后端报 授权码不能为空。 后端 /api/_app/developer/invite/accept 接口不管是否登录,都要求传 code(微信授权码)。

解决

统一用一个 getPhoneNumber 按钮处理两种场景:

  • 已注册:文字「确认加入」→ 触发 getPhoneNumber → doJoinApp(code, accessToken)
  • 未注册:文字「微信手机号快速加入」→ 触发 getPhoneNumber → 先 loginByMpWxPhone 注册 → 再 wx.login() 获取新 code → doJoinApp(newCode, access_token)

doJoinApp 参数

doJoinApp(wxCode: string, accessToken: string)
// 请求体带 code请求头带 Authorization: Bearer xxx

优化:已登录用户不弹手机号授权

改动

  • 已登录按钮:普通 onClick,文字「确认加入」
  • 未注册按钮:getPhoneNumber 授权,文字「微信手机号快速加入」

逻辑差异

用户状态 按钮类型 获取 code 方式
已登录 普通 onClick wx.login()
未注册 getPhoneNumber 授权回调的 code

文件修改

  • src/passport/invite/index.tsx - 按钮区分两种类型,已登录用普通 onClick

任务:后端改造支持已登录用户直接加入

问题

后端 /api/_app/developer/invite/accept 接口强制要求传 code(手机号授权码),导致已登录用户也需要弹手机号授权。

后端改造方案

修改 AppMpInviteController.acceptInvite 方法:

1. 参数校验调整

  • code 改为可选参数
  • 不传 code 时,从 Authorization 头获取当前登录用户

2. 双模式支持

if (StrUtil.isBlank(code)) {
    // 模式一:已登录用户(通过 Authorization 头识别)
    userId = getCurrentUserId();
} else {
    // 模式二:未注册用户(通过手机号授权码获取手机号,创建用户)
    String phone = getPhoneByCode(code);
    userId = getOrCreateUserByPhone(phone);
}

3. getCurrentUserId 方法

  • 尝试从 Spring Security Context 获取
  • 如果获取不到(免登录接口),手动解析 Authorization 头的 JWT Token

前端配合改造

  • 已登录用户:普通 onClick 按钮 → handleConfirmJoindoJoinAppForLoggedInUser(不传 code
  • 未注册用户:getPhoneNumber 按钮 → handleGetPhoneNumberdoJoinAppForNewUser(传 code

文件修改

后端:

  • /Users/gxwebsoft/JAVA/websopy-java/src/main/java/com/gxwebsoft/app/controller/AppMpInviteController.java
    • acceptInvite 方法支持 code 可选
    • 使用 BaseController.getLoginUserId() 获取当前登录用户(无需额外方法)

前端:

  • /Users/gxwebsoft/VUE/websopy-mp/src/passport/invite/index.tsx
    • 已登录按钮改为普通 onClick
    • 新增 handleConfirmJoin 方法
    • 拆分 doJoinAppdoJoinAppForLoggedInUserdoJoinAppForNewUser

优化:已登录用户不强制勾选协议

改动

  • 已登录用户点击「确认加入」时,不再检查 agreementChecked
  • 未注册用户仍需勾选协议后才能授权手机号

文件修改

  • src/passport/invite/index.tsx - handleConfirmJoin 移除协议检查

修复:后端需要手机号授权码

问题

后端 invite/accept 接口只接受 getPhoneNumber 获取的手机号授权码,用 wx.login() 的 code 会报「获取手机号失败」。

解决

两种用户状态都走 getPhoneNumber 按钮:

  • 已登录:文字「确认加入」,回调 handleConfirmJoinGetPhoneNumber
  • 未注册:文字「微信手机号快速加入」,回调 handleGetPhoneNumber

差异

用户状态 回调 行为
已登录 handleConfirmJoinGetPhoneNumber 直接用 code + access_token 调加入接口
未注册 handleGetPhoneNumber loginByMpWxPhone 注册登录,再调加入接口

文件修改

  • src/passport/invite/index.tsx - 两种状态都用 getPhoneNumber 按钮