- 后端accept接口code参数改为可选,支持通过Authorization头识别登录用户 - 已登录用户加入时不再弹手机号授权,前端调用新增的doJoinAppForLoggedInUser方法 - 未注册用户仍通过手机号授权码code加入,调用doJoinAppForNewUser方法 - 拆分前端加入逻辑,新增handleConfirmJoin统一处理已登录加入流程 - 优化按钮交互,已登录状态下按钮变为普通点击,移除协议强制勾选 - 错误处理和状态提示完善,加入成功后自动跳转首页
163 lines
6.0 KiB
Markdown
163 lines
6.0 KiB
Markdown
# 2026-04-12 工作记录
|
||
|
||
## 任务:优化邀请加入应用按钮逻辑
|
||
|
||
### 需求描述
|
||
loginByOpenId 返回有用户数据(已登录)时,不显示手机号授权按钮,直接显示「确认加入」普通按钮;
|
||
loginByOpenId 返回未注册时才走 getPhoneNumber 授权分支。
|
||
|
||
### 解决方案
|
||
完全重写 `invite/index.tsx`,核心逻辑:
|
||
|
||
#### 按钮渲染逻辑
|
||
```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. 已注册按钮:普通 `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
|
||
|
||
---
|
||
|
||
## 任务:后端改造支持已登录用户直接加入
|
||
|
||
### 问题
|
||
后端 `/api/_app/developer/invite/accept` 接口强制要求传 `code`(手机号授权码),导致已登录用户也需要弹手机号授权。
|
||
|
||
### 后端改造方案
|
||
修改 `AppMpInviteController.acceptInvite` 方法:
|
||
|
||
#### 1. 参数校验调整
|
||
- `code` 改为可选参数
|
||
- 不传 `code` 时,从 `Authorization` 头获取当前登录用户
|
||
|
||
#### 2. 双模式支持
|
||
```java
|
||
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.java`
|
||
- `acceptInvite` 方法支持 `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 按钮
|