架构图
架构说明
展示层
终端展示,包括PC WEB、ANDROID、IOS、微信小程序、H5。
网络
Nginx 静态HTTP服务器、反向代理服务器、负载均衡、 SSL证书部署
网关
Gateway 统一前端请求URL,作用是请求路由、用户合法性鉴权、请求链路跟踪、出入参数据结构转换、接口限流、熔断、数据安全验证支持入参MD5签名SIGN、入参业务参数RSA分段加密、出入参采用RSA+AES双向加密
应用层
支付系统
XXL-JOB
定时任务调度、监控、配置
存储层
MySQL 做业务数据,结构化存储
OSS云存储,做文件、图片、视频存储
Redis 数据缓存,token鉴权、session共享、分布式锁、接口幂等
业务告警
根据业务告警等级,可以选择短信、钉钉群、邮箱,三种方式进行告警通知
中间件
RocketMQ 系统解耦、流量削锋、异步、延时消息、顺序消息、事务消息、解决缓存数据库一致性、基于死信队列转发做循环调用接口
结算单数据推送
灵工收款卡变更推送
任务、供应商企业,主题变更推送
基础依赖
银行前置机,上行、下行通信,做数据安全加密
容器化部署
coding
代码托管平台
Jenkins
服务构建
拉去代码托管平台代码,执行构建脚本生成镜像文件
推送镜像文件到ACR镜像仓库
ACR镜像仓库服务
用于存放企业私有的,服务镜像文件
触发器配置
触发ACK部署镜像
ACK k8s集权服务
创建服务
数据库
Redis
RocketMQ
业务服务
拉取镜像,发布服务
监控
支持容器级别和VM级别的监控
网络
支持跨宿主机容器间互联,支持高性能VPC网络驱动
集成SLB负载均衡
日志
支持日志自动采集和日志服务集成。
数据传输结构
请求类型
cnotallow=application/json;UTF-8
入参数据结构
请求header
header
appId
客户端唯一标识
terminalVersion
1
平台
2
pay 支付系统
terminalType
H5
IOS
ANDROID
WEB
APPLETS
encryType
SIGN
RSA
RSA_AES
encryKey
RSA 公钥加密后的 AES key
RSA 公钥加密后的MD5签名的动态盐dynicSalt
sign
sign的生成则是将所有参数按字典顺序排列,拼接value后+动态盐,取MD5特征码再转base64
token
用户登录后生成的token
ip
system
app version
App 版本
phone model
手机型号
system version
系统版本
clientType
PC端WEB
移动端H5
IOS
ANDROID
lat 纬度
lng 经度
请求body
安全验证类型为SIGN,对应body数据结构
body
nonce
nonce取的是随机数再MD5的值
timestamp
时间戳
params
flow_no
请求流水号
业务参数
安全验证类型encryKey为RSA,对应body数据结构
body
params
BASE64解密RSA公钥
业务参数通过RSA公钥,进行分段加密后的密文
安全验证类型encryKey为RSA+AES,对应body数据结构
body
params
业务参数通过AES加密后的密文
返回数据结构
返回response 结构
code 状态码
000000 正常
100000-199999 参数验证
200000-299999 系统异常
300000-399999 依赖银行
300000-399999 依赖第三方
400000-499999 签名加密类
msg 描述信息
errorCode 错误码(方便定位问题)
errorMsg 错误描述(方便定位问题)
data 业务数据
安全验证类型为SIGN,对应response 数据结构
不做响应加密,明文返回
安全验证类型为RSA,对应response 数据结构
不做响应加密,明文返回
安全验证类型为RSA+AES,对应response 数据结构
BASE64解密RSA私钥
使用RSA 私钥,解密入参 encryKey,得到的AES key,
AES key,对出参做对称加密返回
微服务依赖调用
使用openFeign进行接口调用
feign包有服务提供方生成
网关
Gateway
路由
路由方案
兼容jlf平台
根据请求header中的version
1.0 为jlf平台,直接转发
新路由规则
根据请求header中的version
2.0 为jlf-pay支付系统
转发路径拼接
获取请求路径
鉴权
token 用户合法性验证
请求jlf平台系统,验证token有效性接口
验证token合法性
数据安全
数据签名
客户端生成签名规则
将所有参数按字典ASCII排序
拼接value后+动态盐,使用MD5生成特征值
String msg = nnotallow="f5a7d812bff41752cbd8a715aa4be13d"&encryType="SIGN"×tamp=1672207007¶ms="{\"flowNo\":\"4ee11edc9dee61189caf4833bfcb7052\"}"
md5(msg+dynicSalt)
服务端验证签名
首先验证时间戳,确定该请求处于当前时间的60s以内
验证nonce,在redis中查看24小时内的数据中是否存在该nonce
验证sign签名
将除了sign字段,所有参数按字典ASCII排序
拼接value后+动态盐,使用MD5生成特征值
String msg = nnotallow="f5a7d812bff41752cbd8a715aa4be13d"&encryType="SIGN"×tamp=1672207007¶ms="{\"flowNo\":\"4ee11edc9dee61189caf4833bfcb7052\"}"
md5(msg+dynicSalt)
使用生成的sign和入参中的sign做比较
数据加密
RSA
客户端加密请求业务入参
使用RSA公钥,对业务参数进行加密(分段加密)
Js rsa 分段加密参考https://www.jianshu.com/p/2811a81f7fe0
服务端解密请求业务入参
1.使用RSA私钥,对业务入参进行解密(分段加解密)
RSA+AES
客户端加密请求业务入参
动态生成AES key
AES 加密
RSA 公钥加密 AES key,传递给服务端
服务端解密请求业务入参
使用RSA私钥,解密encryKey生成AES key
AES 解密
数据转换
根据请求header中的version
1.0 为jlf平台,不做处理
2.0 为jlf-pay支付系统
安全验证方式
token 解析
通过token,解析出用户ID,放入header
签名SIGN
验证签名通过
读取业务入参params,路由转发时,重新写入请求body中
数据加密
解密通过后
将解密后的明文业务参数,路由转发时,重新写入请求body中