其他分享
首页 > 其他分享> > 支付系统设计

支付系统设计

作者:互联网

背景

  最近在研究一套支付系统,因此借鉴资源,对于支付系统设计做此纪录。

概述

  支付系统是连接消费者、商家(或平台)和金融机构的桥梁,管理支付数据,调用第三方支付平台接口,记录支付信息(对应订单号,支付金额等),金额对账等功能,根据不同公司对于支付业务的定位不同大概有几个阶段:


1.支付是电商系统中核心

我们先来看一下用户完成一次购物需要进行那些操作:

  通常消费者在手机APP或者网站都会涉及到支付相关的业务场景,用户只需要简单点击支付按钮输入支付密码,就可以完成整个支付过程,那么我就和大家一起来看看一个完整的支付系统有什么功能组成和设计时需要考虑那些问题。

从上图中我们可以看出真实的资金流向。首先当用户产生支付行为时,资金从用户端流向支付系统,退款时则相反,从支付系统回流至用户端。因此在整个交易过程中用户端与支付系统是双向资金的流动方式。对于支付系统而言,资金有进有出。从支付系统到商户端就比较简单了,在清算完成后支付系统负责将代收的资金结算给商户,通常结算的操作可以在线上来完成(采用支付公司代付接口或者银企直连接口来完成),也可以由公司财务通过线下手工转账的方式来完成,因此这种资金流动的方式是单向的。出于资金安全考虑,大多数公司通常这部分采用线下方式实现。

真实的资金流由支付公司按照约定期限(通常 T+1 )结算到平台公司对公账户中,然后再由平台公司再按照交易明细进行二次清算后结算给对应的商户。

    1.  应用管理: 同时支持公司多个业务系统对接。

    2.  商户管理: 支持商户入驻,商户需要向平台方提供相关的资料备案。

    3.  渠道管理: 支持微信、支付宝、银联、京东支付等多种渠道。

    4.  账户管理: 渠道账户管理,支持共享账户(个人商户)及自有账户。

    5.  支付交易: 生成预支付订单、提供退款服务。

    6.  对账管理: 实现支付系统的交易数据与第三方支付渠道交易明细的自动核对(通常T+1),确保交易数据的准确性和一致性。

    7.  清算管理: 计算收款交易中商户的应收与支付系统收益。

    8. 结算管理: 根据清算结果,将资金划拨至商户对应的资金帐户中。

2.核心流程

  支付系统有几个关键的核心流程:支付流程、对账流程、结算流程

2.1 支付流程

    1.  用户在商城选购商品并发起支付请求;

    2.  商城将支付订单通过B2C网关收款接口传送至支付网关;

    3.  用户选择网银支付及银行,支付平台将订单转送至指定银行网关界面;

    4.  用户支付完成,银行处理结果并向平台返回处理结果;

    5.  支付平台接收处理结果,落地处理并向商户返回结果;

    6.  商城接收到支付公司返回结果,落地处理(更改订单状态)并通知用户。

  一般而言支付系统会给商户设置有“可用余额”账户、“待结算”账户;系统在接收到银行返回支付成功信息会进行落地处理,一方面更改对应订单状态,另一方面在商户待结算账户记入一笔金额;该笔金额,系统会根据结算周期从待结算账户--->“可用余额”账户。

    1.  用户在商户平台发起退款申请,商户核实退款信息及申请;

    2.  商户登录支付平台账户/或者通过支付公司提供的退款接口向支付平台发起退款;

    3.  支付系统会对退款信息校验(退款订单对应的原订单是否支付成功?退款金额是否少于等于原订单金额?),校验商户账户余额是否充足等;校验不通过,则无法退款;

    4.  支付系统在商户可用余额账户扣除金额,并将退款订单发送至银行,银行完成退款操作。注意:对于网关收款的订单退款,各银行要求不一,有些银行提供的退款接口要求原订单有效期在90或180天,有些银行不提供退款接口;针对超期或者不支持接口退款的订单,支付公司通过代付通道完成退款操作。

  对于收单金额未结算,还在“待结算”账户的订单,如果出现退款情况,业务流程和上述流程差不多,只是从待结算账户进行扣款。


 2.2 对账流程

* 说明

对账,我们一般称为勾兑,支付系统的对账,包含着两个层面:

  1. 支付系统内部间的对账,支付系统一般是分布式的,整个支付系统被拆分成了多个子系统,如交易系统、账户系统、会计系统、账户系统,每个子系统在处理各自的业务,系统间的对账,就是以上系统的核对,用于修正内部系统的数据不一致。

  2. 支付系统与渠道的对账,这里的渠道泛指所有为支付系统提供代收付业务的渠道,如:第三方支付公司、银行、清算中心、网联、银联等。

 * 支付系统与渠道间的对账

系统间的对账比较好理解,这里主要讲支付系统与渠道间的对账。支付系统与渠道间的对账,又包含2个维度:

  1. 信息流勾对:即业务对账/交易对账,主要是就收单交易的支付信息与银行提供的信息流文件进行勾兑。信息流的勾地能发现支付系统与银行系统间的掉单、两边由于系统间的原因导致的同一笔交易支付金额不一致(可能性很小)或者支付状态不一致。信息流勾兑一般用来恢复掉单数据,可通过补单或者具体系统问题排查解决。

  2. 资金流勾对:即资金对账,主要就收单交易的支付信息与银行提供的资金流信息进行勾兑。资金流的勾兑能发现支付系统在银行的帐户资金实际发生的变动与应该发生的变动的差异,比如长款(银行多结算给支付系统)和短款(银行少结算给支付系统)。

  说了这么多,就出现来4个对账文件,支付系统信息流文件、支付系统资金流文件、银行信息流文件、银行资金流文件。业务对账(勾兑)就是支付系统的信息流文件与银行的信息流文件勾兑,资金对账即支付系统的资金流文件与银行的资金流文件勾兑。

 * 核对的差异处理

1、信息流勾对的差异处理

2、资金流勾对对差异处理

总结就是,业务对账,即信息流对账,支付系统的交易流水与银行的交易流水间核对,保障支付交易完整入账。资金对账,即资金流对账,支付系统的入账流水与银行的结算流水间核对,保障银行入账流水与实际入账资金的匹配。


 2.3 结算流程

  在清结算部分,系统按照设定好的清结算规则自动将钱款结算给商户。完善的运营会计体系帮助财务进行精细化核算,提高财务效率。与支付渠道自动进行对账,确保账务正确,在异常情况下能及时定位问题并处理。系统更是能对商户进行个性化的费率配置或账期配置,方便灵活。系统的价值不仅体现在支付清结算方面,同时更是提升了运营管理效率。支付清结算系统可以有效帮助运营、财务、开发以及管理人员。对于运营人员,系统可帮助处理平台的运营工作,包括各类支付管理,商户、会员管理,营销活动的数据统计等,全面提高运营效率。针对财务人员,可以协助完成资金对账、会计处理,出入款管理,账务差错处理等,大部分工作由系统自动处理,减少人工处理,提高资金处理效率。一套灵活便捷的配置后台供开发人员快速调整系统以适应新的业务,并能方便对系统进行维护,如渠道接入、费率配置、账期调整等,提高开发效率。系统提供资金流转过程中各个环节的数据,能够从各个维度进行核算和分析,形成对管理人员的决策支持,从而提高决策效率。

  在支付系统中,支付网关和支付渠道的对接是最繁琐重要的功能之一,其中支付网关是对外提供服务的接口,所有需要渠道支持的资金操作都需要通过网关分发到对应的渠道模块上。一旦定型,后续就很少,也很难调整。而支付渠道模块是接收网关的请求,调用渠道接口执行真正的资金操作。每个渠道的接口,传输方式都不尽相同,所以在这里,支付网关相对于支付渠道模块的作用,类似设计模式中的wrapper,封装各个渠道的差异,对网关呈现统一的接口。而网关的功能是为业务提供通用接口,一些和渠道交互的公共操作,也会放置到网关中。

  支付系统对其他系统,特别是交易系统,提供的支付服务包括签约,支付,退款,充值,转帐,解约等。有些地方还会额外提供签约并支付的接口,用于支持在支付过程中绑卡。 每个服务实现的流程也是基本类似,包括下单,取消订单,退单,查单等操作。每个操作实现,都包括参数校验,支付路由,生成订单,风险评估,调用渠道服务,更新订单和发送消息这7步,对于一些比较复杂的渠道服务,还会涉及到异步同通知处理的步骤。

01 网关前置

  支付网关前置是对接业务系统,为其提供支付服务的模块。它是所有支付服务接口的集成前置,将不同支付渠道提供的接口通过统一的方式呈现给业务方。这样接入方就只需要对接支付网关,增加和调整支付渠道对业务方是透明的。 支付网关前置的设计对整个支付系统的稳定性、功能、性能以及其他非功能性需求有着直接的影响。

在支付网关中需要完成大量的操作,为了保证性能,这些操作都尽量异步化来处理。支付网关前置应保持稳定,尽量减少系统重启等操作对业务方的影响。支付网关也避免不了升级和重启。这可通过基于Nginx的LBS(Load Balance System)网关来解决。LBS在这里有两个作用: 一个是实现负载均衡,一个是隔离支付网关重启对调用的影响。 支付网关也采用多台机器分布式部署,重启时,每个服务器逐个启动。某台服务器重启时,首先从LBS系统中取消注册,重启完成后,再重新注册到LBS上。这个过程对调用方是无感知的。

为了避免接口受攻击,在安全上,还得要求业务方通过HTTPS来访问接口,并提供防篡改机制。防篡改则通过接口参数签名来处理。现在主流的签名是对接口参数按照参数名称排序后,做加密和散列,参考微信的签名规范。

02 参数校验

03 路由选择

  根据用户选择的支付方式确定用来完成该操作的合适的支付渠道。用户指定的支付方式不一定是最终的执行支付的渠道。比如用户选择通过工行信用卡来执行支付,但是我们没有实现和工行的对接,而是可以通过第三方支付,比如支付宝、微信支付、易宝支付,或者银联来完成。那如何选择合适的支付渠道,就通过支付路由来实现。支付路由会综合考虑收费、渠道的可用性等因素来选择最优方案

04 风险评估

检查本次交易是否有风险。风控接口返回三种结果:阻断交易、增强验证和放行交易。

05 发送消息

通过消息来通知相关系统关于订单的变更。风控,信用BI等,都需要依赖这数据做准实时计算。

06 更新订单

对于同步返回的结果,需要在主线程中更新订单的状态,标记是支付成功还是失败。对于异步返回的渠道,需要在异步程序中处理。

07 异步通知

其中涉及到调用远程接口,其延迟不可控。如果调用方一直阻塞等待,很容易超时。引入异步通知机制,可以让调用方在主线程中尽快返回,通过异步线程来得到支付结果。对于通过异步来获取支付结果的渠道接口,也需要对应的在异步通知中将结果返回给调用方。 异步通知需要调用方提供一个回调地址,一般以http或者https的方式。这就有技术风险,如果调用失败,还需要重试。而重试不能过于频繁,需要逐步拉大每一次重试的时间间隔。 在异步处理程序中,订单根据处理结果变更状态后,也要发消息通知相关系统。

08 生成交易订单

将订单信息持久化到数据库中。当访问压力大的时候,数据库写入会成为一个瓶颈。

09 交易流水和记账

每一笔交易都需要记录流水,并登记到个人和机构的分户账户上,统计和分析也需要根据交易流水来更新相关数据。 而个人和机构账户总额更新、交易流水记录以及库存的处理,更是需要事务处理机制的支持。 从性能角度, 可以弱化了事务处理的要求,采用消息机制来异步化和交易相关的数据处理。

10 支付路由

支付路由是一个复杂的话题。对支付系统来说,能支持的支付方式越多越好,不能由于支付方式的不支持断了财路。现实中的支付方式多得难以置信。用户随时甩出一张你听都没听说过的卡。如果一个银行卡只有几个用户在用,那针对这个卡开发个对接有点得不尝失。现在第三方支付的爆发,确实给开发支付系统省了不少事。但是公司不可能只对接一个第三方支付,如果这个渠道出问题了,或者闹矛盾了,把链接给掐了,老板还不欲哭无泪。总之,得对接多个渠道。对于交易量大的银行,还得考虑直联。

11 渠道接入

对于支付渠道,首先考虑的是接入哪些渠道。要对接的渠道按优先级有:


 总结

  支付系统是一个繁杂的系统,其中涉及了各种错综复杂的业务流程,以上只是简单介绍了支付系统我们能看见的一些问题和设计,还有后续的系统保障没有写出来,没写出来的才是关键部分,比如:支付系统监控(业务监控分类、渠道监控、商户监控、账户监控)文章只是引子, 架构不是静态的,而是动态演化的。只有能够不断应对环境变化的系统,才是有生命力的系统。所以即使你掌握了以上所有的业务细节,仍然需要演化式思维,在设计的同时,借助反馈和进化的力量推动架构的持续演进。


转载:https://www.cnblogs.com/veblen/p/10992167.html

标签:网关,银行,系统,对账,渠道,支付,设计
来源: https://www.cnblogs.com/lwcode6/p/12093510.html