RSA加解密三方调用

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
  • MethodPOST
  • 需要登录:是
  • 需要鉴权:是
    :::

请求参数

参数类型是否必传说明
dataString加密数据
encryptKeyStringrsa加密之后的key
nowString时间搓

:::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
  • MethodPOST
  • 需要登录:是
  • 需要鉴权:是
    :::

引入依赖

<dependencies>
  <dependency>
    <groupId>com.exposed</groupId>
    <artifactId>ExposedInterface</artifactId>
    <version>1.0.RELEASE</version>
  </dependency>

</dependencies>

请求参数

参数类型是否必传说明
dataString加密数据
encryptKeyStringrsa加密之后的key
nowString时间搓

:::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);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值