166 lines
5.4 KiB
Markdown
166 lines
5.4 KiB
Markdown
# 手机号授权登录方案说明
|
||
|
||
## 方案概述
|
||
|
||
已实现**方案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. **添加授权动画**:让授权过程更加流畅和友好
|