RSA三方调用
github项目demo
整体项目结构
├─ExposedInterface 服务提供方的单独接口依赖包(里面只有实体和暴露接口) 根据服务提供者每次打包release 正式版本包
│ ├─src
│ │ ├─main
│ │ │ ├─java
│ │ │ │ └─com
│ │ │ │ └─weroom
│ │ │ │ ├─domain 实体对象
│ │ │ │ │ ├─dto
│ │ │ │ │ ├─enums
│ │ │ │ │ └─vo
│ │ │ │ ├─fallback 熔断实现
│ │ │ │ └─openfeign 暴露接口(htpp请求 ip+端口)
│ │ │ └─resources 打包 release1.0
│ │ └─test
│ │ └─java
├─ServerCustomer 服务消费者
│ ├─src
│ │ ├─main
│ │ │ ├─java
│ │ │ │ └─com
│ │ │ │ └─weroom
│ │ │ │ ├─config 配置文件
│ │ │ │ ├─controller 消费者mvc
│ │ │ │ ├─domain 消费者实体
│ │ │ │ │ ├─dto
│ │ │ │ │ ├─enums
│ │ │ │ │ └─vo
│ │ │ │ ├─service 消费者自己的业务逻辑 依赖服务提供者的暴露接口 引进依赖
│ │ │ │ │ └─impl 组装加密数据 调用依赖接口
│ │ │ │ └─util 加解密工具包
│ │ │ └─resources 引入服务提供方依赖包(也就是第一个release1.0包)
│ │ └─test
│ │ └─java
└─ServerProvider 服务提供者
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─weroom
│ │ │ ├─config 配置文件
│ │ │ ├─controller 服务提供者的提供的对外接口 第一个项目的expose暴露接口从这里面单独抽出去
│ │ │ ├─domain 服务提供者实体
│ │ │ │ ├─dto
│ │ │ │ ├─enums
│ │ │ │ └─vo
│ │ │ ├─service 服务提供者接受来到服务消费者的请求,进行解密
│ │ │ │ └─impl
│ │ │ └─util 加解密工具类
│ │ └─resources
│ └─test
│ └─java
服务提供方
支付
允许已授权的用户通过此接口更新自己的信息。
:::tips
- URL:
/provider
- Method:
POST
- 需要登录:是
- 需要鉴权:是
:::
请求参数
参数 | 类型 | 是否必传 | 说明 | |
---|---|---|---|---|
data | String | 是 | 加密数据 | |
encryptKey | String | 是 | rsa加密之后的key | |
now | String | 是 | 时间搓 |
:::info
💡 注意,data是泛型T,对象转成string,然后加密,解密出来需要根据提供的DTO转成对应实体
:::
请求示例
可以仅传递部分请求参数。
{"data": "rjvPAvCy/BjE55r7mzE+r22Rt5kC7fIEzBaHAMjlvsZalC+pOSPLSBnfqYikMsG1vx/CFB5nVLiGcVT0kKLwNVCRPx/qZbV+6rZxwr7nB7CX8f5vGmlMd1EpCDdwMt9T5tFbIn0iyBtPWwq5RwAjyb+RWKnISexso339tJquveY=","encryptKey": "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALM9gyzoliA8R2da9tqfh5c7V/Zcn5etZDNmeqv/1YROoe5O4Vo8N4lBSGP+IKSXsSfCm13v3ZDrxqUpb6YCBnz17W3DR9TxUNQraB4y286fRPsl6N/OMB8EhhCTKuvHyjqgq8sIY5ymg9PVsIetJglVp870hRRDYvJdRaUyf5DpAgMBAAECgYBz+QT69bLNQLNiqHS4mCf/LiKIAP4yAbqnl1MgHvRkGwyjSN5+qB+260qPiEpOtOenNj+Y1C6kKinpi5n167GN60Y6gM/vVHSUA/lv2v/fR4vDRj9CMYu2vNuKrWV3F3y577/qkuCIWaD+iXU9WsQTsuL3UkP5iz3sVgD9K7kwAQJBAOPjKmmKEghwGaCXx05E0BF7UHT4b7BZhCPdCj115PAL0xNqqKYyRhYGfndopcB16Jl7fJJLxjj+02V2YsfkW4ECQQDJWgofvt8Qjf4VLUnl98rnQ6xF2UbXdSOm9JCILU7rtz92TVC7bWy4R0mqX+S5zFGR5Znnk7f2HAP+kDAn3olpAkAkeQIbvB5gvVhMrJ4Yd8j5U0wwPGbbyafteX4fEhRfGvVgYSy21MsE0WtCPzxwDi75CZuJaplCG/7HeWgb5/+BAkBtXnkNUVI83cPboOP5BCW0hK+4qRKvybL55vHy5hluM/VGvyxRAlkBp8c9wiStP2w3QW3dugE8r28EATIHFfuxAkAxV4hHGD6BbHRiCtSMNOQ3XGOZGdlmR4PfPFabv+jfAyoECHe4QHdkBBqdNKTyVVQUpNqPsJ0EsfBTplZlDxTu","now": "1681438549828"
}
解密实现
String server = null;
try {Req.data = providerDTO.getData();Req.encryptkey =providerDTO.getEncryptKey();server = RSA.server();
} catch (Exception e) {
}
return CommonResult.success(ProviderVO.builder().data(server).build());
成功响应
:::tips
条件:请求参数合法,并且用户身份校验通过。
状态码:200 OK
响应示例:
:::
{"code": 200,"message": "","data": "{"content":"ccsadfjaslkf;jasd;lfj","id":1,"orderNo":"111","type":1}","now": "1681439866355"
}
错误响应
:::tips
条件:非法的秘钥,io文件流异常。
状态码:500 BAD REQUEST
响应示例:
:::
{"code": 500,"message": "非法的文件秘钥","data": "","now": "1681439866355"
}
服务消费者
支付
允许已授权的用户通过此接口更新自己的信息。
:::tips
- URL:
/customer
- Method:
POST
- 需要登录:是
- 需要鉴权:是
:::
引入依赖
<dependencies><dependency><groupId>com.exposed</groupId><artifactId>ExposedInterface</artifactId><version>1.0.RELEASE</version></dependency></dependencies>
请求参数
参数 | 类型 | 是否必传 | 说明 | |
---|---|---|---|---|
data | String | 是 | 加密数据 | |
encryptKey | String | 是 | rsa加密之后的key | |
now | String | 是 | 时间搓 |
:::info
💡 注意,data是泛型T,对象转成string,然后加密,解密出来需要根据提供的DTO转成对应实体
:::
请求示例
可以仅传递部分请求参数。
{"data": "rjvPAvCy/BjE55r7mzE+r22Rt5kC7fIEzBaHAMjlvsZalC+pOSPLSBnfqYikMsG1vx/CFB5nVLiGcVT0kKLwNVCRPx/qZbV+6rZxwr7nB7CX8f5vGmlMd1EpCDdwMt9T5tFbIn0iyBtPWwq5RwAjyb+RWKnISexso339tJquveY=","encryptKey": "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALM9gyzoliA8R2da9tqfh5c7V/Zcn5etZDNmeqv/1YROoe5O4Vo8N4lBSGP+IKSXsSfCm13v3ZDrxqUpb6YCBnz17W3DR9TxUNQraB4y286fRPsl6N/OMB8EhhCTKuvHyjqgq8sIY5ymg9PVsIetJglVp870hRRDYvJdRaUyf5DpAgMBAAECgYBz+QT69bLNQLNiqHS4mCf/LiKIAP4yAbqnl1MgHvRkGwyjSN5+qB+260qPiEpOtOenNj+Y1C6kKinpi5n167GN60Y6gM/vVHSUA/lv2v/fR4vDRj9CMYu2vNuKrWV3F3y577/qkuCIWaD+iXU9WsQTsuL3UkP5iz3sVgD9K7kwAQJBAOPjKmmKEghwGaCXx05E0BF7UHT4b7BZhCPdCj115PAL0xNqqKYyRhYGfndopcB16Jl7fJJLxjj+02V2YsfkW4ECQQDJWgofvt8Qjf4VLUnl98rnQ6xF2UbXdSOm9JCILU7rtz92TVC7bWy4R0mqX+S5zFGR5Znnk7f2HAP+kDAn3olpAkAkeQIbvB5gvVhMrJ4Yd8j5U0wwPGbbyafteX4fEhRfGvVgYSy21MsE0WtCPzxwDi75CZuJaplCG/7HeWgb5/+BAkBtXnkNUVI83cPboOP5BCW0hK+4qRKvybL55vHy5hluM/VGvyxRAlkBp8c9wiStP2w3QW3dugE8r28EATIHFfuxAkAxV4hHGD6BbHRiCtSMNOQ3XGOZGdlmR4PfPFabv+jfAyoECHe4QHdkBBqdNKTyVVQUpNqPsJ0EsfBTplZlDxTu","now": "1681438549828"
}
加密实现
try {TreeMap<String,Object> treeMap = Maps.newTreeMap();//providerDTO.getData() 可以是任何对象 需要加密的数据OrderDTO orderDTO = new OrderDTO();orderDTO.setOrderNo("111");orderDTO.setContent("ccsadfjaslkf;jasd;lfj");orderDTO.setType(1);orderDTO.setId(1);treeMap.put("data",orderDTO);Req client = RSA.client(treeMap);providerDTO.setData(Req.data);providerDTO.setEncryptKey(Req.encryptkey);} catch (Exception e) {}return this.openFeignService.pay(providerDTO).getData();
成功响应
:::tips
条件:请求参数合法,并且用户身份校验通过。
状态码:200 OK
响应示例:
:::
{"code": 200,"message": "","data": "{"content":"ccsadfjaslkf;jasd;lfj","id":1,"orderNo":"111","type":1}","now": "1681439866355"
}
错误响应
:::tips
条件:非法的秘钥,io文件流异常。
状态码:500 BAD REQUEST
响应示例:
:::
{"code": 500,"message": "非法的文件秘钥","data": "","now": "1681439866355"
}
服务提供方抽出的暴露接口
openfeign
package com.weroom;import com.weroom.domain.CommonResult;
import com.weroom.domain.dto.ProviderDTO;
import com.weroom.domain.vo.ProviderVO;
import com.weroom.fallback.ProviderFallback;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;@Component
@FeignClient(name = "settle", url = "192.168.0.154:8890", fallback = ProviderFallback.class, path = "/provider/")
public interface OpenFeignService {@ApiOperation(value = "支付")@LoadBalanced@PostMapping("pay")CommonResult<ProviderVO> pay(@RequestBody ProviderDTO providerDTO);@LoadBalanced@PostMapping("refund")CommonResult<ProviderVO> refund(@RequestBody ProviderDTO providerDTO);@ApiOperation(value = "分账")@LoadBalanced@PostMapping("sub-account")CommonResult<ProviderVO> subAccount(@RequestBody ProviderDTO providerDTO);
}