From f1a376215404f94ba824467d457d7d430f976022 Mon Sep 17 00:00:00 2001 From: 13009 Date: Fri, 26 Jul 2024 17:29:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8F=91=E5=8F=B7=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/core/cipher/DefaultCredential.java | 6 ++- .../api/core/cipher/DefaultSequencer.java | 37 ++++++++++++++++ .../api/core/cipher/DefaultSignature.java | 11 ++++- .../czcb/scfs/api/core/cipher/Sequencer.java | 15 +++++++ .../czcb/scfs/api/core/cipher/Signature.java | 7 +++ .../czcb/scfs/api/core/http/HttpRequest.java | 7 --- .../czcb/scfs/api/core/validation/Length.java | 24 +++++++++++ .../api/core/cipher/DefaultSequencerTest.java | 26 +++++++++++ .../api/core/cipher/DefaultSignatureTest.java | 4 +- .../api/core/cipher/DefaultValidatorTest.java | 4 +- .../api/core/http/ApiClientBuilderTest.java | 15 +++++-- .../scfs/api/core/http/HttpRequestTest.java | 19 ++++++++ .../client/ApacheHttpclientGroupTest.java | 3 +- .../client/ApacheHttpclientProxyTest.java | 3 +- .../http/client/ApacheHttpclientTest.java | 3 +- .../client/ApacheHttpclientTestProxyTest.java | 3 +- .../http/client/ApacheHttpclientV2Test.java | 3 +- .../http/client/ApacheHttpclientV3Test.java | 3 +- .../client/ApacheHttpclientValidTest.java | 3 +- .../com/czcb/scfs/api/rsa/RsaProfile.java | 13 +++++- .../czcb/scfs/api/service/MockResponse.java | 5 ++- .../java/com/czcb/scfs/api/sm/SmProfile.java | 13 +++++- .../boot/starter/ScfsAutoConfiguration.java | 43 ++++++++++++------- .../starter/ScfsAutoConfigurationTest.java | 20 +++++++++ .../api/test/service/InvoiceServiceTest.java | 18 ++++++-- .../api/test/service/LoanServiceTest.java | 11 +++++ 26 files changed, 272 insertions(+), 47 deletions(-) create mode 100644 scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSequencer.java create mode 100644 scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/Sequencer.java create mode 100644 scfs-api-core/src/main/java/com/czcb/scfs/api/core/validation/Length.java create mode 100644 scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultSequencerTest.java diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultCredential.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultCredential.java index 0f2f253..19e194a 100644 --- a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultCredential.java +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultCredential.java @@ -19,9 +19,11 @@ import static java.util.Objects.requireNonNull; */ public class DefaultCredential implements Credential { private final Signer signer; + private final Sequencer sequencer; - public DefaultCredential(Signer signer) { + public DefaultCredential(Signer signer, Sequencer sequencer) { this.signer = requireNonNull(signer); + this.sequencer = requireNonNull(sequencer); } @Override @@ -34,7 +36,7 @@ public class DefaultCredential implements Credential { private void addNecessityCustomizeHeaders(HttpRequest request, Channel channel, Signer signer) { request.getHttpHeaders().addHeader(CHANNEL_CERTIFICATE_SERIAL, signer.getCertificateSerial()); - request.getHttpHeaders().addHeader(NONCE, request.getId()); + request.getHttpHeaders().addHeader(NONCE, Objects.isNull(request.getId()) ? sequencer.next() : request.getId()); request.getHttpHeaders().addHeader(TIMESTAMP, DateTimes.ofTimestamp()); if (channel.isChannelGroupMode()) { diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSequencer.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSequencer.java new file mode 100644 index 0000000..dde13f9 --- /dev/null +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSequencer.java @@ -0,0 +1,37 @@ +package com.czcb.scfs.api.core.cipher; + +import com.czcb.scfs.api.core.util.DateTimes; + +import java.security.SecureRandom; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author wangwei + * @since 2024/7/26 + */ +public class DefaultSequencer implements Sequencer { + private final SecureRandom secureRandom = new SecureRandom(); + private final AtomicInteger number = new AtomicInteger(1); + + @Override + public String next() { + return String.format("%s%s%s", getCurrentDate(), getRandomStr(), getNumber()); + } + + private String getCurrentDate() { + return DateTimes.of("yyyyMMdd"); + } + + private String getRandomStr() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 16; i++) { + sb.append(secureRandom.nextInt(9)); + } + + return sb.toString(); + } + + private Integer getNumber() { + return number.getAndIncrement(); + } +} diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSignature.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSignature.java index 4a7b7d0..e5aef53 100644 --- a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSignature.java +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSignature.java @@ -11,12 +11,14 @@ public class DefaultSignature implements Signature { private final Credential credential; private final Signer signer; private final Verifier verifier; + private final Sequencer sequencer; - public DefaultSignature(CertificateProvider certificateProvider, Signer signer, Verifier verifier) { + public DefaultSignature(CertificateProvider certificateProvider, Signer signer, Verifier verifier, Sequencer sequencer) { this.certificateProvider = certificateProvider; this.signer = signer; this.verifier = verifier; - this.credential = new DefaultCredential(this.signer); + this.credential = new DefaultCredential(signer, sequencer); + this.sequencer = sequencer; } @Override @@ -38,4 +40,9 @@ public class DefaultSignature implements Signature { public Verifier getVerifier() { return verifier; } + + @Override + public Sequencer getSequencer() { + return sequencer; + } } diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/Sequencer.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/Sequencer.java new file mode 100644 index 0000000..8a587d4 --- /dev/null +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/Sequencer.java @@ -0,0 +1,15 @@ +package com.czcb.scfs.api.core.cipher; + +import com.czcb.scfs.api.core.validation.Length; + +/** + * 发号器 + * + * @author wangwei + * @since 2024/7/26 + */ +public interface Sequencer { + + @Length(max = 32) + String next(); +} diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/Signature.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/Signature.java index d741b51..0a88e79 100644 --- a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/Signature.java +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/Signature.java @@ -28,4 +28,11 @@ public interface Signature { * @return Verifier */ Verifier getVerifier(); + + /** + * 发号器 + * + * @return Sequencer + */ + Sequencer getSequencer(); } diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/http/HttpRequest.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/http/HttpRequest.java index 5e5634a..0a07b9f 100644 --- a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/http/HttpRequest.java +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/http/HttpRequest.java @@ -1,8 +1,5 @@ package com.czcb.scfs.api.core.http; -import com.czcb.scfs.api.core.util.Nonce; -import com.czcb.scfs.api.core.util.Strings; - import java.util.Map; import java.util.Objects; @@ -193,10 +190,6 @@ public class HttpRequest { requireNonNull(this.httpMethod); requireNonNull(this.url); - if (Strings.isEmpty(this.id)) { - this.id = Nonce.ofNonce(); - } - if (Objects.isNull(this.headers)) { this.headers = new HttpHeaders(); } diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/validation/Length.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/validation/Length.java new file mode 100644 index 0000000..eea0707 --- /dev/null +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/validation/Length.java @@ -0,0 +1,24 @@ +package com.czcb.scfs.api.core.validation; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * @author wangwei + * @since 2024/7/9 + */ +@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE}) +@Retention(RUNTIME) +@Documented +public @interface Length { + String message() default ""; + + int min() default 0; + + int max() default 100; +} + diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultSequencerTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultSequencerTest.java new file mode 100644 index 0000000..e4b19de --- /dev/null +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultSequencerTest.java @@ -0,0 +1,26 @@ +package com.czcb.scfs.api.core.cipher; + +import com.czcb.scfs.api.core.util.DateTimes; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class DefaultSequencerTest { + + @Test + void next() { + Sequencer sequencer = new DefaultSequencer(); + String next = sequencer.next(); + Assertions.assertNotNull(next); + + Assertions.assertEquals(25, next.length()); + } + + @Test + void testNextDate() { + Sequencer sequencer = new DefaultSequencer(); + String next = sequencer.next(); + Assertions.assertNotNull(next); + String text = DateTimes.ofTransDate().replace("-", ""); + Assertions.assertTrue(next.startsWith(text)); + } +} \ No newline at end of file diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultSignatureTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultSignatureTest.java index a095a57..45e2fdb 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultSignatureTest.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultSignatureTest.java @@ -20,11 +20,13 @@ class DefaultSignatureTest { Signer signer = new TestSigner(KeyText.loadTestPrivateKeyRSA(), ""); Verifier verifier = new TestVerifier(provider); - DefaultSignature signature = new DefaultSignature(provider, signer, verifier); + DefaultSignature signature = new DefaultSignature(provider, signer, verifier, new DefaultSequencer()); Assertions.assertNotNull(signature.getCertificateProvider()); Assertions.assertNotNull(signature.getSigner()); Assertions.assertNotNull(signature.getCredential()); Assertions.assertNotNull(signature.getVerifier()); + Assertions.assertNotNull(signature.getSequencer()); + Assertions.assertNotNull(signature.getSequencer().next()); } } \ No newline at end of file diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultValidatorTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultValidatorTest.java index 158501e..08ce843 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultValidatorTest.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/cipher/DefaultValidatorTest.java @@ -35,7 +35,7 @@ class DefaultValidatorTest { Privacy privacy = new TestPrivacy(privateKey, certificateProvider); Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "6CDDAA92CAD75998325027647847330C1756291"), - new TestVerifier(certificateProvider)); + new TestVerifier(certificateProvider), new DefaultSequencer()); return new TestProfile( privacy, @@ -62,7 +62,7 @@ class DefaultValidatorTest { Privacy privacy = new TestPrivacy(privateKey, certificateProvider); Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "823CF3E310F2E2ED1AF85506E74A95DC4301006FDEF2FD019953FAF4DE12A8BF"), - new TestVerifier(certificateProvider)); + new TestVerifier(certificateProvider), new DefaultSequencer()); return new TestProfile( privacy, diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/ApiClientBuilderTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/ApiClientBuilderTest.java index cf0dbf3..bfa134e 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/ApiClientBuilderTest.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/ApiClientBuilderTest.java @@ -29,7 +29,10 @@ class ApiClientBuilderTest { list.add(certificate); CertificateProvider certificateProvider = new LocalCertificateProvider(list); Privacy privacy = new TestPrivacy(privateKey, certificateProvider); - Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, ""), new TestVerifier(certificateProvider)); + Signature signature = new DefaultSignature(certificateProvider, + new TestSigner(privateKey, ""), + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, @@ -106,7 +109,10 @@ class ApiClientBuilderTest { list.add(certificate); CertificateProvider certificateProvider = new LocalCertificateProvider(list); Privacy privacy = new TestPrivacy(privateKey, certificateProvider); - Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, ""), new TestVerifier(certificateProvider)); + Signature signature = new DefaultSignature(certificateProvider, + new TestSigner(privateKey, ""), + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, @@ -126,7 +132,10 @@ class ApiClientBuilderTest { list.add(certificate); CertificateProvider certificateProvider = new LocalCertificateProvider(list); Privacy privacy = new TestPrivacy(privateKey, certificateProvider); - Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, ""), new TestVerifier(certificateProvider)); + Signature signature = new DefaultSignature(certificateProvider, + new TestSigner(privateKey, ""), + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/HttpRequestTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/HttpRequestTest.java index 816a6a8..9772c32 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/HttpRequestTest.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/HttpRequestTest.java @@ -42,6 +42,13 @@ class HttpRequestTest { .url("/aa") .build(); Assertions.assertNotNull(httpRequest.getHttpHeaders()); + + httpRequest = new HttpRequest.Builder() + .httpMethod(HttpMethod.GET) + .url("/aa") + .headers(null) + .build(); + Assertions.assertNotNull(httpRequest.getHttpHeaders()); } @Test @@ -85,6 +92,18 @@ class HttpRequestTest { Assertions.assertNull(httpRequest.getHttpHeaders().getHeader("Accept-Encoding")); } + @Test + void id() { + HttpRequest httpRequest = new HttpRequest.Builder() + .httpMethod(HttpMethod.GET) + .url("/aa") + .id("3333") + .compression(true) + .build(); + + Assertions.assertEquals("3333", httpRequest.getId()); + } + @Test void newBuilder() { HttpRequest httpRequest = new HttpRequest.Builder() diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientGroupTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientGroupTest.java index 17b4527..c185f06 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientGroupTest.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientGroupTest.java @@ -46,7 +46,8 @@ class ApacheHttpclientGroupTest { Privacy privacy = new TestPrivacy(privateKey, certificateProvider); Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "6CDDAA92CAD75998325027647847330C1756291"), - new TestVerifier(certificateProvider)); + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, signature, new DefaultChannel.Builder() diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientProxyTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientProxyTest.java index 6745b31..8fdeb3f 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientProxyTest.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientProxyTest.java @@ -45,7 +45,8 @@ class ApacheHttpclientProxyTest { Privacy privacy = new TestPrivacy(privateKey, certificateProvider); Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "6CDDAA92CAD75998325027647847330C1756291"), - new TestVerifier(certificateProvider)); + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, signature, new DefaultChannel.Builder() diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientTest.java index 3fc34d7..42f3090 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientTest.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientTest.java @@ -50,7 +50,8 @@ class ApacheHttpclientTest { Privacy privacy = new TestPrivacy(privateKey, certificateProvider); Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "6CDDAA92CAD75998325027647847330C1756291"), - new TestVerifier(certificateProvider)); + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, signature, new DefaultChannel.Builder() diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientTestProxyTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientTestProxyTest.java index a3b15bd..67f4a7a 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientTestProxyTest.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientTestProxyTest.java @@ -45,7 +45,8 @@ class ApacheHttpclientTestProxyTest { Privacy privacy = new TestPrivacy(privateKey, certificateProvider); Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "6CDDAA92CAD75998325027647847330C1756291"), - new TestVerifier(certificateProvider)); + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, signature, new DefaultChannel.Builder() diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientV2Test.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientV2Test.java index d0c5a56..3b5b628 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientV2Test.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientV2Test.java @@ -46,7 +46,8 @@ class ApacheHttpclientV2Test { Privacy privacy = new TestPrivacy(privateKey, certificateProvider); Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "6CDDAA92CAD75998325027647847330C1756291"), - new TestVerifier(certificateProvider)); + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, signature, new DefaultChannel.Builder() diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientV3Test.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientV3Test.java index f1df51a..303f2d0 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientV3Test.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientV3Test.java @@ -46,7 +46,8 @@ class ApacheHttpclientV3Test { Privacy privacy = new TestPrivacy(privateKey, certificateProvider); Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "6CDDAA92CAD75998325027647847330C1756291"), - new TestVerifier(certificateProvider)); + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, signature, new DefaultChannel.Builder() diff --git a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientValidTest.java b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientValidTest.java index c4eceeb..3874792 100644 --- a/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientValidTest.java +++ b/scfs-api-core/src/test/java/com/czcb/scfs/api/core/http/client/ApacheHttpclientValidTest.java @@ -45,7 +45,8 @@ class ApacheHttpclientValidTest { Privacy privacy = new TestPrivacy(privateKey, certificateProvider); Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "823CF3E310F2E2ED1AF85506E74A95DC4301006FDEF2FD019953FAF4DE12A8BF"), - new TestVerifier(certificateProvider)); + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, signature, new DefaultChannel.Builder() diff --git a/scfs-api-rsa/src/main/java/com/czcb/scfs/api/rsa/RsaProfile.java b/scfs-api-rsa/src/main/java/com/czcb/scfs/api/rsa/RsaProfile.java index 46e76dd..8574c8f 100644 --- a/scfs-api-rsa/src/main/java/com/czcb/scfs/api/rsa/RsaProfile.java +++ b/scfs-api-rsa/src/main/java/com/czcb/scfs/api/rsa/RsaProfile.java @@ -31,6 +31,7 @@ public class RsaProfile extends AbstractProfile { private Signature signature; private Channel channel; private HttpProfile httpProfile; + private Sequencer sequencer; public Builder privateKey(PrivateKey privateKey) { this.privateKey = privateKey; @@ -65,15 +66,25 @@ public class RsaProfile extends AbstractProfile { return this; } + public Builder sequencer(Sequencer sequencer) { + this.sequencer = sequencer; + return this; + } + public RsaProfile build() { requireNonNull(this.channel); + if (Objects.isNull(this.sequencer)) { + this.sequencer = new DefaultSequencer(); + } + CertificateProvider certificateProvider = new LocalCertificateProvider(certificates); this.privacy = new RsaPrivacy(privateKey, certificateProvider); X509Certificate certificate = certificateProvider.getAvailableCertificate(); this.signature = new DefaultSignature(certificateProvider, new RsaSigner(privateKey, certificate.getSerialNumber().toString(HEX)), - new RsaVerifier(certificateProvider)); + new RsaVerifier(certificateProvider), + this.sequencer); httpProfile(httpProfile); if (Objects.isNull(httpProfile)) { diff --git a/scfs-api-service/src/test/java/com/czcb/scfs/api/service/MockResponse.java b/scfs-api-service/src/test/java/com/czcb/scfs/api/service/MockResponse.java index 109f4af..6f47f0a 100644 --- a/scfs-api-service/src/test/java/com/czcb/scfs/api/service/MockResponse.java +++ b/scfs-api-service/src/test/java/com/czcb/scfs/api/service/MockResponse.java @@ -45,7 +45,10 @@ public class MockResponse { list.add(certificate); CertificateProvider certificateProvider = new LocalCertificateProvider(list); Privacy privacy = new TestPrivacy(privateKey, certificateProvider); - Signature signature = new DefaultSignature(certificateProvider, new TestSigner(privateKey, "6CDDAA92CAD75998325027647847330C1756291"), new TestVerifier(certificateProvider)); + Signature signature = new DefaultSignature(certificateProvider, + new TestSigner(privateKey, "6CDDAA92CAD75998325027647847330C1756291"), + new TestVerifier(certificateProvider), + new DefaultSequencer()); return new TestProfile( privacy, signature, new DefaultChannel.Builder() diff --git a/scfs-api-sm/src/main/java/com/czcb/scfs/api/sm/SmProfile.java b/scfs-api-sm/src/main/java/com/czcb/scfs/api/sm/SmProfile.java index 24c35b2..99b2952 100644 --- a/scfs-api-sm/src/main/java/com/czcb/scfs/api/sm/SmProfile.java +++ b/scfs-api-sm/src/main/java/com/czcb/scfs/api/sm/SmProfile.java @@ -41,6 +41,7 @@ public final class SmProfile extends AbstractProfile { private Signature signature; private Channel channel; private HttpProfile httpProfile; + private Sequencer sequencer; public Builder privateKey(PrivateKey privateKey) { this.privateKey = privateKey; @@ -81,9 +82,18 @@ public final class SmProfile extends AbstractProfile { return this; } + public Builder sequencer(Sequencer sequencer) { + this.sequencer = sequencer; + return this; + } + public SmProfile build() { Objects.requireNonNull(this.channel); + if (Objects.isNull(this.sequencer)) { + this.sequencer = new DefaultSequencer(); + } + // 证书加载器 CertificateProvider certificateProvider = new LocalCertificateProvider(certificates); // 加密器 @@ -91,7 +101,8 @@ public final class SmProfile extends AbstractProfile { // 签名器 this.signature = new DefaultSignature(certificateProvider, new Sm2Signer(privateKey, certificateSerial), - new Sm2Verifier(certificateProvider)); + new Sm2Verifier(certificateProvider), + this.sequencer); httpProfile(httpProfile); if (Objects.isNull(httpProfile)) { diff --git a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java index 60f620c..9b6e94e 100644 --- a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java +++ b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java @@ -2,6 +2,8 @@ package com.czcb.scfs.spring.boot.starter; import com.czcb.scfs.api.core.ApiClient; import com.czcb.scfs.api.core.Profile; +import com.czcb.scfs.api.core.cipher.DefaultSequencer; +import com.czcb.scfs.api.core.cipher.Sequencer; import com.czcb.scfs.api.core.http.ApiClientBuilder; import com.czcb.scfs.api.service.echo.EchoService; import com.czcb.scfs.api.service.v2.account.AccountService; @@ -18,7 +20,7 @@ import com.czcb.scfs.api.service.v2.ocr.OcrService; import com.czcb.scfs.api.service.v2.pay.PayService; import com.czcb.scfs.api.service.v2.sms.SmsService; import com.czcb.scfs.api.service.v2.trans.TransService; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -49,16 +51,25 @@ public class ScfsAutoConfiguration { * 心跳检查 */ @Bean - @ConditionalOnClass(EchoService.class) + @ConditionalOnMissingBean public EchoService echoService(ApiClient apiClient) { return new EchoService(apiClient); } + /** + * 发号器 + */ + @Bean + @ConditionalOnMissingBean + public Sequencer sequencer() { + return new DefaultSequencer(); + } + /** * 账户相关 */ @Bean - @ConditionalOnClass(AccountService.class) + @ConditionalOnMissingBean public AccountService accountService(ApiClient apiClient) { return new AccountService(apiClient); } @@ -67,7 +78,7 @@ public class ScfsAutoConfiguration { * 账单相关 */ @Bean - @ConditionalOnClass(BillService.class) + @ConditionalOnMissingBean public BillService billService(ApiClient apiClient) { return new BillService(apiClient); } @@ -76,7 +87,7 @@ public class ScfsAutoConfiguration { * 白名单 */ @Bean - @ConditionalOnClass(BmdService.class) + @ConditionalOnMissingBean public BmdService bmdService(ApiClient apiClient) { return new BmdService(apiClient); } @@ -85,7 +96,7 @@ public class ScfsAutoConfiguration { * 公共数据 */ @Bean - @ConditionalOnClass(CommunalDataService.class) + @ConditionalOnMissingBean public CommunalDataService communalDataService(ApiClient apiClient) { return new CommunalDataService(apiClient); } @@ -95,7 +106,7 @@ public class ScfsAutoConfiguration { * 人脸识别 */ @Bean - @ConditionalOnClass(FaceService.class) + @ConditionalOnMissingBean public FaceService faceService(ApiClient apiClient) { return new FaceService(apiClient); } @@ -104,7 +115,7 @@ public class ScfsAutoConfiguration { * 文件上传下载 */ @Bean - @ConditionalOnClass(FileService.class) + @ConditionalOnMissingBean public FileService fileService(ApiClient apiClient) { return new FileService(apiClient); } @@ -113,7 +124,7 @@ public class ScfsAutoConfiguration { * 贷款类 */ @Bean - @ConditionalOnClass(LoanService.class) + @ConditionalOnMissingBean public LoanService loanService(ApiClient apiClient) { return new LoanService(apiClient); } @@ -122,7 +133,7 @@ public class ScfsAutoConfiguration { * OCR识别 */ @Bean - @ConditionalOnClass(OcrService.class) + @ConditionalOnMissingBean public OcrService ocrService(ApiClient apiClient) { return new OcrService(apiClient); } @@ -131,7 +142,7 @@ public class ScfsAutoConfiguration { * 支付类 */ @Bean - @ConditionalOnClass(PayService.class) + @ConditionalOnMissingBean public PayService payService(ApiClient apiClient) { return new PayService(apiClient); } @@ -140,7 +151,7 @@ public class ScfsAutoConfiguration { * 短信类 */ @Bean - @ConditionalOnClass(SmsService.class) + @ConditionalOnMissingBean public SmsService smsService(ApiClient apiClient) { return new SmsService(apiClient); } @@ -149,7 +160,7 @@ public class ScfsAutoConfiguration { * 交易类 */ @Bean - @ConditionalOnClass(TransService.class) + @ConditionalOnMissingBean public TransService transService(ApiClient apiClient) { return new TransService(apiClient); } @@ -158,19 +169,19 @@ public class ScfsAutoConfiguration { * 发票类 */ @Bean - @ConditionalOnClass(InvoiceService.class) + @ConditionalOnMissingBean public InvoiceService invoiceService(ApiClient apiClient) { return new InvoiceService(apiClient); } @Bean - @ConditionalOnClass(ProjectService.class) + @ConditionalOnMissingBean public ProjectService projectService(ApiClient apiClient) { return new ProjectService(apiClient); } @Bean - @ConditionalOnClass(OrderService.class) + @ConditionalOnMissingBean public OrderService orderService(ApiClient apiClient) { return new OrderService(apiClient); } diff --git a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfigurationTest.java b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfigurationTest.java index bc6b67b..2d51d59 100644 --- a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfigurationTest.java +++ b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfigurationTest.java @@ -72,6 +72,11 @@ class ScfsAutoConfigurationTest { Assertions.assertNotNull(configuration.echoService(apiClient())); } + @Test + void sequencer() { + Assertions.assertNotNull(configuration.sequencer()); + } + @Test void accountService() { Assertions.assertNotNull(configuration.accountService(apiClient())); @@ -126,4 +131,19 @@ class ScfsAutoConfigurationTest { void transService() { Assertions.assertNotNull(configuration.transService(apiClient())); } + + @Test + void invoiceService() { + Assertions.assertNotNull(configuration.invoiceService(apiClient())); + } + + @Test + void projectService() { + Assertions.assertNotNull(configuration.projectService(apiClient())); + } + + @Test + void orderService() { + Assertions.assertNotNull(configuration.orderService(apiClient())); + } } \ No newline at end of file diff --git a/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/InvoiceServiceTest.java b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/InvoiceServiceTest.java index 946797e..0ad29aa 100644 --- a/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/InvoiceServiceTest.java +++ b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/InvoiceServiceTest.java @@ -1,10 +1,7 @@ package com.czcb.scfs.api.test.service; import com.czcb.scfs.api.service.v2.invoice.InvoiceService; -import com.czcb.scfs.api.service.v2.invoice.model.InvoiceDepositQueryRequest; -import com.czcb.scfs.api.service.v2.invoice.model.InvoiceDepositQueryResponse; -import com.czcb.scfs.api.service.v2.invoice.model.InvoiceInfoSaveRequest; -import com.czcb.scfs.api.service.v2.invoice.model.InvoiceSettleMatchRequest; +import com.czcb.scfs.api.service.v2.invoice.model.*; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -60,4 +57,17 @@ class InvoiceServiceTest { InvoiceDepositQueryResponse response = invoiceService.invoiceDepositQuery(request); System.out.println(response); } + + @Test + void invoiceSettleRepay() { + InvoiceSettleRepayRequest request = new InvoiceSettleRepayRequest(); + request.setChannelNo("1039"); + request.setAppNo("21"); + request.setSerialNo("123456"); + request.setTransDate("2024-07-24"); + request.setTransTradeTime("2024-07-24 15:52:11"); + + InvoiceSettleRepayResponse response = invoiceService.invoiceSettleRepay(request); + System.out.println(response); + } } diff --git a/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/LoanServiceTest.java b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/LoanServiceTest.java index 97345e6..e76b225 100644 --- a/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/LoanServiceTest.java +++ b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/LoanServiceTest.java @@ -1,8 +1,19 @@ package com.czcb.scfs.api.test.service; +import com.czcb.scfs.api.service.v2.loan.LoanService; +import com.czcb.scfs.api.service.v2.loan.model.ApplyPersonRequest; +import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import javax.annotation.Resource; + @SpringBootTest class LoanServiceTest { + @Resource + private LoanService loanService; + @Test + void applyPerson() { + loanService.applyPerson(new ApplyPersonRequest()); + } }