教育训练处考试制证系统后端
zf
2023-09-25 c858ae26143fde37b8c77d403baeb7a050bc2ab6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
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);
 
    }
 
}