order-payment-flow.md 1.7 KB

订单支付流程

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

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

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

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

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

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

需要手动执行的表结构:

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;

订单关闭规则:

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