当前位置: 首页 > 后端技术 > Java

下面说一下支付流程的设计和实现逻辑

时间:2023-04-01 23:41:31 Java

首先,业务后台通常在业务系统中,或多或少涉及到支付相关的功能;对于一些缺乏经验的同学来说,压力最大的就是面对这种类似支付结算的逻辑,因为这个过程中的任何一个细节都可能导致对账异常;错误发生后,如果要修复流程,需要花费大量的时间和成本,而且还涉及到错误数据的平整,最后很可能造成账目混乱,结果不明,然后需要人工干预;在支付场景中,不仅涉及到很多复杂的业务、结算规则、流程长、第三方对接,还有很多技术细节,比如:交易管理、异步处理、重试机制、锁等;下面我们来分析一下具体的细节逻辑。2.支付业务1.流程拆解面对复杂的业务,最基本的能力就是知道如何将流程拆解成模块,管理好每个模块,然后再考虑如何把整个流程串联起来,从而形成一个问题——解决思路和经验;如图所示是一个常见的交易场景分解,大致可以分为四个模块:账簿管理:对于开通了支付功能的用户,需要对资金信息进行清晰的管理;如可用、冻结、票据等;交易流水:整个基金的管理记录,不仅限于交易场景,还包括充值、提现、退款等;支付对接:通常流程中的支付功能是通过与第三方支付平台对接实现的,因此需要做好request和message的记录;订单结构:例如电子商务交易中的订单模型管理、订单拆分策略等,支付产品规格等;这里只是从一个常规的交易流程来分析,实际的详细描述会远比图示复杂。虽然业务细节不同,但处理思路大体相同;然后根据各个模块设计流程时序图,规划节点之间的联系和协作;2.通过时序图的设计分析流程时序。如何处理协同,在支付业务中,通常分为支付前、支付对接、支付后三个核心阶段:库存和商品状态按照订单拆分规则等待,然后冻结账户资金,产生交易流水,此时状态为待支付;支付对接:支付成功前业务模型初始化后,构建第三方支付对接请求,发起支付流程,并记录相应的请求动作和参数,等待支付结果通知;支付后:根据支付结果是否成功,执行相应的业务模型状态更新。如果支付成功,则需要对交易记录、冻结资金、订单结构和库存进行一系列更新;其实在对业务有了清晰的认识和拆分之后,做好时序流程的设计,可以让一个复杂的场景看起来简单很多,然后再设计各个节点的数据结构;3.结构设计基于以上业务场景的分析和拆解,以及流程时序图的呈现,可以很容易的输出一个基本维度的结构设计。下图可以作为参考:账簿管理:三个核心维度,账户金额、可用余额、冻结金额;交易记录:存储用户的交易行为,但可能会产生多个交易明细。典型的场景是在购物车中下订单;交易明细:通常是因为订单拆分,将交易拆分成多个明细,然后将资金支付给不同的商户;支付对接:请求第三方支付平台时,需要记录请求时的参数和第三方回调通知的消息;订单记录:一个订单中可能有多个拆分子订单,拆分策略也有很多种,比如仓库、商户、类目等;订单明细:管理每个子订单的信息,所订购的产品,规格,买卖双方,单价、数量、金额等;就算只看上面简单的设计,也能感受到支付业务的复杂性,更何况叠加了红包、满减等优惠规则,其复杂程度可想而知;当然,如果有明确的复杂版本,所有的开发都要输出业务分解思路、时序和结构设计,统一审核后再实施编码,这样再复杂的业务也会有很大的质量保证。3.关联上面的业务只是从支付的主要逻辑来分析流程。其实涉及的业务远不止流程中提到的那么多。以常见的电商场景为例,还有商品管理、库存管理、物流管理、支付的对接,也会涉及到优惠规则的嵌入等;产品管理产品主体:维护产品各个维度的信息,提供各种规格选项,以及基本的定价阶梯,建立产品描述;仓库管理:订单拆分后,需要根据商品编号核对入库信息,冻结相应库存,付款后出库;优惠券规则优惠券主题:为了适应更多的业务场景,需要对优惠规则进行多种设计,例如全额优惠或优惠比例、阶梯优惠、有效期限制等;分发规则:支持日常运营活动、用户生命周期维护、渠道流量转化,为用户群体营销提供基础能力;这里简单介绍的商品和优惠券业务,与支付流程密切相关,比如拆单后库存不足,需要下架商品;支付中优惠券的使用策略、退款处理方式等;4.实践总结最后,从技术实现上总结支付流程中的一些关键问题:业务模型:对业务有清晰的认识,可以拆分核心节点,设计相应的流程时序和数据结构;事务管理:TCC是事务处理过程中常用的Transaction机制,即Try(预处理)、Confirm(确认)、Cancel(取消)模式;加锁重试:支付完成后,发送支付成功消息,然后更新业务,通常需要加锁已处理的订单号,避免消息重试机制带来的数据问题;资金结算:涉及金额的计算自然要求不能有失准。在一次交易中,必须保证每一笔资金都能通过对账验证;流程维护:流程本身很难保证不出错,需要在开发时提供流程的可视化界面,支持人工维护的机制;很多复杂的业务场景管理需要一个长期迭代的过程,但前提需要牢牢把握核心逻辑;对业务的认知是一个由复杂到简单的过程,而对业务的实现则是一个由浅入深的过程,即分析理解,到实施,再到探索创新。5.参考源码编程文档:https://gitee.com/cicadasmile...应用仓库:https://gitee.com/cicadasmile...