# 2026-04-11 工作记录

## 任务：修复邀请加入应用流程

### 问题描述
`passport/invite/index` 页面在新用户扫码加入应用时存在问题：
- 新用户点击"微信手机号快速加入"时，如果未注册，后端返回"用户不存在"
- 页面引导用户去登录，但登录完成后**没有自动执行加入应用的操作**

### 解决方案
参考 `UserCard.tsx` 和 `phone-auth/index.tsx` 的实现模式，修改了 `src/passport/invite/index.tsx`：

#### 1. 新增功能
- 页面加载时保存邀请 token 到本地存储
- 检测用户登录状态
- 未登录用户点击加入时，保存邀请信息并引导到 `phone-auth` 登录页
- 登录成功后返回邀请页面，自动执行加入操作
- 新增 `clearPendingInviteData` 方法清理临时数据

#### 2. 关键修改点
- 使用 `saveInviteParams` 保存邀请信息
- 使用 `pending_invite_*` 系列 storage key 保存待处理的邀请数据
- 页面显示时通过 `AppShow` 事件监听登录返回
- 登录成功后自动调用 `handleJoinApp` 完成加入

#### 3. 流程优化
```
新用户流程：
1. 扫码进入邀请页面 → 保存 invite token
2. 点击"微信手机号快速加入"
3. 检测到未登录 → 保存 pending 数据 → 跳转到 phone-auth
4. 完成登录/注册 → 返回邀请页面
5. 自动检测 pending 数据 → 自动执行加入
6. 加入成功 → 跳转到首页

已登录用户流程：
1. 扫码进入邀请页面
2. 点击"微信手机号快速加入"
3. 直接执行加入操作
4. 加入成功 → 跳转到首页
```

### 文件修改
- `src/passport/invite/index.tsx` - 完整重构邀请流程

---

## 任务：重写 passport/login 页面

### 问题描述
`passport/login.tsx` 页面只有 UI 框架，没有实现登录逻辑：
- 输入框没有绑定状态
- 登录按钮没有点击事件
- 不支持微信手机号登录
- 无法处理邀请流程的重定向

### 解决方案
基于 `phone-auth/index.tsx` 的实现，重写 `login.tsx`：

#### 1. 功能实现
- 微信手机号一键登录（使用 `open-type="getPhoneNumber"`）
- 支持 `redirect` 参数，登录后返回原页面
- 未注册用户自动注册
- 支持邀请关系绑定
- 服务协议和隐私政策弹窗

#### 2. 跳转逻辑
```
有 redirect 参数：
- TabBar 页面 → switchTab
- 普通页面 → navigateBack 或 redirectTo

无 redirect 参数：
- 跳转到首页 /pages/index/index
```

#### 3. 统一登录入口
- 将 `invite/index.tsx` 中的登录跳转统一改为 `/passport/login`
- 保持与现有代码引用兼容（5处引用无需修改）

### 文件修改
- `src/passport/login.tsx` - 完全重写为微信手机号登录页面
- `src/passport/invite/index.tsx` - 更新登录跳转链接

---

## 任务：修复登录后加入应用流程

### 问题描述
用户从邀请页面跳转到登录页面完成注册后，返回邀请页面提示"您尚未注册"，无法成功加入应用。

### 问题分析
1. 用户在邀请页面点击"微信手机号快速加入"时保存了微信授权码
2. 跳转到登录页面后，用户**重新**进行了微信授权，获得了新的授权码
3. 登录成功后返回邀请页面，但邀请页面使用的是旧的已失效的授权码
4. 导致加入应用失败

### 解决方案
在登录页面登录成功后，直接使用**当前获取的微信授权码**完成加入应用操作：

#### 1. 登录页面修改 (`login.tsx`)
- 添加 `handleJoinAppAfterLogin` 方法
- 登录成功后检测 `pending_invite_token`
- 如果存在，使用当前授权码调用 `/api/_app/developer/invite/accept` 接口
- 加入成功后清理 pending 数据并跳转到首页
- 加入失败则继续正常登录流程

#### 2. 邀请页面修改 (`invite/index.tsx`)
- 优化从登录页返回的处理逻辑
- 检测 `pending_invite_phone_code` 是否存在
- 延迟检查登录页面是否已处理加入操作
- 如果登录页面已处理（token 被清除），则显示成功提示并跳转
- 如果登录页面未处理，则自动执行加入操作

### 新的完整流程
```
新用户扫码加入流程：
1. 扫码进入邀请页面
2. 点击"微信手机号快速加入"
3. 检测到未登录，保存 pending 数据，跳转到登录页面
4. 在登录页面勾选协议，点击"微信手机号一键登录"
5. 获取新的微信授权码，完成登录/注册
6. 登录成功后检测到 pending_invite_token，自动执行加入应用
7. 加入成功，清理数据，跳转到首页

已登录用户流程：
1. 扫码进入邀请页面
2. 点击"微信手机号快速加入"
3. 直接执行加入操作
4. 加入成功，跳转到首页
```

### 文件修改
- `src/passport/login.tsx` - 添加登录后自动加入应用逻辑
- `src/passport/invite/index.tsx` - 优化从登录页返回的处理逻辑

---

## 任务：修复"用户创建失败"问题

### 问题描述
后端返回 `"用户创建失败"`，原因是微信授权码失效。

### 问题分析
1. 用户在邀请页面获取了微信授权码
2. 跳转到登录页面后，用户**重新**点击授权按钮获取了新的授权码
3. 但代码逻辑可能混淆了新旧授权码
4. 或者授权码已过期（5分钟有效期）

### 解决方案
1. **明确使用当前获取的授权码**：在登录页面登录成功后，使用**当前**获取的微信授权码执行加入应用操作
2. **不使用旧的授权码**：从邀请页面带过来的授权码仅作为标记用途，实际使用登录时获取的新授权码
3. **添加错误处理**：加入失败时显示错误信息并延迟跳转

### 关键修改
- `login.tsx`：优化 `handleLogin` 中的邀请流程处理逻辑
  - 明确使用当前 `phoneCode` 执行加入操作
  - 添加错误处理和用户提示
  - 加入失败后延迟跳转，让用户看到错误信息

---

## 任务：修复已登录用户加入应用失败问题

### 问题描述
已登录用户点击"微信手机号快速加入"时，后端返回 `"用户创建失败"`。

### 问题分析
1. 用户已经是登录状态（有 `access_token`）
2. 但后端接口 `/api/_app/developer/invite/accept` 仍然尝试"创建用户"
3. 原因是后端无法识别当前已登录的用户身份

### 解决方案
为已登录用户在请求头中添加 `Authorization: Bearer {access_token}`，让后端能正确识别用户身份：

#### 1. 邀请页面修改 (`invite/index.tsx`)
- 在 `handleJoinApp` 方法中获取 `access_token`
- 构建请求头时，如果用户已登录，添加 `Authorization` 头
- 添加日志记录是否使用了认证头

#### 2. 登录页面修改 (`login.tsx`)
- 在 `handleJoinAppAfterLogin` 方法中同样添加 `Authorization` 头
- 确保登录成功后调用加入接口时携带认证信息

### 文件修改
- `src/passport/invite/index.tsx` - 添加 Authorization 请求头支持
- `src/passport/login.tsx` - 添加 Authorization 请求头支持

---

## 任务：修复 401 认证失败问题

### 问题描述
后端返回 `401` 和 `"请退出重新登录"`，`error: "Username not found"`。

### 问题分析
1. 请求带了 `Authorization: Bearer {token}` 头
2. 但后端验证 token 时发现用户不存在
3. 原因可能是：
   - token 已过期
   - token 对应的用户已被删除
   - `/api/_app` 前缀的接口设计为"免登录"，使用 `Authorization` 头反而导致认证失败

### 解决方案
`/api/_app` 前缀的接口是小程序专用免登录接口，应该优先使用微信授权码方式：

#### 策略调整
- **有微信授权码**：使用授权码方式，不传 `Authorization` 头
- **无授权码但已登录**：使用 `Authorization` 头

#### 修改内容
- `invite/index.tsx`：调整 `handleJoinApp` 方法中的请求头逻辑
- 优先使用微信授权码，避免使用可能过期的 token

### 文件修改
- `src/passport/invite/index.tsx` - 调整认证策略，优先使用微信授权码

---

## 任务：重写邀请加入应用流程

### 新流程设计
1. 扫码进入邀请页面
2. 调用 `wx.login()` 获取 code
3. 调用 `loginByOpenId` 判断用户是否已注册
4. 已注册：显示邀请页面，用户点击加入
5. 未注册：跳转到 `passport/login` 页面完成登录/注册
6. 登录成功后自动执行加入应用操作

### 实现细节

#### 1. 邀请页面 (`invite/index.tsx`)
- 页面状态管理：`loading` → `checking` → `invite`/`login`/`error`
- `initPage()`：解析 token，保存到 storage
- `checkLoginStatus()`：调用 `loginByOpenId` 检查登录状态
- `navigateToLogin()`：未登录用户跳转到登录页
- `fetchInviteInfo()`：获取邀请信息
- `handleGetPhoneNumber()`：处理微信授权
- `handleJoinApp()`：执行加入应用操作

#### 2. 登录页面 (`login.tsx`)
- 登录成功后检查 `invite_token`
- 如果存在，使用当前授权码自动执行加入应用
- 加入成功后跳转到首页

### 简化点
- 不再使用复杂的 `pending_invite_*` 系列 storage key
- 只使用 `invite_token` 保存邀请标识
- 登录页面直接使用当前获取的微信授权码

### 文件修改
- `src/passport/invite/index.tsx` - 完全重写
- `src/passport/login.tsx` - 更新为使用 `invite_token`
