# 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
