# 微信小程序登录流程说明 ## 概述 本系统采用**三步渐进式登录流程**,使用**旧版手机号解密方式**(不需要开通"手机号快速验证组件"权限)。 ## 登录流程 ### 第一步:微信静默登录(老用户) **目的**:检查用户是否已注册,老用户可直接登录 **流程**: 1. 前端调用 `wx.login()` 获取 `code` 2. 发送到后端:`POST /auth/sys/miniapp/custom/openid` 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 /auth/sys/miniapp/custom/check` ```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 /auth/sys/miniapp/custom/login` ```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}` 携带 ## 接口列表 | 接口 | 方法 | 说明 | |------|------|------| | `/auth/sys/miniapp/custom/openid` | POST | 第一步:静默登录 | | `/auth/sys/miniapp/custom/check` | POST | 第二步:手机号验证 | | `/auth/sys/miniapp/custom/login` | POST | 第三步:完善信息 | | `/wd/miniapp-member/bizBigMember/getMemberInfoByToken` | GET | 获取用户信息 | | `/jeecg-boot/mg/sys/oss/file/upload` | POST | 上传头像 | ## 优势 1. **老用户体验好**:无需重复授权,静默登录 2. **新用户流程简单**:一键授权手机号 3. **安全性高**:手机号加密传输,前端无法获取明文 4. **无需付费权限**:使用旧版解密方式,不需要开通"手机号快速验证组件" 5. **个人小程序可用**:不受企业认证限制 ## 注意事项 1. `encryptedData` 和 `iv` 必须同时存在 2. `session_key` 有效期为用户会话期间 3. 手机号解密后格式为:`13800138000`(纯数字,无国家码) 4. 头像上传需要先获取 token 5. 用户信息弹窗不允许点击遮罩关闭