Garland +

一个支付网关的实现

最近给我司的支付系统增加了 Apple Pay 支持,一周多一点儿搞完了,当然这个不是重点,发现我们这个支付网关设计的很不错, 写个文章学习一个。

一般的支付流程,比如电商的支付需要支持多个通道,支付宝、微信、apple Pay 等等,而根据不同的业务线又会有多个服务同时来做支付 比如线上业务和线下业务,所以这是一个多对多的关系,具体到第三方支付相关的逻辑都一样,只是根据不同的业务线有不同的配置,基本的结构 如下图所示:

payment_service

功能

先确定一下一个支付网关需要做的事情

  1. 处理来自各个业务服务的请求
  2. 处理来自第三方支付渠道的回调
  3. 支付/退款/可能还有转账
  4. 需要自己维护各个支付渠道的数据
  5. 维护一份账单

第三方支付渠道的支付流程基本都大同小异

细节

业务配置

一开始设计就要支持多个 AppID,未来增加应用只用增加配置即可

给第三方的 OrderID

网关这边传给第三方支付渠道的 OrderID 应当是网关自己生成的一份 OrderID,网关自己要维护一份业务 OrderID 的映射

重复支付

一个业务的一笔订单在网关这边有且仅有一个 OrderID

业务细节

网关不应关心具体业务的细节,比如多个店铺在一个订单一起支付这种,网关的认知是一笔交易,具体的分帐的逻辑应该在各个业务线内处理

存储

因为涉及到钱,设计的时候宁可多存,不能少存,数据表做好 onSave 快照,打好日志,方便后期排查

消息通知

接受通知的逻辑是,第三方服务回调网关/自己去拉消息(比如微信),然后网关再推给各个服务,当服务应答成功后,才能标记位消息发送成功

存储

MySQL 表

言:

Blog

Thoughts

Project