|
|
@@ -1,122 +0,0 @@
|
|
|
-# 微信小程序登录流程说明
|
|
|
-
|
|
|
-## 概述
|
|
|
-
|
|
|
-本系统采用**三步渐进式登录流程**,使用**旧版手机号解密方式**(不需要开通"手机号快速验证组件"权限)。
|
|
|
-
|
|
|
-## 登录流程
|
|
|
-
|
|
|
-### 第一步:微信静默登录(老用户)
|
|
|
-
|
|
|
-**目的**:检查用户是否已注册,老用户可直接登录
|
|
|
-
|
|
|
-**流程**:
|
|
|
-1. 前端调用 `wx.login()` 获取 `code`
|
|
|
-2. 发送到后端:`POST /v1/auth/wx/silent-login`
|
|
|
-3. 后端用 `code` 调用微信API获取 `openid`
|
|
|
-4. 根据 `openid` 查询数据库
|
|
|
-5. 返回结果:
|
|
|
- - 老用户:`{ isSign: "true", token }`
|
|
|
- - 新用户:`{ isSign: "false" }`
|
|
|
-
|
|
|
-### 第二步:手机号授权(新用户)
|
|
|
-
|
|
|
-**目的**:获取用户手机号,检查是否已用手机号注册
|
|
|
-
|
|
|
-**流程**:
|
|
|
-1. 用户点击授权按钮(`open-type="getPhoneNumber"`)
|
|
|
-2. 微信弹窗授权,获取 `encryptedData` 和 `iv`
|
|
|
-3. 重新调用 `wx.login()` 获取新的 `code`
|
|
|
-4. 发送到后端:`POST /v1/auth/wx/phone-verify`
|
|
|
- ```json
|
|
|
- {
|
|
|
- "loginCode": "新的code",
|
|
|
- "encryptedData": "加密的手机号数据",
|
|
|
- "iv": "加密算法初始向量"
|
|
|
- }
|
|
|
- ```
|
|
|
-5. 后端用 `code` 获取 `session_key`
|
|
|
-6. 后端用 `session_key` 解密 `encryptedData` 得到手机号
|
|
|
-7. 根据手机号查询数据库
|
|
|
-8. 返回结果:
|
|
|
- - 已注册:`{ isSign: "true", token }`
|
|
|
- - 未注册:`{ isSign: "false", openid, unionid, phoneNumber }`
|
|
|
-
|
|
|
-### 第三步:完善用户信息(首次登录)
|
|
|
-
|
|
|
-**目的**:收集用户昵称和头像,创建新用户
|
|
|
-
|
|
|
-**流程**:
|
|
|
-1. 弹出用户信息弹窗
|
|
|
-2. 用户输入昵称、选择头像
|
|
|
-3. 上传头像到服务器
|
|
|
-4. 发送到后端:`POST /v1/auth/wx/register`
|
|
|
- ```json
|
|
|
- {
|
|
|
- "openid": "用户openid",
|
|
|
- "unionid": "用户unionid",
|
|
|
- "phoneNumber": "手机号",
|
|
|
- "nickname": "昵称",
|
|
|
- "avatarUrl": "头像URL"
|
|
|
- }
|
|
|
- ```
|
|
|
-5. 后端创建新用户记录
|
|
|
-6. 返回:`{ token }`
|
|
|
-
|
|
|
-## 技术要点
|
|
|
-
|
|
|
-### 1. 手机号解密(AES-128-CBC)
|
|
|
-
|
|
|
-```java
|
|
|
-// 使用 session_key 作为密钥
|
|
|
-// 使用 iv 作为初始向量
|
|
|
-// 使用 AES/CBC/PKCS5Padding 算法解密
|
|
|
-byte[] decryptedBytes = cipher.doFinal(encryptedDataBytes);
|
|
|
-String decryptedData = new String(decryptedBytes, "UTF-8");
|
|
|
-// 解析JSON获取 purePhoneNumber
|
|
|
-```
|
|
|
-
|
|
|
-### 2. 为什么需要两次 wx.login()?
|
|
|
-
|
|
|
-- 第一次:获取 `openid` 检查是否为老用户
|
|
|
-- 第二次:获取新的 `session_key` 用于解密手机号
|
|
|
-- 原因:微信的 `code` 是一次性的,用过就失效
|
|
|
-
|
|
|
-### 3. Token 机制
|
|
|
-
|
|
|
-- 使用 JWT 生成 token
|
|
|
-- 包含 `userId` 和 `phone`
|
|
|
-- 有效期 7 天
|
|
|
-- 前端存储在 `localStorage`
|
|
|
-- 后续请求通过 `Authorization: Bearer {token}` 携带
|
|
|
-
|
|
|
-## 接口列表
|
|
|
-
|
|
|
-| 接口 | 方法 | 说明 |
|
|
|
-|------|------|------|
|
|
|
-| `/v1/auth/wx/silent-login` | POST | 第一步:静默登录 |
|
|
|
-| `/v1/auth/wx/phone-verify` | POST | 第二步:手机号验证 |
|
|
|
-| `/v1/auth/wx/register` | POST | 第三步:完善信息 |
|
|
|
-| `/v1/user/info` | GET | 获取用户信息 |
|
|
|
-| `/v1/file/upload` | POST | 上传头像 |
|
|
|
-| `/v1/stock/search` | POST | 股票搜索 |
|
|
|
-| `/v1/stock/suggestion` | GET | 搜索建议 |
|
|
|
-| `/v1/user/profile` | PUT | 更新用户资料 |
|
|
|
-| `/v1/user/portfolio` | GET | 获取用户资产(待实现) |
|
|
|
-| `/v1/rank/leaderboard` | GET | 排行榜(待实现) |
|
|
|
-
|
|
|
-## 优势
|
|
|
-
|
|
|
-1. **老用户体验好**:无需重复授权,静默登录
|
|
|
-2. **新用户流程简单**:一键授权手机号
|
|
|
-3. **安全性高**:手机号加密传输,前端无法获取明文
|
|
|
-4. **无需付费权限**:使用旧版解密方式,不需要开通"手机号快速验证组件"
|
|
|
-5. **个人小程序可用**:不受企业认证限制
|
|
|
-
|
|
|
-## 注意事项
|
|
|
-
|
|
|
-1. `encryptedData` 和 `iv` 必须同时存在
|
|
|
-2. `session_key` 有效期为用户会话期间
|
|
|
-3. 手机号解密后格式为:`13800138000`(纯数字,无国家码)
|
|
|
-4. 头像上传需要先获取 token
|
|
|
-5. 用户信息弹窗不允许点击遮罩关闭
|