From b78065223b3d7af2801c67d0fd90be6b3c7f3c4c Mon Sep 17 00:00:00 2001
From: qitz <18810291185@163.com>
Date: Thu, 12 Oct 2023 10:04:57 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=94=A8=E5=8D=B0=E7=AD=BE?=
=?UTF-8?q?=E5=90=8D=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-common/pom.xml | 14 +-
.../domain/SealSignRecord.java | 161 ++++++
.../utils/EsignApplicaConfig.java | 13 +
.../utils/EsignCoreSdkInfo.java | 24 +
.../utils/EsignEncryption.java | 368 ++++++++++++++
.../wisdomarbitrate/utils/EsignFileBean.java | 53 ++
.../utils/EsignHeaderConstant.java | 26 +
.../utils/EsignHttpCfgHelper.java | 479 ++++++++++++++++++
.../utils/EsignHttpHelper.java | 168 ++++++
.../utils/EsignHttpResponse.java | 27 +
.../utils/EsignInterfacException.java | 34 ++
.../utils/EsignRequestType.java | 39 ++
.../utils/FileTransformation.java | 280 ++++++++++
.../wisdomarbitrate/utils/SignAward.java | 336 ++++++++++++
14 files changed, 2021 insertions(+), 1 deletion(-)
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/SealSignRecord.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignApplicaConfig.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignCoreSdkInfo.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignEncryption.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignFileBean.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignHeaderConstant.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignHttpCfgHelper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignHttpHelper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignHttpResponse.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignInterfacException.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignRequestType.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/FileTransformation.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/SignAward.java
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 3b55c2b..52dfb1d 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -138,12 +138,24 @@
tencentcloud-sdk-java
3.1.270
-
+
+
+ com.tencentcloudapi
+ tencentcloud-sdk-java-faceid
+ LATEST
+
+
+ com.tencentcloudapi
+ tencentcloud-sdk-java-common
+ LATEST
+
+
cn.hutool
diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/SealSignRecord.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/SealSignRecord.java
new file mode 100644
index 0000000..d7ae6fd
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/SealSignRecord.java
@@ -0,0 +1,161 @@
+package com.ruoyi.wisdomarbitrate.domain;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+public class SealSignRecord extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /** ID */
+ private Long id;
+ /** 文件id */
+ private String fileid;
+ /** 文件名称 */
+ private String filename;
+ /** 流程id */
+ private String signFlowid;
+ /** 签名人账户 */
+ private String pensonAccount;
+ /** 签名人姓名 */
+ private String pensonName;
+ /** 机构名称 */
+ private String orgnizeName;
+ /** 机构经办人 */
+ private String orgnizeNamePsnAccount;
+ /** 机构经办人名称 */
+ private String orgnizeNamepsnName;
+
+ public String getFileid() {
+ return fileid;
+ }
+
+ public void setFileid(String fileid) {
+ this.fileid = fileid;
+ }
+
+ public String getFilename() {
+ return filename;
+ }
+
+ public void setFilename(String filename) {
+ this.filename = filename;
+ }
+
+ public String getSignFlowid() {
+ return signFlowid;
+ }
+
+ public void setSignFlowid(String signFlowid) {
+ this.signFlowid = signFlowid;
+ }
+
+ public String getPensonAccount() {
+ return pensonAccount;
+ }
+
+ public void setPensonAccount(String pensonAccount) {
+ this.pensonAccount = pensonAccount;
+ }
+
+ public String getPensonName() {
+ return pensonName;
+ }
+
+ public void setPensonName(String pensonName) {
+ this.pensonName = pensonName;
+ }
+
+ public String getOrgnizeName() {
+ return orgnizeName;
+ }
+
+ public void setOrgnizeName(String orgnizeName) {
+ this.orgnizeName = orgnizeName;
+ }
+
+ public String getOrgnizeNamePsnAccount() {
+ return orgnizeNamePsnAccount;
+ }
+
+ public void setOrgnizeNamePsnAccount(String orgnizeNamePsnAccount) {
+ this.orgnizeNamePsnAccount = orgnizeNamePsnAccount;
+ }
+
+ public String getOrgnizeNamepsnName() {
+ return orgnizeNamepsnName;
+ }
+
+ public void setOrgnizeNamepsnName(String orgnizeNamepsnName) {
+ this.orgnizeNamepsnName = orgnizeNamepsnName;
+ }
+
+ public String getPositionPagepsn() {
+ return positionPagepsn;
+ }
+
+ public void setPositionPagepsn(String positionPagepsn) {
+ this.positionPagepsn = positionPagepsn;
+ }
+
+ public double getPositionXpsn() {
+ return positionXpsn;
+ }
+
+ public void setPositionXpsn(double positionXpsn) {
+ this.positionXpsn = positionXpsn;
+ }
+
+ public double getPositionYpsn() {
+ return positionYpsn;
+ }
+
+ public void setPositionYpsn(double positionYpsn) {
+ this.positionYpsn = positionYpsn;
+ }
+
+ public String getPositionPageorg() {
+ return positionPageorg;
+ }
+
+ public void setPositionPageorg(String positionPageorg) {
+ this.positionPageorg = positionPageorg;
+ }
+
+ public double getPositionXorg() {
+ return positionXorg;
+ }
+
+ public void setPositionXorg(double positionXorg) {
+ this.positionXorg = positionXorg;
+ }
+
+ public double getPositionYorg() {
+ return positionYorg;
+ }
+
+ public void setPositionYorg(double positionYorg) {
+ this.positionYorg = positionYorg;
+ }
+
+ /** 签名位置页数 */
+ private String positionPagepsn;
+ /** 签名位置x坐标 */
+ private double positionXpsn;
+ /** 签名位置y坐标 */
+ private double positionYpsn;
+ /** 印章位置页数 */
+ private String positionPageorg;
+ /** 印章位置x坐标 */
+ private double positionXorg;
+ /** 印章位置y坐标 */
+ private double positionYorg;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignApplicaConfig.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignApplicaConfig.java
new file mode 100644
index 0000000..4a1fdd1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignApplicaConfig.java
@@ -0,0 +1,13 @@
+package com.ruoyi.wisdomarbitrate.utils;
+
+public class EsignApplicaConfig {
+
+ // 应用ID
+ public static final String EsignAppId = "7438987614";
+ // 应用密钥
+ public static final String EsignAppSecret = "9d7844f13830931037772b9d20cf1529";
+ // e签宝接口调用域名(模拟环境)
+ public static final String EsignHost = "https://smlopenapi.esign.cn";
+ // e签宝接口调用域名(正式环境)
+ // public static final String EsignHost = "https://openapi.esign.cn";
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignCoreSdkInfo.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignCoreSdkInfo.java
new file mode 100644
index 0000000..113465e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignCoreSdkInfo.java
@@ -0,0 +1,24 @@
+package com.ruoyi.wisdomarbitrate.utils;
+/**
+ * esignSDK-core信息类
+ * @author 澄泓
+ * @date 2022/2/22 13:59
+ * @version
+ */
+public class EsignCoreSdkInfo {
+ private static final String SdkVersion="Esign-Sdk-Core1.0";
+ private static final String SupportedVersion="JDK1.7 MORE THAN";
+
+ private static final String Info="sdk-esign-api核心工具包,主要处理e签宝公有云产品接口调用时的签名计算以及网络请求,通过EsignHttpHelper.signAndBuildSignAndJsonHeader构造签名鉴权+json数据格式的请求头,通过HttpHelper.doCommHttp方法入参发起网络请求。让开发者无需关注具体的请求签名算法,专注于接口业务的json参数构造";
+ public static String getSdkVersion() {
+ return SdkVersion;
+ }
+
+ public static String getInfo() {
+ return Info;
+ }
+
+ public static String getSupportedVersion() {
+ return SupportedVersion;
+ }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignEncryption.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignEncryption.java
new file mode 100644
index 0000000..88cf70b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/utils/EsignEncryption.java
@@ -0,0 +1,368 @@
+/*
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.ruoyi.wisdomarbitrate.utils;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.message.BasicNameValuePair;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.Collator;
+import java.text.MessageFormat;
+import java.util.*;
+
+/**
+ * @description 请求数据通用处理类
+ */
+public class EsignEncryption {
+
+ /**
+ * 不允许外部创建实例
+ */
+ private EsignEncryption(){}
+
+ /**
+ * 拼接待签名字符串
+ * @param httpMethod
+ * @param url
+ * @return
+ */
+ public static String appendSignDataString(String httpMethod, String contentMd5,String accept,String contentType,String headers,String date, String url) throws EsignInterfacException {
+ StringBuffer sb = new StringBuffer();
+ sb.append(httpMethod).append("\n").append(accept).append("\n").append(contentMd5).append("\n")
+ .append(contentType).append("\n");
+
+ if ("".equals(date) || date == null) {
+ sb.append("\n");
+ } else {
+ sb.append(date).append("\n");
+ }
+ if ("".equals(headers) || headers == null) {
+ sb.append(url);
+ } else {
+ sb.append(headers).append("\n").append(url);
+ }
+ return new String(sb);
+ }
+
+ /***
+ * Content-MD5的计算方法
+ * @param str 待计算的消息
+ * @return MD5计算后摘要值的Base64编码(ContentMD5)
+ * @throws EsignInterfacException 加密过程中的异常信息
+ */
+ public static String doContentMD5(String str) throws EsignInterfacException {
+ byte[] md5Bytes = null;
+ MessageDigest md5 = null;
+ String contentMD5 = null;
+ try {
+ md5 = MessageDigest.getInstance("MD5");
+ // 计算md5函数
+ md5.update(str.getBytes("UTF-8"));
+ // 获取文件MD5的二进制数组(128位)
+ md5Bytes = md5.digest();
+ // 把MD5摘要后的二进制数组md5Bytes使用Base64进行编码(而不是对32位的16进制字符串进行编码)
+ contentMD5 = Base64.encodeBase64String(md5Bytes);
+
+ } catch (NoSuchAlgorithmException e) {
+ EsignInterfacException ex = new EsignInterfacException("不支持此算法",e);
+ ex.initCause(e);
+ throw ex;
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return contentMD5;
+ }
+
+ /***
+ * 计算请求签名值-HmacSHA256摘要
+ * @param message 待签名字符串
+ * @param secret 密钥APP KEY
+ * @return reqSignature HmacSHA256计算后摘要值的Base64编码
+ * @throws EsignInterfacException 加密过程中的异常信息
+ */
+ public static String doSignatureBase64(String message, String secret) throws EsignInterfacException {
+ String algorithm = "HmacSHA256";
+ Mac hmacSha256;
+ String digestBase64 = null;
+ try {
+ hmacSha256 = Mac.getInstance(algorithm);
+ byte[] keyBytes = secret.getBytes("UTF-8");
+ byte[] messageBytes = message.getBytes("UTF-8");
+ hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm));
+ // 使用HmacSHA256对二进制数据消息Bytes计算摘要
+ byte[] digestBytes = hmacSha256.doFinal(messageBytes);
+ // 把摘要后的结果digestBytes使用Base64进行编码
+ digestBase64 = Base64.encodeBase64String(digestBytes);
+ } catch (NoSuchAlgorithmException e) {
+ EsignInterfacException ex = new EsignInterfacException("不支持此算法",e);
+ ex.initCause(e);
+ throw ex;
+ } catch (InvalidKeyException e) {
+ EsignInterfacException ex = new EsignInterfacException("无效的密钥规范",e);
+ ex.initCause(e);
+ throw ex;
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return digestBase64;
+ }
+
+ /**
+ * 获取时间戳
+ * @return
+ */
+ public static String timeStamp() {
+ long timeStamp = System.currentTimeMillis();
+ return String.valueOf(timeStamp);
+ }
+
+ /**
+ * byte字节数组转换成字符串
+ * @param b
+ * @return
+ */
+ public static String byteArrayToHexString(byte[] b) {
+ StringBuilder hs = new StringBuilder();
+ String stmp;
+ for (int n = 0; b != null && n < b.length; n++) {
+ stmp = Integer.toHexString(b[n] & 0XFF);
+ if (stmp.length() == 1)
+ hs.append('0');
+ hs.append(stmp);
+ }
+ return hs.toString().toLowerCase();
+ }
+
+ /**
+ * hash散列加密算法
+ * @return
+ */
+ public static String Hmac_SHA256(String message,String key) throws EsignInterfacException {
+ byte[] rawHmac=null;
+ try {
+ SecretKeySpec sk = new SecretKeySpec(key.getBytes(), "HmacSHA256");
+ Mac mac = Mac.getInstance("HmacSHA256");
+ mac.init(sk);
+ rawHmac = mac.doFinal(message.getBytes());
+ }catch (InvalidKeyException e){
+ EsignInterfacException ex = new EsignInterfacException("无效的密钥规范",e);
+ ex.initCause(e);
+ throw ex;
+ } catch (NoSuchAlgorithmException e) {
+ EsignInterfacException ex = new EsignInterfacException("不支持此算法",e);
+ ex.initCause(e);
+ throw ex;
+ }catch (Exception e){
+ EsignInterfacException ex = new EsignInterfacException("hash散列加密算法报错",e);
+ ex.initCause(e);
+ throw ex;
+ }finally {
+ return byteArrayToHexString(rawHmac);
+ }
+
+ }
+
+ /**
+ * MD5加密32位
+ */
+ public static String MD5Digest(String text) throws EsignInterfacException {
+ byte[] digest=null;
+ try {
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
+ md5.update(text.getBytes());
+ digest = md5.digest();
+ }catch (NoSuchAlgorithmException e){
+ EsignInterfacException ex = new EsignInterfacException("不支持此算法",e);
+ ex.initCause(e);
+ throw ex;
+ }finally {
+ return byteArrayToHexString(digest);
+ }
+
+ }
+
+ public static void formDataSort(List param) {
+ Collections.sort(param, new Comparator() {
+ @Override
+ public int compare(BasicNameValuePair o1, BasicNameValuePair o2) {
+ Comparator