一文搞懂第三方支付系统架构设计,分分钟搭个支付宝!
本章将对第三方支付进行整体性的描述,包括角色拆分、账户体系、原作模式以及领域划分等。
1、领域角色
回到我们第三方支付的介绍图中:
上图中涉及到了4个角色:用户、商户、银行以及第三方支付工具本身。由此可见,第三方支付系统必须至少在内部抽象出3种角色来为用户、商户和银行服务。由于支付主要涉及到的是资金的记录和流转,适合以账户形式承载,因此延伸至第三方支付系统中的3种账户。
2、三种账户
账户是支付机构内部为其服务对象(用户、商户、银行等)创建的物理记录(类似于表格),这些记录包含了对象的关键信息,如机构为对象分配的唯一 ID、对象的余额、交易的流水、账户状态等等。可以说账户是支付机构识别服务对象的根本,所有服务对象都必须要有账户。
根据第三方支付的服务对象,我们将抽象出三种账户:用户账户(User Account)、商户账户(Merchant Account)以及银行账户(Bank Account)。
1)用户账户(User Account)
一个用户的账户需要记录什么信息呢?需要有一个唯一的账户 ID 避免记录混乱,需要为用户记录余额,需要记录账户的资金变动过程(流水)。如下图所示:
用户账户的行为特点是什么?
很少并发:同一时刻通常只会发生一笔交易,因为支付需要用户手动去操作。
交易频率较低:一个普通用户通常一天只会支付数笔。
余额敏感:用户对自己的账户余额及其变动非常敏感。
这些特点是很直观的感受,但对我们后文深入的介绍会有很大影响,此处先做了解和铺垫即可。
2)商户账户(Merchant Account)
商户账户需要记录的最基础信息同用户一样,也是 ID、余额和流水。
商户账户的行为特点是什么呢?
高并发:同一时刻会有很多用户向同一个商户支付,促销活动时更甚。
交易频率高:一个商户一天的交易可能会非常大。
余额变动不敏感:由于商户伴随着用户的不断支付,余额会快速变化,因此商户本身对该账户余额不敏感。
3)银行账户(Bank Account)
Bank 账户映射的是各大银行,其账户如下所示:
银行账户的特点是什么呢?
数量有限:银行账户映射的是各大银行,因此数量有限。
金额流水庞大:一个大型支付机构和银行的资金交易往来通常都是以亿为单位,金额特别庞大。
并发量高:拥有同一银行卡的用户非常多,这些用户同时使用银行卡支付、体现的量级也非常大,其量级比单个商户会大很多。
余额不敏感:因为是支付机构内部为了映射银行而开具的内部账户,银行并不会关注,所以除了支付机构本身,没人会关注该账户余额。
4)对应关系
上述3种账户和第三方支付角色的对应关系是怎样的呢?是直接一对一吗?如下图所示:
用户只拥有用户账户就足够了,而商户则往往同时拥有商户账户和用户账户,银行则只对应于银行账户。
为什么商户还额外拥有用户账户呢?这是出于资金管理的需要。商户账户中的资金并非全部归属于商户本身,其中有一部分是第三方支付机构将会收取商户的佣金。只有在支付机构收完佣金后的净额才归属于商户本身,才能任其自由使用。
简而言之,商户账户中的资金商户无法直接动用,需要在支付机构收取完佣金后结转到商户的用户账户中才能自由提取。这其实就是结算过程,后续结算卷会有专门的文章讲解,此处仅做简单了解即可。
3、切换视角
以一个常见的菜市场买菜的场景为例,在用户视角,支付过程如下:
用户挑选好蔬菜后,打开微信支付,扫描卖家二维码,输入金额和密码完成支付,拿走货物,用户角度的支付过程到此结束。但从系统的角度来看,支付仅仅只是整个交易链路中的过程之一。在交易的事前事后还需要很多其他过程的协助。
让我们跳出用户视角,思考一些深入的问题:
我们购买货物的微信余额是怎么来的?如果使用银行卡支付,那么钱是如何从银行卡转移到微信的?
当我们的银行卡急需资金,选择从微信提现到银行卡时,资金是如何转移的?
用户支付的钱是怎么给到商家的?微信支付有收取支付手续费吗?向谁收取的?什么时候收的?
当我们对购买的货物不满意,想要退款时,资金是如何退回的?
由此可见,想要真正了解支付,我们的关注点就不能只停留在用户的角度。
4、运作模式
支付机构本质上还是资金相关的操作,我们知道第三方支付涉及用户、银行和支付机构本身。接下来让我们尝试用上文的账户体系来分析一下常见的支付过程。
1) 初始状态
我们将以一个典型例子来说明,涉及对象的初始状态如下图所示:
涉及的用户有两个,张三和李四,他们分别有自己的微信账户和银行账户,微信也在银行开具了自己的银行账户,称为备付金账户(专业名词章节介绍)。他们各自的余额如上图所示。
2)用户充值
现在假设张三想要通过自己的银行卡充值20元到微信余额,资金变动如下图所示:
首先是张三的银行账户向微信备付金账户划扣20元,成功后微信则给张三的微信余额加20元,充值完成。
PS:用户在微信中绑定了银行卡,因此不需要用户去银行转账,而是通过微信与银行间的接口来自动完成该笔资金的划扣。
3)用户提现
假设李四想要将微信中余额提现10元到自己的银行卡,则资金变动如下:
首先将李四的微信余额减去10元,然后微信支付调用银行接口,从微信备付金账户中转账10元到李四的银行卡中,提现过程结束。
PS:这里减去李四微信余额时并不是直接减掉,而是先冻结,等银行侧成功转账后再实际减去。冻结和解冻的细节和原因将在付款卷中详细介绍。
4)用户转账
假设张三要给李四转账20元,则资金变动如下图:
此时,张三的余额先减20,然后李四的余额加20,转账完成。
PS:微信转账有确认收款的过程,如果我们要用上述账户体系来完成这个功能,可以怎么做呢?这个问题将会在支付卷中探讨。
5)资金变动汇总
从上面的表格我们注意到:备付金账户和微信账户的变动净额总是相等的。
在充值时,微信体系余额增加,则备付金账户也会增加相同的金额;
提现时,微信体系余额减少,则备付金账户的余额也会减少相同金额。
转账时,只是支付工具内部账户之前的划转,不涉及资金流入和流入支付体系,因此备付金账户余额不变。
因此,我们可以认为所有支付系统余额是所有备付金银行账户余额的映射。我们称微信余额为系统资金,银行余额为物理资金。如果物理资金小于系统资金,则说明物理资金被挪用,可能会导致用户无法提现。国家会监管持牌支付机构的备付金使用情况,避免这样的情况出现。
5、支付交互
上一节介绍了用户账户、银行账户之间的一些常见交易类型,本节将介绍涉及商户账户的支付过程,如下图所示:
用户和商户也都拥有自己的银行账户和微信支付账户。微信支付作为中间桥梁,将银行、用户、商户连接起来,共同构成了整个交易网络。从交互图中可以看出,支付系统具有很多重要的功能:
充值。用户将银行卡中的资金转移微信支付中,成为微信余额的过程。
提现。用户或商户将微信余额转移到银行卡的过程。
支付。这里特指用户将资金从自己的现金账户划转到商户的交易账户过程。
退款。支付的逆向过程,将资金从商户账户退回到用户账户。
结算。用户支付给商户的资金,在收取手续费后,划转到商户的现金账户的过程。
上述功能中,有的只涉及用户,如充值和提现;有的同时涉及用户和商户,如支付、退款;而有的只涉及商户,如结算。
6、领域拆分
让我们对上面的各种交易类型做一个整合,在业务领域上进行拆分和归纳,如下图说是:
下面对这些领域及其职责进行简单说明:
支付(广义):负责支付、转账、充值等基础交易能力的提供。
退款:负责将用户支付的资金从商户账户退回用户账户或用户银行卡。
付款:负责将支付体系内的资金提取到指定的用户银行账户,即提现。
结算:负责按照合同约定的规则,将商户交易账户的资金划转到商户现金账户,并收取交易手续费。
各个领域提供基础能力,并服务各种各样的业务场景。有的业务场景需要多种领域能力合作完成,如结算业务需要依赖于付款的提现能力。