“luojun” 6 月之前
父節點
當前提交
db5ac3fa94
共有 2 個文件被更改,包括 247 次插入0 次删除
  1. 56 0
      src/com/kingdee/eas/utils/EncryptUtils.java
  2. 191 0
      src/com/kingdee/eas/utils/MJ.java

+ 56 - 0
src/com/kingdee/eas/utils/EncryptUtils.java

@@ -0,0 +1,56 @@
+package com.kingdee.eas.utils;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @Description ¼ÓÃܹ¤¾ßÀà
+ * @Date 2024/11/8 11:54
+ * @Created by Heyuan
+ */
+public class EncryptUtils {
+    private static final char[] DIGITS_LOWER = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+    private static final char[] DIGITS_UPPER = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
+    public static String sha256(String data, boolean toUpCase) {
+        MessageDigest messageDigest;
+        try {
+            messageDigest = MessageDigest.getInstance("SHA-256");
+            messageDigest.update(data.getBytes(StandardCharsets.UTF_8));
+            return encodeHexStr(messageDigest.digest(), toUpCase);
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("sha256 sign error");
+        }
+    }
+
+    public static String hmacSha256(String data, String key) {
+        try {
+            Mac hmacSha256 = Mac.getInstance("HmacSHA256");
+            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
+            hmacSha256.init(secretKeySpec);
+            byte[] hash = hmacSha256.doFinal(data.getBytes(StandardCharsets.UTF_8));
+            return encodeHexStr(hash, true);
+        } catch (Exception e) {
+            throw new RuntimeException("HmacSha256 sign error");
+        }
+    }
+
+    public static String encodeHexStr(byte[] data, boolean toUpCase) {
+        return encodeHexStr(data, toUpCase ? DIGITS_UPPER : DIGITS_LOWER);
+    }
+
+    private static String encodeHexStr(byte[] data, char[] toDigits) {
+        int len = data.length;
+        char[] out = new char[len << 1];
+        int i = 0;
+
+        for (int var5 = 0; i < len; ++i) {
+            out[var5++] = toDigits[(240 & data[i]) >>> 4];
+            out[var5++] = toDigits[15 & data[i]];
+        }
+        return new String(out);
+    }
+}

+ 191 - 0
src/com/kingdee/eas/utils/MJ.java

@@ -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();
+    }
+}