1.项目背景
车支付系统对接很多的外部渠道,如苹果支付、支付宝、微信、银联等,在实际开发与实施的过程中,发现了其中存在的一些问题,比如:
- 需要一定精力在与渠道进行非业务逻辑的联调与测试。
- 渠道的对接可能分布在不同的业务子系统中,没有进行统一有效的出口管控。
针对以上类似问题,外联网关应运而生,以保证内部系统与外部系统之间进行安全、有效、便捷的通讯。
2.设计方案
2.1系统交互流程图
简单来说,系统的主要功能就是通过对请求的一些配置,选择系统预置的一些插件(系统内置了常用的通讯协议、加签验签、加密解密过程,也可以通过规则引擎脚本实现对请求和响应数据的个性化处理),以实现在不编写代码的情况下,实现对请求的鉴权、参数预处理、参数与响应结果映射等。让业务开发同学更关注业务逻辑。
平台还提供Mock数据的能力,在外部接口未提供可调用环境时,可以根据渠道提供的文档,进行Mock数据的返回。
系统提供两种接入方式:
- 客户端如果采用spring cloud,可以接入统一注册中心Consul;
- 如果是其他系统,可以通过HTTP方式调用。
3.实践过程
在获取到对接方的接口文档之后,通过分析接口的通讯与鉴权方式,在外联网关的配置管理后台配置相应的参数,配置完成之后会有相应的模板编号,客户端通过模板编号+对接接口的请求参数进行接口的请求。
3.1组管理
系统通过组管理,对同一系列的接口的通用配置,实现对一个外部渠道中一个或多个接口的的请求响应处理配置,包括:
- 加签验签
- 加密解密
- 预设字段
系统预置加密及签名:
- 加密分为三种:
对称加密(symmetric),例如:AES、DES等
非对称加密(asymmetric),例如:RSA、DSA等
摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC等。
- 摘要算法:
算法 | 说明 |
MD5-LOWER | 摘要函数-128位-小写 |
MD5-UPPER | 摘要函数-128位-大写 |
SHA-1 | 摘要函数-160位 |
SHA-256 | 摘要函数-256位 |
SHA-384 | 摘要函数-384位 |
SHA-512 | 摘要函数-512位 |
SHA1withRSA | 先用 SHA-1 去摘要,然后使用 RSA 加密 |
SHA256withRSA | 摘要后加密 |
SHA384withRSA | 摘要后加密 |
SHA512withRSA | 摘要后加密 |
MD2withRSA | 摘要后加密 |
MD5withRSA | 摘要后加密 |
- 加解密算法:
算法 | 说明 | 备注 |
AES | 对称加密。更快,兼容设备,安全级别高 | AES|128|AQIDBAUGBwgJAAECAwQFBg==|AES/CBC/PKCS5Padding |
DES | 对称加密。本地数据,安全级别低 | |
RSA | 非对称加密。有公钥和私钥 | |
SM4 | 国密算法-对称加密SM4 | encrypt_key、decrypt_key配置通过“|”间隔key和iv |
注意:
AES|秘钥长度|IV向量(byte-->Base64)|AES/mode (加密模式)/padding (填充方式)
AES|128|AQIDBAUGBwgJAAECAwQFBg==|AES/CBC/PKCS5Padding
- 签名策略(SignStrategyEnum)
简写 | 过程 |
KV_JOIN_BODY_URL | 对请求参数中body和urlParam值,根据配置的连接方式组成字符串 |
V_JOIN_BODY | 请求参数(body)值拼接 |
V_JOIN_BODY_SORT | 请求参数(body)值拼接(需排序) |
KV_JOIN_BODY_HEADER | 对请求参数中body和header值,根据配置的连接方式组成字符串 |
KV_JOIN_BODY_ENCRYPT | 对请求参数中body和encrypt(加密前)值,根据配置的连接方式组成字符串 |
KV_JOIN_BODY_ENCRYPTED | 对请求参数中body和encrypt(加密后)值,根据配置的连接方式组成字符串 |
BODY_JSON | 对请求参数中body数据转换为JSON字符串 |
BODY_ENCRYPT_SORT_JSON | body+encrypt 参数字段排序后 json 化 |
BODY_JSON_RSA | 对请求参数中body数据转换为JSON字符串在经过RSA加密(Base64编码) |
ENCRYPT_RSA | 对请求中的加密字符串进行再签名 |
V_JOIN_HEADER_NO_SORT | header 内容拼接,无排序 |
KV_JOIN_BODY_URL_REJECT_SIGNMETHOD | 对请求参数中body和urlParam值,根据配置的连接方式组成字符串,并且剔除SingMethod的key和value |
- 验签策略(VerifySignStrategyEnum)
简写 | 过程 |
V_JOIN_BODY | 请求参数(body)值拼接 |
BODY_SORT_JSON | 返回结果集字段排序后 JSON 化 |
BODY_SORT_JSON_E_WALLET | 返回结果集字段排序后 JSON 化(E钱包专用) |
- 签名盐值位置:
标识 | 说明 |
left | 拼接左侧 |
right | 拼接在右侧 |
both | 两侧都有 |
- 加密策略(EncryptStrategyEnum)
简写 | 过程 |
SPECIFIC_JSON | 在请求体 |
BODY_JSON | 在请求体 |
- 解密策略:
简写 | 过程 |
SPECIFIC_JSON | 指定的字段,解密后为JSON字符串 |
- 接口预设参数:
示例:$simple_uuid$
预设值 | 类型 | 说明 |
simple_uuid | String | UUID |
millisecond_long | Long | 毫秒 |
timestamp_long | Long | 时间戳 |
持续完善中 |
3.2请求项配置
在配置好接口组之后,接下来就可以通过对请求项实现对某一个接口的具体配置,其中包括:
- 选择对应的接口组
- 是否需要Mock数据
- Mock数据的模板配置(每个属性由 3 部分构成:属性名、生成规则、属性值,可以实现返回动态Mock数据。)
- 请求的方式(POST、GET)
- 请求与响应的Content-type,编码格式等
- 请求超时的配置
- 请求参数映射(参数名称的转换)
- 请求参数脚本(通过规则引擎脚本对请求参数进行二次处理)
Mock模板示例:
3.3模板配置
模板是打包一个或者多个请求(目前仅支持一个,后续通过接入规则引擎平台,实现对请求项的编排能力),对外暴露给客户端,通过模板编号进行请求。
4.规划
外联平台目前实现了基本的对请求的处理与封装,还是有很多需要集成与完善的功能,比如对请求的监控与性能统计,直观感受外部接口的响应效率,更好的优化自己的系统。
还有可以接入规则引擎系统,可以实现对请求更灵活的配置,让系统更加灵活,适应更多的场景。
5.总结
外联网关是针对请求外部接口的一套实现方案,以低代码的形式实现复用,以减少接口对接工作量为目标,最终实现提高工作效率,实现对接口的统一管理与控制,确保交易在各支付渠道之间安全、无缝的传递。
- 作为之家内部业务系统与外部系统的隔离与统一管理:
- 实现外部支付清算系统的统一接入和接入管理;
- 完成通讯协议及信息的转换;
- 完成报文组包解包、报文解密和加密;
- 完成信息的路由分发;
- 完成报文的发送和接收。
作者简介:郑刚
- C端及中台产研中心-效能平台部-业务平台团队。
- 2017年加入汽车之家,主要负责中台及金融相关业务服务器端设计与开发工作。