From ec6e3f7e7a4f06cca55c1fe1905cf3c6be70c8f6 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 3 Dec 2021 16:27:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(tenpayv3):=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=93=8D=E5=BA=94=E6=A8=A1=E5=9E=8B=E8=A7=A3=E5=AF=86?= =?UTF-8?q?=E6=95=8F=E6=84=9F=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5=E6=97=B6?= =?UTF-8?q?=E6=8A=9B=E5=87=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WechatTenpaySensitiveAttribute.cs | 12 +++ ...TenpayClientRequestEncryptionExtensions.cs | 80 ++++++++++--------- ...enpayClientResponseDecryptionExtensions.cs | 39 +++++---- ...eateApplyForSubMerchantApplymentRequest.cs | 1 + ...ifyApplyForSubMerchantSettlementRequest.cs | 1 + .../CreateApplyForSubjectApplymentRequest.cs | 1 + .../GetBillSubMerchantFundflowBillResponse.cs | 1 + .../CreateBrandProfitSharingOrderRequest.cs | 1 + .../Certificates/QueryCertificatesResponse.cs | 1 + .../CreateEcommerceApplymentRequest.cs | 1 + ...erceApplymentByOutRequestNumberResponse.cs | 1 + .../GetEcommerceBillFundflowBillResponse.cs | 1 + ...reateEcommerceProfitSharingOrderRequest.cs | 1 + ...ddEcommerceProfitSharingReceiverRequest.cs | 1 + ...ntServiceComplaintByComplaintIdResponse.cs | 1 + .../QueryMerchantServiceComplaintsResponse.cs | 1 + ...ferBatchDetailByOutDetailNumberResponse.cs | 1 + .../GetPayScoreMerchantBillResponse.cs | 1 + .../CreateProfitSharingOrderRequest.cs | 1 + .../AddProfitSharingReceiverRequest.cs | 1 + .../AddProfitSharingReceiverResponse.cs | 1 + .../SmartGuide/CreateSmartGuideRequest.cs | 1 + .../SmartGuide/QuerySmartGuidesRequest.cs | 1 + .../SmartGuide/QuerySmartGuidesResponse.cs | 1 + .../SmartGuide/UpdateSmartGuideRequest.cs | 1 + .../Batches/CreateTransferBatchRequest.cs | 1 + ...ferBatchDetailByOutDetailNumberResponse.cs | 1 + .../Utilities/Internal/ReflectionUtility.cs | 23 +++++- 28 files changed, 120 insertions(+), 58 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Attributes/WechatTenpaySensitiveAttribute.cs diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Attributes/WechatTenpaySensitiveAttribute.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Attributes/WechatTenpaySensitiveAttribute.cs new file mode 100644 index 00000000..a6db0849 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Attributes/WechatTenpaySensitiveAttribute.cs @@ -0,0 +1,12 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] + public sealed class WechatTenpaySensitiveAttribute : Attribute + { + public WechatTenpaySensitiveAttribute() + { + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientRequestEncryptionExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientRequestEncryptionExtensions.cs index 121c8fd7..b2d43dfa 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientRequestEncryptionExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientRequestEncryptionExtensions.cs @@ -23,55 +23,59 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 try { - // 遍历并加密被标记为敏感数据的字段 - Utilities.ReflectionUtility.ReplacePropertyStringValue(ref request, (obj, prop, value) => + bool requireEncrypt = request.GetType().GetCustomAttributes(inherit: true).Any(); + if (requireEncrypt) { - var attr = prop.GetCustomAttribute(); - if (attr == null) - return value; - - if (Constants.EncryptionAlgorithms.RSA_2048_PKCS8_ECB.Equals(attr.Algorithm)) + // 遍历并加密被标记为敏感数据的字段 + Utilities.ReflectionUtility.ReplacePropertyStringValue(ref request, (obj, prop, value) => { - if (client.CertificateManager == null) - throw new Exceptions.WechatTenpayRequestEncryptionException("Encrypt request failed, because there is no platform certificate in the manager."); + var attr = prop.GetCustomAttribute(); + if (attr == null) + return value; - string certificate; - - if (!string.IsNullOrEmpty(request.WechatpayCertSerialNumber)) + if (Constants.EncryptionAlgorithms.RSA_2048_PKCS8_ECB.Equals(attr.Algorithm)) { - // 如果已在请求中指定特定的平台证书序列号,直接从管理器中取值 - var cert = client.CertificateManager.GetEntry(request.WechatpayCertSerialNumber!); - if (!cert.HasValue) + if (client.CertificateManager == null) + throw new Exceptions.WechatTenpayRequestEncryptionException("Encrypt request failed, because there is no platform certificate in the manager."); + + string certificate; + + if (!string.IsNullOrEmpty(request.WechatpayCertSerialNumber)) { - throw new Exceptions.WechatTenpayEventVerificationException("Encrypt request failed, because there is no platform certificate matched the serial number."); + // 如果已在请求中指定特定的平台证书序列号,直接从管理器中取值 + var cert = client.CertificateManager.GetEntry(request.WechatpayCertSerialNumber!); + if (!cert.HasValue) + { + throw new Exceptions.WechatTenpayEventVerificationException("Encrypt request failed, because there is no platform certificate matched the serial number."); + } + + certificate = cert.Value.Certificate; + } + else + { + // 如果未在请求中指定特定的平台证书序列号,从管理器中取过期时间最远的 + var certs = client.CertificateManager.AllEntries().OrderByDescending(e => e.ExpireTime); + if (!certs.Any()) + { + throw new Exceptions.WechatTenpayEventVerificationException("Encrypt request failed, because there is no platform certificate in the manager."); + } + + var cert = certs.First(); + certificate = cert.Certificate; + request.WechatpayCertSerialNumber = cert.SerialNumber; } - certificate = cert.Value.Certificate; + return Utilities.RSAUtility.EncryptWithECBByCertificate( + certificate: certificate, + plainText: value + ); } else { - // 如果未在请求中指定特定的平台证书序列号,从管理器中取过期时间最远的 - var certs = client.CertificateManager.AllEntries().OrderByDescending(e => e.ExpireTime); - if (!certs.Any()) - { - throw new Exceptions.WechatTenpayEventVerificationException("Encrypt request failed, because there is no platform certificate in the manager."); - } - - var cert = certs.First(); - certificate = cert.Certificate; - request.WechatpayCertSerialNumber = cert.SerialNumber; + throw new Exceptions.WechatTenpayRequestEncryptionException("Unsupported encryption algorithm."); } - - return Utilities.RSAUtility.EncryptWithECBByCertificate( - certificate: certificate, - plainText: value - ); - } - else - { - throw new Exceptions.WechatTenpayRequestEncryptionException("Unsupported encryption algorithm."); - } - }); + }); + } } catch (Exception ex) when (!(ex is Exceptions.WechatTenpayRequestEncryptionException)) { diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseDecryptionExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseDecryptionExtensions.cs index 25b96692..202280b8 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseDecryptionExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseDecryptionExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Reflection; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 @@ -54,25 +55,29 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 return response; } - // 遍历并解密被标记为敏感数据的字段 - Utilities.ReflectionUtility.ReplacePropertyStringValue(ref response, (obj, prop, value) => + bool requireDecrypt = response.GetType().GetCustomAttributes(inherit: true).Any(); + if (requireDecrypt) { - var attr = prop.GetCustomAttribute(); - if (attr == null) - return value; + // 遍历并解密被标记为敏感数据的字段 + Utilities.ReflectionUtility.ReplacePropertyStringValue(ref response, (obj, prop, value) => + { + var attr = prop.GetCustomAttribute(); + if (attr == null) + return value; - if (Constants.EncryptionAlgorithms.RSA_2048_PKCS8_ECB.Equals(attr.Algorithm)) - { - return Utilities.RSAUtility.DecryptWithECB( - privateKey: client.Credentials.MerchantCertPrivateKey, - cipherText: value - ); - } - else - { - throw new Exceptions.WechatTenpayResponseDecryptionException("Unsupported decryption algorithm."); - } - }); + if (Constants.EncryptionAlgorithms.RSA_2048_PKCS8_ECB.Equals(attr.Algorithm)) + { + return Utilities.RSAUtility.DecryptWithECB( + privateKey: client.Credentials.MerchantCertPrivateKey, + cipherText: value + ); + } + else + { + throw new Exceptions.WechatTenpayResponseDecryptionException("Unsupported decryption algorithm."); + } + }); + } } catch (Exception ex) when (!(ex is Exceptions.WechatTenpayResponseDecryptionException)) { diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.cs index 57c46574..98683e06 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /applyment4sub/applyment/ 接口的请求。 /// + [WechatTenpaySensitive] public class CreateApplyForSubMerchantApplymentRequest : WechatTenpayRequest { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.cs index a0683bd8..a7c5eb4b 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.cs @@ -3,6 +3,7 @@ /// /// 表示 [POST] /apply4sub/sub_merchants/{sub_mchid}/modify-settlement 接口的请求。 /// + [WechatTenpaySensitive] public class ModifyApplyForSubMerchantSettlementRequest : WechatTenpayRequest { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentRequest.cs index 7abc0517..ed0cc899 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentRequest.cs @@ -5,6 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /apply4subject/applyment 接口的请求。 /// + [WechatTenpaySensitive] public class CreateApplyForSubjectApplymentRequest : WechatTenpayRequest { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillSubMerchantFundflowBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillSubMerchantFundflowBillResponse.cs index 27039579..c6c9924c 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillSubMerchantFundflowBillResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillSubMerchantFundflowBillResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /bill/sub-merchant-fundflowbill 接口的响应。 /// + [WechatTenpaySensitive] public class GetBillSubMerchantFundflowBillResponse : WechatTenpayResponse { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.cs index 48759056..e099375a 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.cs @@ -5,6 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /brand/profitsharing/orders 接口的请求。 /// + [WechatTenpaySensitive] public class CreateBrandProfitSharingOrderRequest : WechatTenpayRequest { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesResponse.cs index 1b366e78..0e608ae7 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /certificates 接口的响应。 /// + [WechatTenpaySensitive] public class QueryCertificatesResponse : WechatTenpayResponse { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentRequest.cs index 68052bc6..0eae996e 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentRequest.cs @@ -5,6 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /ecommerce/applyments 接口的请求。 /// + [WechatTenpaySensitive] public class CreateEcommerceApplymentRequest : WechatTenpayRequest { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs index c60daa1d..85dbdaff 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /ecommerce/applyments/out-request-no/{out_request_no} 接口的响应。 /// + [WechatTenpaySensitive] public class GetEcommerceApplymentByOutRequestNumberResponse : WechatTenpayResponse { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillResponse.cs index 833fa9ed..09358e22 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /ecommerce/bill/fundflowbill 接口的响应。 /// + [WechatTenpaySensitive] public class GetEcommerceBillFundflowBillResponse : WechatTenpayResponse { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.cs index eb032d5f..3cdb6ab5 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.cs @@ -5,6 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /ecommerce/profitsharing/orders 接口的请求。 /// + [WechatTenpaySensitive] public class CreateEcommerceProfitSharingOrderRequest : WechatTenpayRequest { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs index 4be427ff..c6e25783 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs @@ -3,6 +3,7 @@ /// /// 表示 [POST] /ecommerce/profitsharing/receivers/add 接口的请求。 /// + [WechatTenpaySensitive] public class AddEcommerceProfitSharingReceiverRequest : WechatTenpayRequest { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs index 32576789..6c522126 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /merchant-service/complaints-v2/{complaint_id} 接口的响应。 /// + [WechatTenpaySensitive] public class GetMerchantServiceComplaintByComplaintIdResponse : WechatTenpayResponse { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs index f3acb06e..5d81e048 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /merchant-service/complaints-v2 接口的响应。 /// + [WechatTenpaySensitive] public class QueryMerchantServiceComplaintsResponse : WechatTenpayResponse { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PartnerTransfer/Batches/GetPartnerTransferBatchDetailByOutDetailNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PartnerTransfer/Batches/GetPartnerTransferBatchDetailByOutDetailNumberResponse.cs index 23b5e457..f6f4d636 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PartnerTransfer/Batches/GetPartnerTransferBatchDetailByOutDetailNumberResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PartnerTransfer/Batches/GetPartnerTransferBatchDetailByOutDetailNumberResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /partner-transfer/batches/out-batch-no/{out_batch_no}/details/out-detail-no/{out_detail_no} 接口的响应。 /// + [WechatTenpaySensitive] public class GetPartnerTransferBatchDetailByOutDetailNumberResponse : GetTransferBatchDetailByOutDetailNumberResponse { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreBill/GetPayScoreMerchantBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreBill/GetPayScoreMerchantBillResponse.cs index 3037dd69..9fc51d32 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreBill/GetPayScoreMerchantBillResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreBill/GetPayScoreMerchantBillResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /payscore/merchant-bill 接口的响应。 /// + [WechatTenpaySensitive] public class GetPayScoreMerchantBillResponse : WechatTenpayResponse { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/CreateProfitSharingOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/CreateProfitSharingOrderRequest.cs index f95e0662..32a97ca8 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/CreateProfitSharingOrderRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/CreateProfitSharingOrderRequest.cs @@ -5,6 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /profitsharing/orders 接口的请求。 /// + [WechatTenpaySensitive] public class CreateProfitSharingOrderRequest : WechatTenpayRequest { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/Receivers/AddProfitSharingReceiverRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/Receivers/AddProfitSharingReceiverRequest.cs index 62257831..1157adcb 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/Receivers/AddProfitSharingReceiverRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/Receivers/AddProfitSharingReceiverRequest.cs @@ -3,6 +3,7 @@ /// /// 表示 [POST] /profitsharing/receivers/add 接口的请求。 /// + [WechatTenpaySensitive] public class AddProfitSharingReceiverRequest : WechatTenpayRequest { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/Receivers/AddProfitSharingReceiverResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/Receivers/AddProfitSharingReceiverResponse.cs index 19c0b9fa..e7d14b69 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/Receivers/AddProfitSharingReceiverResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/ProfitSharing/Receivers/AddProfitSharingReceiverResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /profitsharing/receivers/add 接口的响应。 /// + [WechatTenpaySensitive] public class AddProfitSharingReceiverResponse : WechatTenpayResponse { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideRequest.cs index 489e4a71..50d26a7f 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideRequest.cs @@ -3,6 +3,7 @@ /// /// 表示 [POST] /smartguide/guides 接口的请求。 /// + [WechatTenpaySensitive] public class CreateSmartGuideRequest : WechatTenpayRequest { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesRequest.cs index dc38f1d5..99a6000a 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesRequest.cs @@ -3,6 +3,7 @@ /// /// 表示 [GET] /smartguide/guides 接口的请求。 /// + [WechatTenpaySensitive] public class QuerySmartGuidesRequest : WechatTenpayRequest { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesResponse.cs index 4f3e4236..2a6f5e48 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /smartguide/guides 接口的响应。 /// + [WechatTenpaySensitive] public class QuerySmartGuidesResponse : WechatTenpayResponse { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideRequest.cs index 5957f261..c62281dc 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideRequest.cs @@ -3,6 +3,7 @@ /// /// 表示 [PATCH] /smartguide/guides/{guide_id} 接口的请求。 /// + [WechatTenpaySensitive] public class UpdateSmartGuideRequest : WechatTenpayRequest { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Transfer/Batches/CreateTransferBatchRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Transfer/Batches/CreateTransferBatchRequest.cs index 87831ef0..05e66399 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Transfer/Batches/CreateTransferBatchRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Transfer/Batches/CreateTransferBatchRequest.cs @@ -5,6 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [POST] /transfer/batches 接口的请求。 /// + [WechatTenpaySensitive] public class CreateTransferBatchRequest : WechatTenpayRequest { public static class Types diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Transfer/Batches/GetTransferBatchDetailByOutDetailNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Transfer/Batches/GetTransferBatchDetailByOutDetailNumberResponse.cs index 6d6485be..9ff45993 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Transfer/Batches/GetTransferBatchDetailByOutDetailNumberResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Transfer/Batches/GetTransferBatchDetailByOutDetailNumberResponse.cs @@ -6,6 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [GET] /transfer/batches/out-batch-no/{out_batch_no}/details/out-detail-no/{out_detail_no} 接口的响应。 /// + [WechatTenpaySensitive] public class GetTransferBatchDetailByOutDetailNumberResponse : WechatTenpayResponse { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/Internal/ReflectionUtility.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/Internal/ReflectionUtility.cs index 9a0dc26a..28b03599 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/Internal/ReflectionUtility.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/Internal/ReflectionUtility.cs @@ -66,6 +66,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities if (objType.IsArray) { var array = (obj as Array)!; + if (array.IsReadOnly) + return; + for (int i = 0, len = array.Length; i < len; i++) { object? element = array.GetValue(i); @@ -77,9 +80,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities { if (currentProp == null) continue; + if (!currentProp.CanWrite) + continue; string oldValue = (string)element!; - string newValue = replacement(obj, currentProp, oldValue); + string newValue = replacement(obj!, currentProp, oldValue); array.SetValue(newValue, i); } else if (elementType.IsClass) @@ -93,8 +98,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities } } } - else if (obj is IList list) + else if (obj is IList) { + var list = (obj as IList)!; + if (list.IsReadOnly) + return; + for (int i = 0, len = list.Count; i < len; i++) { object? element = list[i]; @@ -106,6 +115,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities { if (currentProp == null) continue; + if (!currentProp.CanWrite) + continue; string oldValue = (string)element!; string newValue = replacement(obj, currentProp, oldValue); @@ -122,8 +133,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities } } } - else if (obj is IDictionary dict) + else if (obj is IDictionary) { + var dict = (obj as IDictionary)!; + if (dict.IsReadOnly) + return; + foreach (DictionaryEntry entry in dict) { object? entryValue = entry.Value; @@ -135,6 +150,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities { if (currentProp == null) continue; + if (!currentProp.CanWrite) + continue; string oldValue = (string)entryValue!; string newValue = replacement(obj, currentProp, oldValue);