图解结算平台:准确高效给商户结款

这是《百图解码支付系统设计与实现》专栏系列文章中的第(4)篇。

本章主要讲清楚支付系统中商户结算涉及的基本概念,产品架构、系统架构,以及一些核心的流程和相关领域模型、状态机设计等。

1. 前言

收单结算是支付系统最重要的子域之一,行业内经常把有牌照的支付平台称为"收单机构"就可见一斑。

我们在上一篇文章讲了收单如何帮忙商户收钱,收完钱还得转给商户,用户支付100块钱,那么到底给商户多少钱,什么时候给,这都是结算平台干的工作。谓之"结算"。

下面这个图留着是为了提高"收单、结算、拒付"紧密结合的印象。

三者的职能如下:

收单核心: 主要负责处理商户订单的全生命周期管理:订单创建、支付推进、退款、撤销等。

结算核心: 主要负责把商户应收账款算清楚,把结算款按合同约定结转给商户。

拒付核心: 主要负责处理用户的拒付和对应的抗辩以及最后的判责。

2. 结算在支付系统中的位置

在收单机构(支付平台)里,结算就是把帮商户收进来的钱,按约定的结算规则、准确、及时地结算给商户

3. 结算产品架构

结算模式分为主动结算和被动结算。站在商户 的角度,被动结算 就是以收单机构为准,收单机构说结多少就是多少。主动结算就是以商户为准,商户说结多少就是多少。一般来说,大部分商户都是被动结算,特殊的大商户比如Google,Apple经常使用主动结算。

结算一定要设计账期,就像账务系统要有会计日是一样的道理,避免跨天的交易或零点附近的交易出现结算异常。对应就有账期创建、入账、关账、出账。

4. 结算系统架构

核心的服务包括:结算受理、注册,账期的新建、关账、出账,最后就是结算。

5. 结算核心流程

下面以即时到账模式为例说明。担保交易模式和预授权模式稍有不同。

在交易日,收单收到支付成功回执后,就发消息给结算,结算收到消息去查结算合约,进入结算注册流程。

在结算注册时,如果存在打开的账期,就直接挂过去,如果不存在,就创建一个账期。

在结算日,先进行关账,避免在途任务受影响。关账成功后,进入结算批次,再进入打款流程。

打款有3种情况:1)结算到商户余额户。2)在线结算到提现卡。3)线下人工打款(人工结算)。

打款完成后,推进结算流水SETTLED。

6. 结算核心领域模型

左边绿色部分是账单和流水相关信息,中间蓝色是账期和批次相关信息,右边是打款信息。

因为一个收单可能会有多种费用,所以会生成多条我方账单流水。同样的,一个收单可能结算给多个主体,对应有多笔结算流水。

结算账期有点类似会计日的概念,是为了控制零点左右的收单单据的结算能落到正确的结算账期里去。

关账后就会发起外部结算以及对应的打款。一个结算批次可能会分成多笔打款。

7. 结算状态机设计

上面把结算涉及到的状态机都画出来了。

特殊的是打款单的状态机,因为打款有可能调用外部渠道打到商户的卡里去,外部渠道有一定概率先返回打款成功,过两天后又返回退票(实际打款失败,资金退回),这个时候需要推进到REVERSE,然后重新更新信息后再进行打款。

退票的原因有多种,比如商户的卡被冻结等。

8. 资金流

结算一般只涉及到正向资金流,也就是支付成功后,一步步推进结算到商户余额户或者商户银行卡,如果是结算到商户余额户,就需要商户主动在商户门户发起提现到卡。

9. 结束语

本章主要讲了结算的基本概念,以及对应的产品和系统架构图,一些核心的领域模型和状态机设计。

相关推荐
雷渊19 分钟前
深入分析Spring的事务隔离级别及实现原理
java·后端·面试
Smilejudy29 分钟前
不可或缺的相邻引用
后端
惜鸟29 分钟前
Elasticsearch 的字段类型总结
后端
rebel31 分钟前
Java获取excel附件并解析解决方案
java·后端
微客鸟窝33 分钟前
Redis常用数据类型和命令
后端
熊猫片沃子34 分钟前
centos挂载数据盘
后端·centos
微客鸟窝35 分钟前
Redis配置文件解读
后端
不靠谱程序员37 分钟前
"白描APP" OCR 软件 API 逆向抓取
后端·爬虫
小华同学ai39 分钟前
6.4K star!企业级流程引擎黑马,低代码开发竟能如此高效!
后端·github
Paladin_z42 分钟前
【导入导出】功能设计方案(Java版)
后端