# 订单支付流程

创建订单成功后，`POST /Order/CreateOrder` 会返回 `pay.autoSubmit = true`。前端应使用 `pay.payUrl` 与 `pay.payData` 自动提交 POST 表单到支付网关，当前页面保留在订单详情页。

订单详情 `GET /Order/Detail` 在待支付状态下返回：

- `data.canChangePayType`: 是否允许切换付款方式。
- `data.paymentMethods`: 后台支付配置中启用的支付方式。

用户在订单详情页切换付款方式时调用：

```json
{ "uuid": "...", "session": "...", "orderId": "...", "pay_type": "wxpay" }
```

每次支付都会生成独立的易支付 `out_trade_no`，并写入 `order_payment_attempts`。切换支付方式不会尝试修改易支付平台已经创建的旧订单；回调和主动轮询会检查该业务订单下的所有支付尝试，任意一个支付成功都会完成原业务订单。

需要手动执行的表结构：

```sql
CREATE TABLE order_payment_attempts (
  gateway_order_no VARCHAR(64) NOT NULL,
  order_id VARCHAR(64) NOT NULL,
  pay_type VARCHAR(32) NOT NULL,
  create_time BIGINT NOT NULL,
  PRIMARY KEY (gateway_order_no),
  KEY idx_order_payment_attempt_order_id (order_id),
  KEY idx_order_payment_attempt_order_time (order_id, create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

订单关闭规则：

- 用户主动取消待支付订单时，订单状态改为取消，并返还商品库存、释放优惠券占用、删除支付缓存。
- 轮询超时仍未支付时执行同样的关闭逻辑。
- 支付平台非成功回调不会立即关闭业务订单，避免旧支付尝试失败影响用户切换后的新支付。
- 支付成功会校验实付金额与订单金额，金额不一致不会发货。
