这是《百图解码支付系统设计与实现》专栏系列文章中的第(4)篇。
本章主要讲清楚支付系统中商户结算涉及的基本概念,产品架构、系统架构,以及一些核心的流程和相关领域模型、状态机设计等。
1. 前言
收单结算是支付系统最重要的子域之一,行业内经常把有牌照的支付平台称为"收单机构"就可见一斑。
我们在上一篇文章讲了收单如何帮忙商户收钱,收完钱还得转给商户,用户支付100块钱,那么到底给商户多少钱,什么时候给,这都是结算平台干的工作。谓之"结算"。
下面这个图留着是为了提高"收单、结算、拒付"紧密结合的印象。
三者的职能如下:
收单核心: 主要负责处理商户订单的全生命周期管理:订单创建、支付推进、退款、撤销等。
结算核心: 主要负责把商户应收账款算清楚,把结算款按合同约定结转给商户。
拒付核心: 主要负责处理用户的拒付和对应的抗辩以及最后的判责。
2. 结算在支付系统中的位置
在收单机构(支付平台)里,结算就是把帮商户收进来的钱,按约定的结算规则、准确、及时地结算给商户。
3. 结算产品架构
结算模式分为主动结算和被动结算。站在商户 的角度,被动结算 就是以收单机构为准,收单机构说结多少就是多少。主动结算就是以商户为准,商户说结多少就是多少。一般来说,大部分商户都是被动结算,特殊的大商户比如Google,Apple经常使用主动结算。
结算一定要设计账期,就像账务系统要有会计日是一样的道理,避免跨天的交易或零点附近的交易出现结算异常。对应就有账期创建、入账、关账、出账。
4. 结算系统架构
核心的服务包括:结算受理、注册,账期的新建、关账、出账,最后就是结算。
5. 结算核心流程
下面以即时到账模式为例说明。担保交易模式和预授权模式稍有不同。
在交易日,收单收到支付成功回执后,就发消息给结算,结算收到消息去查结算合约,进入结算注册流程。
在结算注册时,如果存在打开的账期,就直接挂过去,如果不存在,就创建一个账期。
在结算日,先进行关账,避免在途任务受影响。关账成功后,进入结算批次,再进入打款流程。
打款有3种情况:1)结算到商户余额户。2)在线结算到提现卡。3)线下人工打款(人工结算)。
打款完成后,推进结算流水SETTLED。
6. 结算核心领域模型
左边绿色部分是账单和流水相关信息,中间蓝色是账期和批次相关信息,右边是打款信息。
因为一个收单可能会有多种费用,所以会生成多条我方账单流水。同样的,一个收单可能结算给多个主体,对应有多笔结算流水。
结算账期有点类似会计日的概念,是为了控制零点左右的收单单据的结算能落到正确的结算账期里去。
关账后就会发起外部结算以及对应的打款。一个结算批次可能会分成多笔打款。
7. 结算状态机设计
上面把结算涉及到的状态机都画出来了。
特殊的是打款单的状态机,因为打款有可能调用外部渠道打到商户的卡里去,外部渠道有一定概率先返回打款成功,过两天后又返回退票(实际打款失败,资金退回),这个时候需要推进到REVERSE,然后重新更新信息后再进行打款。
退票的原因有多种,比如商户的卡被冻结等。
8. 资金流
结算一般只涉及到正向资金流,也就是支付成功后,一步步推进结算到商户余额户或者商户银行卡,如果是结算到商户余额户,就需要商户主动在商户门户发起提现到卡。
9. 结束语
本章主要讲了结算的基本概念,以及对应的产品和系统架构图,一些核心的领域模型和状态机设计。