docs: 更新后端AGENTS.md-补齐auto-confirm/sync-order/orders API/修复支付流程和部署表

This commit is contained in:
2026-05-11 09:40:39 +08:00
parent 2c66528205
commit 0cba52f545

View File

@@ -10,7 +10,7 @@
| 技术 | 版本 | 说明 |
|------|------|------|
| Rust | edition 2021 | 主力语言 |
| Rust | edition 2024 | 主力语言Rust 1.85+ 稳定) |
| actix-web | 4.11 | Web 框架 |
| sqlx | 0.8.6 | PostgreSQL 连接 |
| serde | 1.0 | 序列化 |
@@ -60,6 +60,8 @@ static/ # 静态文件
│ │ └── ...
│ └── katex/ # KaTeX 数学公式
deploy.sh # 部署脚本
set-paid-user.sh # 设置用户付费状态
expire-paid-user.sh # 使用户付费时间过期
.env.example # 环境变量模板
```
@@ -154,7 +156,6 @@ APP_WECHAT_APPID=wx...
[package]
name = "rust-backend"
version = "0.3.0" # 唯一版本定义
edition = "2024"
```
**不再使用 `app_version` 字段**(已移除)。
@@ -220,8 +221,8 @@ created_at TIMESTAMPTZ创建时间
id SERIAL PRIMARY KEY
order_no VARCHAR UNIQUEASD{timestamp}{random}
user_id INTEGER users
package_type VARCHARmonthly/quarterly/annual/permanent
amount DECIMAL(10,2)
package_type VARCHARmonthly/yearly/permanent
amount INTEGER
status VARCHARpending/paid/cancelled/expired
paid_at TIMESTAMPTZ
created_at TIMESTAMPTZ
@@ -289,8 +290,9 @@ created_at TIMESTAMPTZ创建时间
| 接口 | 说明 |
|------|------|
| `POST /api/web-login/code` | 小程序微信 code 换取 display_code |
| `POST /api/web-login/confirm` | 小程序确认登录(需 JWT + code |
| `POST /api/web-login/auto-confirm` | 小程序一键确认:微信 code → openid → 创建用户 → JWT → 返回 payment_url |
| `POST /api/web-login/code` | 小程序用微信 code 换取 display_code旧方案 |
| `POST /api/web-login/confirm` | 小程序确认登录(需 JWT + code旧方案 |
| `GET /payment/generate-code` | 网页端生成登录码(已废弃,不建议使用) |
| `GET /payment/login-status` | 网页端轮询登录状态 |
@@ -305,6 +307,8 @@ created_at TIMESTAMPTZ创建时间
| `POST /payment/notify` | 支付宝异步回调通知(需 RSA 签名验证,无认证) |
| `GET /payment/success` | 支付成功页(需 order_no |
| `POST /api/payment/mock-confirm` | 模拟支付确认(沙箱测试用) |
| `POST /api/payment/sync-order` | 根据订单号强制同步会员状态(幂等) |
| `GET /api/payment/orders` | 获取当前用户的订单记录 |
### 支付宝配置(可选)
@@ -451,22 +455,21 @@ ORDER BY "desc"
小程序内无法直接接入支付宝支付,采用外部浏览器中转方案:
```
小程序(升级页) → outter页面 → 外部浏览器 → /payment?code=xxx → 支付宝
小程序(mine/升级页) → outter页面 → 外部浏览器 → /payment → 支付宝
```
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`
1. 用户在小程序 mine 页面点击升级入口(未付费用户)
2. 小程序调用 `POST /api/web-login/auto-confirm`(微信 code → openid → 创建用户 → JWT → payment_url
3. 小程序跳转 `outter` 页面URL 指向 `/payment?jwt=xxx`
4. outter 页面提示用户在外部浏览器打开
5. 用户在手机浏览器打开 `/payment?jwt=xxx`
6. JWT 在 URL 参数中,网页自动通过 JWT 登录,获取用户信息和付费状态
7. 未付费用户显示套餐选择页(包月/包年),已付费用户显示会员信息
8. 用户选择套餐,点击「去支付」→ 跳转到 `/payment/page?package=xxx&jwt=xxx`
9. 后端生成订单,渲染支付宝支付表单(表单自动提交到沙箱/正式环境)
10. 支付宝沙箱/正式环境展示支付页面
11. 支付完成后,支付宝异步通知 `/payment/notify`
12. 跳转成功页 `/payment/success?order_no=xxx`(同步确认订单,幂等)
### 登录码相关接口
@@ -509,14 +512,6 @@ Mock 登录支持 `user_id` 参数指定已有用户,或自动创建新用户
**启用真实支付**
`.env` 中配置 `ALIPAY_APP_ID``ALIPAY_PRIVATE_KEY``ALIPAY_ALIPAY_PUBLIC_KEY``ALIPAY_GATEWAY`,重启服务后自动禁用 Mock 模式。
### 支付模式
| 模式 | 来源 | 处理方式 |
|------|------|---------|
| 微信支付 | `payment_orders` | 收到微信回调后确认 |
| 邀请码 | `invitation_codes` | 核销后直接激活 |
| 管理员开通 | 直接 UPDATE | 后台手动设置 |
### 累积计算逻辑
用户多次购买时,有效期会累加而非覆盖:
@@ -543,7 +538,7 @@ let new_expires = base_time + days(pkg_days);
| 环境 | 域名 | 端口 | 远程目录 |
|------|------|------|---------|
| 测试 | xmclassmate.top/dev | 8080 | /root/rust/rust_backend_dev |
| 测试 | dev.xmclassmate.top | 8080 | /root/rust/rust_backend_dev |
| 生产 | xmclassmate.top | 4433 | /root/rust/rust_backend |
### systemd 服务