feat(payment): 支持 URL 参数直接传递 JWT 登录

This commit is contained in:
2026-04-27 13:13:32 +08:00
parent 48ed2ca9ea
commit 580e68b58c
6 changed files with 196 additions and 77 deletions

View File

@@ -284,6 +284,15 @@ created_at TIMESTAMPTZ创建时间
| `PUT /api/admin/users/{id}/payment` | 更新用户支付状态 |
| `GET /api/admin/users/{id}` | 获取用户信息 |
### 登录码接口(网页授权)
| 接口 | 说明 |
|------|------|
| `POST /api/web-login/code` | 小程序用微信 code 换取 display_code |
| `POST /api/web-login/confirm` | 小程序确认登录(需 JWT + code |
| `GET /payment/generate-code` | 网页端生成登录码(已废弃,不建议使用) |
| `GET /payment/login-status` | 网页端轮询登录状态 |
### 支付接口
| 接口 | 说明 |
@@ -436,25 +445,36 @@ ORDER BY "desc"
## 支付系统
### 支付流程(真实支付宝
### 支付流程(登录码授权模式
小程序内无法直接接入支付宝支付,采用以下方案:
小程序内无法直接接入支付宝支付,采用外部浏览器中转方案:
```
小程序 → outter页面 → 外部浏览器 → /payment?jwt=xxx
小程序(升级页) → outter页面 → 外部浏览器 → /payment?code=xxx → 支付宝
```
1. 用户在小程序选择套餐 → 点击「立即开通
2. 小程序调用 `POST /api/payment/create-order` 创建订单(需 JWT
3. 小程序跳转 `outter` 页面URL 指向 `/payment?jwt=xxx&package=xxx`outter 页面复制链接到剪贴板
4. 用户切换到外部浏览器,打开 `/payment?jwt=xxx`
5. 后端验证 JWT返回套餐选择页已携带 package 参数则预选套餐)
6. 用户选择套餐,点击「去支付」→ 跳转到 `/payment/pay?order_no=xxx&package_type=xxx`
7. 后端调用 `alipay.trade.page.pay` API生成支付表单或跳转 URL
8. 支付宝沙箱/正式环境支付页面展示
9. 支付完成后,支付宝异步通知 `/payment/notify`
10. 后端验证签名,确认订单状态
11. 跳转成功页 `/payment/success?order_no=xxx`
1. 用户在小程序升级页点击「输入登录码
2. 小程序获取微信 code换取 display_code
3. 小程序自动调用 `POST /api/web-login/confirm` 确认登录(无需用户操作
4. 小程序跳转 `outter` 页面URL 指向 `/payment?code=xxx`
5. outter 页面提示用户在外部浏览器打开
6. 用户在手机浏览器打开 `/payment?code=xxx`
7. 网页轮询 `/payment/login-status?code=xxx`,检测到已确认后自动登录
8. 显示套餐选择页
9. 用户选择套餐,点击「去支付」→ 跳转到 `/payment/page?package=xxx&jwt=xxx`
10. 后端调用 `alipay.trade.page.pay` API返回支付跳转
11. 支付宝沙箱/正式环境展示支付页面
12. 支付完成后,支付宝异步通知 `/payment/notify`
13. 跳转成功页 `/payment/success?order_no=xxx`
### 登录码相关接口
| 接口 | 说明 |
|------|------|
| `POST /api/web-login/code` | 小程序用微信 code 换取 display_code |
| `POST /api/web-login/confirm` | 小程序确认登录(需 JWT + code |
| `GET /payment/generate-code` | 网页端生成登录码(已废弃,不建议使用) |
| `GET /payment/login-status` | 网页端轮询登录状态(返回 token 表示已确认) |
### Mock 登录(沙箱测试)