# 2026-04-12 工作记录 ## 任务:优化邀请加入应用按钮逻辑 ### 需求描述 loginByOpenId 返回有用户数据(已登录)时,不显示手机号授权按钮,直接显示「确认加入」普通按钮; loginByOpenId 返回未注册时才走 getPhoneNumber 授权分支。 ### 解决方案 完全重写 `invite/index.tsx`,核心逻辑: #### 按钮渲染逻辑 ```tsx {isLoggedIn ? ( // 已登录:普通按钮,直接加入,携带 Authorization 头 ) : ( // 未注册:手机号授权按钮(兜底,实际大多已被重定向到 login 页) )} ``` #### 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. 已注册按钮:普通 `onClick` → `handleConfirmJoin` → `doJoinApp(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 参数 ```ts doJoinApp(wxCode: string, accessToken: string) // 请求体带 code,请求头带 Authorization: Bearer xxx ``` --- ## 优化:已登录用户不弹手机号授权 ### 改动 - 已登录按钮:普通 `onClick`,文字「确认加入」 - 未注册按钮:`getPhoneNumber` 授权,文字「微信手机号快速加入」 ### 逻辑差异 | 用户状态 | 按钮类型 | 获取 code 方式 | |------|------|------| | 已登录 | 普通 onClick | `wx.login()` | | 未注册 | getPhoneNumber | 授权回调的 `code` | ### 文件修改 - `src/passport/invite/index.tsx` - 按钮区分两种类型,已登录用普通 onClick --- ## 优化:已登录用户不强制勾选协议 ### 改动 - 已登录用户点击「确认加入」时,不再检查 `agreementChecked` - 未注册用户仍需勾选协议后才能授权手机号 ### 文件修改 - `src/passport/invite/index.tsx` - `handleConfirmJoin` 移除协议检查