Просмотр исходного кода

📝 docs(prd): 添加微信小程序环境自动登录获取openid故事US005-13

- 添加微信小程序环境自动登录获取openid故事US005-13,顺延原有故事编号
- 更新版本信息,添加版本2.3记录
- 详细描述微信小程序登录功能需求、验收标准和技术实现方案
- 更新文档最后更新时间为2025-10-25,下次评审时间为2025-11-01
yourname 3 месяцев назад
Родитель
Сommit
534b61ec11
1 измененных файлов с 176 добавлено и 2 удалено
  1. 176 2
      docs/prd/epic-005-travel-service-core.md

+ 176 - 2
docs/prd/epic-005-travel-service-core.md

@@ -3,6 +3,7 @@
 ## 版本信息
 | 版本 | 日期 | 描述 | 作者 |
 |------|------|------|------|
+| 2.3 | 2025-10-25 | 添加微信小程序环境自动登录获取openid故事US005-13,顺延原有故事编号 | John (PM) |
 | 2.2 | 2025-10-25 | 添加小程序手机号获取集成故事US005-12,顺延原有故事编号 | John (PM) |
 | 2.1 | 2025-10-20 | 添加车型和路线配置增强故事US005-04,顺延原有故事编号 | John (PM) |
 | 2.0 | 2025-10-19 | 添加样式迁移合规性修复故事US005-03,顺延原有故事编号 | John (PM) |
@@ -402,6 +403,179 @@ POST /api/v1/auth/phone
 - E2E测试:完整手机号获取流程测试
 - 安全测试:数据加密和权限验证测试
 
+### US005-13: 微信小程序环境自动登录获取openid
+**作为** 微信小程序用户
+**我希望** 在微信小程序环境中能够通过微信一键登录并获取我的openid
+**以便** 便捷使用出行服务,无需手动输入账号密码
+
+**验收标准**:
+- [x] 支持微信小程序 `wx.login` 获取code
+- [x] 实现openid获取API接口,接收小程序code
+- [x] 自动创建或关联用户账号
+- [x] 支持用户信息自动同步
+- [ ] 实现静默登录机制,用户无感知(应用启动时自动登录)
+- [x] 支持登录状态持久化
+- [x] 确保登录流程的安全性和可靠性
+- [x] 支持登录失败的重试机制
+- [x] 兼容现有用户认证系统
+
+**技术实现方案**:
+- **前端实现**: 微信小程序登录页面调用 `wx.login` API获取code,支持用户信息授权
+- **后端认证**: 使用微信官方SDK通过code获取openid和session_key
+- **用户管理**: 自动创建或关联用户账号,支持openid绑定
+- **会话管理**: session_key存储在Redis,JWT token用于认证
+
+**前端实现细节**:
+```typescript
+// 微信小程序登录页面登录逻辑
+const handleWechatLogin = async () => {
+  try {
+    // 1. 获取用户信息授权
+    const userProfile = await Taro.getUserProfile({
+      desc: '用于完善用户资料'
+    });
+
+    // 2. 获取登录code
+    const loginRes = await Taro.login();
+
+    if (!loginRes.code) {
+      throw new Error('获取登录凭证失败');
+    }
+
+    // 3. 使用RPC client调用后端小程序登录API
+    const response = await authClient['mini-login'].$post({
+      json: {
+        code: loginRes.code,
+        userInfo: userProfile.userInfo
+      }
+    });
+
+    if (response.status === 200) {
+      const { token, user, isNewUser } = await response.json();
+
+      // 4. 保存token和用户信息
+      Taro.setStorageSync('userInfo', user);
+      Taro.setStorageSync('mini_token', token);
+
+      Taro.showToast({
+        title: isNewUser ? '注册成功' : '登录成功',
+        icon: 'success',
+        duration: 1500
+      });
+
+      // 跳转到首页
+      setTimeout(() => {
+        Taro.switchTab({ url: '/pages/home/index' });
+      }, 1500);
+    } else {
+      const errorData = await response.json();
+      throw new Error(errorData.message || '登录失败');
+    }
+  } catch (error) {
+    // 错误处理逻辑
+  }
+}
+
+// 应用启动时调用
+App({
+  onLaunch() {
+    autoLogin();
+  }
+});
+```
+
+**后端实现细节**:
+- **服务位置**: `packages/server/src/modules/auth/mini-auth.service.ts`
+- **核心方法**: `miniLogin(code: string)`
+- **登录流程**:
+  1. 使用code调用微信 `jscode2session` API获取openid和session_key
+  2. 根据openid查找或创建用户账号
+  3. 生成JWT token并返回给前端
+  4. 保存session_key到Redis用于后续数据解密
+  5. 支持用户信息更新(昵称、头像)
+
+**API设计**:
+```typescript
+// 小程序自动登录API
+POST /api/v1/auth/mini-login
+{
+  "code": "微信小程序登录获取的code",
+  "userInfo": {
+    "nickName": "用户昵称",
+    "avatarUrl": "头像URL"
+  }
+}
+
+// 响应
+{
+  "token": "JWT认证token",
+  "user": {
+    "id": "用户ID",
+    "username": "用户名",
+    "nickname": "昵称",
+    "phone": "手机号",
+    "email": "邮箱",
+    "avatarFileId": "头像文件ID",
+    "registrationSource": "注册来源"
+  },
+  "isNewUser": true
+}
+```
+
+**API路由位置**:
+- **文件路径**: `packages/server/src/api/auth/mini-login/post.ts`
+- **路由注册**: 已在 `packages/server/src/api/auth/index.ts` 中注册
+- **认证中间件**: 无需登录状态验证(用于首次登录)
+- **错误处理**: 支持微信API错误、网络错误、用户创建失败等
+
+**用户实体扩展**:
+```typescript
+// 在User实体中已添加微信相关字段
+@Entity('users')
+export class UserEntity {
+  // 现有字段...
+
+  @Column({ name: 'openid', type: 'varchar', length: 255, nullable: true, unique: true })
+  openid!: string | null;
+
+  @Column({ name: 'unionid', type: 'varchar', length: 255, nullable: true })
+  unionid!: string | null;
+
+  @Column({ name: 'registration_source', type: 'varchar', length: 20, default: 'web' })
+  registrationSource!: string;
+}
+```
+
+**安全考虑**:
+- 使用微信官方SDK进行openid获取
+- session_key安全存储在Redis,不返回给前端
+- JWT token设置合理过期时间
+- 防止重复登录和会话劫持
+- 符合微信小程序安全规范
+- 用户隐私数据保护
+- 登录频率限制和防刷机制
+- 支持用户信息授权,符合微信隐私政策
+
+**依赖关系**:
+- **前置依赖**: US005-02 用户管理基础框架 ✅
+- **并行开发**: US005-12 小程序手机号获取集成 ✅
+- **技术依赖**: 微信小程序SDK、微信开放平台配置、JWT认证 ✅
+
+**测试策略**:
+- 单元测试:openid获取和用户关联逻辑测试
+- 集成测试:微信API调用和JWT生成测试
+- E2E测试:完整微信登录流程测试
+- 安全测试:会话管理和防刷机制测试
+- 兼容性测试:与现有用户系统的兼容性
+
+**实现状态总结**:
+- ✅ **后端API**: 完整实现,支持openid获取、用户自动创建、JWT认证
+- ✅ **前端页面**: 完整实现微信登录页面,支持用户信息授权
+- ✅ **数据模型**: 用户实体已扩展支持openid、unionid等字段
+- ✅ **会话管理**: session_key存储在Redis,支持后续数据解密
+- 🔄 **静默登录**: 应用启动时自动登录功能待实现
+- ✅ **安全机制**: 完整的错误处理、防刷机制和隐私保护
+
 ## 技术实现方案
 
 ### 后端数据模型
@@ -718,5 +892,5 @@ GET /api/v1/routes?startLocationId=123&endLocationId=456&date=2025-10-15&type=de
 ---
 
 **文档状态**: 已更新
-**最后更新**: 2025-10-20
-**下次评审**: 2025-10-27
+**最后更新**: 2025-10-25
+**下次评审**: 2025-11-01