From 11afc1c8ba55e17bfe3deb6527e9376ce90d6609 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Wed, 8 May 2024 10:57:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(tenpayv3):=20=E4=BF=AE=E5=A4=8D=E4=BF=9D?= =?UTF-8?q?=E9=99=A9=E8=A1=8C=E4=B8=9A=E5=A7=94=E6=89=98=E4=BB=A3=E6=89=A3?= =?UTF-8?q?=E9=A2=84=E7=AD=BE=E7=BA=A6=E6=8E=A5=E5=8F=A3=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E8=AF=B7=E6=B1=82=E4=B8=AD=E6=95=8F=E6=84=9F?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ayInsuranceSignContractEntrustH5Request.cs | 1 + ...ceSignContractEntrustMiniProgramRequest.cs | 1 + .../TestCase_RequestEncryptionTests.cs | 177 ++++++++++++++++++ 3 files changed, 179 insertions(+) diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PAPay/InsuranceSign/PresignPAPayInsuranceSignContractEntrustH5Request.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PAPay/InsuranceSign/PresignPAPayInsuranceSignContractEntrustH5Request.cs index 94f7abd9..32a4ae06 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PAPay/InsuranceSign/PresignPAPayInsuranceSignContractEntrustH5Request.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PAPay/InsuranceSign/PresignPAPayInsuranceSignContractEntrustH5Request.cs @@ -5,6 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /papay/insurance-sign/contracts/pre-entrust-sign/h5 接口的请求。 /// + [WechatTenpaySensitive] public class PresignPAPayInsuranceSignContractEntrustH5Request : WechatTenpayRequest { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PAPay/InsuranceSign/PresignPAPayInsuranceSignContractEntrustMiniProgramRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PAPay/InsuranceSign/PresignPAPayInsuranceSignContractEntrustMiniProgramRequest.cs index f816a0bd..4e5e32bd 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PAPay/InsuranceSign/PresignPAPayInsuranceSignContractEntrustMiniProgramRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PAPay/InsuranceSign/PresignPAPayInsuranceSignContractEntrustMiniProgramRequest.cs @@ -5,6 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /papay/insurance-sign/contracts/pre-entrust-sign/mini-program 接口的请求。 /// + [WechatTenpaySensitive] public class PresignPAPayInsuranceSignContractEntrustMiniProgramRequest : WechatTenpayRequest { public static class Types diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs index 9adcb010..ed9555be 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs @@ -1047,6 +1047,183 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests } } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /papay/insurance-sign/contracts/pre-entrust-sign/h5)")] + public async Task TestEncryptRequestSensitiveProperty_PresignPAPayInsuranceSignContractEntrustH5Request() + { + static Models.PresignPAPayInsuranceSignContractEntrustH5Request GenerateMockRequestModel() + { + return new Models.PresignPAPayInsuranceSignContractEntrustH5Request() + { + RealIdentity = new Models.PresignPAPayInsuranceSignContractEntrustH5Request.Types.RealIdentity() + { + RealName = MOCK_PLAIN_STR, + IdCardNumber = MOCK_PLAIN_STR + } + }; + } + + static void AssertMockRequestModel(Models.PresignPAPayInsuranceSignContractEntrustH5Request request, Func decryptor) + { + Assert.NotEqual(MOCK_PLAIN_STR, request.RealIdentity!.RealName); + Assert.NotEqual(MOCK_PLAIN_STR, request.RealIdentity!.IdCardNumber); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.RealIdentity!.RealName)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.RealIdentity!.IdCardNumber)); + Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true); + } + + if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey)) + { + using (var client = CreateMockClientUseRSA(autoEncrypt: false)) + { + var request = GenerateMockRequestModel(); + client.EncryptRequestSensitiveProperty(request); + AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + + using (var client = CreateMockClientUseRSA(autoEncrypt: true)) + { + var request = GenerateMockRequestModel(); + await client.ExecutePresignPAPayInsuranceSignContractEntrustH5Async(request); + AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + } + + if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey)) + { + using (var client = CreateMockClientUseSM2(autoEncrypt: false)) + { + var request = GenerateMockRequestModel(); + client.EncryptRequestSensitiveProperty(request); + AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + + using (var client = CreateMockClientUseSM2(autoEncrypt: true)) + { + var request = GenerateMockRequestModel(); + await client.ExecutePresignPAPayInsuranceSignContractEntrustH5Async(request); + AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + } + } + + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /papay/insurance-sign/contracts/pre-entrust-sign/jsapi)")] + public async Task TestEncryptRequestSensitiveProperty_PresignPAPayInsuranceSignContractEntrustJsapiRequest() + { + static Models.PresignPAPayInsuranceSignContractEntrustJsapiRequest GenerateMockRequestModel() + { + return new Models.PresignPAPayInsuranceSignContractEntrustJsapiRequest() + { + RealIdentity = new Models.PresignPAPayInsuranceSignContractEntrustJsapiRequest.Types.RealIdentity() + { + RealName = MOCK_PLAIN_STR, + IdCardNumber = MOCK_PLAIN_STR + } + }; + } + + static void AssertMockRequestModel(Models.PresignPAPayInsuranceSignContractEntrustJsapiRequest request, Func decryptor) + { + Assert.NotEqual(MOCK_PLAIN_STR, request.RealIdentity!.RealName); + Assert.NotEqual(MOCK_PLAIN_STR, request.RealIdentity!.IdCardNumber); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.RealIdentity!.RealName)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.RealIdentity!.IdCardNumber)); + Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true); + } + + if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey)) + { + using (var client = CreateMockClientUseRSA(autoEncrypt: false)) + { + var request = GenerateMockRequestModel(); + client.EncryptRequestSensitiveProperty(request); + AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + + using (var client = CreateMockClientUseRSA(autoEncrypt: true)) + { + var request = GenerateMockRequestModel(); + await client.ExecutePresignPAPayInsuranceSignContractEntrustJsapiAsync(request); + AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + } + + if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey)) + { + using (var client = CreateMockClientUseSM2(autoEncrypt: false)) + { + var request = GenerateMockRequestModel(); + client.EncryptRequestSensitiveProperty(request); + AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + + using (var client = CreateMockClientUseSM2(autoEncrypt: true)) + { + var request = GenerateMockRequestModel(); + await client.ExecutePresignPAPayInsuranceSignContractEntrustJsapiAsync(request); + AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + } + } + + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /papay/insurance-sign/contracts/pre-entrust-sign/mini-program)")] + public async Task TestEncryptRequestSensitiveProperty_PresignPAPayInsuranceSignContractEntrustMiniProgramRequest() + { + static Models.PresignPAPayInsuranceSignContractEntrustMiniProgramRequest GenerateMockRequestModel() + { + return new Models.PresignPAPayInsuranceSignContractEntrustMiniProgramRequest() + { + RealIdentity = new Models.PresignPAPayInsuranceSignContractEntrustMiniProgramRequest.Types.RealIdentity() + { + RealName = MOCK_PLAIN_STR, + IdCardNumber = MOCK_PLAIN_STR + } + }; + } + + static void AssertMockRequestModel(Models.PresignPAPayInsuranceSignContractEntrustMiniProgramRequest request, Func decryptor) + { + Assert.NotEqual(MOCK_PLAIN_STR, request.RealIdentity!.RealName); + Assert.NotEqual(MOCK_PLAIN_STR, request.RealIdentity!.IdCardNumber); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.RealIdentity!.RealName)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.RealIdentity!.IdCardNumber)); + Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true); + } + + if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey)) + { + using (var client = CreateMockClientUseRSA(autoEncrypt: false)) + { + var request = GenerateMockRequestModel(); + client.EncryptRequestSensitiveProperty(request); + AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + + using (var client = CreateMockClientUseRSA(autoEncrypt: true)) + { + var request = GenerateMockRequestModel(); + await client.ExecutePresignPAPayInsuranceSignContractEntrustMiniProgramAsync(request); + AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + } + + if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey)) + { + using (var client = CreateMockClientUseSM2(autoEncrypt: false)) + { + var request = GenerateMockRequestModel(); + client.EncryptRequestSensitiveProperty(request); + AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + + using (var client = CreateMockClientUseSM2(autoEncrypt: true)) + { + var request = GenerateMockRequestModel(); + await client.ExecutePresignPAPayInsuranceSignContractEntrustMiniProgramAsync(request); + AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + } + } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /payroll-card/authentications/pre-order-with-auth)")] public async Task TestEncryptRequestSensitiveProperty_PreorderPayrollCardAuthenticationRequest() {