From 5eee93a4b3493a99b47f0c5828ee286d3c9a2784 Mon Sep 17 00:00:00 2001 From: 13009 Date: Wed, 22 May 2024 15:20:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=94=99=E8=AF=AF=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/core/cipher/DefaultValidator.java | 29 ++++++++++++--- .../czcb/scfs/api/core/http/HttpLogger.java | 15 -------- .../api/test/CommunalDataServiceTest.java | 35 +++++++++++++++++++ 3 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 scfs-api-test/src/test/java/com/czcb/scfs/api/test/CommunalDataServiceTest.java diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultValidator.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultValidator.java index 07310dd..887a034 100644 --- a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultValidator.java +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultValidator.java @@ -30,6 +30,10 @@ public final class DefaultValidator implements Validator { this.verifier = profile.getSignature().getVerifier(); } + public Profile getProfile() { + return profile; + } + @Override public void validate(HttpRequest request, OriginalResponse response, Channel channel) { // 校验应答状态码 @@ -45,7 +49,7 @@ public final class DefaultValidator implements Validator { private void isInvalidHttpCode(OriginalResponse response) { if (response.getStatusCode() < HTTP_OK || response.getStatusCode() >= HTTP_MULT_CHOICE) { throw new ValidationException(String.format("校验失败, HttpStatusCode=%s, Request-Id=%s, HttpResponseBody=%s", - response.getStatusCode(), response.getHttpHeaders().getHeader(REQUEST_ID), Strings.toStr(response.getBody()))); + response.getStatusCode(), response.getHttpHeaders().getHeader(REQUEST_ID), plainBody(response))); } } @@ -53,14 +57,14 @@ public final class DefaultValidator implements Validator { String timestamp = response.getHttpHeaders().getHeader(TIMESTAMP); if (Strings.isEmpty(timestamp)) { throw new TimestampException(String.format("校验失败, 时间戳[%s]不存在, Request-Id=%s, HttpResponseBody=%s", TIMESTAMP, - response.getHttpHeaders().getHeader(REQUEST_ID), Strings.toStr(response.getBody()))); + response.getHttpHeaders().getHeader(REQUEST_ID), plainBody(response))); } Instant responseTime = Instant.ofEpochSecond(Long.parseLong(timestamp)); // 拒绝过期请求 if (Duration.between(responseTime, Instant.now()).abs().toMinutes() >= RESPONSE_EXPIRED_MINUTES) { throw new TimestampException(String.format("校验失败, 时间戳[%s=%s]已过期, Request-Id=%s, HttpResponseBody=%s", TIMESTAMP, - timestamp, response.getHttpHeaders().getHeader(REQUEST_ID), Strings.toStr(response.getBody()))); + timestamp, response.getHttpHeaders().getHeader(REQUEST_ID), plainBody(response))); } } @@ -70,14 +74,29 @@ public final class DefaultValidator implements Validator { String signature = response.getHttpHeaders().getHeader(SIGNATURE); if (signature == null || signature.isEmpty()) { throw new ValidationException(String.format("校验失败, 签名[%s]不存在, Request-Id=%s, HttpResponseBody=%s", SIGNATURE, - response.getHttpHeaders().getHeader(REQUEST_ID), Strings.toStr(response.getBody()))); + response.getHttpHeaders().getHeader(REQUEST_ID), plainBody(response))); } // 签名证书编号 String serialNumber = response.getHttpHeaders().getHeader(BANK_CERTIFICATE_SERIAL); if (!verifier.verify(serialNumber, message, signature)) { throw new ValidationException(String.format("校验失败, 签名[%s=%s]校验未通过, Request-Id=%s, HttpResponseBody=%s", SIGNATURE, - signature, response.getHttpHeaders().getHeader(REQUEST_ID), Strings.toStr(response.getBody()))); + signature, response.getHttpHeaders().getHeader(REQUEST_ID), plainBody(response))); } } + + private String plainBody(OriginalResponse originalResponse) { + byte[] body = originalResponse.getBody(); + + // 判断是否有body加密密钥 + if (!originalResponse.getHttpHeaders().hasHeader(SECRET_KEY)) { + return Strings.toStr(body); + } + + // 解密密钥 + String secretKey = originalResponse.getHttpHeaders().getHeader(SECRET_KEY); + String decryptSecretKey = getProfile().getPrivacy().getDecryptor().decrypt(secretKey); + // 解密body + return getProfile().getPrivacy().getSecretCipher().decrypt(Strings.toBytes(decryptSecretKey), body); + } } diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/http/HttpLogger.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/http/HttpLogger.java index 4cbf63f..301b245 100644 --- a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/http/HttpLogger.java +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/http/HttpLogger.java @@ -80,21 +80,6 @@ public class HttpLogger { logger.info("{}应答报文:{}", logPrefixText, text); } - /** - * 打印异常日志 - * - * @param originalResponse 响应数据 - */ - public void logResponseError(HttpRequest request, OriginalResponse originalResponse, String errorMessage) { - String logPrefixText = logPrefix(request); - if (isFull(logLevel)) { - originalResponse.getHttpHeaders().getHeaders().forEach((k, v) -> logger.info("{}应答头:{}:{}", logPrefixText, k, v)); - } - - String body = Strings.toStr(originalResponse.getBody() == null ? new byte[]{} : originalResponse.getBody()); - logger.error("{}{}, 应答原始报文:{}", logPrefixText, errorMessage, body); - } - public String httpReasonPhrase(OriginalResponse response) { HttpStatus status = HttpStatus.resolve(response.getStatusCode()); if (Objects.isNull(status)) { diff --git a/scfs-api-test/src/test/java/com/czcb/scfs/api/test/CommunalDataServiceTest.java b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/CommunalDataServiceTest.java new file mode 100644 index 0000000..1660a1e --- /dev/null +++ b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/CommunalDataServiceTest.java @@ -0,0 +1,35 @@ +package com.czcb.scfs.api.test; + +import com.czcb.scfs.api.service.v2.communal.CommunalDataService; +import com.czcb.scfs.api.service.v2.communal.model.FiveCascadeQueryRequest; +import com.czcb.scfs.api.service.v2.communal.model.FiveCascadeQueryResponse; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.annotation.Resource; +import java.util.UUID; + +/** + * @author wangwei + * @date 2024/5/22 + */ +@SpringBootTest +public class CommunalDataServiceTest { + + @Resource + private CommunalDataService communalDataService; + + @Test + void fiveCascadeQuery() { + FiveCascadeQueryRequest request = new FiveCascadeQueryRequest(); + request.setChannelNo("0000"); + request.setAppNo("10"); + request.setSerialNo(UUID.randomUUID().toString().replace("-", "")); + request.setSysTime("2024-03-20"); + request.setSysDate("2024-03-20"); + request.setZoningCode("110101001000000"); + FiveCascadeQueryResponse response = communalDataService.fiveCascadeQuery(request); + + System.out.println(response); + } +}