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