package com.ruoyi.common.signature; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.enums.HttpMethod; import com.ruoyi.common.exception.ServiceException; 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.HttpPost; 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 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 queryParam * @param url * @param method * @return */ public static String getObject(String queryParam, String url, HttpMethod method){ if(method.equals(HttpMethod.GET)){ return getMethod(url, queryParam); } if(method.equals(HttpMethod.POST)){ return postMethod(url,queryParam); } return null; } private static String getMethod(String url,String queryParam){ // 时间戳 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 + "?" + queryParam; HttpGet httpGet = new HttpGet(getFullUrl); // get 请求查询参数, 用在 URL 上的, 这里若是通过 ID 查询的, 接口中 ID 是作为路径存在的, 所以需要将 ID 组成 String getAllParamUrl = commonParamUrl + "&" + queryParam; // 创建 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); httpGet.addHeader("signData", signData); String urlStr = httpGet.getURI().toString(); // 公共参数 URL 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); // 执行请求 CloseableHttpResponse response = httpclient.execute(httpGet); // 取响应的结果 int statusCode = response.getStatusLine().getStatusCode(); // 打印响应结果 if (statusCode == HttpStatus.SC_OK) { String resp = EntityUtils.toString(response.getEntity(), "utf-8"); Object object = JSONObject.parseObject(resp); return resp; } else { throw new ServiceException("同步数据异常"); } } catch (URISyntaxException e) { logger.error("签名失败: ", e); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } private static String postMethod(String url, String bodyParam){ // 时间戳 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 postFullUrl = restSever + url; HttpPost httpPost = new HttpPost(postFullUrl); String postAllParamUrl = commonParamUrl + "&bodyData=" + bodyParam; // 创建 HttpClient 对象 CloseableHttpClient httpclient = (CloseableHttpClient) SkipHttpsUtils.wrapClient(); StringEntity bodyData = new StringEntity(bodyParam.toString(), "UTF-8"); httpPost.setEntity(bodyData); // 对参数签名, 并放入请求 header 中的 signData 参数中 try { // 签名数据 String signData = TokenUtils.getSignature(appPwd, postAllParamUrl); // 添加 header 参数 appCode、 timestamp、 signatureNonce、 signature httpPost.addHeader("appKey", appKey); httpPost.addHeader("ts", ts.toString()); httpPost.addHeader("once", once); httpPost.addHeader("signMethod", signMethod); httpPost.addHeader("signData", signData); String urlStr = httpPost.getURI().toString(); // 公共参数 URL if (StringUtils.endsWith(urlStr, "/")) { urlStr = StringUtils.removeEnd(urlStr, "/"); } httpPost.setURI(new URI(urlStr)); RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000) .setConnectionRequestTimeout(6000).setSocketTimeout(6000).build(); httpPost.setConfig(requestConfig); // 执行请求 CloseableHttpResponse response = httpclient.execute(httpPost); // 取响应的结果 int statusCode = response.getStatusLine().getStatusCode(); // 打印响应结果 if (statusCode == HttpStatus.SC_OK) { String resp = EntityUtils.toString(response.getEntity(), "utf-8"); Object object = JSON.parse(resp); return resp; } else { throw new ServiceException("同步数据异常"); } } 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-09-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",HttpMethod.GET); System.out.println(obj); System.out.println("********************************************************************************************************************************"); System.out.println("********************************************************************************************************************************"); NcCertQuery1 ncCertQuery1 = new NcCertQuery1(); ncCertQuery1.setIdcardTypeCode("01"); ncCertQuery1.setIdcardNum("362421197712217718"); String bodyParam = JSON.toJSONString(ncCertQuery1); Object obj2 = getObject(bodyParam,"/api/v1/cert/query",HttpMethod.POST); System.out.println(obj2); } }