|
|
@@ -21,6 +21,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.google.common.base.Ascii;
|
|
|
+import com.smecloud.apigw.client.ApigwClient;
|
|
|
+import com.smecloud.apigw.constant.HttpMethod;
|
|
|
+import com.smecloud.apigw.model.ApiRequest;
|
|
|
+import com.smecloud.apigw.model.ApiResult;
|
|
|
+import com.smecloud.apigw.model.ApigwConfig;
|
|
|
+import com.smecloud.apigw.util.SHAUtil;
|
|
|
import com.trade.purchase.extra.entity.Claim;
|
|
|
import com.trade.purchase.extra.entity.ClaimItem;
|
|
|
import com.trade.purchase.extra.entity.JdModule;
|
|
|
@@ -38,6 +45,7 @@ import com.trade.purchase.vojo.JDYitems;
|
|
|
import io.seata.spring.annotation.GlobalTransactional;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.Data;
|
|
|
+import org.apache.poi.ss.formula.functions.T;
|
|
|
import org.springblade.check.dto.AuditProecessDTO;
|
|
|
import org.springblade.check.entity.AuditPathsActs;
|
|
|
import org.springblade.check.entity.AuditPathsLevels;
|
|
|
@@ -58,6 +66,7 @@ import org.springblade.core.tool.utils.StringUtil;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
+import org.apache.commons.codec.binary.Base64;
|
|
|
|
|
|
import javax.net.ssl.*;
|
|
|
import java.io.*;
|
|
|
@@ -69,6 +78,7 @@ import java.security.SecureRandom;
|
|
|
import java.security.cert.X509Certificate;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
@@ -538,6 +548,72 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
|
|
|
if (jdTenant == null) {
|
|
|
throw new SecurityException("当前租户未配置凭证信息");
|
|
|
}
|
|
|
+
|
|
|
+ /*ApigwConfig config = new ApigwConfig();
|
|
|
+ //设置client_id
|
|
|
+ config.setClientID(jdTenant.getClientId());
|
|
|
+ //设置client_secret
|
|
|
+ config.setClientSecret("a4ae57bc06ea205a013acbf7ec753139");
|
|
|
+ ApigwClient apigwClient = ApigwClient.getInstance();
|
|
|
+ //初始化API网关客户端
|
|
|
+ apigwClient.init(config);
|
|
|
+
|
|
|
+ //设置headers参数
|
|
|
+ ApiRequest request = new ApiRequest(HttpMethod.GET, "api.kingdee.com", "/jdyconnector/app_management/kingdee_auth_token");
|
|
|
+
|
|
|
+ String key = "qidi75E9";
|
|
|
+ String secret = "0267f465852aa7690857cd0ca681889864a79158";
|
|
|
+ String s = SHAUtil.SHA256HMAC(key, secret);
|
|
|
+ System.out.println("s======>"+s);
|
|
|
+
|
|
|
+ String c = Base64.encodeBase64String(s.getBytes());
|
|
|
+ System.out.println("c======>"+c);
|
|
|
+
|
|
|
+ Map<String, String> querys = new TreeMap<>();
|
|
|
+ querys.put("app_key", key);
|
|
|
+ String appSignature = URLEncoder.encode(c, "UTF-8");
|
|
|
+ System.out.println("appSignature编码======>"+appSignature);
|
|
|
+ querys.put("app_signature", appSignature);
|
|
|
+ System.out.println("map======>"+querys.toString());
|
|
|
+ request.setQuerys(querys);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ request.addSignHeaders("Content-Type","application/json");
|
|
|
+ request.addSignHeaders("X-Api-ClientID",jdTenant.getClientId());
|
|
|
+ request.addSignHeaders("X-Api-Auth-Version","2.0");
|
|
|
+
|
|
|
+ String timestamp = String.valueOf(System.currentTimeMillis());
|
|
|
+ request.addSignHeaders("X-Api-TimeStamp",timestamp);
|
|
|
+ System.out.println("时间戳======>" + timestamp);
|
|
|
+
|
|
|
+
|
|
|
+ System.out.println("clientId======>"+jdTenant.getClientId());
|
|
|
+
|
|
|
+ request.addSignHeaders("X-Api-SignHeaders","");
|
|
|
+
|
|
|
+ String nonce = getThirteenNumber();
|
|
|
+ System.out.println("随机正整数======>"+nonce);
|
|
|
+ request.addSignHeaders("X-Api-Nonce",nonce);
|
|
|
+
|
|
|
+
|
|
|
+ String Signature = getSignature(key, c, timestamp, nonce, jdTenant.getClientSecret());
|
|
|
+ request.addSignHeaders("X-Api-Signature",Signature);
|
|
|
+ System.out.println("返回的加密字符串======》"+ Signature);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ System.out.println("Querys======>"+request.getQuerys().toString());
|
|
|
+ System.out.println("Host======>"+request.getHost());
|
|
|
+ System.out.println("Path======>"+request.getPath());
|
|
|
+
|
|
|
+
|
|
|
+ ApiResult results = ApigwClient.getInstance().send(request);
|
|
|
+ System.out.println("金蝶返回数据======》"+results.getBody());*/
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
//获取测试账套token的url
|
|
|
String getTokenUrl = "https://api.kingdee.com/auth/user/access_token?client_id=" + jdTenant.getClientId() +
|
|
|
"&client_secret=" + jdTenant.getClientSecret() +
|
|
|
@@ -553,6 +629,68 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
|
|
|
return tokenDTO.getData().getAccess_token();
|
|
|
}
|
|
|
|
|
|
+ private String getSignature(String appKey, String appSignature, String timestamp, String nonce, String clientSecret) {
|
|
|
+
|
|
|
+ try {
|
|
|
+ //1、对path部分进行url编码
|
|
|
+ String path = URLEncoder.encode("/jdyconnector/app_management/kingdee_auth_token", "UTF-8");
|
|
|
+ System.out.println("对path部分进行url编码======>"+path);
|
|
|
+
|
|
|
+ //2、params请求参数
|
|
|
+ //2.1 进行第一次url编码
|
|
|
+ appSignature = URLEncoder.encode(appSignature, "UTF-8");
|
|
|
+ System.out.println("进行第一次url编码======>"+appSignature);
|
|
|
+
|
|
|
+ //2.2 进行第二次url编码
|
|
|
+ appSignature = URLEncoder.encode(appSignature, "UTF-8");
|
|
|
+ System.out.println("进行第二次url编码======>"+appSignature);
|
|
|
+
|
|
|
+ //2.3 拼接params请求参数部分(按ASCII码升序顺序进行排序)
|
|
|
+ String params = "app_key=" + appKey + "&app_signature=" + appSignature;
|
|
|
+ System.out.println("拼接params请求参数部分======>"+params);
|
|
|
+
|
|
|
+ //3、headers请求参数
|
|
|
+ nonce = "x-api-nonce:" + nonce;//随机随机正整数
|
|
|
+ timestamp = "x-api-timestamp:" + timestamp;//请求发起的时间戳
|
|
|
+
|
|
|
+ //4、拼接得到签名字符串
|
|
|
+ String srcStr = "GET" + "\n"
|
|
|
+ + path + "\n"
|
|
|
+ + params + "\n"
|
|
|
+ + nonce + "\n"
|
|
|
+ + timestamp + "\n";
|
|
|
+ System.out.println("拼接得到签名字符串======>"+srcStr);
|
|
|
+
|
|
|
+ //4、签名字符串生成X-Api-Signature
|
|
|
+ String spec = SHAUtil.SHA256HMAC(srcStr, clientSecret);
|
|
|
+ System.out.println("签名字符串生成X-Api-Signature======>"+spec);
|
|
|
+ String value = Base64.encodeBase64String(spec.getBytes());
|
|
|
+ System.out.println("Base64签名======>"+value);
|
|
|
+
|
|
|
+ return value;
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Map<String,String> sortHashMap(Map<String,String> map){
|
|
|
+ Map<String,String> sortedMap = new LinkedHashMap<String,String>();
|
|
|
+ List<String> list = new ArrayList<String>();
|
|
|
+ Iterator<String> item = map.keySet().iterator();
|
|
|
+ while(item.hasNext()){
|
|
|
+ list.add(item.next());
|
|
|
+ }
|
|
|
+ Collections.sort(list);
|
|
|
+ Iterator<String> item2 = list.iterator();
|
|
|
+ while(item2.hasNext()){
|
|
|
+ String key = item2.next();
|
|
|
+ sortedMap.put(key,map.get(key));
|
|
|
+ }
|
|
|
+ return sortedMap;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
public String doGet(String url, Map<String, String> urlParams)
|
|
|
throws IOException {
|
|
|
if (isEmpty(url)) {
|
|
|
@@ -708,4 +846,31 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
|
|
|
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据时间戳+atomicInteger生成13位长度数字,只能支持小并发不重复,仅适用于后台系统
|
|
|
+ *
|
|
|
+ * @return Number
|
|
|
+ */
|
|
|
+ public static String getThirteenNumber() {
|
|
|
+ AtomicInteger atomicInteger = new AtomicInteger(0);
|
|
|
+ //后10位时间戳
|
|
|
+ String timeStr = String.valueOf(System.currentTimeMillis()).substring(3);
|
|
|
+ // 递增生成最大999的递增ID
|
|
|
+ if (atomicInteger.get() == 999) {
|
|
|
+ atomicInteger.set(0);
|
|
|
+ }
|
|
|
+ int atomicIntegerNum = atomicInteger.getAndIncrement();
|
|
|
+ String atomicString = String.valueOf(atomicIntegerNum);
|
|
|
+ if (atomicString.length() < 3) {
|
|
|
+ switch (atomicString.length()) {
|
|
|
+ case 1:
|
|
|
+ return timeStr.concat("00" + atomicString);
|
|
|
+ case 2:
|
|
|
+ return timeStr.concat("0" + atomicString);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return timeStr.concat(atomicString);
|
|
|
+ }
|
|
|
+
|
|
|
}
|