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);
|
|
}
|
|
}
|