# ratel **Repository Path**: jiangpingcmt1/ratel ## Basic Information - **Project Name**: ratel - **Description**: ratel基于SpringBoot,致力于做简洁的交易对接脚手架,完美整合springboot、mybatis-plus、jetcache、swagger、spring-retry、shedlock等。项目代码简洁,注释丰富,同时支持java和kotlin双语言开发,maven和docker自动化打包部署,开箱即用。 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 94 - **Forks**: 27 - **Created**: 2018-07-20 - **Last Updated**: 2024-10-09 ## Categories & Tags **Categories**: code-generator **Tags**: None ## README `RATEL` # 功能简介 致力于做简洁的交易对接脚手架,在实际项目中经常要对接上下游系统,此时采用ratel对接简单高效。 ratel基于SpringBoot,项目代码简洁,注释丰富,同时支持java和kotlin双语言开发, maven和docker自动化打包部署,开箱即用。 # 项目结构 ratel ├─doc 项目pdm,和使用说明 │ ├─api API接口模块 │ ├─common 公共模块 │ ├─config 配置信息 │ ├─mannage 共通下沉,上游对接。 │ ├─persistence 持久层 │ ├─MysqlGenerator 代码自动生成 │ ├─web 接入层 │ # 通讯保密 1.合作方请求报文上送时,HTTP 表单提交六个参数:encryptData=加密后的请求报文;encryptKey=加密后的AES对称密钥; partnerNo=合作方标识;signature=请求报文签名;traceId=请求流水号(即订单号);ext=备用域。 2.平台异步回调报文时,HTTP 表单提交六个参数:encryptData=加密后的返回报文;encryptKey=加密后的AES对称密钥; signature=报文签名; traceId=请求流水号;ext=备用域。 注意:traceId(合作方请求交易流水号,唯一标识一笔交易,必须保证永远唯一(撤销交易除外,需要使用同一个traceId),长度不能超过32,建议可以包含日期)。 3.为了防止数据在传输过程中被截取和篡改,报文在通讯过程中使用AES数据加密算法和RSA数字签名算法来保证安全性和完整性。 其中,AES加密模式为"AES/ECB/PKCS5Padding", RSA加密模式为"RSA/ECB/PKCS1Padding",RSA签名算法为"SHA256WithRSA"。 4.详细步骤如下: 1. 合作方、平台方生成各自RSA公私钥、AES对称密钥。其中,合作方RSA公私钥为(partnerPubKey、partnerPriKey), 合作方AES对称密钥为partnerAESKey;平台方RSA公私钥为(platformPubKey、platformPriKey),平台方AES对称密钥为platformAESKey。生成密钥后交换各自RSA公钥。 2. 合作方请求报文时,需要用合作方AES对称密钥partnerAESKey加密请求报文:encryptData=AES.encryptToBase64(plainText,partnerAESKey), 其中encryptData是Base64编码的字符串;用合作方RSA私钥签名请求报文:signature=RSA.signToBase64(plainText,partnerPriKey),其中signature是Base64编码的字符串; 用平台方RSA公钥加密合作方AES对称密钥partnerAESKey:encryptKey=RSA.encryptToBase64(partnerAESKey,platformPubKey),其中encryptKey是Base64编码的字符串。 3. 平台方收到合作方请求报文(包含6个参数:encryptData、encryptKey、partnerNo、signature,traceId,ext),根据partner取出对应的密钥, 用平台方RSA私钥解密encryptKey:partnerAESKey=RSA.decryptFromBase64(encryptKey,platformPriKey);用解密得到的partnerAESKey解密encryptData:plainText=AES.decryptFromBase64(encryptData, partnerAESKey); 用合作方RSA公钥验证签名:boolean result=RSA.checkSignFromBase64(plainText,signature,partnerPubKey);根据报文中的txnCode得到获取配置进行解包,最后根据报文体callBack回调地址异步应答。 4. 同步应答返回内容首先采用json格式报文序列化, 用合作方AES加密返回内容json串,然后对加密结果进行Base64加码,同时平台私钥返回内容的json串进行签名, 然后对签名之后的json进行Base64加码, 然后把加密加码和签名加码的两个字段再次用json序列话,最后返回。 5. 同理,平台方应答报文,合作方端处理类似上述流程。需要注意的是,平台方每次通讯报文的AES密钥不一样。 ![1603984925642](https://bk-markdown.oss-cn-shanghai.aliyuncs.com/2020/10/29/1603984925642.jpg) # 技术选型 核心框架:SpringBoot 模板引擎:Thymeleaf 持久层框架:MyBatis-plus 连接池:Druid 缓存框架:Jetcache 、Jedis 日志管理:Slf4j,Logback 重试框架:Spring-retry 分布式调度: ShedLock 打包部署:Maven,Docker 数据库:Mysql,Redis 工具类:ApacheCommons、hutool-all、lombok、mica Jackson、fastjson、guava、 joda-time、httpclient、bcprov、jsr305等。 # 交流反馈 QQ群:642645792