# 手机号授权登录方案说明

## 方案概述

已实现**方案B：首次登录时请求手机号授权**。用户首次打开小程序时，会显示一个精美的授权弹窗，引导用户授权手机号。

## 实现流程

### 1. 用户首次登录
1. 用户打开小程序
2. 调用 `wx.login` 获取微信登录 code
3. 显示手机号授权弹窗，提供两个选项：
   - **授权手机号登录**：获取用户手机号，完成正式注册
   - **暂不授权，以游客身份使用**：跳过手机号授权，以游客身份登录
4. 用户选择授权：
   - 点击"授权手机号登录" → 获取手机号加密数据（phoneCode）
   - 点击"暂不授权" → 以游客身份登录，无需手机号
5. 将相关数据发送到后端
6. 后端完成注册/登录（正式用户或游客）
7. 保存用户信息到本地缓存

### 2. 后续登录
- 直接从本地缓存读取用户信息
- 无需重复授权

## 关键代码位置

### 模板部分 (index.uvue)
- **手机号授权弹窗**: 第 176-202 行
- **授权按钮**: 第 190-196 行，使用 `open-type="getPhoneNumber"` 触发授权
- **暂不授权按钮**: 第 197-199 行，点击后以游客身份登录

### 脚本部分 (index.uvue)
- **showPhoneAuthModal**: 第 244 行 - 控制授权弹窗显示
- **tempWechatCode**: 第 246 行 - 保存微信登录 code
- **autoLogin()**: 第 296-327 行 - 修改后的自动登录逻辑
- **onGetPhoneNumber()**: 第 370-466 行 - 处理手机号授权回调
- **handleSkipAuth()**: 第 468-526 行 - 处理跳过授权，游客登录

### 样式部分 (index.scss)
- **phone-auth-modal**: 第 817-905 行 - 授权弹窗样式
- **skip-auth-btn**: 第 888-905 行 - 暂不授权按钮样式

## 后端接口要求

### identify 接口需要支持以下功能：

```typescript
// 请求参数
interface IdentifyRequest {
  wechatId: string;  // 微信ID（从code中提取的临时ID）
  phone: string;     // 手机号加密code（phoneCode）或明文手机号
}

// 后端需要：
// 1. 判断 phone 是否为加密code
// 2. 如果是加密code，使用微信API解密获取真实手机号
// 3. 根据 wechatId 和 phone 查询或创建用户
// 4. 返回用户信息和 token
```

### 微信手机号解密接口

后端需要调用微信的 `getPhoneNumber` 接口：

```
POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN

{
  "code": "手机号加密code"
}
```

参考文档：https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html

## 小程序配置要求

### 1. 开通手机号快速验证权限

在微信公众平台（mp.weixin.qq.com）：
1. 登录小程序后台
2. 进入"开发" → "开发管理" → "接口设置"
3. 找到"手机号快速验证组件"
4. 点击"开通"

### 2. 服务器域名配置

确保后端 API 域名已添加到小程序的合法域名列表中。

## 错误处理

### errno 102 错误
如果用户授权时出现 errno 102 错误，说明小程序未开通"手机号快速验证"功能。代码中已添加友好提示：

```typescript
if (e.detail.errno === 102) {
  uni.showModal({
    title: '提示',
    content: '该小程序暂未开通手机号快速验证功能，请联系管理员开通后再试。',
    showCancel: false
  })
}
```

### 授权失败重试
如果授权失败，会重新显示授权弹窗，用户可以再次尝试。

## 用户体验优化

### 1. 精美的授权弹窗
- 渐变色背景
- 大图标设计
- 清晰的授权说明
- 突出的授权按钮

### 2. 非侵入式设计
- 用户可以选择"暂不授权"继续使用（如果实现了游客模式）
- 已授权用户不会重复看到授权弹窗

### 3. 本地缓存
- 授权成功后保存用户信息到本地
- 下次打开直接使用缓存，无需重复授权

## 测试要点

### 1. 首次登录测试
- 清空小程序缓存
- 打开小程序
- 验证是否显示授权弹窗
- 点击授权按钮
- 验证是否成功登录

### 2. 已登录用户测试
- 授权成功后关闭小程序
- 重新打开小程序
- 验证是否自动登录（不显示授权弹窗）

### 3. 授权失败测试
- 点击授权按钮后取消
- 验证错误提示是否友好
- 验证是否可以再次尝试

### 4. 未开通权限测试
- 在未开通手机号快速验证的小程序中测试
- 验证 errno 102 错误提示

## 相关文件

- `urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue` - 主要逻辑
- `urbanLifelineWeb/packages/workcase_wechat/pages/index/index.scss` - 样式文件
- `urbanLifelineWeb/packages/workcase_wechat/api/guest/index.ts` - guest API（identify接口）

## 注意事项

1. **隐私政策**：使用手机号授权前，需要在小程序中添加隐私政策说明
2. **用户同意**：确保用户知道手机号的用途（身份识别、工单通知等）
3. **数据安全**：后端需要安全存储用户手机号，遵守相关法律法规
4. **降级方案**：如果手机号授权失败，可以考虑提供其他登录方式（如手动输入手机号+验证码）

## 后续优化建议

1. **添加"暂不授权"功能**：允许用户跳过授权，以游客身份使用部分功能
2. **添加重新授权入口**：在个人中心添加"绑定手机号"功能，让跳过授权的用户可以后续绑定
3. **优化错误提示**：针对不同的授权失败原因，提供更详细的解决方案
4. **添加授权动画**：让授权过程更加流畅和友好
