0%

电商域 支付清结算系统 账务系统

C 端消费者购买商品进行支付,付款的金额会通过三方支付机构送达银联或网联,银联或网联转发扣款指令到付款银行卡的发卡行来扣除付款人的付款资金。清算机构会在 T+1 日把支付的金额结算给支付机构,支付机构再把资金结算给售卖商品的商户。结算资金给商户就涉及结算的资金是多少,结算的资金对应的支付订单是哪些,这些问题可以通过账务系统来统一处理。账务系统最核心的功能是记账,商户通过三方支付机构交易的每一笔订单都可以通过账务系统进行登记入账,账务系统给商户开设一个虚拟的账户,每一笔支付、退款订单都通过账务系统进行记录,清结算系统每天会发起清分,计算当天需要结算给商户的资金,并计入商户的余额账户,然后通过结算任务把余额账户的资金结算到商户的银行卡中。

账户体系

要厘清支付机构的账务系统,首先要梳理清楚支付机构的账户体系。支付机构的账户按照服务的对象可以分为 B 端账户和 C 端账户,B 端账户是针对支付机构服务的商户开设的账户,C 端账户是针对 C 端消费者开设的账户,B 端账户的作用主要是在给商户结算资金的时候根据账户余额判断结算给商户的余额有多少。C 端账户是针对储值、预付卡等应用场景开设的账户,用来存储 C 端消费者在该支付机构体系下可以支配的资金。根据是否需要结算把账户分为内部户、外部户,内部户是支付机构内部用于资金过渡的账户,外部户是开设给 B 端商户的资金账户。另外,支付机构在央行需要开设备付金账户,所有的资金都要进入备付金账户,结算的时候也是通过备付金账户进行实际资金的划拨。这样能防止支付机构“跑路”,给消费者和商户造成不必要的损失。下面逐一介绍这些账户。

B 端账户

B 端账户是针对支付机构服务的商户开设的账户,商户入驻支付机构的时候,支付机构会给商户开设对应的账户,在清结算的时候根据账户的资金进行结算。

B 端账户可以分为清算账户、结算账户、营销账户、保证金账户、跨境余额账户等,根据提供的业务不同,给商户开设的账户类型也不通,并且不限于这几种账户,每种账户都有不同的职责。

  1. 清算账户

    支付机构在每天的凌晨会通过定时任务发起清算,统一汇总当天的支付交易和退款交易,通过清算任务计算出清算金额并落入清算账户。比如一个商户有两笔 100 元的支付单和一笔 100 元的退款单,那么通过清算任务最终落入清算账户的资金是 100 元。账务系统会把清算流水落库,以便后续查询。

  2. 结算账户

    清算任务完成之后,就可以进行结算任务,通常结算任务会在 T+1 日进行,将 T 日的资金结算给商户。结算之前需要计算支付机构应该收取的手续费,比如清算账户的资金是 100 元,手续费率是 0.6%,那么会在结算的时候调用计费系统扣除 0.6 元手续费,然后把剩余的 99.4 元结算到商户的结算账户中。

  3. 营销账户

    做生意都会有一些营销活动,比如好评有礼活动,C 端消费者对于购买的商品给了好评后,商户会返相应的资金到 C 端消费者的余额中,或者通过微信红包的形式返回给C端消费者。因为商户的账户中需要先储备营销资金才可以发放给 C 端消费者,所以可以给商户开设营销账户,如果有营销的需求,则可以在该账户中充值,然后通过支付机构发放给对应的 C 端消费者,

  4. 保证金账户

    有些平台公司和 SaaS 公司不仅给商户提供了软件服务的功能,还会提供支付功能,比如淘宝。商户在这样的平台上做生意,平台会承担一部分责任,如果商户“跑路”,没有给消费者提供对应的商品,则会给消费者造成资金的损失,所以可以给商户开设一个保证金账户,让商户缴纳一定的保证金,这样能在一定程度上降低风险。

  5. 跨境余额账户

    随着互联网的发展,海外商品慢慢进入大众的视野,跨境电商也慢慢崛起,购买跨境商品就涉及跨境支付。商户开设跨境业务的时候,三方支付机构需要给商户开设跨境账户,跨境账户的资金通过跨境结算系统结算到商户的银行账户中。

C 端账户

我们到理发店理发,经常会遇到理发师推销会员卡的情况,并且根据会员卡金额的不同,享受不同的折扣。在理发店办理会员卡就是一种储值行为,理发店的后台需要给客户开设账户,记录每次消费的金额和余额。支付机构针对 C 端的账户类似理发店储值账户,不同点在于支付机构做这样的业务需要申请对应的预付卡支付牌照,而 C 端消费者充值之后可以在多个商户的店铺使用。支付机构申请到预付卡支付牌照之后可以根据不同的业务类型设置不同的账户类型,常用的账户类型有储值账户、礼品卡账户等。

如果 C 端消费者有对应的储值账户,那么在支付的时候,支付方式列表需要展示余额支付或者礼品卡支付。消费者选择使用余额支付,C 端消费者的账户余额需要出账对应的资金,然后商户的结算账户会入账对应的资金。

从会计学上来讲,账户是根据会计科目设置的,具有一定格式和结构,用于分类反馈会计要素及其结果的载体。设置账户是会计核算的重要方法之一。同会计科目分类相对应,账户按其提供的信息详细程度和统驭关系不同分为总账账户和明细账户。

会计要素主要有6个方面:资产、负债、所有者权益、利润、费用、收入。会计账户按照账户反映的经济内容不同可分为资产类账户、负债类账户、所有者权益类账户、成本费用类账户和损益类账户。

账户是有结构和内容的,账户分为左方、右方两个方向,一个方向登记增加,另一方向登记减少。账户的内容包括账户的名称、记录经济业务的日期、所依据记账凭证的编号、经济金务摘要、借贷金额和余额等。从账户的结构和内容的角度分析,一个账户需要记录账户变动的过程等,即借方和贷方均需要进行记录,这里一般是通过账户流水来实现的,即出入流水。同时,账户记录了会计要素的变动结果,因此需要记录变动的最终结果,即账户的余额。

在账户的核算中,包括账户名称、借方、贷方、发生额、借贷方余额和账户余额等。

账户的内部对账:在一个指定的核算周期内,保证余额和流水的一致性。

账户的外部对账:保证账户操作的流水与外部系统相关依赖流水的一致性。

借贷复试记账法

所谓复试记账法就是针对发生的每项经济业务都要以相等金额在相互联系的两个或者两个以上有关账户中进行同时登记的记账方法。而借贷复试记账法是复试记账法的一种,它是以“资产=负债+所有者权益”为依据,以“借”和“贷”为记账符号,以“有借必有贷,借贷必须相等”为记账规则的一种复试记账方法。

借贷记账法的记账符号就是“借”和“贷”,用来反映经济业务变化的方向,本身没有特别的意义。在实际的操作中,我们把账户的左方规定记为借方,把右方规定记为贷方,在任何一笔经济业务中,必须同时登记相关账户的借方和贷方。每个账户都有借方和贷方,用来记录其对应经济业务的变化情况。哪一方登记增加,哪一方登记减少,要根据对应账户的经济性质决定,即账户相对会计主体来说,是属于什么类型的账户。常用的账户有资产类账户、负债类账户、所有者权益类账户、费用成本类账户和收入类账户。

  1. 资产类账户

    资产类账户:资产的增加登记在账户的借方,资产的减少登记在账户的贷方,期末有余额,一般出现在借方。在一个会计期间,所有借方金额的累加为“借方本期发生额”,所有贷方金额的累加为“贷方本期发生额”。而资产账户的余额=借方期初余额 + 借方本期发生额 - 贷方本期发生额。

    例如,某人在工商银行账户A中存入100元,该如何记账呢?首先,我们要分析此人在工行的这个账户的性质。由于这是此人存储在工行的一笔资产,所以该账户对应的这个会计主体来说,是一个资产类账户,因此记账的借贷方向需要按照资产类账户的要求来进行记账,即增加记为借,减少记为贷。根据分析,此人存入100元到账户A中,记账如下:

    • 借:银行存款为100元(资产类账户,银行账户中增加了100元)。

    • 贷:库存现金为100元(资产类账户,此人持有的现金减少了100元)。

  2. 负债类账户

负债类账户的记账规则与资产类账户相反,负债增加记为贷,负债减少记为借,期末如有余额,则一般出现在贷方。负债类账户的余额计算方式:贷方期末余额 = 贷方期初余额 + 贷方本期发生额 - 借方本期发生额

  1. 所有者权益类账户

所有者权益类账户的记账规则跟负债类账户一致:所有者权益增加记为贷,减少记为借。

  1. 费用成本类账户

企业在日常经营活动中会产生各种各样的耗费,这些耗费在会计学上称为成本费用,它们是收入的抵减项目,在抵销收入之前,可以视为一种资产,因此成本费用类账户的记账规则与资产类账户一样:增加记为借,减少或者转销记为贷。一般借方记录的增加额都要通过贷方转出,所有此类账户在期末转销后无余额,如有余额,则出现在借方。

  1. 收入类账户

    企业取得的收入最终使得所有者权益增加,因此收入类账户的记账方法与所有者权益账户一致:增加记为贷,减少记为借。通常该账户期末无余额(因为期末收入都会转为所有权益账户如未分配利润等)。

一个账户的增加或者减少记为借还是记为贷,是与该账户反映的经济内容有关的,而不是简单的增加就一定是借,减少就一定是贷,在实际的记账处理中,我们首先需要根据会而不是对记账的账户的经济性质进行分析,然后按照不同账户的记账规则进行处理即可。

备付金账户

备付金

央行给出的关于客户备付金的定义:客户备付金是指支付机构办理客户委托的支付业务时,实际收到的预收待付货币资金。通俗地说就是用户个人账户余额,这个余额不仅狭义包含我们在钱包中看到的零钱余额,还包括例如网购未确认收款前,由于存在结算周期的时间差,托管给三方的商品金额等。这些充值后未进行交易的资金都被沉淀在支付机构账户内。

那么支付机构可以随意支配这些资金吗?

显然是不可以的,在《中国人民银行办公厅文件(银办发【2018】114号)》(以下简称114号文件)发布之前,还未集中存交的这笔资金的利息都归三方支付机构所有,但只能进行银行存款或者基金购买,不能用于放贷等高风险投资。并且只能通过备付金存管银行办理客户委托的跨行付款业务,以及调整不同备付金合作银行的备付金银行账户头寸(头寸是款项的意思)。不同支付机构的备付金银行之间不能办理客户备付金的划转。

什么是“114号文件”

2018年6月29日,中国人民银行网站发布了《中国人民银行办公厅关于支付机构客户备付金全部集中交存有关事宜的通知》,规定自2018年7月9日起,按月逐步提高支付机构客户备付金集中交存比例,到2019年1月14日实现100%集中交存。这就是著名的“114号文件”。

备付金如何管理

支付机构的备付金管理由备付金存管银行和备付金合作银行负责。

备付金存管银行是指可以为支付机构办理客户备付金的跨行收付业务,并且负责对支付机构存放在备付金银行的客户备付金信息进行归集、监督、核对的备付金银行。

备付金合作银行是指能够为支付机构办理客户备付金的收取和本银行支取业务,并且负责对支付机构存放在本银行的客户备付金进行监督的备付金银行。

三方支付机构、备付金存管银行、备付金合作银行之间的关系如下图所示。

三方支付机构需要在中国人民银行开设对应的备付金专用存款账户,即备付金集中存管账户,备付金集中存管账户根据用途和合作银行的不同分为三类:备付金存管账户、备付金收付账户和备付金汇缴账户。

备付金存管账户由备付金存管银行管理,具备本行和跨行收付款、调整备付金账户头寸、结转手续费等功能。值得注意的是,支付机构在同一个省只能开设一个备付金存管账户。

备付金收付账户由备付金合作银行开设并管理,具备本行的付款功能,跨行仅能转账到备付金存管账户做资金归集。

备付金汇缴账户在备付金存管银行和备付金合作银行都可以开设,支持本行收款和原路退回业务,资金日终清零,归集到备付金存管账户或收付账户。

备付金三类账户之间的关系如下图所示。

系统设计

账户系统除了备付金账户以外,其他账户都需要账务系统进行管理。

账务架构

账务系统最核心的功能就是管理账户余额,账户余额的变更是根据业务来确定的,这里的账务记账与会计是分开的,只是针对账户的管理,以及商户账户资金的管理。架构如下:

  1. API 接口层

    账务系统是支付体系里底层的系统,不会有支付以外的系统和账务系统进行交互,账务系统提供的接口也是给内部支付业务系统使用的,主要给支付核心、结算系统、风控系统等提供 API 接口,针对支付核心提供支付、退款等接口,针对结算系统提供结算接口,针对风控系统提供冻结、解冻等接口,通过这些上游系统一起对账户进行操作,实现记账、结算资金等功能。

  2. 业务处理层

    要对商户的资金做好管理,首先要管理好商户的账户,商户入驻时支付机构需要给商户开通账户,在账务系统中就要创建对应的账户,商户停止使用支付机构的支付功能时,需要把账户设置为不可用,即对账户的状态要具备管理的能力。账户状态通常有初始化、使用中、已停用、冻结等状态。账户的信息也要支持上游查询。

    商户对应的账户是用来记账的,记账分为入账和出账,商户售卖一个商品,收到一笔支付单,账户里就需要有一笔入账,消费者做了退款操作,账户里就需要有一笔出账,账务系统需要定义好入账和出账的逻辑。支付机构需要有反洗钱、反欺诈系统,能够及时检测到商户及C端消费者交易的异常,如果商户存在电信欺诈、洗钱等风险,则需要及时冻结商户余额,避免给社会造成损失,所以账务系统提供了冻结与解冻账户的功能。

    商户的资金余额是怎么来的呢?这要有对应的明细,可以在支付核心查询到支付、退款单相关的明细,但是手续费的收取明细需要在账务侧来查看,所以账务系统要提供针对账户操作的明细订单,供商户用来对账。

  3. 会计处理层

    一般三方支付机构会单独搭建会计系统来管理公司的会计科目、借贷关系、会计分录等内容,账务系统做好记账之后会把信息透传给会计系统,会计系统需要提前配置好会计科目,然后根据借贷关系进行登账。

热点账户问题

支付、退款等操作都会改变商户的余额账户,针对账户资金的操作都需要加锁、解锁,以此来保证资金的安全。如果商户交易非常频繁,就会出现频繁地进行资金进出的操作,商户对应的账户频繁地出现加锁与解锁,如果商户做活动,QPS 达到万级,对数据库来说,基本无法承受。

解决热点问题可以从两个途径考虑,一是通过业务的手段,二是通过技术的手段。业务的手段通常有两种方式可以作为参考。

1. 汇总入账

当天的交易可以先入数据库,不做入账处理,T+1 日把 T 日所有的交易做好汇总轧差,然后统一入账。

优点:一次性入账,数据库无压力
缺点:商户账户资金不能实时入账,对商户有一定的对账成本

2. 缓冲记账

缓冲记账的处理逻辑是收到记账请求后会先返回受理结果,再处理实际业务逻辑,将实时同步的记账行为进行异步化,从而达到记账实时性和系统稳定性平衡的目的,在一定程度上解决了汇总入账时效差的问题。账务系统收到入账请求后,会先入库,不做任何业务处理,然后直接返回上游受理成功,再使用专门的线程来处理入库后的数据并进行入账操作。

上游发起记账,账务系统会接收记账请求,然后把记账请求落入数据库或者缓存,并返回给上游记账成功,这个流程就结束了。后续会有缓冲记账的线程从缓存中拉取数据,根据数据库的承受能力来设定拉取数据的处理速度,然后将数据逐一入账。缓冲记账默认也是实时入账的,只不过能接受一定时间的延迟,比如告知商户延迟是10分钟,就是用时效性换取峰值时的稳定性。但不是所有场景都适用缓冲记账,业务量明显过大时,缓冲记账会带来业务问题。假如账务实际处理能力与业务量不在一个量级上,那么缓冲记账的延迟会给业务造成一定的困扰,比如用户会奇怪明明退款成功了,但并没有收到钱。另外,异步处理有一个前提条件是账户状态正常,如果没有这个前提条件,那么后续的处理都会有问题,并且针对出账的场景要保证账户的资金充足。

拆分子账户

技术手段解决账户热点问题通常是采用拆分子账户的方式,将原本一个账户拆分为多个子账户,能够倍数级地降低 QPS,比如原本一个账户要承受的 QPS 是 100,即每秒处理 100 个请求,把这个账户拆分成 10 个账户后,每个账户需要承受的 QPS 就降低到了 10。账户拆分前后对比如图7—8所示。

拆分子账户就是创建与热点账户对应的多个子账户,子账户与账户的数据结构相同,将账户的余额分散至各个子账户。当账务系统收到账务请求的时候,通过Hash分配(根据具体情况来定义具体的Hash函数)选择子账户进行记账,这样就将原来对一个账户的请求分散到多个子账户中,分散了账务热点。拆分子账户虽然缓解了热点账户的问题,但需要额外处理一些拆分后的逻辑。

扣款入账实际操作的是子账户(就是一个单独的账户,只是保存了与原本账户之间的关系),主账户中不存放余额,余额存放在子账户中,所以查询余额时,需要做特殊处理,即求和子账户的余额。

多子账户扣款时会存在子账户余额不足的问题,但所有子账户的余额总和可能是充足的,所以需要在余额不足时做子账户资金的归集。而且若为代付代发的场景,那么对商户账户进行充值时,需要做充值资金拆分,将资金加到每个子账户中。

在实际场景中,我们处理的热点账户问题通常并非为单个热点账户。例如,账户基数为1000万个,其中高并发账户有1万~5万个,在正常入账时,这些热点账户在数据库上产生的锁及占用的数据库连接都是共享资源,会相互影响,以至于很难提升性能。在这种情况下,我们可以从几个方面对数据库的性能进行优化,首先要控制并发数,所有入账和出账操作都进入线程池,以线程池的并发数控制对热点账户操作的并发数。其次要缩小事务范围,对热点账户的操作尽量控制在小的事务范围内,减少时间分片,提高成功率。