|
@@ -0,0 +1,191 @@
|
|
|
+package com.kingdee.eas.utils;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.kingdee.eas.custom.sso.ExpiringMapCache;
|
|
|
+import okhttp3.*;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.text.ParseException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Description TODO
|
|
|
+ * @Date 2024/11/8 11:33
|
|
|
+ * @Created by Heyuan
|
|
|
+ */
|
|
|
+public class MJ {
|
|
|
+ private static ExpiringMapCache<String, String> cache = new ExpiringMapCache();
|
|
|
+ private static Properties properties = new Properties();
|
|
|
+ private long durationInMillis = 84600000;
|
|
|
+
|
|
|
+ static {
|
|
|
+ properties.put("version", "1.0");
|
|
|
+ properties.put("tenantCode", "200775");//租户编号,平台提供
|
|
|
+ properties.put("language", "zh-CN");//语言
|
|
|
+ properties.put("tenantSecret", "dGJbXDdjK0UtekhZWGJpW1JWMk00SFMhZlogcEV3NG0=");//密钥
|
|
|
+ properties.put("account", "200775-sHR");//接口账号
|
|
|
+ properties.put("password", "m3F)xLakHjd4ya=dFs@9");//接口账号密码
|
|
|
+ properties.put("getTokenPath", "http://10.0.3.81:9000/openapi/xt/v2/UserLogin");//获取token接口地址
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) throws IOException, ParseException {
|
|
|
+ JSONObject params = new JSONObject();
|
|
|
+ params.put("count", "100");
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ Date parse = sdf.parse("2022-01-01");
|
|
|
+ params.put("rowTimeStamp", parse.getTime());
|
|
|
+ String payload = params.toJSONString();
|
|
|
+ Map<String, String> headers = getHeader(payload, false);
|
|
|
+
|
|
|
+ OkHttpClient client = new OkHttpClient.Builder().build();
|
|
|
+ MediaType mediaType = MediaType.parse("application/json");
|
|
|
+ RequestBody body = RequestBody.create(mediaType, payload);
|
|
|
+ Request.Builder requestBuilder = new Request.Builder()
|
|
|
+ .url("http://10.0.3.81:9000/openapi/mj/v2/DoorAccessRecordPullData")
|
|
|
+ .method("POST", body)
|
|
|
+ .addHeader("Content-Type", "application/json");
|
|
|
+ // 批量添加请求头
|
|
|
+ for (Map.Entry<String, String> header : headers.entrySet()) {
|
|
|
+ requestBuilder.header(header.getKey(), header.getValue());
|
|
|
+ }
|
|
|
+ Response response = client.newCall(requestBuilder.build()).execute();
|
|
|
+ System.out.println(response.isSuccessful());
|
|
|
+ System.out.println(response.body().string());
|
|
|
+ System.out.println(System.currentTimeMillis() / 1000);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重置token,每次调用接口后刷新token
|
|
|
+ */
|
|
|
+ private void resetToken() {
|
|
|
+ String token = cache.get("token");
|
|
|
+ if (StringUtils.isBlank(token)) {
|
|
|
+ getTokenByRemote();
|
|
|
+ } else {
|
|
|
+ cache.put("token", token, durationInMillis);//23.5小时
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取请求头
|
|
|
+ *
|
|
|
+ * @param payload body的json字符串
|
|
|
+ * @param isGetToken 是否获取token请求
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static Map<String, String> getHeader(String payload, boolean isGetToken) {
|
|
|
+ Map<String, String> signParams = new HashMap<>();
|
|
|
+ signParams.put("version", (String) properties.getOrDefault("version", "1.0"));
|
|
|
+ signParams.put("transId", UUID.randomUUID().toString());
|
|
|
+ signParams.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
|
|
|
+ signParams.put("tenantCode", (String) properties.getOrDefault("tenantCode", "200775"));//租户编号,平台提供
|
|
|
+ signParams.put("language", (String) properties.getOrDefault("language", "zh-CN"));//语言支持
|
|
|
+ if (!isGetToken) {
|
|
|
+ signParams.put("token", getToken());
|
|
|
+ }
|
|
|
+ signParams.put("payload", payload);//发起请求时 body 的 json 字符串
|
|
|
+ //密钥必须放在生成签名代码之前
|
|
|
+ signParams.put("tenantSecret", (String) properties.getOrDefault("tenantSecret", "dGJbXDdjK0UtekhZWGJpW1JWMk00SFMhZlogcEV3NG0="));
|
|
|
+ signParams.put("sign", createSign(signParams));
|
|
|
+ return signParams;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取token
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static String getToken() {
|
|
|
+ String token = cache.get("token");
|
|
|
+ if (StringUtils.isBlank(token)) {
|
|
|
+ token = getTokenByRemote();
|
|
|
+ }
|
|
|
+ return token;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 远程获取token
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static String getTokenByRemote() {
|
|
|
+ try {
|
|
|
+ JSONObject params = new JSONObject();
|
|
|
+ params.put("account", (String) properties.getOrDefault("account", "200775-sHR"));
|
|
|
+ String password = (String) properties.getOrDefault("password", "m3F)xLakHjd4ya=dFs@9");
|
|
|
+ params.put("password", EncryptUtils.sha256(password, false));
|
|
|
+ String payload = params.toJSONString();
|
|
|
+ String getTokenPath = (String) properties.getOrDefault("getTokenPath", "http://10.0.3.81:9000/openapi/xt/v2/UserLogin");
|
|
|
+
|
|
|
+ Map<String, String> headers = getHeader(payload, true);
|
|
|
+ OkHttpClient client = new OkHttpClient.Builder().build();
|
|
|
+ MediaType mediaType = MediaType.parse("application/json");
|
|
|
+ RequestBody body = RequestBody.create(mediaType, payload);
|
|
|
+ Request.Builder requestBuilder = new Request.Builder()
|
|
|
+ .url(getTokenPath)
|
|
|
+ .method("POST", body)
|
|
|
+ .addHeader("Content-Type", "application/json");
|
|
|
+ // 批量添加请求头
|
|
|
+ for (Map.Entry<String, String> header : headers.entrySet()) {
|
|
|
+ requestBuilder.header(header.getKey(), header.getValue());
|
|
|
+ }
|
|
|
+ Response response = client.newCall(requestBuilder.build()).execute();
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ if (response.isSuccessful()) {
|
|
|
+ Map<String, Object> result = mapper.readValue(response.body().string(), Map.class);
|
|
|
+ if ("success".equals(result.get("msg"))) {
|
|
|
+ String token = (String) result.get("data");
|
|
|
+ cache.put("token", token, 84600000);//23.5小时
|
|
|
+ return token;
|
|
|
+ } else {
|
|
|
+ throw new RuntimeException("远程获取token报错: ");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new RuntimeException("远程获取token报错: ");
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ throw new RuntimeException("远程获取token报错: " + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成签名
|
|
|
+ *
|
|
|
+ * @param signParams 参与签名的参数
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static String createSign(Map<String, String> signParams) {
|
|
|
+ String tenantSecret = signParams.get("tenantSecret");
|
|
|
+ signParams.remove("tenantSecret");
|
|
|
+ String linkStr = createLinkStr(signParams, "&");
|
|
|
+ linkStr = linkStr + "&tenantSecret=" + tenantSecret;
|
|
|
+ return EncryptUtils.sha256(linkStr, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建链接字符串
|
|
|
+ *
|
|
|
+ * @param params 参数
|
|
|
+ * @param linkStr 连接字符
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static String createLinkStr(Map<String, String> params, String linkStr) {
|
|
|
+ List<String> keys = new ArrayList<String>(params.keySet());
|
|
|
+ Collections.sort(keys);
|
|
|
+ StringBuilder content = new StringBuilder();
|
|
|
+ for (int i = 0; i < keys.size(); i++) {
|
|
|
+ String key = keys.get(i);
|
|
|
+ String value = params.get(key);
|
|
|
+ if (i == keys.size() - 1) {
|
|
|
+ content.append(key).append("=").append(value);
|
|
|
+ } else {
|
|
|
+ content.append(key).append("=").append(value).append(linkStr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return content.toString();
|
|
|
+ }
|
|
|
+}
|