各种系统中会经常用到支付功能,需要对接各种第三方支付系统(微信、支付宝、网银等),这种系统模块如何架构呢,我这里提供一种架构思路。
起源
如上图所示,支付系统有两个重要的环节:预支付和支付
- 预支付
- 预支付的时候,系统有订单信息,并且生成好了支付信息,返回客户支付
- 支付
- 用户收到预支付信息 提交支付,并且知道支付状态
设计
数据库关系
订单-支付记录:一对多的关系
支付商家后台设计
sequenceDiagram participant 服务接口 participant 支付平台 participant 数据库 服务接口->数据库: 调用生成Order接口:新增订单,得到OrderID 数据库->服务接口: 返回终端订单标志:OrderId 服务接口->支付平台:调用PrePay接口:通过OrderId生成预支付信息 支付平台->数据库:写入PayRecord,得到支付记录 数据库->服务接口:返回给支付终端,进行支付 服务接口->支付平台:调用订单详情接口:获取支付平台最新支付状态信息 支付平台->数据库:修改,PayRecord和Order订单状态 数据库->服务接口:返回给终端,进行展示支付信息 服务接口->支付平台:主动接收支付平台推送支付记录信息 支付平台->数据库:修改,PayRecord和Order订单状态 Note right of 数据库: 数据库要使用事务锁
对账
为了保证支付过程,支付的金额和订单信息都能对应起来,需要结合各个第三方平台给出来的历史支付记录进行对账
对账算法:将历史订单导入各自的支付平台账单表中,和商家Order表、PayRecord表关联,计算归档期内总正常支付金额是否相等