From ab870561f2996804d8fb8fa61b25641ea4f42f36 Mon Sep 17 00:00:00 2001
From: zf <1603559716@qq.com>
Date: 星期四, 07 九月 2023 16:31:57 +0800
Subject: [PATCH] ceshi

---
 ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature.java                     |  157 +++++++++++++++++++++++++++++++
 pom.xml                                                                                  |   16 ++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/TokenUtils.java                   |   78 +++++++++++++++
 ruoyi-common/src/main/java/com/ruoyi/exam/noncoalmine/controller/TestDemoController.java |    2 
 ruoyi-common/pom.xml                                                                     |   10 ++
 5 files changed, 260 insertions(+), 3 deletions(-)

diff --git a/pom.xml b/pom.xml
index ce5a9ec..0aeefb0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,7 +32,8 @@
         <jwt.version>0.9.1</jwt.version>
         <mybatis-plus.version>3.5.2</mybatis-plus.version>
         <hutool.version>5.5.7</hutool.version>
-
+        <httpclient.version>4.5.11</httpclient.version>
+        <gson.version>2.8.9</gson.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -196,7 +197,18 @@
                 <artifactId>hutool-all</artifactId>
                 <version>${hutool.version}</version>
             </dependency>
-
+            <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>${httpclient.version}</version>
+            </dependency>
+            <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
+            <dependency>
+                <groupId>com.google.code.gson</groupId>
+                <artifactId>gson</artifactId>
+                <version>${gson.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 54060bb..4b89e39 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -139,6 +139,16 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
+        <!--httpclient-->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <!--gson-->
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature.java b/ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature.java
new file mode 100644
index 0000000..ef80a15
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature.java
@@ -0,0 +1,157 @@
+package com.ruoyi.common.signature;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+import com.ruoyi.common.utils.sign.TokenUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.google.gson.Gson;
+
+/**
+ * @email 1603559716@qq.com
+ * @author: zf
+ * @date: 2023/9/7
+ * @time: 11:06
+ */
+public class Signature {
+	private static final Logger logger = LoggerFactory.getLogger(Signature.class);
+	// 接口服务地址
+	static String restSever = "http://kiam.example.com/api/v1/queryPlanExaminee";
+	// 应用标识
+	static String appKey = "320000000002";
+	// 加密算法
+	static String signMethod = "SHA-256";
+	// 身份系统签发给应用对接的密钥
+	static String appPwd = "ZNn2fdrvSWR+aGN2ORe/CtMfIq4yuJSzFBtVuaqVnUEJ457QB3W7l0T9yslAMr3H";
+
+	public static void main(String[] args) {
+		// 时间戳
+		Long ts = Calendar.getInstance().getTime().getTime();
+		// 随机数
+		String once = RandomStringUtils.randomAlphanumeric(32);
+		// 接口header 中的公共参数
+		String commonParamUrl = String.format("appKey=%s" + "&" + "ts=%s" + "&" + "once=%s" + "&" + "signMethod=%s", appKey, ts, once, signMethod);
+		// 创建HttpClient 对象
+		CloseableHttpClient httpclient = HttpClients.createDefault();
+		/**
+		 * GET 查询接口演示代码
+		 */
+		String getQueryParam = "startTime=2019-06-21T08:00:00.000Z";
+		String getFullUrl = restSever + "?" + getQueryParam;
+		HttpGet httpGet = new HttpGet(getFullUrl);
+		// get 请求查询参数, 用在 URL 上的, 这里若是通过 ID 查询的, 接口中 ID 是作为路径存在的, 所以需要将 ID 组合成
+		String getAllParamUrl = commonParamUrl + "&" + getQueryParam;
+		// 对参数签名, 并放入请求 header 中的 signData 参数中
+		try {
+			// 签名数据
+			String signData = TokenUtils.getSignature(appPwd, getAllParamUrl);
+			// 添加 header 参数 appCode、timestamp、signatureNonce、signature
+			httpGet.addHeader("appKey", appKey);
+			httpGet.addHeader("ts", ts.toString());
+			httpGet.addHeader("once", once);
+			httpGet.addHeader("signMethod", signMethod);
+			System.out.println("once:" + once);
+			httpGet.addHeader("signData", signData);
+			System.out.println("headers:" + httpGet.getAllHeaders());
+			String urlStr = httpGet.getURI().toString();
+			// 公共参数 URL
+			System.out.println("commonParamter:" + urlStr);
+			if (StringUtils.endsWith(urlStr, "/")) {
+				urlStr = StringUtils.removeEnd(urlStr, "/");
+			}
+			httpGet.setURI(new URI(urlStr));
+			RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(3000).setConnectionRequestTimeout(3000).setSocketTimeout(3000).build();
+			httpGet.setConfig(requestConfig);
+			System.out.println("urlStr in request:" + httpGet.getURI().toString());
+			// 执行请求
+			CloseableHttpResponse response = httpclient.execute(httpGet);
+			// 取响应的结果
+			int statusCode = response.getStatusLine().getStatusCode();
+			// 打印响应结果
+			if (statusCode == HttpStatus.SC_OK) {
+				String resp = EntityUtils.toString(response.getEntity(), "utf-8");
+				System.out.println("status:" + statusCode);
+				System.out.println("result:" + resp);
+			}
+		} catch (URISyntaxException e) {
+			logger.error("签名失败: ", e);
+		} catch (ClientProtocolException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		/**
+		 * PUT 修改接口的演示代码,POST 与 PUT 类似
+		 */
+		String ID = "aa03a5c692cf480b87887e0ff8cfe566";
+		// 这里若是通过 ID 查询的, 接口中 ID 是作为路径存在的, 所以需要将 ID 组合成
+		String putQueryParam = "ID=" + ID;
+
+		String putFullUrl = restSever + "/" + ID;
+		// 访问用户接口
+		HttpPut httpPut = new HttpPut(putFullUrl);
+		// 模拟 POST/PUT 的 body 中数据, 需转为 JSON 进行签名。GET 则没有这部分内容。
+		Map<String, Object> dataMap = new HashMap<String, Object>();
+		dataMap.put("USER_NAME", "张三");
+		String bodyParam = new Gson().toJson(dataMap);
+		String postAllParamUrl = commonParamUrl + "&" + putQueryParam + "&bodyData=" + bodyParam;
+		StringEntity bodyData = new StringEntity(bodyParam.toString(), "UTF-8");
+		httpPut.setEntity(bodyData);
+		// 对参数签名, 并放入请求 header 中的 signData 参数中
+		try {
+			// 签名数据
+			String signData = TokenUtils.getSignature(appPwd, postAllParamUrl);
+			// 添加 header 参数 appCode、timestamp、signatureNonce、signature
+			httpPut.addHeader("appKey", appKey);
+			httpPut.addHeader("ts", ts.toString());
+			httpPut.addHeader("once", once);
+			System.out.println("once:" + once);
+			httpPut.addHeader("signData", signData);
+			System.out.println("headers:" + httpPut.getAllHeaders());
+			String urlStr = httpPut.getURI().toString();
+			// 公共参数 URL
+			System.out.println("commonParamter:" + urlStr);
+			if (StringUtils.endsWith(urlStr, "/")) {
+				urlStr = StringUtils.removeEnd(urlStr, "/");
+			}
+			httpPut.setURI(new URI(urlStr));
+			RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(3000).setConnectionRequestTimeout(3000).setSocketTimeout(3000).build();
+			httpPut.setConfig(requestConfig);
+			System.out.println("urlStr in request:" + httpPut.getURI().toString());
+			// 执行请求
+			CloseableHttpResponse response = httpclient.execute(httpPut);
+			// 取响应的结果
+			int statusCode = response.getStatusLine().getStatusCode();
+			// 打印响应结果
+			if (statusCode == HttpStatus.SC_OK) {
+				String resp = EntityUtils.toString(response.getEntity(), "utf-8");
+				System.out.println("status:" + statusCode);
+				System.out.println("result:" + resp);
+			}
+		} catch (URISyntaxException e) {
+			logger.error("签名失败: ", e);
+
+		} catch (ClientProtocolException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
+
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/TokenUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/TokenUtils.java
new file mode 100644
index 0000000..1f2ade5
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/TokenUtils.java
@@ -0,0 +1,78 @@
+package com.ruoyi.common.utils.sign;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * @email 1603559716@qq.com
+ * @author: zf
+ * @date: 2023/9/7
+ * @time: 11:01
+ */
+public class TokenUtils {
+    private static final Logger logger = LoggerFactory.getLogger(TokenUtils.class);
+    private static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a",
+            "b", "c", "d", "e",
+            "f" };
+    public static String getSignature(String appPwd, String paramUrl) {
+        if (StringUtils.isNotBlank(paramUrl)) {
+            try {
+                paramUrl = URLDecoder.decode(paramUrl, "UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                logger.error("生成 signData 失败:", e);
+                throw new RuntimeException("生成 signData 失败:", e);
+            }
+        }
+        String[] paraArray = new String[] {};
+        if (StringUtils.isNotBlank(paramUrl)) {
+            String[] queryArray = paramUrl.split("&");
+            paraArray = (String[]) ArrayUtils.addAll(queryArray, paraArray);
+        }
+        Arrays.sort(paraArray);
+        StringBuffer buffer = new StringBuffer();
+        buffer.append(appPwd);
+        buffer.append(":");
+        for (int i = 0; i < paraArray.length; i++) {
+            buffer.append(paraArray[i]);
+            buffer.append("&");
+        }
+        buffer.deleteCharAt(buffer.length() - 1);
+        buffer.append(":");
+        buffer.append(appPwd);
+        MessageDigest md = null;
+        try {
+            md = MessageDigest.getInstance("SHA-256");
+            md.update(buffer.toString().getBytes("UTF-8"));
+        } catch (NoSuchAlgorithmException e) {
+            logger.error("生成 signData 失败:", e);
+            throw new RuntimeException("生成 signData 失败.", e);
+        } catch (UnsupportedEncodingException e) {
+            logger.error("生成 signData 失败:", e);
+            throw new RuntimeException("生成 signData 失败.", e);
+        }
+        String encode = byteArrayToHexString(md.digest());
+        return encode;
+    }
+    private static String byteArrayToHexString(byte[] byteArray) {
+        StringBuffer sb = new StringBuffer();
+        for (byte byt : byteArray) {
+            sb.append(byteToHexString(byt));
+        }
+        return sb.toString();
+    }
+    private static String byteToHexString(byte byt) {
+        int n = byt;
+        if (n < 0)
+            n = 256 + n;
+        return hexDigits[n / 16] + hexDigits[n % 16];
+    }
+}
+
diff --git a/exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/TestDemoController.java b/ruoyi-common/src/main/java/com/ruoyi/exam/noncoalmine/controller/TestDemoController.java
similarity index 90%
rename from exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/TestDemoController.java
rename to ruoyi-common/src/main/java/com/ruoyi/exam/noncoalmine/controller/TestDemoController.java
index 5b6654f..c5c43cd 100644
--- a/exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/TestDemoController.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/exam/noncoalmine/controller/TestDemoController.java
@@ -1,4 +1,4 @@
-package com.gkhy.exam.noncoalmine.controller;
+package com.ruoyi.exam.noncoalmine.controller;
 
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;

--
Gitblit v1.9.2