3. 支付订单领域分析:识别支付订单上下文与核心业务能力

在支付系统中,支付订单并非简单的交易记录,而是承载了资金流转、状态机演进、对账与风控的核心聚合。本章从领域驱动设计视角,对支付订单进行领域分析,明确其限界上下文边界,并提炼出支撑支付业务的核心能力。

3.1 支付订单的限界上下文

支付订单处于多个上下文的交汇点。为避免概念混淆,必须将交易订单(业务订单)与支付订单(资金订单)严格分离。下表展示了二者的核心差异:

维度 交易订单上下文 支付订单上下文
核心职责 管理商品、数量、价格、用户地址 管理支付金额、支付方式、渠道、状态机
生命周期 从创建到完成/取消 从待支付到支付成功/失败/退款
金额可变性 可修改(优惠、运费调整) 一旦创建,支付金额不可变(幂等关键)
对账粒度 按订单行对账 按支付单号+渠道流水对账
典型聚合根 Order(订单) PaymentOrder(支付订单)
领域边界原则:支付订单上下文只关注“谁付了多少钱、通过什么渠道、当前状态是什么”,不关心用户买了什么商品。商品信息通过交易订单ID关联,但不在支付上下文中展开。

3.2 支付订单上下文的核心业务能力

通过事件风暴与业务专家访谈,我们识别出支付订单上下文必须提供的六项核心业务能力:

  1. 支付订单创建 —— 接收交易订单发起的支付请求,生成唯一支付单号,锁定支付金额与渠道。
  2. 支付执行 —— 调用第三方支付渠道(、支付宝、银联),发起扣款请求,并记录渠道返回的流水号。
  3. 支付结果通知 —— 处理异步回调(同步/异步),更新支付订单状态,并通知交易订单上下文。
  4. 支付状态查询 —— 提供幂等的状态查询接口,支持交易系统、用户端、对账系统轮询。
  5. 支付超时处理 —— 定时扫描超时未支付的订单,执行自动取消或降级处理。
  6. 退款处理 —— 基于原支付订单发起退款,生成退款子单,保证退款金额不超过原支付金额。
设计提示:支付执行与结果通知之间通常存在“最终一致性”窗口。建议在支付订单聚合中维护一个支付尝试记录(PaymentAttempt)值对象,用于追踪每次渠道调用的请求与响应,便于对账与问题排查。

3.3 支付订单聚合模型(核心结构)

下图展示了支付订单聚合的内部结构,包含聚合根、实体、值对象以及它们之间的关系:

支付订单聚合模型结构图 聚合根 PaymentOrder 支付订单ID / 金额 / 状态 / 渠道 实体 PaymentAttempt 尝试ID / 渠道请求 / 响应 值对象 Money 金额 / 币种 / 精度 值对象 ChannelInfo 渠道编码 / 商户号 / 子渠道 外部上下文 交易订单上下文 通过 OrderId 关联 外部上下文 支付渠道上下文 通过 ChannelRefId 关联 聚合设计要点 • 聚合根保证支付金额不变性 • PaymentAttempt 记录每次渠道调用 • 值对象不可变,支持快照对比

3.4 核心业务能力与聚合方法的映射

将六项核心业务能力映射到聚合方法,形成清晰的领域接口:

业务能力 聚合方法 输入参数 输出/事件
支付订单创建 createPaymentOrder() 交易订单ID、金额、渠道 PaymentOrderCreatedEvent
支付执行 executePayment() 支付订单ID、渠道参数 PaymentExecutedEvent
支付结果通知 handlePaymentResult() 渠道流水、支付结果 PaymentSucceededEvent / PaymentFailedEvent
支付状态查询 getPaymentStatus() 支付订单ID 当前状态 + 最后尝试记录
支付超时处理 markAsTimedOut() 支付订单ID PaymentTimedOutEvent
退款处理 createRefund() 支付订单ID、退款金额 RefundCreatedEvent
常见误区:不要在支付订单聚合中直接调用第三方渠道的HTTP接口。渠道调用应通过领域服务(Domain Service)或防腐层(Anti-Corruption Layer)封装,聚合只负责状态判断与事件记录,保持领域模型的纯净。

3.5 支付订单状态机

支付订单的状态演进是领域建模的核心约束。下图展示了完整的状态转换路径:

支付订单状态机 待支付 支付中 支付成功 支付失败 已退款 已超时 状态转换规则 待支付 → 支付中 → 支付成功/失败;支付成功 → 已退款;待支付 → 已超时(虚线为超时路径)
幂等设计关联:状态机中的每个状态转换都对应一个幂等Key。例如,“支付中→支付成功”的转换必须携带渠道返回的渠道流水号作为幂等Key,防止重复回调导致状态错误。

3.6 领域事件清单

支付订单上下文通过领域事件与外部上下文通信。以下是关键事件列表:

  • PaymentOrderCreatedEvent —— 支付订单创建后发布,交易订单上下文监听后更新关联状态。
  • PaymentSucceededEvent —— 支付成功时发布,包含支付订单ID、渠道流水、成功时间。
  • PaymentFailedEvent —— 支付失败时发布,包含失败原因、渠道错误码。
  • PaymentTimedOutEvent —— 超时取消时发布,交易订单上下文据此恢复库存。
  • RefundCreatedEvent —— 退款申请创建后发布,对账系统开始跟踪退款状态。
领域分析结论:支付订单上下文是一个高内聚、低耦合的限界上下文。其核心聚合PaymentOrder通过严格的状态机、不可变的金额值对象、以及幂等的渠道调用记录,为支付系统提供了可靠的基础。下一章将基于此模型,深入讲解幂等Key的生成规则,确保支付操作在分布式环境下的精确一次语义。