资金产品与收单产品最大的区别在于,收单产品需要依托交易标的存在,比如买一杯咖啡,用户和商家存在交易标的“咖啡”。而资金产品是没有交易标的存在,比如充值100块,给别人转账100块,提现100块。当然特殊情况下可能有线下交易标的,但在系统中是没有反映的,比如在线下买份早点,直接给店主转了10块钱。
支付的复杂主要是信息流的复杂,因为要想实现一次交易、一次支付的处理,往往会涉及到很多系统,每个系统当中都会生成相应的单据,而这些单据之间存在着千层万缕的联系,只要搞清楚了他们之间的联系,就搞懂了这些系统之间的“关系”,信息流,无非就是在系统通讯过程中生成的信息而已,而这些信息就是“单据”
对软件设计模式的理解和应用,基本上可以算做初级研发工程师和高级研发工程师的分水岭。我在面试时很喜欢问候选人对设计模式的理解,以及实际应用情况,大部分候选人都能回答单例,工厂等,再多问几句,就惨不忍睹。其实也能理解,这些内容对于初学者而言,基本只能靠死记硬背,记不长久。今天聊聊我理解的设计模式,在支付系统经常用到的场景,以及容易混淆的点,里面讲到的概念可能和一些权威的论述有所出入。下面的内容全部源自我这么多年所写代码的抽象总结,和以前一样,也不可避免会夹杂一些我个人不成熟的见解,请各位以“取其精华,去其糟粕”的精神辩证地看待此文内容。
本篇主要讲清楚收银核心的设计与实现,包括收银核心如何渲染可用支付方式,如何做可支付检查,收银台核心的系统架构、领域模型,常见支付方式等。如果说电子商务是现代经济的繁华都市,那么在线支付系统无疑就是最繁忙的交通大动脉。在这个每年数十万亿规模的在线支付交易世界中,有两个默契十足的队友密切配合,确保每一笔交易都像优雅的华尔兹舞步一样流畅 -- 那就是:收银核心和支付引擎。
每个公司的账务系统设计思路、实现方式必然是不一样的,我个人经历过好几家支付公司,实现细节千差万别,但是整体思路都差不太多,比如账户设计一定有客户账户和内部账户,一定有中间户(过渡户),也一定使用复式记账,也都有实时记账和缓冲记账等。
除了从事账务系统研发的工程师外,大部分支付研发工程师对账务都了解甚少,主要原因仍然是账务系统的业务门槛往往大于技术门槛,比如很多支付研发工程师甚至不了解复式记账。所以有必要从研发工程师的角度来介绍一些账务系统入门的知识。需要说明的是,不同支付公司内部设计的账务系统必然存在差异,但有些基本原则大家都会遵守,比如复式记账、账户管理、记账、对账、会计中心、日切等。
本文描述的概念大部分做了极致简化,只是用于入门,对于理解概念应该是够用的。真实的实现会复杂非常多。这些概念如同支付核心系统拼图的一些小碎片,串起这些小碎片,就是一个完整的支付系统大图。另:后面的描述中,经常混着用“支付系统”、“支付平台”,“支付机构”,“收单机构”,本质是一个东西。在内部来说,就是一个支付系统,但从和外部机构交互来说,就是一个支付平台。对用户来说是支付,对商户来说就是帮商户收单。
本文主要讲清楚支付系统中拒付涉及的基本概念,产品架构、系统架构,以及一些核心的流程和相关领域模型、状态机设计等。拒付在中国比较少见,但是在海外非常普遍,只要做跨境收单支付系统,就无法绕开拒付。拒付涉及到冻结收单单据,并扣减商户的结算款,所以拒付经常和收单、结算一起讲。下面这个图第三次出现,只是想强调三者之间的紧密关系。
本文主要讲清楚支付系统中商户结算涉及的基本概念,产品架构、系统架构,以及一些核心的流程和相关领域模型、状态机设计等。收单结算是支付系统最重要的子域之一,行业内经常把有牌照的支付平台称为“收单机构”就可见一斑。我们在上一篇文章讲了收单如何帮忙商户收钱,收完钱还得转给商户,用户支付100块钱,那么到底给商户多少钱,什么时候给,这都是结算平台干的工作。谓之“结算”
收单结算是支付系统最重要的子域之一,行业内经常把有牌照的支付平台称为“收单机构”就可见一斑。有些监管严格的国家地区,没有收单牌照就不能碰收单和结算,商户必须入驻到有收单牌照的支付机构。本文主要讲清楚支付系统中收单涉及的基本概念,产品架构、系统架构,以及一些核心的流程和相关领域模型、状态机设计。