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 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 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 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 getHeader(String payload, boolean isGetToken) { Map 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 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 header : headers.entrySet()) { requestBuilder.header(header.getKey(), header.getValue()); } Response response = client.newCall(requestBuilder.build()).execute(); ObjectMapper mapper = new ObjectMapper(); if (response.isSuccessful()) { Map 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 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 params, String linkStr) { List keys = new ArrayList(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(); } }