|
@@ -3,6 +3,7 @@
|
|
|
## 版本信息
|
|
## 版本信息
|
|
|
| 版本 | 日期 | 描述 | 作者 |
|
|
| 版本 | 日期 | 描述 | 作者 |
|
|
|
|------|------|------|------|
|
|
|------|------|------|------|
|
|
|
|
|
+| 2.2 | 2025-10-25 | 添加小程序手机号获取集成故事US005-12,顺延原有故事编号 | John (PM) |
|
|
|
| 2.1 | 2025-10-20 | 添加车型和路线配置增强故事US005-04,顺延原有故事编号 | John (PM) |
|
|
| 2.1 | 2025-10-20 | 添加车型和路线配置增强故事US005-04,顺延原有故事编号 | John (PM) |
|
|
|
| 2.0 | 2025-10-19 | 添加样式迁移合规性修复故事US005-03,顺延原有故事编号 | John (PM) |
|
|
| 2.0 | 2025-10-19 | 添加样式迁移合规性修复故事US005-03,顺延原有故事编号 | John (PM) |
|
|
|
| 1.9 | 2025-10-17 | 添加省市区实体设计方案,支持标准化行政区划数据管理 | John (PM) |
|
|
| 1.9 | 2025-10-17 | 添加省市区实体设计方案,支持标准化行政区划数据管理 | John (PM) |
|
|
@@ -307,6 +308,100 @@ mini-demo包含14个页面,Epic 005将页面迁移作为用户故事的具体
|
|
|
- **安全机制**: 签名验证、AES-256-GCM数据加密、防重放攻击
|
|
- **安全机制**: 签名验证、AES-256-GCM数据加密、防重放攻击
|
|
|
- **测试覆盖**: 完整的集成测试和单元测试
|
|
- **测试覆盖**: 完整的集成测试和单元测试
|
|
|
|
|
|
|
|
|
|
+### US005-12: 小程序手机号获取集成
|
|
|
|
|
+**作为** 出行用户
|
|
|
|
|
+**我希望** 能够通过微信小程序一键获取我的手机号
|
|
|
|
|
+**以便** 快速完成订单联系信息填写
|
|
|
|
|
+
|
|
|
|
|
+**验收标准**:
|
|
|
|
|
+- [ ] 支持微信小程序 `getPhoneNumber` 功能调用
|
|
|
|
|
+- [ ] 实现手机号解密API接口,接收小程序加密数据
|
|
|
|
|
+- [ ] 将获取的手机号保存到用户信息中
|
|
|
|
|
+- [ ] 订单确认页面显示已获取的手机号状态
|
|
|
|
|
+- [ ] 支持手机号获取失败的重试机制
|
|
|
|
|
+- [ ] 确保手机号数据安全性和隐私保护
|
|
|
|
|
+- [ ] 手机号获取成功后自动填充到订单联系信息
|
|
|
|
|
+- [ ] 支持手机号验证状态显示
|
|
|
|
|
+
|
|
|
|
|
+**技术实现方案**:
|
|
|
|
|
+- **前端实现**: 使用微信小程序 `getPhoneNumber` 组件
|
|
|
|
|
+- **后端解密**: 使用微信官方SDK解密手机号加密数据
|
|
|
|
|
+- **数据存储**: 将手机号保存到用户实体的 `phone` 字段
|
|
|
|
|
+- **状态管理**: 订单页面显示手机号获取状态和验证状态
|
|
|
|
|
+
|
|
|
|
|
+**前端实现细节**:
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 订单确认页面手机号获取逻辑
|
|
|
|
|
+const handleGetPhoneNumber = async (e: any) => {
|
|
|
|
|
+ if (e.detail.errMsg === 'getPhoneNumber:ok') {
|
|
|
|
|
+ // 调用后端手机号解密API
|
|
|
|
|
+ const phoneData = await authClient.phone.$post({
|
|
|
|
|
+ json: {
|
|
|
|
|
+ code: e.detail.code,
|
|
|
|
|
+ encryptedData: e.detail.encryptedData,
|
|
|
|
|
+ iv: e.detail.iv
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 更新用户信息和页面状态
|
|
|
|
|
+ setPhoneNumber(phoneData.phoneNumber);
|
|
|
|
|
+ setHasPhoneNumber(true);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**后端实现细节**:
|
|
|
|
|
+- **服务位置**: `packages/server/src/modules/auth/mini-auth.service.ts`
|
|
|
|
|
+- **新增方法**: `decryptPhoneNumber(code: string, encryptedData: string, iv: string)`
|
|
|
|
|
+- **解密流程**:
|
|
|
|
|
+ 1. 使用session_key解密手机号数据
|
|
|
|
|
+ 2. 验证用户身份和会话有效性
|
|
|
|
|
+ 3. 将手机号保存到用户实体
|
|
|
|
|
+ 4. 返回解密后的手机号信息
|
|
|
|
|
+
|
|
|
|
|
+**API设计**:
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 手机号解密API
|
|
|
|
|
+POST /api/v1/auth/phone
|
|
|
|
|
+{
|
|
|
|
|
+ "code": "微信小程序获取的code",
|
|
|
|
|
+ "encryptedData": "加密数据",
|
|
|
|
|
+ "iv": "加密算法的初始向量"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 响应
|
|
|
|
|
+{
|
|
|
|
|
+ "phoneNumber": "13812345678",
|
|
|
|
|
+ "countryCode": "86",
|
|
|
|
|
+ "purePhoneNumber": "13812345678"
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**API路由位置**:
|
|
|
|
|
+- **文件路径**: `packages/server/src/api/auth/phone/post.ts`
|
|
|
|
|
+- **路由注册**: 在 `packages/server/src/api/auth/index.ts` 中添加
|
|
|
|
|
+- **认证中间件**: 需要用户登录状态验证
|
|
|
|
|
+- **错误处理**: 支持微信API错误、解密错误、网络错误等
|
|
|
|
|
+
|
|
|
|
|
+**安全考虑**:
|
|
|
|
|
+- 使用微信官方SDK进行数据解密
|
|
|
|
|
+- 验证用户身份和会话有效性
|
|
|
|
|
+- 防止重复获取和滥用
|
|
|
|
|
+- 符合微信小程序隐私政策要求
|
|
|
|
|
+- 手机号数据加密存储
|
|
|
|
|
+- 访问权限控制
|
|
|
|
|
+
|
|
|
|
|
+**依赖关系**:
|
|
|
|
|
+- **前置依赖**: US005-10 个人中心管理(用户信息展示)
|
|
|
|
|
+- **并行开发**: US005-08 订单创建和支付(订单确认页面)
|
|
|
|
|
+- **技术依赖**: 微信小程序SDK、微信开放平台配置
|
|
|
|
|
+
|
|
|
|
|
+**测试策略**:
|
|
|
|
|
+- 单元测试:手机号解密逻辑测试
|
|
|
|
|
+- 集成测试:微信API调用测试
|
|
|
|
|
+- E2E测试:完整手机号获取流程测试
|
|
|
|
|
+- 安全测试:数据加密和权限验证测试
|
|
|
|
|
+
|
|
|
## 技术实现方案
|
|
## 技术实现方案
|
|
|
|
|
|
|
|
### 后端数据模型
|
|
### 后端数据模型
|