Merge branch 'master' of http://git.hchbox.com/yuyou/client into master

# Conflicts:
#	src/main/java/com/yuyou/openapi/openapi/model/convert/ABMessageConverter.java
#	src/main/java/com/yuyou/openapi/openapi/model/dataobject/ABMessageDO.java
#	src/main/java/com/yuyou/openapi/openapi/service/impl/ABClientServiceImpl.java
master
土豆兄弟 4 years ago
commit 9fcfffb85a

2
.gitignore vendored

@ -18,6 +18,8 @@ target/
*.iws
*.iml
*.ipr
logs/
log/
### NetBeans ###
/nbproject/private/

@ -16,6 +16,11 @@
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>

@ -79,9 +79,8 @@ public class ABClient {
return CommonResponse.createByErrorMessage(ResponseCode.DECRYPT_ERROR.getDesc());
}
ABZMMessageDTO abzmMessageDTO = JSONUtil.toBean(jsonResult, ABZMMessageDTO.class);
// 处理具体逻辑
abClientService.recordZMClientMsg(abzmMessageDTO);
// 返回校验成功的结果
return CommonResponse.createBySuccess();
// 处理具体逻辑,返回校验成功的结果
return abClientService.recordZMClientMsg(abzmMessageDTO)?
CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试");
}
}

@ -1,35 +1,57 @@
package com.yuyou.openapi.openapi.common.enums;
import cn.hutool.core.util.StrUtil;
import javax.persistence.criteria.CriteriaBuilder;
/**
*
* @version 1.0
* @date 2020/8/10
*/
public enum GradeEnum {
FIRST_GRADE("X1", "一年级"),
SECOND_GRADE("X2","二年级"),
THIRD_GRADE("X3","三年级"),
FOURTH_GRADE("X4", "四年级"),
FIFTH_GRADE("X5", "五年级"),
SIXTH_GRADE("X6", "六年级"),
FIRST_MIDDLE("M1", "初一"),
SECOND_MIDDLE("M2", "初二"),
THIRD_MIDDLE("M3", "初三"),
FIRST_HIGH("H1", "高一"),
SECOND_HIGH("H2", "高二"),
THIRD_HIGH("H3", "高三"),
UNKNOW(0, "未知"),
FIRST_GRADE(1, "一年级"),
SECOND_GRADE(2,"二年级"),
THIRD_GRADE(3,"三年级"),
FOURTH_GRADE(4, "四年级"),
FIFTH_GRADE(5, "五年级"),
SIXTH_GRADE(6, "六年级"),
FIRST_MIDDLE(7, "初一"),
SECOND_MIDDLE(8, "初二"),
THIRD_MIDDLE(9, "初三"),
FIRST_HIGH(10, "高一"),
SECOND_HIGH(11, "高二"),
THIRD_HIGH(12, "高三"),
;
private String code;
private Integer code;
private String desc;
GradeEnum(String code, String desc){
GradeEnum(Integer code, String desc){
this.code = code;
this.desc = desc;
}
public String getCode() {
/**
* desc
* @param grade
* @return
*/
public static Integer codeOf(String grade) {
if (StrUtil.isBlank(grade)) {
return GradeEnum.UNKNOW.getCode();
}
for (GradeEnum gradeEnum : GradeEnum.values()) {
if (gradeEnum.getDesc().equals(grade)) {
return gradeEnum.getCode();
}
}
return GradeEnum.UNKNOW.getCode();
}
public Integer getCode() {
return code;
}

@ -1,11 +1,14 @@
package com.yuyou.openapi.openapi.common.enums;
import cn.hutool.core.util.StrUtil;
/**
*
* @version 1.0
* @date 2020/8/10
*/
public enum SubjectEnum {
UNKNOW(0, "未知"),
CHINESE(1, "语文"),
MATH(2, "数学"),
ENGLISH(3,"英语"),
@ -25,6 +28,24 @@ public enum SubjectEnum {
this.desc = desc;
}
/**
* subject
* @param subject
* @return
*/
public static Integer codeOf(String subject) {
if (StrUtil.isBlank(subject)) {
return SubjectEnum.UNKNOW.getCode();
}
for (SubjectEnum subjectEnum : SubjectEnum.values()) {
if (subjectEnum.getDesc().equals(subject)) {
return subjectEnum.getCode();
}
}
return SubjectEnum.UNKNOW.getCode();
}
public Integer getCode() {
return code;
}

@ -2,6 +2,9 @@ package com.yuyou.openapi.openapi.dao;
import com.yuyou.openapi.openapi.model.dataobject.ABMessageDO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
/**
@ -9,4 +12,8 @@ import org.springframework.stereotype.Repository;
*/
@Repository
public interface ABMessageRepository extends JpaRepository<ABMessageDO,Long> {
@Modifying
@Query("update ABMessageDO t set t.sendStatus = sendStatus where t.recId = id")
void updateSendStatus(@Param(value = "id") Long recId, @Param(value = "sendStatus") Integer sendStatus);
}

@ -1,11 +1,11 @@
package com.yuyou.openapi.openapi.model.convert;
import cn.hutool.core.date.DateUtil;
import com.yuyou.openapi.openapi.common.security.SecurityConstants;
import com.yuyou.openapi.openapi.common.security.SecurityService;
import com.yuyou.openapi.openapi.model.dataobject.ABMessageDO;
import com.yuyou.openapi.openapi.model.dto.ABMessageDTO;
import com.yuyou.openapi.openapi.model.vo.ABClientInterMessageVO;
import com.yuyou.openapi.openapi.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
@ -80,8 +80,8 @@ public class ABMessageConverter {
}
BeanUtils.copyProperties(abMessageDTO, abMessageDO);
abMessageDO.setPushTime(DateUtil.date(abMessageDTO.getTimestamp() * 1000));
abMessageDO.setStartTime(DateUtil.date(abMessageDTO.getStartTime() * 1000));
abMessageDO.setPushTime(DateUtils.date(abMessageDTO.getTimestamp()));
abMessageDO.setStartTime(DateUtils.date(abMessageDTO.getStartTime()));
try{
abMessageDO.setRecId(Long.valueOf(abMessageDTO.getRecId()));
}catch (Exception e){
@ -90,11 +90,13 @@ public class ABMessageConverter {
// AES加密
try {
SecurityService.encrypt(abMessageDTO.getMobile(), SecurityConstants.PHONE);
String encryptedMobile = SecurityService.encrypt(abMessageDTO.getMobile(), SecurityConstants.PHONE);
abMessageDO.setPnum(encryptedMobile);
} catch (Exception e) {
log.error("Encrypt Mobile raise Error, error is :", e);
log.error("Encrypt Mobile raise Error, recId = {}, error is :", abMessageDTO.getRecId(), e);
abMessageDO.setPnum(abMessageDTO.getMobile());
}
abMessageDO.setPnum(abMessageDTO.getMobile());
return abMessageDO;
}
}

@ -1,8 +1,18 @@
package com.yuyou.openapi.openapi.model.convert;
import com.yuyou.openapi.openapi.common.enums.GradeEnum;
import com.yuyou.openapi.openapi.common.enums.SubjectEnum;
import com.yuyou.openapi.openapi.common.security.SecurityConstants;
import com.yuyou.openapi.openapi.common.security.SecurityService;
import com.yuyou.openapi.openapi.model.dataobject.ZhangmenMessageDO;
import com.yuyou.openapi.openapi.model.dto.ABZMMessageDTO;
import com.yuyou.openapi.openapi.model.vo.ABClientZMMessageVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
*
@ -10,6 +20,7 @@ import com.yuyou.openapi.openapi.model.vo.ABClientZMMessageVO;
* @version 1.0
* @date 2020/8/10
*/
@Slf4j
public class ZhangmenMessageConverter {
/**
@ -22,13 +33,50 @@ public class ZhangmenMessageConverter {
return abzmMessageDTO;
}
/**
* DTODO
* @param list
* @return
*/
public static List<ZhangmenMessageDO> convertZhangmenMessageDOFromDTO(List<ABZMMessageDTO> list) {
if (CollectionUtils.isEmpty(list)) {
return null;
}
List<ZhangmenMessageDO> zhangmenMessageDOs = new ArrayList<>();
list.forEach(each -> {
ZhangmenMessageDO zhangmenMessageDO = convertZhangmenMessageDOFromDTO(each);
if (zhangmenMessageDO != null) {
zhangmenMessageDOs.add(zhangmenMessageDO);
}
});
return zhangmenMessageDOs;
}
/**
* DTODO
* @param abzmMessageDTO
* @return
*/
public static ZhangmenMessageDO convertZhangmenMessageDOFromDTO(ABZMMessageDTO abzmMessageDTO) {
if (abzmMessageDTO == null || abzmMessageDTO.getData() == null) {
return null;
}
ZhangmenMessageDO zhangmenMessageDO = new ZhangmenMessageDO();
BeanUtils.copyProperties(abzmMessageDTO.getData(), zhangmenMessageDO);
try {
String encryptedMobile = SecurityService.encrypt(abzmMessageDTO.getData().getMobile(), SecurityConstants.PHONE);
String encryptedName = SecurityService.encrypt(abzmMessageDTO.getData().getName(), SecurityConstants.SIMPLE);
zhangmenMessageDO.setPnum(encryptedMobile);
zhangmenMessageDO.setStuName(encryptedName);
}catch (Exception e) {
log.error("Encrypt data raise Error, recId = {}, error is :", abzmMessageDTO.getData().getRecId(), e);
zhangmenMessageDO.setPnum(abzmMessageDTO.getData().getMobile());
zhangmenMessageDO.setStuName(abzmMessageDTO.getData().getName());
}
zhangmenMessageDO.setStuGrade(GradeEnum.codeOf(abzmMessageDTO.getData().getGrade()));
zhangmenMessageDO.setStuSub(SubjectEnum.codeOf(abzmMessageDTO.getData().getCourse()));
return zhangmenMessageDO;
}
}

@ -55,7 +55,7 @@ public class ZhangmenMessageDO {
*
*/
@Column(name = "stu_grade")
private String stuGrade;
private Integer stuGrade;
/**
*

@ -19,10 +19,13 @@ public class ABZMMessageDTO {
/**
*
*/
private Data data;
private Datas data;
static class Tag {
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class Tag {
/**
*
*/
@ -44,8 +47,10 @@ public class ABZMMessageDTO {
private String tag_key_course;
}
static class Data {
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class Datas {
/**
* id

@ -23,10 +23,12 @@ public interface ABClientService {
*/
boolean recordAndSendABClientMsg(List<ABMessageDTO> dto);
boolean updateSendStatus(Long recId, boolean success);
/**
* ,
*
* @param dto Bean
*/
void recordZMClientMsg(ABZMMessageDTO dto);
boolean recordZMClientMsg(ABZMMessageDTO dto);
}

@ -1,8 +1,11 @@
package com.yuyou.openapi.openapi.service.impl;
import com.yuyou.openapi.openapi.dao.ABMessageRepository;
import com.yuyou.openapi.openapi.dao.ZhangmenMessageRepository;
import com.yuyou.openapi.openapi.model.convert.ABMessageConverter;
import com.yuyou.openapi.openapi.model.convert.ZhangmenMessageConverter;
import com.yuyou.openapi.openapi.model.dataobject.ABMessageDO;
import com.yuyou.openapi.openapi.model.dataobject.ZhangmenMessageDO;
import com.yuyou.openapi.openapi.model.dto.ABMessageDTO;
import com.yuyou.openapi.openapi.model.dto.ABZMMessageDTO;
import com.yuyou.openapi.openapi.service.ABClientService;
@ -35,8 +38,15 @@ public class ABClientServiceImpl implements ABClientService {
@Autowired
private ABMessageRepository abMessageRepository;
@Autowired
private ZhangmenMessageRepository zhangmenMessageRepository;
@Override
public boolean recordAndSendABClientMsg(List<ABMessageDTO> dtos) {
if (CollectionUtils.isEmpty(dtos)) {
log.error("Param dtos is empty");
return Boolean.FALSE;
}
// 调用接口进行入库
List<ABMessageDO> abMessageDOS = ABMessageConverter.convertABMessageDOFromDTO(dtos);
// TODO: 2020/8/10 0010 加密存储
@ -48,17 +58,42 @@ public class ABClientServiceImpl implements ABClientService {
// TODO: 2020/8/10 0010 解密 发送
// 调用异步任务进行转发AB单 - 这里是这有一条数据
// 返回处理结果
// TODO: 2020/8/11 0011 暂时关闭下游接口 - 进行测试
//abDownTask.doRunTask(dtos);
return Boolean.TRUE;
}
@Override
public boolean updateSendStatus(Long recId, boolean success) {
if (recId == null) {
return Boolean.FALSE;
}
if (success) {
abMessageRepository.updateSendStatus(recId, 1);
}else {
abMessageRepository.updateSendStatus(recId, 0);
}
return Boolean.TRUE;
}
/**
*
*
* @param dto Bean
*/
@Override
public void recordZMClientMsg(ABZMMessageDTO dto) {
// TODO: 2020/8/10 0010 补充具体的入库处理逻辑
public boolean recordZMClientMsg(ABZMMessageDTO dto) {
if (dto == null) {
log.error("Param dtos is empty");
return Boolean.FALSE;
}
ZhangmenMessageDO zhangmenMessageDO = ZhangmenMessageConverter.convertZhangmenMessageDOFromDTO(dto);
ZhangmenMessageDO result = zhangmenMessageRepository.save(zhangmenMessageDO);
if (result == null) {
return Boolean.FALSE;
}
return Boolean.TRUE;
}
}

@ -27,14 +27,21 @@ public class ABClientServiceProxy implements ABClientService {
public boolean recordAndSendABClientMsg(List<ABMessageDTO> list) {
// 解密List<ABMessageDTO>中的加密字段
list.forEach(each -> {
each.setActName(each.getActName());
// mobile不进行解密处理
each.setActName(decryptBase64Value(each.getActName()));
});
return abClientService.recordAndSendABClientMsg(list);
}
@Override
public void recordZMClientMsg(ABZMMessageDTO dto) {
public boolean updateSendStatus(Long recId, boolean success) {
return abClientService.updateSendStatus(recId, success);
}
@Override
public boolean recordZMClientMsg(ABZMMessageDTO dto) {
// TODO: DTO层数据解密
return abClientService.recordZMClientMsg(dto);
}
/**

@ -1,14 +1,13 @@
package com.yuyou.openapi.openapi.task;
import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.yuyou.openapi.openapi.model.dto.ABMessageDTO;
import com.yuyou.openapi.openapi.model.dto.ABMessageCovDTO;
import com.yuyou.openapi.openapi.model.dto.ABMessageDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
@ -43,13 +42,12 @@ public class ABDownTask {
* @return
*/
@Async(value = "abTaskExecutor")
public boolean doRunTask(List<ABMessageDTO> messageDTOList){
public void doRunTask(List<ABMessageDTO> messageDTOList){
Long satrtMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ task start running, task name is {} ] ======", "ABDownTask");
boolean resultTag = runTask(messageDTOList);
runTask(messageDTOList);
Long endMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ task start end, task name is {},cost milliSecond is {} ] ======", "ABDownTask", (endMilliSecond-satrtMilliSecond));
return resultTag;
}
/**
@ -65,7 +63,7 @@ public class ABDownTask {
List<ABMessageDTO> filterData = messageDTOList.stream()
.filter(item -> (1 == item.getClientType()) || 2 == item.getClientType())
.map(item -> {
StringUtils.reverse(Base64.encode(item.getMobile()));
StringUtils.reverse(item.getMobile());
return item;
})
.collect(Collectors.toList());
@ -82,6 +80,7 @@ public class ABDownTask {
// 调用HTTP请求发送数据
HttpResponse httpResponse = sendReq(jsonObject);
if (httpResponse.isOk() && httpResponse.body().contains("成功")){
log.info("========== [request success, response is {} ] ==========", httpResponse.body());
break;
}else{
count ++;

@ -0,0 +1,20 @@
package com.yuyou.openapi.openapi.utils;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
public class DateUtils {
public static DateTime date(Long date) {
if (date == null) {
return null;
}
if (date.toString().length() == 10) {
date = date * 1000;
}
if (date.toString().length() == 13) {
return DateUtil.date(date);
}
return null;
}
}

@ -124,6 +124,13 @@ public class SecurityOperationUtil {
}
}
private static String decryptBase64Value(String base64Value) {
if (StrUtil.isBlank(base64Value)) {
return base64Value;
}
return Base64.decodeStr(base64Value);
}
public static void main(String[] args) throws SecretException {
String decryptValue = aesDecrypt("DqkOjL726BFVqAj5TNkgyw==", "AnOQ&1^lyobm%vUX");
System.out.println(decryptValue);

@ -1,8 +0,0 @@
{
"properties": [
{
"name": "ab.customer.app_id",
"type": "java.lang.String",
"description": "Description for ab.customer.app_id."
}
] }

@ -1,12 +1,14 @@
spring:
profiles:
active: dev
active: prod
# 序列化忽略null的k-v配置
jackson:
default-property-inclusion: non_null
# JPA数据层相关配置
jpa:
show-sql: true
open-in-view: false
---
# 端口
server:
@ -17,13 +19,13 @@ spring:
# 数据库相关配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/push?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
url: jdbc:mysql://localhost:3306/push?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: root
# 下游请求配置信息
ab:
customer:
url: https://sandbox.openapi.ppke.com.cn/
url: http://sandbox.openapi.ppke.com.cn/openapi/tmk/clues/receive
app_id: YY9X8XCZ
thread_pool:
corePoolSize: 2
@ -41,16 +43,18 @@ spring:
# 数据库相关配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/push?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
url: jdbc:mysql://localhost:3306/push?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: Yuyou@2020
# 下游请求配置信息
ab:
customer:
url: https://openapi.ppke.com.cn/
app_id: app_id
url: https://openapi.ppke.com.cn/openapi/tmk/clues/receive
app_id: YY9X8XCZ
thread_pool:
corePoolSize: 2
maxPoolSize: 16
queueCapacity: 3
ThreadNamePrefix: "AB-Req-"
logging:
config: classpath:logback.xml

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration scan="false" debug="false">
<!-- TODO 非dev环境用/tmp/gateway/${MODULE_NAME}dev环境可以用${user.dir}/logs/warn_nginx_plus -->
<property name="LOG_DIR" value="./log/" />
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss:SS} %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{50}) - %cyan(%msg%n)" />
<appender name="stdAppender" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi> <!-- 如果是UTF-8的环境这句要注释掉 -->
<encoder>
<pattern>%highlight([%-5level]) %cyan(%d{yyyy-MM-dd#HH:mm:ss.SSS}) %yellow([Thread:%thread]) %magenta([Logger:%logger]) -> %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/log.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天归档,如果按小时后面加-hh -->
<fileNamePattern>${LOG_DIR}/history/%d{yyyy-MM-dd}.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 不写TRACE DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<root level="INFO">
<!-- TODO prod 环境去掉std -->
<!--<appender-ref ref="stdAppender"/>-->
<appender-ref ref="fileAppender"/>
</root>
</configuration>

@ -19,6 +19,7 @@ public class RSATest {
// 待加密字符串
String str = "{\"tag\":{\"tag_key_name\":\"学生姓名\",\"tag_key_mobile\":\"联系方式\",\"tag_key_grade\":\"课程年级\",\"tag_key_course\":\"课程科目\"},\"data\":{\"name\":\"张小兵\",\"mobile\":\"13011112222\",\"grade\":\"三年级\",\"course\":\"数学\"}}";
str = "JTdCJTIydGFnJTIyJTNBJTdCJTIydGFnX2tleV9pZCUyMiUzQSUyMklEJXU2ODA3JXU4QkM2JTIyJTJDJTIydGFnX2tleV9uYW1lJTIyJTNBJTIyJXU1QjY2JXU3NTFGJXU1OUQzJXU1NDBEJTIyJTJDJTIydGFnX2tleV8lMjBtb2JpbGUlMjIlM0ElMjIldTgwNTQldTdDRkIldTY1QjkldTVGMEYlMjIlMkMlMjJ0YWdfa2V5XyUyMGdyYWRlJTIyJTNBJTIyJXU4QkZFJXU3QTBCJXU1RTc0JXU3RUE3JTIyJTJDJTIydGFnX2tleV8lMjBjb3Vyc2UlMjIlM0ElMjIldThCRkUldTdBMEIldTc5RDEldTc2RUUlMjIlN0QlMkMlMjJkYXRhJTIyJTNBJTdCJTIybmFtZSUyMiUzQSUyMiV1NUYyMCV1NUMwRiV1NTE3NSUyMiUyQyUyMm1vYmlsZSUyMiUzQSUyMjEzMDExMTEyMjIyJTIyJTJDJTIyZ3JhZGUlMjIlM0ElMjIldTRFMDkldTVFNzQldTdFQTclMjIlMkMlMjJjb3Vyc2UlMjIlM0ElMjIldTY1NzAldTVCNjYlMjIlN0QlN0Q=";
//先用Base64编码
String encode = Base64.encode(str);
System.out.println("Base64加密后的内容为:" + encode);
@ -71,6 +72,8 @@ public class RSATest {
// 公钥加密,私钥解密
byte[] encrypt = rsa.encrypt(StrUtil.bytes(encode, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
System.out.println("加密串" + StrUtil.str(encrypt, CharsetUtil.CHARSET_UTF_8));
// System.out.println("加密"+ Arrays.toString(encrypt));
byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey);
//Base64解码

Loading…
Cancel
Save