文章内容
一、背景
支付系统作为连接消费者、商家(或平台)和金融机构的桥梁,随着市场的发展和技术的进步,一般可以分为以下两个阶段:
- 第一阶段:封闭式支付系统 在这个阶段,支付系统通常是一个封闭的、独立的应用系统,为公司内部的业务提供支付支持。该系统通常和业务紧密耦合,主要目的是为了满足公司内部的支付需求。该系统可能具有一定的自主开发能力,但通常无法提供给公司外部的系统或其他合作伙伴使用。
- 第二阶段:开放式支付系统 在这个阶段,支付系统已经发展成为一个开放的、可扩展的系统,为公司内外部的各种业务提供支付服务。支付服务本身应该是和具体的业务解耦合的,即可以被不同的系统和业务使用。此时,支付系统通常具有更强的自主研发和整合能力,可以调用第三方支付平台接口,记录支付信息,实现金额对账等功能,并为商家提供多样化的支付方式以及风险管理等服务。
1、支付是电商系统中核心
我们先来看一下用户完成一次购物需要进行那些操作:
2、支付系统功能组成
随着互联网和移动设备的普及,越来越多的用户使用手机APP或网站进行在线消费和支付。为了满足用户的支付需求,支付系统应该具备以下功能组成:
- 支付接口 支付接口是支付系统最核心的功能,它通过调用第三方支付平台的API,实现与各大银行或第三方支付机构之间的支付交易。该功能需要具备高可用性和稳定性,以确保支付交易的安全和稳定。
- 订单管理 订单管理功能是支付系统的另一个重要组成部分,它主要负责记录订单信息,包括订单号、交易金额、商品信息等,并且与支付接口进行交互,实现订单支付和退款等功能。
- 账户管理 账户管理功能主要是对用户账户进行管理,包括用户注册、登录、账户安全、账户余额管理等。该功能需要具备安全性和可靠性,以确保用户账户的安全和稳定。
- 风控管理 风控管理是支付系统不可或缺的一个功能,它主要是对支付过程中的风险进行控制和管理。该功能需要具备实时性和准确性,能够识别和防范欺诈、盗刷、非法交易等风险。
- 数据统计和分析 数据统计和分析功能可以对支付系统中的各项业务数据进行统计和分析,包括支付订单数量、支付金额、用户活跃度、商家收益等,为商家和管理者提供决策支持和业务优化建议。
在设计支付系统时,需要考虑的问题包括:支付方式的选择和接入、支付交易的安全和稳定性、系统的可扩展性和可维护性、用户体验的优化等。通过合理的设计和开发,支付系统可以为用户和商家提供快捷、安全、稳定的支付服务,促进电商行业的发展和用户消费的便利化。
二、支付系统的作用
支付系统中的资金流向是支付过程中最为关键的环节之一。从上图中我们可以看出,支付系统在交易过程中扮演着资金流动的中转角色。当用户发起支付行为时,资金从用户端流向支付系统,支付系统再通过与银行或第三方支付机构的接口完成支付交易,并将资金转移至商户账户中。反之,当用户需要退款时,资金则从商户账户流回支付系统,并最终退回至用户账户中。
在整个交易过程中,用户端和支付系统之间是双向资金的流动方式。用户支付成功后,支付系统需要扣除相应金额,并将其暂存于支付系统账户中,等待商户发起结算请求。当商户请求结算时,支付系统负责将代收的资金结算给商户。结算的操作通常可以在线上完成,如采用支付公司代付接口或银企直连口来完成;也可以由公司财务通过线下手工转账的方式来完成。因此,这种资金流动的方式是单向的,即资金从支付系统流向商户。
为了保证资金流动的安全性和稳定性,支付系统需要严格遵守相关的监管规定和安全标准。同时,支付系统需要建立高效的风控机制,及时识别和防范欺诈、盗刷、非法交易等风险。只有通过有效的管理和控制,支付系统才能为用户和商户提供快捷、安全、可靠的支付服务。
真实的资金流由支付公司按照约定期限(通常 T+1 )结算到平台公司对公账户中,然后再由平台公司再按照交易明细进行二次清算后结算给对应的商户。
三、支付系统
一个支付系统需要由哪些功能模块组成
1、完整的支付系统包括的功能
完整的支付系统包括如下功能:
- 应用管理: 同时支持公司多个业务系统对接。
- 商户管理: 支持商户入驻,商户需要向平台方提供相关的资料备案。
- 渠道管理: 支持微信、支付宝、银联、京东支付等多种渠道。
- 账户管理: 渠道账户管理,支持共享账户(个人商户)及自有账户。
- 支付交易: 生成预支付订单、提供退款服务。
- 对账管理: 实现支付系统的交易数据与第三方支付渠道交易明细的自动核对(通常T+1),确保交易数据的准确性和一致性。
- 清算管理: 计算收款交易中商户的应收与支付系统收益。
- 结算管理: 根据清算结果,将资金划拨至商户对应的资金帐户中。
2、核心流程
支付系统通常包含三个关键的核心流程:支付流程、对账流程和结算流程。
支付流程是支付系统最基本的流程,包括用户支付、商户接收支付请求、支付平台进行支付处理、银行处理支付等环节。在该流程中,用户在商城进行选购商品并发起支付请求,商城将支付订单通过B2C网关收款接口传送至支付网关,用户选择网银支付及银行,支付平台将订单转送至指定银行网关界面。用户支付完成,银行处理结果并向平台返回处理结果。支付平台接收处理结果,落地处理并向商户返回结果,商城接收到支付公司返回结果,落地处理(更改订单状态)并通知用户。
对账流程是支付系统的另一个核心流程,主要用于检查支付平台和商户账户之间的交易数据是否一致。在该流程中,支付平台会定期对比商户账户中的收款数据和支付平台自身的交易数据,确保双方的账户信息一致。如果发现数据不一致,则需要进行调账等操作,以保障支付系统的正常运行。
结算流程是支付系统中的最后一个核心流程,用于完成交易款项的清算和结算。在该流程中,商户的可用余额账户和待结算账户是两个重要的账户。商户销售商品后,支付平台会在商户的待结算账户中暂时保留交易款项,待结算周期到期后,将交易款项从待结算账户中结算到商户的可用余额账户中。商户可以在可用余额账户中提现或者用于下一笔交易。同时,支付平台还会根据银行和商户的约定周期进行结算操作,将商户的款项转移到指定的银行账户中,完成结算流程。
以上是支付系统中的三个关键流程,它们紧密相连,共同构成了完整的支付生态系统。
3、支付流程
1)支付流程说明
以下是用户在商城购买商品并完成支付的流程步骤:
- 用户在商城选购商品并发起支付请求;
- 商城将支付订单通过B2C网关收款接口传送至支付网关;
- 支付平台将订单转送至指定银行网关界面;
- 用户选择网银支付及银行,银行处理支付请求并返回处理结果至支付平台;
- 支付平台接收处理结果并落地处理,将支付结果返回给商城;
- 商城接收到支付结果并进行落地处理,例如更改订单状态并通知用户。
此外,为了方便商户管理资金流动,支付系统一般会为商户设置可用余额账户和待结算账户。当系统接收到银行返回的支付成功信息时,会进行落地处理,其中一部分金额会记录在商户的待结算账户中,另一部分金额则会记入商户的可用余额账户中。在结算周期到达时,系统会将待结算账户中的金额转移至可用余额账户中,商户可以随时查询可用余额,并在需要时进行提现或使用余额购买其他商品。
2)退款流程说明
以下是用户在商户平台发起退款申请并完成退款的流程步骤:
- 用户在商户平台发起退款申请,商户核实退款信息及申请;
- 商户登录支付平台账户或通过支付公司提供的退款接口向支付平台发起退款请求;
- 支付系统对退款信息进行校验,包括退款订单对应的原订单是否支付成功、退款金额是否少于等于原订单金额、商户账户余额是否充足等。如果校验不通过,则无法进行退款;
- 如果校验通过,支付系统会在商户可用余额账户中扣除退款金额,并将退款订单发送至银行进行退款操作。注意,对于网关收款的订单退款,不同银行的要求可能不同。有些银行提供的退款接口要求原订单有效期在90或180天,有些银行不提供退款接口。针对超期或者不支持接口退款的订单,支付公司会通过代付通道完成退款操作。
- 对于收单金额未结算,还在“待结算”账户的订单,如果出现退款情况,业务流程和上述流程类似,只是从待结算账户进行扣款。
总之,支付系统会对退款信息进行严格校验,以确保退款操作的准确性和合法性。同时,支付公司会通过不同渠道,包括银行退款接口和代付通道等,为商户提供便捷的退款服务,满足商户和用户的需求。
4、对账流程
对账是指在支付系统中核对不同子系统之间以及与渠道之间的数据记录,以确保数据一致性。对账可以分为两个层面:
- 内部对账:支付系统一般由多个子系统组成,包括交易系统、账户系统、会计系统和风控系统等。这些子系统在处理各自的业务时,可能会出现数据不一致的情况。内部对账就是对这些子系统的数据进行核对和修正,以确保系统内部的数据一致性。
- 外部对账:支付系统需要与多个渠道进行对接,包括第三方支付公司、银行、清算中心、网联、银联等。这些渠道会向支付系统发送代收付业务请求,并返回处理结果。外部对账就是核对支付系统和渠道之间的数据记录,以确保双方的数据一致性。如果发现数据不一致,需要及时处理并纠正。
1)支付系统与渠道间的对账
支付系统与渠道间的对账主要包括两个维度:
- 信息流勾对:也称为业务对账或交易对账,主要是对比支付系统的信息流文件与银行提供的信息流文件,以发现掉单、交易支付金额不一致或支付状态不一致等问题。信息流勾对一般用来恢复掉单数据,并通过补单或者具体系统问题排查解决。
- 资金流勾对:也称为资金对账,主要是对比支付系统的资金流文件与银行提供的资金流文件,以发现支付系统与银行在帐户资金实际发生的变动上存在的差异,如长款和短款等。
在进行对账时,通常需要比对四个文件,即支付系统的信息流文件、支付系统的资金流文件、银行的信息流文件和银行的资金流文件。其中,业务对账就是对比支付系统的信息流文件与银行的信息流文件,资金对账则是对比支付系统的资金流文件与银行的资金流文件。
通过对账,可以及时发现和解决支付系统和银行之间的数据不一致问题,确保双方的数据一致性,保证支付业务的正常进行。
2)核对的差异处理
业务对账是确保支付系统和银行的交易数据一致的重要流程。在信息流勾对中,可能出现支付系统信息流和银行信息流的差异,如支付系统信息流没有,而银行有的差异,可能是由于支付系统交易数据的丢失或银行的掉单。如果是银行的掉单,需要支付公司的运营登录银行网银确认后,做补单处理,并将差异表中该记录核销。另一种差异是支付系统信息流有,而银行没有的差异,这种情况一般不会发生,因为支付系统所有的交易数据都是取银行返回状态的数据。
在资金流勾对中,也可能出现支付系统资金流和银行资金流的差异。例如,支付系统资金流没有,而银行有的差异,可能是由于银行日切晚与支付系统核心账务系统或支付系统账务核心系统与其他系统间的掉单等原因。一旦出现,会出现长款(即银行不应该结算而实际结算)的现象。对于因日切导致的差异,在第二天的对账中系统会对平,其他原因的需要技术排查。另一种差异是支付系统资金流有,而银行没有的差异,可能是因为银行日切早于支付系统的核心账务系统。一旦出现,会出现短款(银行应结算而实际未结算)的现象。银行日切导致的差异,会在下一天与银行的勾对中将此笔差异勾对上。如果是非日切导致的原因,就需要找银行追款了。
因此,业务对账包括信息流对账和资金流对账,支付系统的交易流水与银行的交易流水间核对,保障支付交易完整入账,支付系统的入账流水与银行的结算流水间核对,保障银行入账流水与实际入账资金的匹配。
5、结算流程
支付清结算系统是现代商业运营不可或缺的一部分,它能够通过设定清结算规则自动完成支付清算并帮助财务进行精细化核算,提高财务效率。该系统可以自动对账以确保账务正确,并在出现异常情况时及时定位并处理问题。系统还支持个性化费率配置和账期配置,为商户提供灵活方便的服务。除了支付清结算功能,该系统还能够帮助运营人员处理平台的各类运营工作,提高运营效率。财务人员也能够通过系统协助完成资金对账、会计处理、出入款管理等工作,减少人工处理,提高资金处理效率。开发人员也能够利用系统的灵活便捷配置后台快速调整系统以适应新的业务,并方便进行系统维护。系统提供的资金流转过程中各个环节的数据能够为管理人员提供决策支持,提高决策效率。综合来看,支付清结算系统对于商业运营的高效性和精细化管理具有重要意义。
四、关键表设计
五、支付系统要点
在支付系统中,支付网关和支付渠道模块的对接是非常重要的功能之一。支付网关是提供给外部的接口,所有需要渠道支持的资金操作都需要通过网关分发到对应的渠道模块上。支付渠道模块是接收网关的请求,调用具体的渠道接口执行真正的资金操作。由于每个渠道的接口和传输方式都不尽相同,因此支付网关相当于是一个“包装器”,封装了各个渠道的差异,对外呈现统一的接口。除此之外,支付网关还提供了一些和渠道交互的公共操作。
支付系统对其他系统提供的支付服务包括签约、支付、退款、充值、转账、解约等。有些地方还会提供签约并支付的接口,用于支持在支付过程中绑卡。每个服务的实现流程基本相似,包括下单、取消订单、退单、查单等操作。每个操作实现都包括参数校验、支付路由、生成订单、风险评估、调用渠道服务、更新订单和发送消息这七个步骤。对于一些比较复杂的渠道服务,还会涉及到异步通知处理的步骤。
1、网关前置
支付网关前置是一个模块,其主要任务是为业务系统提供支付服务。作为所有支付服务接口的集成前置,支付网关前置通过统一的方式呈现不同支付渠道提供的接口给业务方,从而为接入方提供便利。支付网关前置的设计对整个支付系统的稳定性、功能、性能以及其他非功能性需求有着直接的影响。
在支付网关前置中,需要完成大量的操作,为了保证性能,这些操作都应该尽量异步化来处理。同时,支付网关前置应该保持稳定,尽量减少系统重启等操作对业务方的影响。当然,支付网关也无法避免升级和重启。为了解决这个问题,我们可以采用基于Nginx的LBS(Load Balance System)网关来实现负载均衡和隔离支付网关重启对调用的影响。
在这个系统中,LBS的作用是多方面的。一方面,它可以实现负载均衡,从而提高系统的稳定性和性能。另一方面,LBS还可以隔离支付网关重启对调用的影响,从而进一步提高系统的可用性。
为了保障接口的安全性,业务方需要通过HTTPS来访问支付网关前置的接口,并提供防篡改机制。在这个系统中,防篡改机制通过接口参数签名来实现。现在主流的签名规范是对接口参数按照参数名称排序后,做加密和散列,参考微信的签名规范。这样可以有效防止接口被攻击,从而保障系统的安全性。
2、参数校验
- 所有的支付操作,都需要对输入执行参数校验,避免接口受到攻击。
- 验证输入参数中各字段的有效性验证,比如用户ID,商户ID,价格,返回地址等参数。
- 验证账户状态。交易主体、交易对手等账户的状态是处于可交易的状态。
- 验证订单:如果涉及到预单,还需要验证订单号的有效性,订单状态是未支付。为了避免用户缓存某个URL地址,还需要校验下单时间和支付时间是否超过预定的间隔。
- 验证签名。签名也是为了防止支付接口被伪造。 一般签名是使用分发给商户的key来对输入参数拼接成的字符串做MD5 Hash或者RSA加密,然后作为一个参数随其他参数一起提交到服务器端。
3、路由选择
根据用户选择的支付方式确定用来完成该操作的合适的支付渠道。用户指定的支付方式不一定是最终的执行支付的渠道。比如用户选择通过工行信用卡来执行支付,但是我们没有实现和工行的对接,而是可以通过第三方支付,比如支付宝、微信支付、易宝支付,或者银联来完成。那如何选择合适的支付渠道,就通过支付路由来实现。支付路由会综合考虑收费、渠道的可用性等因素来选择最优方案
4、风险评估
检查本次交易是否有风险。风控接口返回三种结果:阻断交易、增强验证和放行交易。
- 阻断交易,说明该交易是高风险的,需要终止,不执行第5个步骤;
- 增强验证,说明该交易有一定的风险,需要确认下是不是用户本人在操作。这可以通过发送短信验证码或者其他可以验证用户身份的方式来做校验,验证通过后,可以继续执行该交易。
- 放行交易,即本次交易是安全的,可以继续往下走。
5、发送消息
通过消息来通知相关系统关于订单的变更。风控,信用BI等,都需要依赖这数据做准实时计算。
6、更新订单
在支付系统中,支付结果分为同步返回和异步返回两种情况。对于同步返回的结果,支付系统需要在主线程中接收并处理结果,将订单状态更新为支付成功或支付失败。通常,在接收到同步返回结果后,支付系统会立即处理订单,并在支付页面中展示相应的支付结果。
对于异步返回的结果,支付系统需要在异步通知程序中接收并处理结果。一般来说,异步通知是通过消息队列实现的,可以保证消息的可靠性和顺序性。异步通知程序会接收到支付结果,并根据结果更新订单状态,标记是支付成功还是失败。如果是支付成功,还需要进行相应的账户资金扣减和库存扣减等操作。
需要注意的是,对于异步返回的结果,由于时间上的不确定性,可能存在多次异步通知的情况。支付系统需要保证对同一笔订单,只有一次支付结果被处理,避免出现重复扣款等问题。为此,可以在订单记录中添加唯一标识,或者采用分布式锁等机制来保证订单的幂等性。
7、异步通知
在支付系统中,调用远程接口是非常常见的操作。但是,由于远程接口的延迟不可控,如果调用方一直阻塞等待,很容易超时,影响系统的性能。为了避免这种情况,需要引入异步通知机制,让调用方在主线程中尽快返回,通过异步线程来得到支付结果。同时,对于通过异步来获取支付结果的渠道接口,也需要在异步通知中将结果返回给调用方。
在异步通知中,调用方需要提供一个回调地址,一般以http或https的方式。这样就存在技术风险,如果调用失败,还需要重试。但是,重试不能过于频繁,需要逐步拉大每一次重试的时间间隔,以免对系统造成太大的负担。
在异步处理程序中,订单根据处理结果变更状态后,也需要发消息通知相关系统。这样可以保持系统中各个模块之间的状态一致性,并及时更新相关数据。同时,为了保证异步通知的可靠性,需要采用消息队列的方式进行处理,保证消息的可靠性和顺序性。在实现时,可以使用分布式锁等机制来保证消息的顺序性,避免消息丢失和重复。
8、生成交易订单
在一个高并发的系统中,订单信息的持久化是一个非常关键的环节。通常情况下,我们会将订单信息保存到数据库中,以便后续的查询和统计。但是,在访问压力大的情况下,数据库的写入操作会成为一个瓶颈,影响整个系统的性能。
为了解决这个问题,可以采用多种方法来提高数据库写入的性能。一种常见的方法是采用数据库连接池来管理数据库连接,以避免频繁地打开和关闭数据库连接。此外,可以将订单信息的持久化操作异步化,通过消息队列将订单信息发送到后台处理。这样可以避免前端线程被阻塞,提高系统的并发处理能力。
另外,还可以采用缓存来提高数据库写入性能。将订单信息保存到缓存中,并设置过期时间,可以避免频繁地读写数据库。当有查询请求时,可以首先从缓存中获取订单信息,如果缓存中不存在,则从数据库中读取,并将读取到的订单信息保存到缓存中,以便后续的查询和统计。
最后,还可以考虑采用分库分表的策略,将订单信息分散到多个数据库中,以提高数据库写入的并发处理能力。这种方法需要考虑数据库之间的数据同步和一致性问题,但可以有效地提高系统的整体性能。
9、交易流水和记账
这段文本描述了一个支付系统的数据处理架构。在这个系统中,每一笔交易都需要记录流水,并登记到个人和机构的分户账户上,同时也需要统计和分析数据。为了提高性能,采用了消息机制来异步化和交易相关的数据处理。
在主流程中,只记录交易流水,将当前的请求保存到数据库中。完成数据记录后,发送MQ消息,让后续的记账、统计和分析等操作在接收MQ消息后完成数据处理。对于涉及到本地资金支付的操作,需要采用分布式事务处理,以确保扣减账户余额、记账和扣减库存等操作能够在一个原子性的事务中完成,以避免出现数据不一致的情况。
当交易量增加时,需要考虑对交易表进行分表分库操作。分表分库有两种策略,可以按照流水号或者交易主体ID来走。采用后者可以支持按用户来获取交易记录,而采用前者可以提高性能。同时,还需要考虑将风控、信用和统计所需的数据通过MQ同步到历史库中,以便存储和查询。最后,对于支付系统最有价值的数据,可以采用专库专用的存储策略,以确保数据的安全和稳定性。
10、支付路由
支付路由对于支付系统来说是一个非常重要和复杂的话题。一方面,支付系统需要支持尽可能多的支付方式,以保证能够满足用户的各种支付需求,而不能因为支付方式的不支持而影响到财务收益。另一方面,支付系统也需要考虑支付方式的使用情况和用户数量,有针对性地开发和对接支付渠道,以降低成本并提高用户体验。
实际中,支付方式的种类非常多,用户可能会使用各种各样的银行卡、第三方支付、移动支付等,对于支付系统来说,需要进行全面的调研和分析,确定要支持的支付方式,并且根据用户群体和地域特点,灵活地对接和使用这些支付渠道。
对于银行卡支付,一些交易量较小的银行卡可以选择不对接,而对于交易量较大的银行卡,则需要考虑与银行直接联通,以提高交易效率和降低成本。
对于第三方支付,不同的支付机构可能具有不同的特点和优势,需要进行综合评估和选择,以确保在保证用户体验和安全性的前提下,尽可能降低成本。
在选择支付渠道时,还需要考虑支付渠道的稳定性和安全性,以及与支付渠道的合作关系和风险控制策略,以保证支付系统的可靠性和稳定性。
综上所述,支付路由对于支付系统来说是一个非常复杂和关键的话题,需要全面考虑支付方式的种类、使用情况和特点,灵活选择和对接支付渠道,以保证支付系统的顺畅运作和长期发展。
11、渠道接入
在考虑接入哪些支付渠道时,需要综合考虑以下因素:
- 渠道的普及程度和覆盖范围:首先需要选择被广泛接受和使用的支付渠道,以保证支付的便捷性和用户体验。同时也要考虑渠道的覆盖范围,确保支付渠道可以覆盖到需要服务的用户群体。
- 渠道的稳定性和安全性:支付渠道的稳定性和安全性是非常重要的,必须确保所接入的渠道在支付过程中能够保证数据的安全性和交易的稳定性。
- 渠道的手续费和成本:在选择支付渠道时,还需要考虑渠道的手续费和成本,以确保在支付过程中能够控制成本,并在可接受的范围内为用户提供优质的支付服务。
综合考虑以上因素,可以将支付渠道按优先级排序,以便在设计支付系统时进行决策。常见的支付渠道按照优先级排序如下:
- 银行卡支付:银行卡支付是一种被广泛使用的支付方式,具有广泛的普及程度和覆盖范围,同时也有较高的安全性和稳定性。
- 第三方支付:第三方支付机构具有灵活的支付方式和较低的手续费用,被越来越多的用户所接受,但安全性和稳定性方面需要更加谨慎考虑。
- 移动支付:移动支付由于便捷性和灵活性而受到越来越多用户的青睐,但需要注意支付安全和稳定性的问题。
- 网络银行支付:网络银行支付具有高度的安全性和稳定性,但普及程度和覆盖范围相对较低。
需要注意的是,不同行业和不同地区的支付渠道偏好可能存在差异,因此在进行具体设计时需要结合实际情况进行权衡和决策。
六、总结
支付系统是一个非常复杂的系统,它涉及到众多的业务流程和技术细节。这些流程和细节的变化是不断的,而系统的稳定性和可靠性也是至关重要的。
为了确保支付系统的正常运行,我们需要对其进行监控。这包括业务监控、渠道监控、商户监控和账户监控等方面。通过对这些方面的监控,我们可以及时发现并解决问题,确保系统的正常运行。
然而,支付系统的架构并不是静态的,而是需要不断演化的。随着业务和技术的发展,支付系统的架构也需要不断地进行更新和优化。因此,在设计支付系统的时候,我们需要考虑演化式思维,不断借助反馈和进化的力量推动架构的持续演进。
最终,只有具备持续演进的能力的支付系统,才能适应环境的变化,保持稳定和可靠,并为用户提供优质的支付体验。