这个版本把超长流程拆成 8 个阶段来讲,更适合你自己理解,也更适合面试时按顺序口述。你可以先把每个阶段讲顺,再切换到明细版看完整节点和兜底分支。
01
商户入口
- 商户通过 `open-api`、`merchant-gateway` 或 checkout 创建 payment。
- 交易先进入 trade,而不是直接进银行或结算。
- 这一步只是在平台侧生成一笔待处理交易。
关键对象:`payment` 初始状态通常是 `pending + incomplete`。
02
创建主单
- trade 生成 `paymentId`、`clientSecret` 并保存主单。
- 同时落支付方式快照、billing、shipping、device、products 等上下文。
- 如果只是 create,就先停在未确认状态。
关键对象:`payment` 是平台主视角,后面所有链路都围着它转。
03
确认与风控
- confirm 时做参数校验、商户能力校验和 Redis 并发锁。
- 初始化 `payment_bank`,准备记录银行侧交互结果。
- 卡支付先过 risk-control,再决定是否送银行、是否建议 3DS。
关键点:风控在交易前做业务决策,挡住高风险单。
04
通道执行
- bank-channel 根据支付方式、币种、路由、3DS、预授权能力选具体通道。
- 统一适配各家银行报文、签名、回调、查单。
- 银行可能返回成功、失败、处理中、预授权成功或 nextAction。
关键对象:`payment_bank` 承接银行单号、returnCode、nextAction。
05
状态回写
- trade 根据同步返回、异步回调或查单结果推进状态机。
- `status`、`statusDetail`、`actionStatus` 一起表达交易当前所处阶段。
- 普通成功进入 complete,预授权则要 capture 后才进入成功主链。
关键点:pending 不直接判失败,后面还有回调、查单、对账修正。
06
异步通知与结算
- complete 后并行发商户通知 MQ 和结算 MQ。
- 发送失败先落 `mq_send_retry`,由定时任务补发。
- settlement 消费 `SettleDTO`,按 `type + businessNo` 幂等入账。
关键点:trade 不直接改余额,账务靠 MQ 异步最终一致。
07
余额释放与出款
- `charge` 先生成 `settle_transaction`,并把钱记到 pending。
- 到 `availableOn` 后由任务把 pending 释放成 available。
- payout 再从可用余额中归集、扣账、生成出款批次和后续通知。
关键对象:`settle_transaction`、`settle_balance`、`settle_payout`。
08
对账与补偿
- 银行回调丢失、MQ 失败、账务不一致、payout 异常都要靠补偿和对账修复。
- 能自动修的补状态、补 MQ、补反向流水。
- 不能自动修的进入人工排查和调账。
关键点:支付系统价值不只在成功流程,更在异常闭环。