diff --git a/common/src/main/java/tech/deepq/common/enums/SignatureEnumGroup.java b/common/src/main/java/tech/deepq/common/enums/SignatureEnumGroup.java index 5f56a0b..ca63483 100644 --- a/common/src/main/java/tech/deepq/common/enums/SignatureEnumGroup.java +++ b/common/src/main/java/tech/deepq/common/enums/SignatureEnumGroup.java @@ -11,6 +11,7 @@ public class SignatureEnumGroup { */ public static enum SignatureLocation{ header, + body, url } @@ -19,6 +20,9 @@ public class SignatureEnumGroup { * RSA */ RSA, + /** + * MD5 + */ MD5 } diff --git a/common/src/main/java/tech/deepq/common/utils/signature/AbstractSignatureService.java b/common/src/main/java/tech/deepq/common/utils/signature/AbstractSignatureService.java index 9b00090..6ccb078 100644 --- a/common/src/main/java/tech/deepq/common/utils/signature/AbstractSignatureService.java +++ b/common/src/main/java/tech/deepq/common/utils/signature/AbstractSignatureService.java @@ -15,13 +15,13 @@ public abstract class AbstractSignatureService { protected SignatureContext signatureContext; /** - * 加密 + * 对content进行加密 * * @param content * @return * @throws GeneralSecurityException */ - public abstract String signature(String content) throws GeneralSecurityException; + public abstract String signatureContent(String content) throws GeneralSecurityException; void init(SignatureConfig signatureConfig) throws GeneralSecurityException { diff --git a/common/src/main/java/tech/deepq/common/utils/signature/MD5SignatureService.java b/common/src/main/java/tech/deepq/common/utils/signature/MD5SignatureService.java new file mode 100644 index 0000000..58ee26f --- /dev/null +++ b/common/src/main/java/tech/deepq/common/utils/signature/MD5SignatureService.java @@ -0,0 +1,37 @@ +package tech.deepq.common.utils.signature; + +import org.springframework.util.DigestUtils; +import tech.deepq.common.dto.SignatureConfig; + +import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; + +/** + * @author yechuan + * @since 2023/9/1 09:46 + **/ +public class MD5SignatureService extends AbstractSignatureService { + + private final static MD5SignatureService instance = new MD5SignatureService(); + + private MD5SignatureService() { + + } + + public static AbstractSignatureService getInstance(SignatureConfig signatureConfig) throws GeneralSecurityException { + return instance; + } + + /** + * 对content进行加密 + */ + @Override + public String signatureContent(String content) { + return DigestUtils.md5DigestAsHex((content).getBytes(StandardCharsets.UTF_8)); + } + + @Override + void init(SignatureConfig signatureConfig) { + return; + } +} diff --git a/common/src/main/java/tech/deepq/common/utils/signature/RSASignatureService.java b/common/src/main/java/tech/deepq/common/utils/signature/RSASignatureService.java index 268a5b8..7a62672 100644 --- a/common/src/main/java/tech/deepq/common/utils/signature/RSASignatureService.java +++ b/common/src/main/java/tech/deepq/common/utils/signature/RSASignatureService.java @@ -32,7 +32,7 @@ class RSASignatureService extends AbstractSignatureService { } @Override - public String signature(String content) throws GeneralSecurityException { + public String signatureContent(String content) throws GeneralSecurityException { if (signatureContext == null) { throw new RuntimeException("未初始化公私钥对信息"); } diff --git a/source/src/main/java/tech/deepq/source/handler/SourceHandler.java b/source/src/main/java/tech/deepq/source/handler/SourceHandler.java index 610c78c..ebaeb12 100644 --- a/source/src/main/java/tech/deepq/source/handler/SourceHandler.java +++ b/source/src/main/java/tech/deepq/source/handler/SourceHandler.java @@ -34,6 +34,7 @@ import tech.deepq.common.utils.signature.SignatureFactory; import tech.deepq.source.request.RequestClient; import tech.deepq.source.spel.CustomRequest; import tech.deepq.source.spel.ZhiDeMaiRequest; +import tech.deepq.source.util.TokenUtils; import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; @@ -58,6 +59,7 @@ public class SourceHandler { private final TaskManager taskManager; public final Gson gson; public final ZhiDeMaiRequest zdm; + public final TokenUtils tokenUtils; public List> handle(Message message) { TaskMiniVO taskMiniVO = message.getPayload(); @@ -220,6 +222,7 @@ public class SourceHandler { return; } } + // 节点命中 List nextNodes = filter.getNextNodes(); if (ObjectUtils.isEmpty(nextNodes)) { @@ -354,10 +357,12 @@ public class SourceHandler { AbstractSignatureService signatureService = null; try { signatureService = SignatureFactory.getSignatureService(signatureConfig); - String signature = signatureService.signature(signatureContext); + String signature = signatureService.signatureContent(signatureContext); // 优化 if (SignatureEnumGroup.SignatureLocation.header.equals(signatureConfig.getSignatureLocation())) { requestParams.getHeaders().put(signatureConfig.getSignatureField(), signature); + } else if (SignatureEnumGroup.SignatureLocation.body.equals(signatureConfig.getSignatureLocation())) { + requestParams.getBody().put(signatureConfig.getSignatureField(), signature); } else if (SignatureEnumGroup.SignatureLocation.url.equals(signatureConfig.getSignatureLocation())) { String url = requestParams.getUrl(); String separator = ""; diff --git a/source/src/main/java/tech/deepq/source/util/TokenUtils.java b/source/src/main/java/tech/deepq/source/util/TokenUtils.java new file mode 100644 index 0000000..d7d9746 --- /dev/null +++ b/source/src/main/java/tech/deepq/source/util/TokenUtils.java @@ -0,0 +1,73 @@ +package tech.deepq.source.util; + +import com.alibaba.fastjson2.JSON; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.util.DigestUtils; +import tech.deepq.common.dto.HttpRequestParams; +import tech.deepq.common.dto.HttpRes; +import tech.deepq.source.request.RequestClient; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * @author yechuan + * @since 2023/9/1 09:58 + **/ +@Component +public class TokenUtils { + + @Autowired + private RequestClient requestClient; + + @Autowired + private RedisTemplate redisTemplate; + + @Lazy + @Autowired + private TokenUtils proxy; + + private final String TokenFormQHRBCacheKey = "tokenFormQHRBCacheKey"; + + public String getTokenFormQHRB(String partnerId, String partnerNtr) { + proxy.checkTokenFormQHRB(partnerId, partnerNtr); + return redisTemplate.opsForValue() + .get(TokenFormQHRBCacheKey); + } + + @Async + public void checkTokenFormQHRB(String partnerId, String partnerNtr) { + Long expire = redisTemplate.getExpire(TokenFormQHRBCacheKey, TimeUnit.MINUTES); + if (expire == null) { + expire = Long.MIN_VALUE; + } + if (expire.compareTo(15L) > 0) { + return; + } + Map body = new HashMap<>(); + String randomNum = UUID.randomUUID().toString().replaceAll("-", ""); + randomNum = randomNum.substring(randomNum.length() - 8); + body.put("partnerId", partnerId); + body.put("randomNum", randomNum); + body.put("partnerNtr", DigestUtils.md5DigestAsHex((partnerNtr + randomNum).getBytes(StandardCharsets.UTF_8))); + HttpRequestParams httpRequestParams = new HttpRequestParams(); + httpRequestParams.setUrl("https://app.qhrb.com.cn/api/user/partner/getTicket"); + httpRequestParams.setBody(body); + httpRequestParams.setMethod("POST"); + + HttpRes res = requestClient.execute(httpRequestParams); + if (!res.getStatus().is2xxSuccessful()) { + return; + } + redisTemplate.opsForValue().set(TokenFormQHRBCacheKey, JSON.parseObject(res.getBody()).getString("dataPoints"), 120, TimeUnit.MINUTES); + } + + +}