支付系统概述(五):结算系统
上一章我们介绍了和商户交互的收单系统,这章我们介绍和商户交互的另一个系统:结算系统。收单结算一般是在一起说的,我们在系统架构上,将收单系统和结算系统进行分离,主要考虑收单系统和结算系统在技术架构上有比较大的区别:收单系统一般是一个实时的订单处理系统,而结算一般是一个批处理系统。
在业务架构上,结算系统的职责非常简单:完成和商户的结算交互。结算交互包括两部分:
结算金额的计算:按照一定的周期,计算需要给商户结算的金额。在有的公司这个步骤叫清分。
结算打款:包括打款信息维护、资金流出和后续的流出运营等等。
对于结算金额的计算,有两类实现方式:实时结算系统和批处理结算系统。
对于批处理的实现方式,利用数据平台 T+1 的跑批,计算每个商户 T 日所有交易正逆向钆差后需要给商户结算的总金额,并生成结算明细文件供商户查询和下载。
对于实时结算系统,在正向商品订单和逆向退款订单以及拒付拒付翻转等单据到达终态后,发送消息给到结算系统,计算系统处理后实时生成结算明细和每日结算金额汇总。到结算日后,关闭当期的结算窗口进行打款即可。
对于结算打款,需要视商户数量以及结算周期的不同,可选人工和自动的方式:
如果商户数量不多,结算周期为月结,可以采用汇总所有商户结算金额,生成盘片后由人工通过网银上传银行进行打款的操作。
如果商户数量较大,或者结算周日为日结周结,通过人工的方式工作量相对较大,可以采用自动化的方式,对接银行的银企互联系统,到期自动触发指令进行打款操作。
整个结算系统,一般来说需要维护如下的模型:
商户的结算策略:一般和收单合约一起维护,不单独建设。
商户的收款信息:这个可以和用户资产信息一起,放在后续将要介绍的资产管理系统中。同时需要提供给商户维护的入口。
结算明细:维护正逆向订单的结算分录。
结算单:针对每个周期,对结算明细的汇总。记录周期、笔数、金额等。
打款单:每笔结算打款的记录。需要严格控制重试的条件,避免重复打款。
在技术架构上,区别离线结算和实时结算的方式,需要引入数据平台或者消息中间件。
同时,对于个别大商户结算频率较高的情况,需要考虑账户热点的问题。这部分大商户,可以采用分层汇总的方式:在商户下虚拟若干子商户,将结算明细 sharding 到虚拟子商户进行第一次汇总,在结算周期时再进行第二次汇总,避免账户热点的产生。
最后,对于结算打款,需要和银行明确幂等的条件和流出状态。严格保证原单重试不改变幂等条件,非终态不换单重试,避免重复打款导致的资损问题。
版权声明: 本文为 InfoQ 作者【agnostic】的原创文章。
原文链接:【http://xie.infoq.cn/article/1a934219815dd0c8194ee1dc2】。文章转载请联系作者。
评论