- 后端accept接口code参数改为可选,支持通过Authorization头识别登录用户 - 已登录用户加入时不再弹手机号授权,前端调用新增的doJoinAppForLoggedInUser方法 - 未注册用户仍通过手机号授权码code加入,调用doJoinAppForNewUser方法 - 拆分前端加入逻辑,新增handleConfirmJoin统一处理已登录加入流程 - 优化按钮交互,已登录状态下按钮变为普通点击,移除协议强制勾选 - 错误处理和状态提示完善,加入成功后自动跳转首页
6.0 KiB
6.0 KiB
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 xxxphoneCode参数:未注册用户,请求体加 code/encryptedData/iv
文件修改
src/passport/invite/index.tsx- 完整重写,区分已登录/未注册两种按钮状态
任务:未注册用户在邀请页内完成授权注册,不跳登录页
需求
- loginByOpenId 未注册 → 在页面内显示「微信手机号授权」按钮
- 授权成功 → 调用
loginByMpWxPhone注册/登录 → 自动执行加入应用 - 不再跳转 passport/login 页面
关键逻辑
checkLoginStatus:已注册 isLoggedIn=true,未注册 isLoggedIn=false,两种情况都显示邀请页- 未注册按钮:
open-type="getPhoneNumber"→handleGetPhoneNumber- 授权码调
SERVER_API_URL/wx-login/loginByMpWxPhone完成注册登录 - 保存 token → isLoggedIn=true → 立即调
doJoinApp
- 授权码调
- 已注册按钮:普通
onClick→handleConfirmJoin→doJoinApp(access_token) 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按钮 →handleConfirmJoin→doJoinAppForLoggedInUser(不传code) - 未注册用户:
getPhoneNumber按钮 →handleGetPhoneNumber→doJoinAppForNewUser(传code)
文件修改
后端:
/Users/gxwebsoft/JAVA/websopy-java/src/main/java/com/gxwebsoft/app/controller/AppMpInviteController.javaacceptInvite方法支持code可选- 使用
BaseController.getLoginUserId()获取当前登录用户(无需额外方法)
前端:
/Users/gxwebsoft/VUE/websopy-mp/src/passport/invite/index.tsx- 已登录按钮改为普通
onClick - 新增
handleConfirmJoin方法 - 拆分
doJoinApp为doJoinAppForLoggedInUser和doJoinAppForNewUser
- 已登录按钮改为普通
优化:已登录用户不强制勾选协议
改动
- 已登录用户点击「确认加入」时,不再检查
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 按钮