聊聊优雅的支付系统设计

开发 架构
很多复杂的业务场景管理,都需要一个长期的迭代过程,但是前提需要牢牢把握住核心的逻辑;对业务的认知是一个由繁入简的过程,而业务的实现是一个由浅到深的过程,即分析与理解,到落地实现,再到探索与创新。

一、业务背景

在业务系统中,支付功能的实现尤为关键且挑战重重,尤其是对经验不足的开发者而言。支付结算逻辑的细微差错可能导致对账失误,引发连锁反应:错误排查耗时巨大,数据不平需调整,甚至可能演变成复杂的账目混乱,最终不得不依赖人工逐一手动修正。

支付场景复杂,涵盖多维度业务、结算规则及长流程,还需与第三方对接,技术上要求严格,涉及事务管理、异步处理、重试策略、并发控制等关键细节。接下来将深入探讨这些技术要点。

图片图片

二、支付业务

1、流程拆解

图片图片

  • 账面管理:对于开通支付功能的用户,必须清晰的管理资金信息;比如可用,冻结,账单等;
  • 交易流水:整个资金管理的流水记录,不局限于交易场景,还有充值,提现,退款等;
  • 支付对接:通常流程中的支付功能都是对接第三方支付平台来实现的,所以要做好请求和报文的记录;
  • 订单结构:比如在电商交易中,订单模型的管理,拆单策略等,支付的商品规格等;

常规交易流程虽可概览,实际操作细节更为繁复,各业务特异但处理逻辑相似。设计时,细化各模块流程图,确保节点衔接流畅,协同工作高效。

2、流程时序

通过时序图的设计,来分析各个节点在衔接协作时应该如何处理,在支付业务中,通常分为支付前、支付对接、支付后三个核心阶段:

图片

  • 支付前:在商品下单时,构建订单模型,根据拆单规则校验库存、商品状态等,然后进行账户资金冻结,生成交易流水,此时的状态都是待支付;
  • 支付对接:支付前业务模型初始化成功之后,构建第三方支付对接请求,发起付款流程,并记录相应的请求动作和参数,等待支付结果的通知;
  • 支付后:根据支付结果的成功与否,执行相应的业务模型状态更新,如果支付成功则交易记录、冻结的资金、订单结构与库存等都需要做一系列更新;

理解并拆分业务后,精心设计时序流程,复杂场景将变得条理清晰。随后,重点聚焦于定义各节点数据结构,进一步细化实现方案。

3、结构设计

基于上面的业务场景分析和拆解,以及流程时序图的呈现,可以很容易输出一份基础维度的结构设计,下图可以作为参考:

图片图片

  • 账面管理:三个核心维度,账户金额,可用余额,冻结金额;
  • 交易记录:存储用户的交易动作,但是可能会产生多个交易明细,典型的场景就是购物车下单;
  • 交易明细:通常因为订单拆分,从而导致交易被拆分多条明细,进而将资金支付给不同商家;
  • 支付对接:请求第三方支付平台时,需要记录请求时参数,以及第三方回调通知的报文;
  • 订单记录:在一笔订单中可能存在多个拆分的子单,拆分策略也很多,比如仓库,商家,品类等;
  • 订单明细:管理每笔子订单的信息,下单的商品、规格、买卖双方、单价、数量、金额等;

即使单看上面的简单设计,都能感觉到支付业务的复杂性,更何况还会叠加红包或满减等优惠规则之后,其复杂程度可想而知;

当然如果有明确的开发规范,在复杂版本中,所有开发必须输出业务的分解拆分思路,时序和结构设计,在统一评审之后再落地编码,这样即便是复杂的业务也会有极大的质量保证。

三、关联业务

上面单从支付的主逻辑去分析流程,实际上涉及到的业务远不止流程中提到的这些,以常见的电商场景为例,交易中还存在商品管理、库存管理、物流管理,支付对接还会涉及优惠规则嵌入等等;

商品管理

图片图片

  • 商品主体:维护商品各个维度的信息,并提供各种规格选项,以及基础的定价阶梯,构建商品详情描述;
  • 仓储管理:订单拆单之后,需要根据商品编号去校验仓储信息,进行相应的库存冻结以及支付后的仓库发货;

优惠券规则

图片图片

  • 优惠券主体:为了适配更多的业务场景,需要对优惠规则有诸多的设计,比如满减或折扣比例、按价格阶梯优惠、有效期限制等;
  • 发放规则:支撑日常的运营活动,用户生命周期的维护,以及渠道流量的转化,提供用户群营销的基础能力;

这里简述的商品和优惠券业务,都是与支付流程有紧密的联系,比如拆单后库存不足,需要移除该商品;优惠券在支付中的使用策略,以及退款时的处理方式等;

四、实践总结

最后从技术实现的角度,总结一下支付流程中的一些关键问题:

  • 业务模型:对业务有清晰的理解,并能拆分出核心的节点,设计出相应的流程时序和数据结构;
  • 事务管理:交易流程中常用TCC事务机制,即Try(预处理)、Confirm(确认)、Cancel(取消)模式;
  • 加锁与重试:支付完成后发出支付成功的消息,而后进行业务更新,通常需要对处理的订单号加锁,避免消息重试机制引发数据问题;
  • 资金结算:涉及金额的计算,自然要求不能出现精度损失的问题,在一次交易中必须保证每笔资金可以通过对账核验;
  • 流程维护:流程本身是很难保证不出现错误的,需要在开发的时候,提供流程的可视化界面,并且支持手动维护的机制;

很多复杂的业务场景管理,都需要一个长期的迭代过程,但是前提需要牢牢把握住核心的逻辑;对业务的认知是一个由繁入简的过程,而业务的实现是一个由浅到深的过程,即分析与理解,到落地实现,再到探索与创新。

责任编辑:武晓燕 来源: 一安未来
相关推荐

2023-11-30 07:40:05

URLCMS

2022-04-11 08:17:07

JVMJava进程

2024-06-27 12:26:32

2024-04-24 12:34:08

Spring事务编程

2024-10-14 08:09:08

2021-10-26 13:55:53

搞定系统设计

2024-10-29 11:19:23

点赞系统同步

2017-02-17 13:54:01

支付系统处理设计

2024-07-12 08:28:09

聊天系统架构

2024-09-13 08:18:10

2017-02-28 17:48:29

支付支付路由

2022-05-13 08:48:50

React组件TypeScrip

2023-12-21 10:26:30

​​Prettier

2024-09-10 08:06:41

2023-10-30 10:17:02

Go编程语言

2021-12-28 19:05:41

路由服务治理

2023-05-26 08:24:17

短信渠道模型

2024-01-31 08:41:43

异步设计项目

2024-02-23 08:57:42

Python设计模式编程语言

2017-06-16 15:52:58

移动支付系统
点赞
收藏

51CTO技术栈公众号