Files
FastapiAdmin/overview_wx_mini_backend.md
T
zhangtao ffbe2453f2 refactor: 小程序端代码瘦身与功能补齐
- 清理冗余代码与配置:
  - 删除废弃的 mock 适配器、通用 mock 模块与示例API
  - 移除冗余的 ts 类型文件与 patch 目录
  - 简化 tsconfig 组件路径配置
- 新增功能与优化:
  - 新增全局水印组件与水印配置
  - 接入微信小程序登录/手机号登录
  - 新增系统参数配置 store 与国际化支持
  - 新增 markdown 渲染插件与样式配置
  - 优化 pinia 持久化逻辑修复
  - 新增微信小程序 access_token 缓存配置
  - 修复登录趋势数据结构定义
  - 优化全局请求防抖重定向逻辑
- 页面与路由优化:
  - 补全引导页首次启动逻辑
  - 统一页面底部安全区适配
  - 更新页面路由类型声明
- 代码质量优化:
  - 移除无用 console.log 调试代码
  - 修复全局弹窗重复重登录问题
  - 优化 mp-html 组件配置
2026-08-05 23:47:49 +08:00

74 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 微信小程序后端接口实现 — 交付说明
**日期**: 2026-08-05
**范围**: 打通小程序完整登录闭环(微信一键登录 / 手机号登录 / 小程序码生成)
---
## 一、新增后端接口(3个)
| 接口 | 方法 | 功�� | 依赖 |
|------|------|------|------|
| `/system/auth/wx-login` | POST | uni.login code → code2Session → openid → 查建用户 → JWT | WX_MINI_APP_ID/SECRET |
| `/system/auth/wx-phone-login` | POST | getPhoneNumber code → getuserphonenumber → 手机号 → 查建用户 → JWT | 同上 |
| `/system/auth/wx-qrcode/generate` | POST | scene/page/width → getwxacodeunlimit → base64 PNG | 同上 |
## 二、文件变更清单
### 后端(5个)
| 文件 | 变更 |
|------|------|
| `backend/app/config/setting.py` | +`WX_MINI_APP_ID` / `WX_MINI_APP_SECRET` / `WX_MINI_ACCESS_TOKEN_CACHE_TTL=7000` |
| `backend/app/common/enums.py` | +`WX_MINI_ACCESS_TOKEN` Redis key |
| `backend/app/api/v1/module_system/auth/schema.py` | +`WxLoginSchema` / `WxPhoneLoginSchema` / `WxQrCodeSchema` / `WxQrCodeOutSchema` |
| `backend/app/api/v1/module_system/auth/wx_mini_service.py` | **新增**,核心服务层 |
| `backend/app/api/v1/module_system/auth/controller.py` | +3 个端点及所需 import |
### 前端(5个)
| 文件 | 变更 |
|------|------|
| `frontend/app/src/api/module_system/auth.ts` | `wxPhoneLogin` 改为仅传 code;+`generateWxQrCode` 及类型 |
| `frontend/app/src/composables/useWxLogin.ts` | `wxPhoneLogin` 接收 `e.detail.code` |
| `frontend/app/src/pages/login/index.vue` | 手机号登录传 code;移除废弃 `getUserProfile` |
| `frontend/app/src/store/userStore.ts` | `wxPhoneLogin` 类型改为 `{ code: string }` |
| `frontend/app/src/composables/useSharePoster.ts` | 改用 `AuthAPI.generateWxQrCode`(修复错误路径) |
### 顺带修复(2个既有 TS 错误)
| 文件 | 修复 |
|------|------|
| `frontend/app/src/composables/useShare.ts` | 移除不存在的 `ShareAppMessageOptions` / `ShareTimelineOptions` 类型导入 |
| `frontend/app/src/composables/useSubscribeMessage.ts` | `requestSubscribeMessage` 返回值先转 `unknown` 再断言 |
## 三、关键技术决策
1. **手机号登录用 2023+ 新方案**:前端 `getPhoneNumber` 回调的 `e.detail.code` 直传后端,后端调 `wxa/business/getuserphonenumber` 换手机号。**无需 AES 解密**,避免引入 pycryptodome 依赖(旧方案 encryptedData+iv 已废弃)。
2. **access_token 用 stable_token 接口**:`POST cgi-bin/stable_token`,比传统 `cgi-bin/token` 更稳定(并发不互相覆盖);Redis 缓存 7000s(微信上限 7200 留 200s 余量),多实例共享。
3. **小程序码返回 base64 data URI**:`data:image/png;base64,...`,前端可直接作为 `<image>` src 或 Canvas 图片来源,无需中转存储。
4. **用户名规则**:微信登录自动注册 `wxmini_{openid前20位}`;手机号登录 `wxphone_{尾号4位}_{随机8hex}`,风格与 OAuth 模块 `oauth_{provider}_{id}` 一致。
5. **登录类型标记**:`login_type` 分别记录 `wx_mini` / `wx_mini_phone`,便于会话审计。
## 四、验证结果
- ✅ 后端全模块导入无错误,3 个新路由断言通过
- ✅ Schema 字段校验通过(默认值、边界)
- ✅ 前端 `vue-tsc --noEmit` 通过(0 错误)
## 五、上线前置条件(待用户配置)
| 事项 | 说明 |
|------|------|
| 申请小程序 AppID/AppSecret | 微信公众平台 → 开发管理,填入环境变量 `WX_MINI_APP_ID` / `WX_MINI_APP_SECRET` |
| 配置订阅消息模板 | 公众平台 → 订阅消息,将模板 ID 填入 `useSubscribeMessage.ts` 的 `TEMPLATE_IDS` |
| 域名白名单 | 微信公众平台配置 request 合法域名指向后端 API 地址 |
| 小程序码配额 | 有数量限制(getwxacodeunlimit 每日上限),生产需注意缓存 |
## 六、测试建议
配置好密钥后,可用以下命令快速自测(需 Redis 与数据库就绪):
```bash
# 微信登录(code 需真实小程序 code,可用微信开发者工具获取)
curl -X POST http://localhost:8000/api/v1/system/auth/wx-login \
-H "Content-Type: application/json" \
-d '{"code": "REAL_CODE"}'
```