pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature11.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/signature/SignatureUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/signature/SkipHttpsUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/signature/TokenUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pom.xml
@@ -196,7 +196,16 @@ <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.14</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> </dependencies> </dependencyManagement> ruoyi-common/pom.xml
@@ -139,6 +139,15 @@ <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> </dependencies> </project> ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature.java
对比新文件 @@ -0,0 +1,166 @@ package com.ruoyi.common.signature; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; import java.util.Calendar; import java.util.HashMap; import java.util.Map; 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.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 = "https://inspurtestcx.saws.org.cn/sjjh/api/v1/exam/plan/enroll/download"; // 应用标识 static String appKey = "hj92qe"; // 加密算法 static String signMethod = "SHA-256"; // 身份系统签发给应用对接的密钥 static String appPwd = "dxep6j"; 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 = (CloseableHttpClient) SkipHttpsUtils.wrapClient(); /** * GET 查询接口演示代码 */ String startTime = "2023-05-25 00:00:00"; String endTime = "2023-06-01 21:00:00"; try { startTime = URLEncoder.encode(startTime, "UTF-8"); endTime = URLEncoder.encode(endTime, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getCause()); } String getQueryParam = "startTime=" + startTime + "&endTime=" + endTime; System.out.println(getQueryParam); 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(); } } } ruoyi-common/src/main/java/com/ruoyi/common/signature/Signature11.java
对比新文件 @@ -0,0 +1,121 @@ package com.ruoyi.common.signature; import com.alibaba.fastjson2.JSON; import com.google.gson.Gson; 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 java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; import java.util.Calendar; import java.util.HashMap; import java.util.Map; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/9/7 * @time: 11:06 */ public class Signature11 { private static final Logger logger = LoggerFactory.getLogger(Signature11.class); // 接口服务地址 考生信息下载 static String restSever = "https://inspurtestcx.saws.org.cn/sjjh/api/v1/exam/plan/enroll/download"; // 应用标识 static String appKey = "hj92qe"; // 加密算法 static String signMethod = "SHA-256"; // 身份系统签发给应用对接的密钥 static String appPwd = "dxep6j"; 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 = (CloseableHttpClient) SkipHttpsUtils.wrapClient(); /** * GET 查询接口演示代码 */ String startTime = "2018-05-25 00:00:00"; String endTime = "2023-06-01 21:00:00"; try { startTime = URLEncoder.encode(startTime, "UTF-8"); endTime = URLEncoder.encode(endTime, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getCause()); } String getQueryParam = "startTime=" + startTime + "&endTime=" + endTime; System.out.println(getQueryParam); 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(6000) .setConnectionRequestTimeout(6000).setSocketTimeout(6000).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); Object object = JSON.parse(resp); System.out.println("result:" + resp); } else { System.out.println(statusCode); } } catch (URISyntaxException e) { logger.error("签名失败: ", e); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ruoyi-common/src/main/java/com/ruoyi/common/signature/SignatureUtils.java
对比新文件 @@ -0,0 +1,127 @@ package com.ruoyi.common.signature; import com.alibaba.fastjson2.JSON; 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.impl.client.CloseableHttpClient; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; import java.util.Calendar; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/9/8 * @time: 14:52 */ public class SignatureUtils { private static final Logger logger = LoggerFactory.getLogger(SignatureUtils.class); // 接口服务地址 private static final String restSever = "https://inspurtestcx.saws.org.cn/sjjh"; // 应用标识 private static final String appKey = "hj92qe"; // 加密算法 private static final String signMethod = "SHA-256"; // 身份系统签发给应用对接的密钥 private static final String appPwd = "dxep6j"; /** * 获取数据接口 * @param getQueryParam * @return */ public static Object getObject(String getQueryParam,String url){ // 时间戳 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); String getFullUrl = restSever + url + "?" + getQueryParam; HttpGet httpGet = new HttpGet(getFullUrl); // get 请求查询参数, 用在 URL 上的, 这里若是通过 ID 查询的, 接口中 ID 是作为路径存在的, 所以需要将 ID 组成 String getAllParamUrl = commonParamUrl + "&" + getQueryParam; // 创建 HttpClient 对象 CloseableHttpClient httpclient = (CloseableHttpClient) SkipHttpsUtils.wrapClient(); // 对参数签名, 并放入请求 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(6000) .setConnectionRequestTimeout(6000).setSocketTimeout(6000).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); Object object = JSON.parse(resp); System.out.println("result:" + resp); return object; } else { System.out.println(statusCode); } } catch (URISyntaxException e) { logger.error("签名失败: ", e); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } public static void main(String[] args) { /** * GET 查询接口演示代码 */ String startTime = "2018-05-25 00:00:00"; String endTime = "2023-06-01 21:00:00"; try { startTime = URLEncoder.encode(startTime, "UTF-8"); endTime = URLEncoder.encode(endTime, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getCause()); } String getQueryParam = "startTime=" + startTime + "&endTime=" + endTime; System.out.println(getQueryParam); Object obj = getObject(getQueryParam,"/api/v1/exam/plan/enroll/download"); System.out.println(obj); } } ruoyi-common/src/main/java/com/ruoyi/common/signature/SkipHttpsUtils.java
对比新文件 @@ -0,0 +1,46 @@ package com.ruoyi.common.signature; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.apache.http.client.HttpClient; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; public class SkipHttpsUtils { //绕过证书 public static HttpClient wrapClient() { try { SSLContext ctx = SSLContext.getInstance("TLS"); X509TrustManager tm = new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { } }; ctx.init(null, new TrustManager[] { tm }, null); SSLConnectionSocketFactory ssf = new SSLConnectionSocketFactory( ctx, NoopHostnameVerifier.INSTANCE); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(ssf).build(); return httpclient; } catch (Exception e) { return HttpClients.createDefault(); } } } ruoyi-common/src/main/java/com/ruoyi/common/signature/TokenUtils.java
对比新文件 @@ -0,0 +1,78 @@ package com.ruoyi.common.signature; 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]; } }