【支付】支付路由设计
近期需要做支付系统,这里对项目中的支付路由设计进行总结
一.支付路由出现的背景
现在市面上具备支付牌照的公司越来越多,因此哪些公司对应着出现了越来越多的支付通道,往往公司会选择不同公司的支付渠道去对接,主要有以下优点
1.不同支付通道稳定性各有不同,在通道不稳定时,需要有备用的支付通道去切换;
2.不同支付通道的费率有区别,相比与原生的支付宝和微信,费率有差别
3.公司内部往往有很多业务,例如业务A,业务B...等等,为了区分不同业务的营收,方便财务对账,需要根据不通业务指定不同的支付通道;
4.公司内部业务往往有很多定制化需求,例如PC扫码聚合支付,或自定义支付收银台的需求,这种往往都需要接多种支付通道,或直接对接第三方支付通道线程的收银台,减少了自己封装收银台的时间成本,相比于原生的微信/支付宝 支付,更加满足公司现有的定制化的业务需求,对接速度也相对更快;
但是支付路由不是银弹,说完优点,再说缺点
1.对接通道过多,支付系统变复杂,需要监控不同的通道的支付指标更多;
二.支付业务流程
以PC扫码支付为例,这里描述一下支付业务的流程
核心接口就是接口order/pay,该接口由订单系统发起,调用支付系统发起对第三方支付通道的预支付,然后返回给前端预订单
由于整套支付路由并不在订单系统,全部都是支付系统来维护,因此客户端并不知道支付系统使用哪一套支付通道
基于以上原因,order/pay该接口需要除了常见的订单号,金额,商品信息以外,还需要提供以下参数用来给支付系统判断使用哪个通道
1. 业务类型 busiType (用来区分不同业务,后期可以根据业务使用不同的支付通道)
2. 支付类型 payType (微信扫码/微信APP/支付宝扫码/支付宝APP/苹果内购/微信H5/支付宝H5/聚合码支付)
3. 客户端类型 fromType (iOS/Android/Web/QT)
以上三个要素确定了,对应的表关系也就确定了,这里分了4个表
1.业务类型表 app_info
2.支付通道表 channel_info
3.通道和业务映射表 app_channel_info
4.支付通道业务信息表 channel_busi_info
对应的表关系如下
整个支付路由的核心也就是channel_busi_info,通道from_type,pay_type字段以及子系统信息表的app_id字段就能确定调用order/pay接口时,使用哪一种支付通道(channel_id)
三.项目结构
account-api --支付相关接口暴露
account-center --账户中心
account-channel --支付通道服务(核心)
account-clear --支付结算服务
account-core --支付相关公共包
account-dao --数据库访问层,仅与数据库交互
account-pay --支付服务(核心)
这里和支付路由相关的主要是account-pay服务和account-channel服务这两个服务,因此主要针对这两个服务的设计进行展开说明
account-pay:主要暴露具体的支付接口给订单服务,处理系统内部的业务逻辑,根据订单系统传递的参数选择不同的支付通道,然后调用account-channel传递通道id,channel_id 真正的发起预支付
account-channel: 主要与第三方交互,抽象出一个基类,不通的支付通道通过实现这个类进而具备相近的能力,例如,支付,退款,支付查询,退款查询等等
四. 具体实现细节
account-channel服务中,使用工厂+策略模式,通过account-pay服务中传递通道ID,channel_id选择不同的支付通道进行支付,类图如下
execute():用于发起支付
getPayType():用于获取当前通道的支付类型
getCHannelEnName:用于获取当前通道的名称
备注
扫盲:https://www.sohu.com/na/421683471_120746823