来,撸一个简单的支付网关

451 阅读3分钟
青海长云暗雪山,孤城遥望玉门关。
黄沙百战穿金甲,不破楼兰终不还。
——<<从军行>> 王昌龄

名词解释

名词 解释
应用(接入方) 使用支付网关的业务方,比如:电商业务应用、广告业务应用
支付方式 用户在支付时选择的方式,比如:微信扫码支付、微信APP支付
支付渠道 实现支付的实体,就是各种第三方支付平台,比如微信、支付宝、浦发银行等
支付路由 根据用户选择的支付方式确定完成该支付操作最合适的支付渠道,如用户选择微信扫码支付,可以微信官方渠道API实现,也可以用浦发银行渠道的微信扫码API来实现

简化的架构

支付网关

支付核心功能入口,比如支付、退款、转账、查询支付结果、查询退款结果等功能

支付路由

支付路由根据配置规则自动选择合适的第三方支付渠道来完成支付功能

支付回调

接收第三方支付结果回调通知,并负责通知接入方

支付调度

预防各种原因未能及时获取第三方结果回调通知,支付调度服务会定时主动向第三方查询支付结果

支付对账

负责和第三方渠道的对账,提供对账单给接入方下载

支付渠道

微信、支付宝、银联等支付渠道对接管理

关键逻辑

针对一些关键逻辑的设计说明

智能路由

可根据费率、支付成功率、营销逻辑等自动选择使用的支付渠道,这里提供一个简单的通过手动配置实现路由切换的实现

  1. 使用一张路由映射表,关联接入方和支付渠道,不同的支付方式可以使用不同的支付渠道
  2. 一种支付方式也可以配置多个支付渠道,通过配置优先级来选择第一支付渠道

  1. 相关表

支付流程

  1. 在第三方支付渠道异步通知支付结果这一步,支付回调服务处理完本地业务后,将支付结果放入MQ,再由独立服务消费通知业务方
  2. 可增加支付调度服务,对超过一定时间未收到支付异步通知的订单主动向第三方查询
接口重试
  1. 对交易结果异步通知,有可能遇到接入方提供的回调接口不稳定的情况,需要实现重试功能
  2. 接入方需保证幂等
  3. 延迟队列 or retry框架
分布式锁
  1. 在支付、退款等一些不允许重复操作的请求时需要考虑幂等性
  2. 分布式锁实现可选择基于Zookeeper实现的Curator或者基于Redis实现的Redisson?