支付处理
设计理念
- 永远不信任前端价格:后端从数据库获取
- Webhooks 保证可靠性:不依赖重定向成功
- 原子订单创建:Stripe 重定向前创建待支付订单
- 幂等性处理:同一 webhook 触发两次 = 相同结果
- 库存预留:结账时锁定库存,失败/过期时释放
支付流程
┌──────────┐ ┌────────────── ─┐ ┌──────────┐ ┌──────────┐
│ 购物车 │──▶│ 结账 API │──▶│ Stripe │──▶│ 成功页 │
│ 页面 │ │ │ │ 托管页 │ │ │
└──────────┘ └───────┬───────┘ └────┬─────┘ └────┬─────┘
│ │ │
┌────────────┼────────────────┼──────────────┘
│ │ │
▼ ▼ ▼
┌───────────┐ ┌────────────┐ ┌────────────┐
│ 限流 │ │ 预留库存 │ │ Webhook │
│ (Redis) │ │ (Postgres) │ │ 处理器 │
└───────────┘ └────────────┘ └─────┬──────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌────────────┐ ┌────────────────┐ ┌─────────────┐
│ 更新状态 │ │ 扣减库存 │ │ 发送邮件 │
│ → paid │ │ on_hand -= N │ │ (Resend) │
└────────────┘ └────────────────┘ └─────────────┘