From f9230eacc8060a51a3f2bc50bcb91e4f9ed21c09 Mon Sep 17 00:00:00 2001 From: qitz <18810291185@163.com> Date: Thu, 12 Oct 2023 13:12:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=AD=BE=E5=90=8D=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/utils/EsignApplicaConfig.java | 13 + .../com/ruoyi/common/utils/SignAward.java | 360 ++++++++++++++++++ .../common/utils/bean/SealSignRecord.java | 161 ++++++++ 3 files changed, 534 insertions(+) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/EsignApplicaConfig.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/SignAward.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/SealSignRecord.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/EsignApplicaConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/EsignApplicaConfig.java new file mode 100644 index 0000000..0d5bda7 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/EsignApplicaConfig.java @@ -0,0 +1,13 @@ +package com.ruoyi.common.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-common/src/main/java/com/ruoyi/common/utils/SignAward.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SignAward.java new file mode 100644 index 0000000..5301908 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SignAward.java @@ -0,0 +1,360 @@ +package com.ruoyi.common.utils; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.ruoyi.common.core.domain.entity.EsignHttpResponse; +import com.ruoyi.common.enums.EsignRequestType; +import com.ruoyi.common.exception.EsignDemoException; +import com.ruoyi.common.utils.bean.SealSignRecord; + +import java.util.Map; + +public class SignAward { + + private static String eSignHost= EsignApplicaConfig.EsignHost; + private static String eSignAppId= EsignApplicaConfig.EsignAppId; + private static String eSignAppSecret= EsignApplicaConfig.EsignAppSecret; +// public static String fileId = "95d0c307d91e4985bdb8874f6f84daa5"; + public static String fileId = "a0c2ad21065f48ff8b872412c39d5d3a"; + + + + public static void main(String[] args) throws EsignDemoException { + Gson gson = new Gson(); + + SealSignRecord sealSignRecord = new SealSignRecord(); + + sealSignRecord.setFileid("a808f1f39a744357a2f018e4ab34c55d"); + sealSignRecord.setFilename("23893bfd3f2249ffa5c82850c11c482e.pdf"); + sealSignRecord.setSignFlowid("41e6732b48c54c63a91b2379c352212d"); + + + sealSignRecord.setPensonAccount("18209231185"); + sealSignRecord.setPensonName("秦桃则"); + sealSignRecord.setOrgnizeName("西安云美电子科技有限公司"); + sealSignRecord.setOrgnizeNamePsnAccount("17691338406"); + sealSignRecord.setOrgnizeNamepsnName("韩超勃"); + sealSignRecord.setPositionPagepsn("2"); + + sealSignRecord.setPositionXpsn(279+20); + sealSignRecord.setPositionYpsn(216.336-20); + + sealSignRecord.setPositionPageorg("2"); + + sealSignRecord.setPositionXorg(342+30); + sealSignRecord.setPositionYorg(185.136); + + + + + /* 发起签署*/ +// EsignHttpResponse createByFile = createByFile(sealSignRecord); +// JsonObject createByFileJsonObject = gson.fromJson(createByFile.getBody(), JsonObject.class); +// JsonObject createByFileData = createByFileJsonObject.getAsJsonObject("data"); +// String signFlowId = createByFileData.get("signFlowId").getAsString(); +// System.err.println("流程id:"+signFlowId); + + /* 获取文件签名印章位置*/ + EsignHttpResponse positions = getPositions(sealSignRecord); + JsonObject positionsJsonObject = gson.fromJson(positions.getBody(), JsonObject.class); + JsonObject positionsData = positionsJsonObject.getAsJsonObject("data"); + JsonArray keywordPositions = positionsData.get("keywordPositions").getAsJsonArray(); + System.out.println("获取文件签名印章位置:" +keywordPositions.toString()); + +// String signFlowId = "c9955453716344f9971d308abdc13464"; + //获取合同文件签名链接 +// EsignHttpResponse signUrl = signUrl(sealSignRecord); +// JsonObject signUrlJsonObject = gson.fromJson(signUrl.getBody(), JsonObject.class); +// JsonObject signUrlData = signUrlJsonObject.getAsJsonObject("data"); +// String shortUrl = signUrlData.get("shortUrl").getAsString(); +// String url = signUrlData.get("url").getAsString(); +// System.out.println("签署短链接:" +shortUrl); +// System.out.println("签署长链接:"+url); + + //获取合同文件用印链接 +// EsignHttpResponse usesealUrl = usesealUrl(sealSignRecord); +// JsonObject usesealUrlJsonObject = gson.fromJson(usesealUrl.getBody(), JsonObject.class); +// JsonObject usesealUrlData = usesealUrlJsonObject.getAsJsonObject("data"); +// String shortusesealUrl = usesealUrlData.get("shortUrl").getAsString(); +// String sealUrl = usesealUrlData.get("url").getAsString(); +// System.out.println("签署长链接:" +shortusesealUrl); +// System.out.println("签署短链接:"+sealUrl); + + //查询签署流程详情 +// EsignHttpResponse signFlowDetail = signFlowDetail(sealSignRecord); +// JsonObject signFlowDetailJsonObject = gson.fromJson(signFlowDetail.getBody(),JsonObject.class); +// System.out.println(signFlowDetailJsonObject); + + + } + + /** + * 查询签署流程详情 + * @return + */ + public static EsignHttpResponse signFlowDetail(SealSignRecord sealSignRecord) throws EsignDemoException { + String signFlowId = sealSignRecord.getSignFlowid(); + String apiaddr= "/v3/sign-flow/"+ signFlowId + "/detail"; + String jsonParm = null; + //请求方法 + EsignRequestType requestType = EsignRequestType.GET; + //生成签名鉴权方式的的header + Map header = EsignHttpHelper.signAndBuildSignAndJsonHeader(eSignAppId,eSignAppSecret,jsonParm,requestType.name(),apiaddr,true); + //发起接口请求 + return EsignHttpHelper.doCommHttp(eSignHost, apiaddr,requestType , jsonParm, header,true); + } + + + /** + * 发起签署 + * @return + * @throws EsignDemoException + */ + public static EsignHttpResponse createByFile(SealSignRecord sealSignRecord) throws EsignDemoException { + String apiaddr = "/v3/sign-flow/create-by-file"; + + String fileId = sealSignRecord.getFileid(); + String fileName = sealSignRecord.getFilename(); + + String psnAccount = sealSignRecord.getPensonAccount(); + String psnName = sealSignRecord.getPensonName(); + + String orgName = sealSignRecord.getOrgnizeName(); + String orgNamePsnAccount = sealSignRecord.getOrgnizeNamePsnAccount(); + String orgNamepsnName = sealSignRecord.getOrgnizeNamepsnName(); + + String positionPagepsn = sealSignRecord.getPositionPagepsn(); + double positionXpsn = sealSignRecord.getPositionXpsn(); + double positionYpsn = sealSignRecord.getPositionYpsn(); + + String positionPageorg = sealSignRecord.getPositionPageorg(); + double positionXorg = sealSignRecord.getPositionXorg(); + double positionYorg = sealSignRecord.getPositionYorg(); + + + String jsonParm = "{\n" + + " \"docs\": [\n" + + " {\n" + + +// " \"fileId\": \"5bd34a81e8084acaab3287c019e82fe8\",\n" + + " \"fileId\": \"" + fileId + "\",\n" + + +// " \"fileName\": \"477470a7741b4536a200c792b6ddf966.pdf\"\n" + + " \"fileName\": \"" + fileName + "\"\n" + + + " }\n" + + " ],\n" + + " \"signFlowConfig\": {\n" + + " \"signFlowTitle\": \"测试合同\",\n" + + " \"autoStart\": true,\n" + + " \"authConfig\": {\n" + + " \"willingnessAuthModes\": [\n" + + " \"CODE_SMS\"\n" + + " ],\n" + + " \"psnAvailableAuthModes\": [\n" + + " \"PSN_MOBILE3\"\n" + + " ],\n" + + " \"orgAvailableAuthModes\": [\n" + + " \"ORG_LEGALREP\"\n" + + " ]\n" + + " },\n" + + " \"autoFinish\": true\n" + + " },\n" + + + " \"signers\": [\n" + + + " {\n" + + + " \"psnSignerInfo\": {\n" + + +// " \"psnAccount\": \"18209231185\",\n" + + " \"psnAccount\": \"" + psnAccount + "\",\n" + + + " \"psnInfo\": {\n" + + +// " \"psnName\": \"秦桃则\"\n" + + " \"psnName\": \"" + psnName + "\"\n" + + " }\n" + + + + " },\n" + + + + " \"signFields\": [\n" + + " {\n" + + +// " \"fileId\": \"5bd34a81e8084acaab3287c019e82fe8\",\n" + + " \"fileId\": \"" + fileId + "\",\n" + + + " \"normalSignFieldConfig\": {\n" + + " \"autoSign\": false,\n" + + " \"freeMode\": false,\n" + + " \"movableSignField\": false,\n" + + " \"signFieldPosition\": {\n" + + +// " \"positionPage\": \"2\",\n" + + " \"positionPage\": \"" + positionPagepsn + "\",\n" + + +// " \"positionX\": 310.0,\n" + + " \"positionX\": " + positionXpsn + ",\n" + + +// " \"positionY\": 247.536\n" + + " \"positionY\": " + positionYpsn + "\n" + + + " },\n" + + " \"signFieldStyle\": 1\n" + + " },\n" + + " \"signFieldType\": 0\n" + + " }\n" + + " ],\n" + + " \"signerType\": 0\n" + + " },\n" + + + + " {\n" + + " \"orgSignerInfo\": {\n" + + +// " \"orgName\": \"西安云美电子科技有限公司\",\n" + + " \"orgName\": \"" + orgName + "\",\n" + + + " \"transactorInfo\": {\n" + + + +// " \"psnAccount\": \"17691338406\",\n" + + " \"psnAccount\": \"" + orgNamePsnAccount + "\",\n" + + + " \"psnInfo\": {\n" + + +// " \"psnName\": \"韩超勃\"\n" + + " \"psnName\": \"" + orgNamepsnName + "\"\n" + + " }\n" + + + " }\n" + + " },\n" + + + " \"signFields\": [\n" + + " {\n" + + +// " \"fileId\": \"5bd34a81e8084acaab3287c019e82fe8\",\n" + + " \"fileId\": \"" + fileId + "\",\n" + + + " \"normalSignFieldConfig\": {\n" + + " \"autoSign\": false,\n" + + " \"freeMode\": false,\n" + + + " \"signFieldPosition\": {\n" + + +// " \"positionPage\": \"2\",\n" + + " \"positionPage\": \"" + positionPageorg + "\",\n" + + +// " \"positionX\": 340.0,\n" + + " \"positionX\": " + positionXorg + ",\n" + + +// " \"positionY\": 340.736\n" + + " \"positionY\": " + positionYorg + "\n" + + " },\n" + + " \"signFieldStyle\": 1\n" + + " },\n" + + " \"signFieldType\": 0\n" + + " }\n" + + " ],\n" + + " \"signerType\": 1\n" + + " }\n" + + + " ]\n" + + "}"; + + //请求方法 + EsignRequestType requestType = EsignRequestType.POST; + //生成请求签名鉴权方式的Header + Map header = EsignHttpHelper.signAndBuildSignAndJsonHeader(eSignAppId, eSignAppSecret, jsonParm, requestType.name(), apiaddr, true); + //发起接口请求 + return EsignHttpHelper.doCommHttp(eSignHost, apiaddr, requestType, jsonParm, header, true); + } + + /** + * 获取合同文件签名链接 + * @return + * @throws EsignDemoException + */ + public static EsignHttpResponse signUrl(SealSignRecord sealSignRecord) throws EsignDemoException { + + String signFlowId = sealSignRecord.getSignFlowid(); + String psnAccount = sealSignRecord.getPensonAccount(); + + String apiaddr = "/v3/sign-flow/" + signFlowId + "/sign-url"; + String jsonParm = "{\n" + + " \"operator\": {\n" + +// " \"psnAccount\":\"18209231185\"\n" + + " \"psnAccount\": \"" + psnAccount + "\"\n" + + " }\n" + + "}"; + //请求方法 + EsignRequestType requestType = EsignRequestType.POST; + //生成请求签名鉴权方式的Header + Map header = EsignHttpHelper.signAndBuildSignAndJsonHeader(eSignAppId, eSignAppSecret, jsonParm, requestType.name(), apiaddr, true); + //发起接口请求 + return EsignHttpHelper.doCommHttp(eSignHost, apiaddr, requestType, jsonParm, header, true); + } + + /** + * 获取合同文件用印链接 + * @return + * @throws EsignDemoException + */ + public static EsignHttpResponse usesealUrl(SealSignRecord sealSignRecord) throws EsignDemoException { + String signFlowId = sealSignRecord.getSignFlowid(); + String apiaddr = "/v3/sign-flow/" + signFlowId + "/sign-url"; + + String psnAccount = sealSignRecord.getOrgnizeNamePsnAccount(); + String orgName = sealSignRecord.getOrgnizeName(); + + String jsonParm = "{\n" + +// " \"needLogin\": true,\n" + + " \"operator\": {\n" + + +// " \"psnAccount\":\"17691338406\"\n" + + " \"psnAccount\": \"" + psnAccount + "\"\n" + + " },\n" + + " \"organization\": {\n" + + +// " \"orgName\": \"西安云美电子科技有限公司\"\n" + + " \"orgName\": \"" + orgName + "\"\n" + + + " }\n" + + "}"; + //请求方法 + EsignRequestType requestType = EsignRequestType.POST; + //生成请求签名鉴权方式的Header + Map header = EsignHttpHelper.signAndBuildSignAndJsonHeader(eSignAppId, eSignAppSecret, jsonParm, requestType.name(), apiaddr, true); + //发起接口请求 + return EsignHttpHelper.doCommHttp(eSignHost, apiaddr, requestType, jsonParm, header, true); + } + + /** + * 获取文件签名印章位置 + * @return + * @throws EsignDemoException + */ + public static EsignHttpResponse getPositions(SealSignRecord sealSignRecord) throws EsignDemoException { + String fileId = sealSignRecord.getFileid(); + String apiaddr = "/v3/files/" + fileId + "/keyword-positions"; + String jsonParm = "{\n" + + " \"keywords\": [\n" + + " \"仲裁员:\",\n" + + " \"(仲裁委员会盖章)\"\n" + + " ]\n" + + "}"; + //请求方法 + EsignRequestType requestType = EsignRequestType.POST; + //生成请求签名鉴权方式的Header + Map header = EsignHttpHelper.signAndBuildSignAndJsonHeader(eSignAppId, eSignAppSecret, jsonParm, requestType.name(), apiaddr, true); + //发起接口请求 + return EsignHttpHelper.doCommHttp(eSignHost, apiaddr, requestType, jsonParm, header, true); + } + + + + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/SealSignRecord.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/SealSignRecord.java new file mode 100644 index 0000000..b16f39b --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/SealSignRecord.java @@ -0,0 +1,161 @@ +package com.ruoyi.common.utils.bean; + +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; + } + + +} -- 2.54.0