大家好,我是隐墨星辰,自从《百图解码支付系统设计与实现》专栏中的文章《图解支付报文网关:一种低代码报文网关的设计思路与核心代码实现》发表以来,不少同学留言或私信问我如何实现,说是虽然看懂了思路,但是还是不知道如何写代码,所以周末抽空实现了核心模块的代码,贡献出来给大家。
1. 效果
只需要手写几个配置文件,就可以快速接入一个渠道。如果有能力的话,可以自行扩展后台界面,就可以形成产品化接入,连配置文件也不需要写,只需要在后台管理界面上输入变量和映射就行。
1.1. 几个配置文件
一共只需要几个配置文件:
- 接口配置文件:定义接口名称,报文格式类型,报文模板等。
- 机构/渠道参数配置文件:与渠道交互使用的host,url,apiKey,商户号等。
- 密钥配置文件:签名私钥,验签公钥,加解密密钥等配置。
详细如下:
- 渠道接口配置文件(生产上建议保存在数据库):

其中requestMessageTemplate的内容如下:

- 机构/渠道配置(生产上建议保存在数据库):

- 签名私钥配置(生产建议放在密钥中心)

验签公钥配置(生产建议放在密钥中心)

1.2. 外发请求与处理简要说明
以系统运行日志为例子说明,这样更直观。
其中渠道报文是拿的一个公共渠道做了一点修改。大家可以拿支付宝或微信支付做实验。
- 内部应用调用网关的完整请求参数 (GatewayRequest) :

- 内部应用发送外部渠道的参数示例(只包括requestContext):

- 发给渠道前需要组装的报文模板(requestMessageTemplate):

- 组装后将要发给渠道的报文(assembledRequestMessage):

- 渠道返回的原始报文:

- 根据模板转成内部参数:

- 转换后返回内部应用的参数(GatewayResponse):

2. 设计思路
参考《百图解码支付系统设计与实现》专栏文章:
《图解支付报文网关:一种低代码报文网关的设计思路与核心代码实现》
《图解支付渠道网关(一):不只是对接渠道的接口》
《图解支付渠道网关(二):不只是对接渠道的接口》
使用责任链串起各处理器:

报文网关的整体架构图:

渠道网关的整体架构图:

3. 工程说明
如下图所示。

4. 如何获取源码
留言或私信。
5. 小结
报文网关有四层境界:
1)直接java手写,一个接口一段代码。
2)使用模板方法,定义好主流程,每个接口实现特定的函数。
3)低代码模式(本次实现),写好核心框架,通过写配置文件接入渠道。
4)产品化,通过后台管理界面配置接口完成渠道接入。
第4层境界,需要更好抽象,更多的前后端资源,留待各位自行去探寻。我带领团队实现过第4层,如果对第4层有兴趣,可私聊。
项目代码写得很简洁精炼,如果有同学所在公司的网关还处在第1、2层,可以直接拿回去修改一下就能用起来。如果已经到了第3层,但是准备重构,可以拿回去参考一下。说不定能为上半年的好绩效做点贡献。
周末有时间再写篇文章给大家拆解里面的源码和实现原理。
这是《百图解码支付系统设计与实现》专栏系列文章中的第(32)篇。 欢迎和我一起深入解码支付系统的方方面面。