标准答案
- 订单和支付分别维护清楚的状态机与允许转换,例如订单创建后等待支付,支付确认后进入已支付或失败分支。
- 创建订单和发起支付使用业务幂等键或唯一约束,重复请求返回同一结果而不是产生新的扣款路径。
- 支付回调必须验签、去重、允许乱序到达,并只在当前状态允许时推进,不能直接覆盖已有状态。
- 通过定时查询、消息重试和对账补偿处理回调丢失或第三方响应不确定,最终以可信支付事实校正状态。
题目解析
支付系统最危险的情况是“用户不知道是否扣款成功”。因此状态要区分请求已发起、结果待确认、已成功和已失败,不能只用一个布尔值。
状态机是业务约束,不是数据库字段枚举。所有入口,包括 API、回调、定时任务和人工修复,都必须走同一转换规则。
常见误区
- 把支付回调当作只会来一次且严格有序。
- 收到成功回调就无条件更新订单,导致取消订单被重新标成已支付。
- 没有对账和主动查询,回调丢失后订单永久悬挂。