From 449d605c98872ffddfa40a1862b8b405e47eb38e Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Wed, 24 Sep 2025 20:55:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(tenpayv3):=20=E6=96=B0=E5=A2=9E=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=85=A8=E6=95=B0=E7=94=B5=E5=8F=91=E7=A5=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/WechatTenpayV3/Basic_ModelDefinition.md | 14 +- ...xecuteMerchantOperationManageExtensions.cs | 4 +- ...entExecuteNewTaxControlFapiaoExtensions.cs | 518 +++++++++++------- ...enpayClientExecuteTaxiInvoiceExtensions.cs | 17 + ...rolFapiaoApplicationIssueGeneralRequest.cs | 163 ++++++ ...olFapiaoApplicationIssueGeneralResponse.cs | 9 + ...piaoApplicationRealEstateLeasingRequest.cs | 205 +++++++ ...iaoApplicationRealEstateLeasingResponse.cs | 9 + ...teNewTaxControlFapiaoApplicationRequest.cs | 29 +- ...apiaoApplicationByFapiaoApplyIdResponse.cs | 42 ++ ...ntrolFapiaoApplicationFapiaoFileRequest.cs | 7 +- ...oMerchantServicePartnerInviteUrlRequest.cs | 62 +++ ...MerchantServicePartnerInviteUrlResponse.cs | 29 + ...ntServicePartnerInvitedMerchantsRequest.cs | 55 ++ ...tServicePartnerInvitedMerchantsResponse.cs | 103 ++++ ...ewTaxControlFapiaoMerchantStatusRequest.cs | 15 + ...wTaxControlFapiaoMerchantStatusResponse.cs | 137 +++++ ...FapiaoMerchantDevelopmentConfigResponse.cs | 16 +- ...lFapiaoMerchantDevelopmentConfigRequest.cs | 11 +- ...FapiaoMerchantDevelopmentConfigResponse.cs | 8 +- ...GetNewTaxControlFapiaoUserTitleResponse.cs | 28 + ...NewTaxControlFapiaoUserTitleUrlResponse.cs | 4 +- ...onManageEnhancedDueDiligenceFileRequest.cs | 2 +- .../Card/UploadTaxiInvoiceCardFileRequest.cs | 7 +- ...axControlFapiaoApplicationCardRequest.json | 6 +- ...lFapiaoApplicationIssueGeneralRequest.json | 50 ++ ...aoApplicationRealEstateLeasingRequest.json | 62 +++ ...iaoApplicationByFapiaoApplyIdResponse.json | 10 +- ...rchantServicePartnerInviteUrlResponse.json | 5 + ...ervicePartnerInvitedMerchantsResponse.json | 17 + ...axControlFapiaoMerchantStatusResponse.json | 25 + ...apiaoMerchantDevelopmentConfigRequest.json | 3 +- ...piaoMerchantDevelopmentConfigResponse.json | 4 +- ...tNewTaxControlFapiaoUserTitleResponse.json | 6 +- .../TestCase_RequestEncryptionTests.cs | 53 ++ 35 files changed, 1522 insertions(+), 213 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusResponse.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusResponse.json diff --git a/docs/WechatTenpayV3/Basic_ModelDefinition.md b/docs/WechatTenpayV3/Basic_ModelDefinition.md index c0060390..43322e58 100644 --- a/docs/WechatTenpayV3/Basic_ModelDefinition.md +++ b/docs/WechatTenpayV3/Basic_ModelDefinition.md @@ -485,7 +485,7 @@ - 获取用户填写的抬头:`GetNewTaxControlFapiaoUserTitle` - - 区块链电子发票 API + - 区块链电子发票 - 获取商户开票基础信息:`GetNewTaxControlFapiaoMerchantBaseInformation` @@ -1271,6 +1271,10 @@ - 开具电子发票:`CreateNewTaxControlFapiaoApplication` + - 开具通用行业电子发票:`CreateNewTaxControlFapiaoApplicationIssueGeneral` + + - 开具不动产租赁行业电子发票:`CreateNewTaxControlFapiaoApplicationRealEstateLeasing` + - 上传电子发票文件:`UploadNewTaxControlFapiaoApplicationFapiaoFile` - 查询电子发票:`GetNewTaxControlFapiaoApplicationByFapiaoApplyId` @@ -1283,6 +1287,12 @@ - 下载发票文件:`DownloadNewTaxControlFapiaoApplicationFile` + - 电子发票服务商邀请 + + - 获取邀请商户开通服务商电子发票能力:`GetNewTaxControlFapiaoMerchantServicePartnerInviteUrl` + + - 获取邀请开通的商户信息:`QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchants` + - 电子发票商户信息 - 获取商户开票基础信息:`GetNewTaxControlFapiaoMerchantBaseInformation` @@ -1293,7 +1303,7 @@ - 获取商品和服务税收分类对照表:`QueryNewTaxControlFapiaoMerchantTaxCodes` - - 检查子商户开票功能状态:`CheckNewTaxControlFapiaoMerchant` + - 检查子商户开票功能状态:`CheckNewTaxControlFapiaoMerchant` / `CheckNewTaxControlFapiaoMerchantStatus` - 用户抬头 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantOperationManageExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantOperationManageExtensions.cs index cf7b6882..b081a86e 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantOperationManageExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantOperationManageExtensions.cs @@ -75,8 +75,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 if (request.FileName is null) request.FileName = Guid.NewGuid().ToString("N").ToLower() + ".png"; - if (request.FileDigest is null) - request.FileDigest = EncodedString.ToHexString(Utilities.SHA256Utility.Hash(request.FileBytes)).Value!.ToUpper(); + if (request.FileHash is null) + request.FileHash = EncodedString.ToHexString(Utilities.SHA256Utility.Hash(request.FileBytes)).Value!.ToUpper(); if (request.FileContentType is null) request.FileContentType = MimeTypes.GetMimeMapping(request.FileName!); diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteNewTaxControlFapiaoExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteNewTaxControlFapiaoExtensions.cs index af09bd82..91b83b89 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteNewTaxControlFapiaoExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteNewTaxControlFapiaoExtensions.cs @@ -6,6 +6,8 @@ using Flurl.Http; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 { + using SKIT.FlurlHttpClient.Primitives; + public static class WechatTenpayClientExecuteNewTaxControlFapiaoExtensions { #region CardTemplate @@ -14,7 +16,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// /// REF:
///
- /// + ///
+ /// ///
/// /// @@ -33,6 +36,309 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 } #endregion + #region FapiaoApplications + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications 接口。 + /// + /// REF:
+ ///
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteCreateNewTaxControlFapiaoApplicationAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/issue-general 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteCreateNewTaxControlFapiaoApplicationIssueGeneralAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationIssueGeneralRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", "issue-general"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/real-estate-leasing 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteCreateNewTaxControlFapiaoApplicationRealEstateLeasingAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", "real-estate-leasing"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/reverse 接口。 + /// + /// REF:
+ ///
+ ///
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteReverseNewTaxControlFapiaoApplicationAsync(this WechatTenpayClient client, Models.ReverseNewTaxControlFapiaoApplicationRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "reverse"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id} 接口。 + /// + /// REF:
+ ///
+ ///
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteGetNewTaxControlFapiaoApplicationByFapiaoApplyIdAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId) + .SetQueryParam("sub_mchid", request.SubMerchantId) + .SetQueryParam("fapiao_id", request.FapiaoId); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/fapiao-files 接口。 + /// + /// REF:
+ ///
+ ///
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteGetNewTaxControlFapiaoApplicationFilesAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoApplicationFilesRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "fapiao-files") + .SetQueryParam("sub_mchid", request.SubMerchantId) + .SetQueryParam("fapiao_id", request.FapiaoId); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [GET] /{download_url} 接口。 + /// + /// REF:
+ ///
+ ///
+ /// + ///
+ /// (请注意此接口不受构造 时指定的 参数控制。) + ///
+ /// + /// + /// + /// + public static async Task ExecuteDownloadNewTaxControlFapiaoApplicationFileAsync(this WechatTenpayClient client, Models.DownloadNewTaxControlFapiaoApplicationFileRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (request.MerchantId is null) + request.MerchantId = client.Credentials.MerchantId; + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Get, request.DownloadUrl) + .WithUrl(request.DownloadUrl) + .SetQueryParam("mchid", request.MerchantId) + .SetQueryParam("sub_mchid", request.SubMerchantId) + .SetQueryParam("openid", request.OpenId) + .SetQueryParam("fapiao_id", request.FapiaoId) + .SetQueryParam("invoice_code", request.FapiaoCode) + .SetQueryParam("invoice_no", request.FapiaoNumber); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/upload-fapiao-file 接口。 + /// + /// REF:
+ ///
+ ///
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteUploadNewTaxControlFapiaoApplicationFapiaoFileAsync(this WechatTenpayClient client, Models.UploadNewTaxControlFapiaoApplicationFapiaoFileRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (request.FileHashAlgorithm is null) + { + request.FileHashAlgorithm = "SM3"; + } + + if (request.FileHash is null) + { + switch (request.FileHashAlgorithm) + { + case "SM3": + request.FileHash = EncodedString.ToHexString(Utilities.SM3Utility.Hash(request.FileBytes)).Value!.ToLower(); + break; + } + } + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", "upload-fapiao-file"); + + using var httpContent = Utilities.HttpContentBuilder.BuildWithFile(fileName: "file.pdf", fileBytes: request.FileBytes, fileContentType: "application/pdf", fileMetaJson: client.JsonSerializer.Serialize(request)); + return await client.SendFlurlRequestAsync(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/insert-cards 接口。 + /// + /// REF:
+ ///
+ ///
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteCreateNewTaxControlFapiaoApplicationCardAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationCardRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "insert-cards"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + #endregion + + #region FapiaoMerchant + /// + /// 异步调用 [GET] /new-tax-control-fapiao/fapiaomerchant/getspinviteurl 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteGetNewTaxControlFapiaoMerchantServicePartnerInviteUrlAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "fapiaomerchant", "getspinviteurl") + .SetQueryParam("operation_type", request.OperationType) + .SetQueryParam("operate_user", request.OperateUser) + .SetQueryParam("fapiao_mode", request.FapiaoMode) + .SetQueryParam("fapiao_ability_type_list", request.FapiaoAbilityTypeList is not null ? string.Join(",", request.FapiaoAbilityTypeList) : null) + .SetQueryParam("invite_channel", request.InviteChannel) + .SetQueryParam("invite_code", request.InviteCode) + .SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [GET] /new-tax-control-fapiao/fapiaomerchant/listspinvitemchinfo 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteQueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsAsync(this WechatTenpayClient client, Models.QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "fapiaomerchant", "getspinviteurl") + .SetQueryParam("query_time_start", request.QueryStartTime.HasValue ? request.QueryStartTime.Value.ToString("yyyy-MM-dd'T'HH:mm:sszzz") : null) + .SetQueryParam("query_time_end", request.QueryEndTime.HasValue ? request.QueryEndTime.Value.ToString("yyyy-MM-dd'T'HH:mm:sszzz") : null) + .SetQueryParam("invite_code", request.InviteCode) + .SetQueryParam("mch_invite_status", request.InviteCode) + .SetQueryParam("offset", request.Offset) + .SetQueryParam("limit", request.Limit); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + #endregion + #region Merchant /// /// 异步调用 [POST] /new-tax-control-fapiao/merchant/{sub_mchid}/check 接口。 @@ -56,6 +362,28 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); } + /// + /// 异步调用 [POST] /new-tax-control-fapiao/merchant/{sub_mchid}/check-status 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteCheckNewTaxControlFapiaoMerchantStatusAsync(this WechatTenpayClient client, Models.CheckNewTaxControlFapiaoMerchantStatusRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "merchant", request.SubMerchantId, "check-status"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + /// /// 异步调用 [PATCH] /new-tax-control-fapiao/merchant/development-config 接口。 /// @@ -108,7 +436,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// /// REF:
///
- /// + ///
+ /// ///
///
/// @@ -160,7 +489,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// /// REF:
///
- /// + ///
+ /// ///
///
/// @@ -194,7 +524,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// /// REF:
///
- /// + ///
+ /// ///
/// /// @@ -215,184 +546,5 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); } #endregion - - #region FapiaoApplication - /// - /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications 接口。 - /// - /// REF:
- ///
- /// - ///
- ///
- /// - /// - /// - /// - public static async Task ExecuteCreateNewTaxControlFapiaoApplicationAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationRequest request, CancellationToken cancellationToken = default) - { - if (client is null) throw new ArgumentNullException(nameof(client)); - if (request is null) throw new ArgumentNullException(nameof(request)); - - IFlurlRequest flurlReq = client - .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications"); - - return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - /// - /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/reverse 接口。 - /// - /// REF:
- ///
- /// - ///
- ///
- /// - /// - /// - /// - public static async Task ExecuteReverseNewTaxControlFapiaoApplicationAsync(this WechatTenpayClient client, Models.ReverseNewTaxControlFapiaoApplicationRequest request, CancellationToken cancellationToken = default) - { - if (client is null) throw new ArgumentNullException(nameof(client)); - if (request is null) throw new ArgumentNullException(nameof(request)); - - IFlurlRequest flurlReq = client - .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "reverse"); - - return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - /// - /// 异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id} 接口。 - /// - /// REF:
- ///
- /// - ///
- ///
- /// - /// - /// - /// - public static async Task ExecuteGetNewTaxControlFapiaoApplicationByFapiaoApplyIdAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest request, CancellationToken cancellationToken = default) - { - if (client is null) throw new ArgumentNullException(nameof(client)); - if (request is null) throw new ArgumentNullException(nameof(request)); - - IFlurlRequest flurlReq = client - .CreateFlurlRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId) - .SetQueryParam("sub_mchid", request.SubMerchantId) - .SetQueryParam("fapiao_id", request.FapiaoId); - - return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - /// - /// 异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/fapiao-files 接口。 - /// - /// REF:
- ///
- /// - ///
- ///
- /// - /// - /// - /// - public static async Task ExecuteGetNewTaxControlFapiaoApplicationFilesAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoApplicationFilesRequest request, CancellationToken cancellationToken = default) - { - if (client is null) throw new ArgumentNullException(nameof(client)); - if (request is null) throw new ArgumentNullException(nameof(request)); - - IFlurlRequest flurlReq = client - .CreateFlurlRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "fapiao-files") - .SetQueryParam("sub_mchid", request.SubMerchantId) - .SetQueryParam("fapiao_id", request.FapiaoId); - - return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - /// - /// 异步调用 [GET] /{download_url} 接口。 - /// - /// REF:
- ///
- /// - ///
- /// (请注意此接口不受构造 时指定的 参数控制。) - ///
- /// - /// - /// - /// - public static async Task ExecuteDownloadNewTaxControlFapiaoApplicationFileAsync(this WechatTenpayClient client, Models.DownloadNewTaxControlFapiaoApplicationFileRequest request, CancellationToken cancellationToken = default) - { - if (client is null) throw new ArgumentNullException(nameof(client)); - if (request is null) throw new ArgumentNullException(nameof(request)); - - if (request.MerchantId is null) - request.MerchantId = client.Credentials.MerchantId; - - IFlurlRequest flurlReq = client - .CreateFlurlRequest(request, HttpMethod.Get, request.DownloadUrl) - .WithUrl(request.DownloadUrl) - .SetQueryParam("mchid", request.MerchantId) - .SetQueryParam("sub_mchid", request.SubMerchantId) - .SetQueryParam("openid", request.OpenId) - .SetQueryParam("fapiao_id", request.FapiaoId) - .SetQueryParam("invoice_code", request.FapiaoCode) - .SetQueryParam("invoice_no", request.FapiaoNumber); - - return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - /// - /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/upload-fapiao-file 接口。 - /// - /// REF:
- ///
- /// - ///
- ///
- /// - /// - /// - /// - public static async Task ExecuteUploadNewTaxControlFapiaoApplicationFapiaoFileAsync(this WechatTenpayClient client, Models.UploadNewTaxControlFapiaoApplicationFapiaoFileRequest request, CancellationToken cancellationToken = default) - { - if (client is null) throw new ArgumentNullException(nameof(client)); - if (request is null) throw new ArgumentNullException(nameof(request)); - - IFlurlRequest flurlReq = client - .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", "upload-fapiao-file"); - - using var httpContent = Utilities.HttpContentBuilder.BuildWithFile(fileName: "file.pdf", fileBytes: request.FileBytes, fileContentType: "application/pdf", fileMetaJson: client.JsonSerializer.Serialize(request)); - return await client.SendFlurlRequestAsync(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - /// - /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/insert-cards 接口。 - /// - /// REF:
- ///
- /// - ///
- ///
- /// - /// - /// - /// - public static async Task ExecuteCreateNewTaxControlFapiaoApplicationCardAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationCardRequest request, CancellationToken cancellationToken = default) - { - if (client is null) throw new ArgumentNullException(nameof(client)); - if (request is null) throw new ArgumentNullException(nameof(request)); - - IFlurlRequest flurlReq = client - .CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "insert-cards"); - - return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); - } - #endregion } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteTaxiInvoiceExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteTaxiInvoiceExtensions.cs index efc96018..7d9852ca 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteTaxiInvoiceExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteTaxiInvoiceExtensions.cs @@ -6,6 +6,8 @@ using Flurl.Http; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 { + using SKIT.FlurlHttpClient.Primitives; + public static class WechatTenpayClientExecuteTaxiInvoiceExtensions { #region TaxiCompany @@ -219,6 +221,21 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); + if (request.FileHashAlgorithm is null) + { + request.FileHashAlgorithm = "SM3"; + } + + if (request.FileHash is null) + { + switch (request.FileHashAlgorithm) + { + case "SM3": + request.FileHash = EncodedString.ToHexString(Utilities.SM3Utility.Hash(request.FileBytes)).Value!.ToLower(); + break; + } + } + IFlurlRequest flurlReq = client .CreateFlurlRequest(request, HttpMethod.Post, "taxi-invoice", "cards", "upload-file"); diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.cs new file mode 100644 index 00000000..843ed0db --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.cs @@ -0,0 +1,163 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/issue-general 接口的请求。 + /// + [WechatTenpaySensitive] + public class CreateNewTaxControlFapiaoApplicationIssueGeneralRequest : WechatTenpayRequest + { + public static class Types + { + public class Buyer : CreateNewTaxControlFapiaoApplicationRequest.Types.Buyer + { + } + + public class FapiaoInfo + { + public static class Types + { + public class Item : CreateNewTaxControlFapiaoApplicationRequest.Types.Fapiao.Types.Item + { + /// + /// 获取或设置优惠政策标识。 + /// + [Newtonsoft.Json.JsonProperty("preferential_policy_code")] + [System.Text.Json.Serialization.JsonPropertyName("preferential_policy_code")] + public int? PreferentialPolicyCode { get; set; } + } + + public class Transaction + { + /// + /// 获取或设置支付渠道。 + /// + [Newtonsoft.Json.JsonProperty("pay_channel")] + [System.Text.Json.Serialization.JsonPropertyName("pay_channel")] + public string PayChannel { get; set; } = string.Empty; + + /// + /// 获取或设置微信支付交易单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string? TransactionId { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string? OutTradeNumber { get; set; } + + /// + /// 获取或设置交易金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + } + } + + /// + /// 获取或设置商户发票单号。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_id")] + public string FapiaoId { get; set; } = string.Empty; + + /// + /// 获取或设置总价税合计(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置发票行列表。 + /// + [Newtonsoft.Json.JsonProperty("items")] + [System.Text.Json.Serialization.JsonPropertyName("items")] + public IList? ItemList { get; set; } + + /// + /// 获取或设置交易信息列表。 + /// + [Newtonsoft.Json.JsonProperty("transaction_information")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_information")] + public IList? TransactionList { get; set; } + + /// + /// 获取或设置出口业务适用政策代码。 + /// + [Newtonsoft.Json.JsonProperty("export_business_policy_code")] + [System.Text.Json.Serialization.JsonPropertyName("export_business_policy_code")] + public int? ExportBusinessPolicyCode { get; set; } + + /// + /// 获取或设置增值税即征即退代码。 + /// + [Newtonsoft.Json.JsonProperty("vat_refund_levy_code")] + [System.Text.Json.Serialization.JsonPropertyName("vat_refund_levy_code")] + public int? VATRefundLevyCode { get; set; } + + /// + /// 获取或设置开票人 ID。 + /// + [Newtonsoft.Json.JsonProperty("billing_person_id")] + [System.Text.Json.Serialization.JsonPropertyName("billing_person_id")] + public string BillingPersonId { get; set; } = string.Empty; + + /// + /// 获取或设置开票人姓名。 + /// + [Newtonsoft.Json.JsonProperty("billing_person")] + [System.Text.Json.Serialization.JsonPropertyName("billing_person")] + public string? BillingPersonName { get; set; } + + /// + /// 获取或设置开具发票类型。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_bill_type")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")] + public string? FapiaoBillType { get; set; } = string.Empty; + + /// + /// 获取或设置备注信息。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + } + } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置发票申请单号。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_apply_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_apply_id")] + public string FapiaoApplyId { get; set; } = string.Empty; + + /// + /// 获取或设置购买方信息。 + /// + [Newtonsoft.Json.JsonProperty("buyer_information")] + [System.Text.Json.Serialization.JsonPropertyName("buyer_information")] + public Types.Buyer Buyer { get; set; } = new Types.Buyer(); + + /// + /// 获取或设置电子发票信息。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_information")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_information")] + public Types.FapiaoInfo FapiaoInfo { get; set; } = new Types.FapiaoInfo(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralResponse.cs new file mode 100644 index 00000000..df706510 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/issue-general 接口的响应。 + /// + public class CreateNewTaxControlFapiaoApplicationIssueGeneralResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest.cs new file mode 100644 index 00000000..65124c0c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/real-estate-leasing 接口的请求。 + /// + [WechatTenpaySensitive] + public class CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest : WechatTenpayRequest + { + public static class Types + { + public class Buyer : CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.Types.Buyer + { + } + + public class FapiaoInfo + { + public static class Types + { + public class Item : CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.Types.FapiaoInfo.Types.Item + { + public static class Types + { + public class RealEstateLeasingInformation + { + /// + /// 获取或设置省份。 + /// + [Newtonsoft.Json.JsonProperty("province")] + [System.Text.Json.Serialization.JsonPropertyName("province")] + public string? Province { get; set; } + + /// + /// 获取或设置城市。 + /// + [Newtonsoft.Json.JsonProperty("city")] + [System.Text.Json.Serialization.JsonPropertyName("city")] + public string? City { get; set; } + + /// + /// 获取或设置详细地址。 + /// + [Newtonsoft.Json.JsonProperty("address")] + [System.Text.Json.Serialization.JsonPropertyName("address")] + public string Address { get; set; } = string.Empty; + + /// + /// 获取或设置是否跨市。 + /// + [Newtonsoft.Json.JsonProperty("cross_city_flag")] + [System.Text.Json.Serialization.JsonPropertyName("cross_city_flag")] + public bool IsCrossCity { get; set; } + + /// + /// 获取或设置租赁起始日期。 + /// + [Newtonsoft.Json.JsonProperty("lease_period_start")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("lease_period_start")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))] + public DateTimeOffset LeasePeriodStartDate { get; set; } + + /// + /// 获取或设置租赁截止日期。 + /// + [Newtonsoft.Json.JsonProperty("lease_period_end")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("lease_period_end")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))] + public DateTimeOffset LeasePeriodEndDate { get; set; } + + /// + /// 获取或设置产权证或不动产权证号(需使用平台公钥/证书加密)。 + /// + [Newtonsoft.Json.JsonProperty("certificate_no")] + [System.Text.Json.Serialization.JsonPropertyName("certificate_no")] + [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)] + [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)] + public string? CertificateNumber { get; set; } + + /// + /// 获取或设置车牌号列表。 + /// + [Newtonsoft.Json.JsonProperty("plate_no")] + [System.Text.Json.Serialization.JsonPropertyName("plate_no")] + public IList? PlateNumberList { get; set; } + } + } + + /// + /// 获取或设置不动产租赁特定行业额外信息。 + /// + [Newtonsoft.Json.JsonProperty("real_estate_leasing_information")] + [System.Text.Json.Serialization.JsonPropertyName("real_estate_leasing_information")] + public Types.RealEstateLeasingInformation? RealEstateLeasingInformation { get; set; } + } + + public class Transaction : CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.Types.FapiaoInfo.Types.Transaction + { + } + } + + /// + /// 获取或设置商户发票单号。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_id")] + public string FapiaoId { get; set; } = string.Empty; + + /// + /// 获取或设置总价税合计(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置发票行列表。 + /// + [Newtonsoft.Json.JsonProperty("items")] + [System.Text.Json.Serialization.JsonPropertyName("items")] + public IList? ItemList { get; set; } + + /// + /// 获取或设置交易信息列表。 + /// + [Newtonsoft.Json.JsonProperty("transaction_information")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_information")] + public IList? TransactionList { get; set; } + + /// + /// 获取或设置出口业务适用政策代码。 + /// + [Newtonsoft.Json.JsonProperty("export_business_policy_code")] + [System.Text.Json.Serialization.JsonPropertyName("export_business_policy_code")] + public int? ExportBusinessPolicyCode { get; set; } + + /// + /// 获取或设置增值税即征即退代码。 + /// + [Newtonsoft.Json.JsonProperty("vat_refund_levy_code")] + [System.Text.Json.Serialization.JsonPropertyName("vat_refund_levy_code")] + public int? VATRefundLevyCode { get; set; } + + /// + /// 获取或设置开票人 ID。 + /// + [Newtonsoft.Json.JsonProperty("billing_person_id")] + [System.Text.Json.Serialization.JsonPropertyName("billing_person_id")] + public string BillingPersonId { get; set; } = string.Empty; + + /// + /// 获取或设置开票人姓名。 + /// + [Newtonsoft.Json.JsonProperty("billing_person")] + [System.Text.Json.Serialization.JsonPropertyName("billing_person")] + public string? BillingPersonName { get; set; } + + /// + /// 获取或设置开具发票类型。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_bill_type")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")] + public string? FapiaoBillType { get; set; } = string.Empty; + + /// + /// 获取或设置备注信息。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + } + } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置发票申请单号。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_apply_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_apply_id")] + public string FapiaoApplyId { get; set; } = string.Empty; + + /// + /// 获取或设置购买方信息。 + /// + [Newtonsoft.Json.JsonProperty("buyer_information")] + [System.Text.Json.Serialization.JsonPropertyName("buyer_information")] + public Types.Buyer Buyer { get; set; } = new Types.Buyer(); + + /// + /// 获取或设置电子发票信息。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_information")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_information")] + public Types.FapiaoInfo FapiaoInfo { get; set; } = new Types.FapiaoInfo(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingResponse.cs new file mode 100644 index 00000000..31f7b4a3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/real-estate-leasing 接口的响应。 + /// + public class CreateNewTaxControlFapiaoApplicationRealEstateLeasingResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRequest.cs index 3cfa2f5c..f9d94d80 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRequest.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models @@ -79,6 +78,34 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)] [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)] public string? UserEmail { get; set; } + + /// + /// 获取或设置订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int? Amount { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string? OutTradeNumber { get; set; } + + /// + /// 获取或设置开具发票类型。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_bill_type")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")] + public string? FapiaoBillType { get; set; } + + /// + /// 获取或设置用户留言信息。 + /// + [Newtonsoft.Json.JsonProperty("user_apply_message")] + [System.Text.Json.Serialization.JsonPropertyName("user_apply_message")] + public string? UserApplyMessage { get; set; } } public class Fapiao diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.cs index 0faf7639..539ce798 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.cs @@ -160,6 +160,34 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)] [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)] public string? UserEmail { get; set; } + + /// + /// 获取或设置订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int? Amount { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string? OutTradeNumber { get; set; } + + /// + /// 获取或设置开具发票类型。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_bill_type")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")] + public string? FapiaoBillType { get; set; } + + /// + /// 获取或设置用户留言信息。 + /// + [Newtonsoft.Json.JsonProperty("user_apply_message")] + [System.Text.Json.Serialization.JsonPropertyName("user_apply_message")] + public string? UserApplyMessage { get; set; } } public class Seller : GetNewTaxControlFapiaoMerchantBaseInformationResponse.Types.Seller @@ -368,6 +396,20 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [Newtonsoft.Json.JsonProperty("remark")] [System.Text.Json.Serialization.JsonPropertyName("remark")] public string? Remark { get; set; } + + /// + /// 获取或设置开票失败错误码。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_error_code")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_error_code")] + public string? FapiaoErrorCode { get; set; } + + /// + /// 获取或设置开票失败错误信息。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_error_message")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_error_message")] + public string? FapiaoErrorMessage { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.cs index 671082a7..6e4e52e1 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.cs @@ -31,16 +31,17 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 获取或设置文件内容哈希算法。 + /// 默认值:"SM3" /// [Newtonsoft.Json.JsonProperty("digest_alogrithm")] [System.Text.Json.Serialization.JsonPropertyName("digest_alogrithm")] - public string FileHashAlgorithm { get; set; } = string.Empty; + public string FileHashAlgorithm { get; set; } = "SM3"; /// - /// 获取或设置文件内容哈希值。 + /// 获取或设置文件内容哈希值。如果不指定将由系统自动生成。 /// [Newtonsoft.Json.JsonProperty("digest")] [System.Text.Json.Serialization.JsonPropertyName("digest")] - public string FileHashValue { get; set; } = string.Empty; + public string? FileHash { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest.cs new file mode 100644 index 00000000..86e8fbf9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/fapiaomerchant/getspinviteurl 接口的请求。 + /// + [WechatTenpaySensitive] + public class GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest : WechatTenpayRequest + { + /// + /// 获取或设置操作类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OperationType { get; set; } = string.Empty; + + /// + /// 获取或设置操作人员(需使用平台公钥/证书加密)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)] + [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)] + public string? OperateUser { get; set; } + + /// + /// 获取或设置开票模式。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoMode { get; set; } = string.Empty; + + /// + /// 获取或设置发票能力类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public IList? FapiaoAbilityTypeList { get; set; } + + /// + /// 获取或设置服务商邀请渠道。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? InviteChannel { get; set; } + + /// + /// 获取或设置邀请码。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string InviteCode { get; set; } = string.Empty; + + /// + /// 获取或设置受邀商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? SubMerchantId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse.cs new file mode 100644 index 00000000..713e46be --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/fapiaomerchant/getspinviteurl 接口的响应。 + /// + public class GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse : WechatTenpayResponse + { + /// + /// 获取或设置邀请开通二维码链接。 + /// + [Newtonsoft.Json.JsonProperty("invite_url")] + [System.Text.Json.Serialization.JsonPropertyName("invite_url")] + public string InviteUrl { get; set; } = default!; + + /// + /// 获取或设置开通小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("miniprogram_appid")] + [System.Text.Json.Serialization.JsonPropertyName("miniprogram_appid")] + public string MiniProgramAppId { get; set; } = default!; + + /// + /// 获取或设置开通小程序页面路径。 + /// + [Newtonsoft.Json.JsonProperty("miniprogram_path")] + [System.Text.Json.Serialization.JsonPropertyName("miniprogram_path")] + public string MiniProgramPagePath { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsRequest.cs new file mode 100644 index 00000000..b8e7b4dd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsRequest.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/fapiaomerchant/listspinvitemchinfo 接口的请求。 + /// + public class QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsRequest : WechatTenpayRequest + { + /// + /// 获取或设置查询起始时间。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public DateTimeOffset? QueryStartTime { get; set; } + + /// + /// 获取或设置查询截止时间。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public DateTimeOffset? QueryEndTime { get; set; } + + /// + /// 获取或设置分页大小。 + /// 默认值:0 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Limit { get; set; } = 0; + + /// + /// 获取或设置分页开始位置。 + /// 默认值:10 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Offset { get; set; } = 10; + + /// + /// 获取或设置邀请码。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? InviteCode { get; set; } + + /// + /// 获取或设置商户邀请状态。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? MerchantInviteStatus { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse.cs new file mode 100644 index 00000000..8108161b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse.cs @@ -0,0 +1,103 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/fapiaomerchant/listspinvitemchinfo 接口的响应。 + /// + public class QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse : WechatTenpayResponse + { + public static class Types + { + public class MerchantInviteResult + { + /// + /// 获取或设置受邀商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置商户邀请状态。 + /// + [Newtonsoft.Json.JsonProperty("mch_invite_status")] + [System.Text.Json.Serialization.JsonPropertyName("mch_invite_status")] + public string MerchantInviteStatus { get; set; } = default!; + + /// + /// 获取或设置商户名称。 + /// + [Newtonsoft.Json.JsonProperty("ep_name")] + [System.Text.Json.Serialization.JsonPropertyName("ep_name")] + public string MerchantName { get; set; } = default!; + + /// + /// 获取或设置商户税号。 + /// + [Newtonsoft.Json.JsonProperty("tax_id")] + [System.Text.Json.Serialization.JsonPropertyName("tax_id")] + public string TaxId { get; set; } = default!; + + /// + /// 获取或设置邀请码。 + /// + [Newtonsoft.Json.JsonProperty("invite_code")] + [System.Text.Json.Serialization.JsonPropertyName("invite_code")] + public string InviteCode { get; set; } = default!; + + /// + /// 获取或设置操作时间。 + /// + [Newtonsoft.Json.JsonProperty("operate_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("operate_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))] + public DateTimeOffset OperateTime { get; set; } + + /// + /// 获取或设置邀请失败错误码。 + /// + [Newtonsoft.Json.JsonProperty("invite_failed_code")] + [System.Text.Json.Serialization.JsonPropertyName("invite_failed_code")] + public string? InviteFailCode { get; set; } + + /// + /// 获取或设置邀请失败原因。 + /// + [Newtonsoft.Json.JsonProperty("invite_failed_reason")] + [System.Text.Json.Serialization.JsonPropertyName("invite_failed_reason")] + public string? InviteFailReason { get; set; } + } + } + + /// + /// 获取或设置邀请的商户结果列表。 + /// + [Newtonsoft.Json.JsonProperty("mch_invite_result_list")] + [System.Text.Json.Serialization.JsonPropertyName("mch_invite_result_list")] + public Types.MerchantInviteResult[] MerchantInviteResultList { get; set; } = default!; + + /// + /// 获取或设置总数量。 + /// + [Newtonsoft.Json.JsonProperty("total_count")] + [System.Text.Json.Serialization.JsonPropertyName("total_count")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public int TotalCount { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusRequest.cs new file mode 100644 index 00000000..367a927a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/merchant/{sub_mchid}/check-status 接口的请求。 + /// + public class CheckNewTaxControlFapiaoMerchantStatusRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusResponse.cs new file mode 100644 index 00000000..cd74cf61 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusResponse.cs @@ -0,0 +1,137 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/merchant/{sub_mchid}/check-status 接口的响应。 + /// + public class CheckNewTaxControlFapiaoMerchantStatusResponse : WechatTenpayResponse + { + public static class Types + { + public class ThirdPartyMode + { + /// + /// 获取或设置接入状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + } + + public class DigitalTaxMode + { + public static class Types + { + public class BillingPerson + { + /// + /// 获取或设置开票人 ID。 + /// + [Newtonsoft.Json.JsonProperty("id")] + [System.Text.Json.Serialization.JsonPropertyName("id")] + public string Id { get; set; } = default!; + + /// + /// 获取或设置开票人姓名。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + } + + public class Ability + { + /// + /// 获取或设置能力类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置授权状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string AuthorizeStatus { get; set; } = default!; + + /// + /// 获取或设置授权失败原因。 + /// + [Newtonsoft.Json.JsonProperty("authorize_fail_reason")] + [System.Text.Json.Serialization.JsonPropertyName("authorize_fail_reason")] + public string? AuthorizeFailReason { get; set; } + } + } + + /// + /// 获取或设置接入状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置开票人信息列表。 + /// + [Newtonsoft.Json.JsonProperty("billing_person_info")] + [System.Text.Json.Serialization.JsonPropertyName("billing_person_info")] + public Types.BillingPerson[]? BillingPersonList { get; set; } + + /// + /// 获取或设置接入时间。 + /// + [Newtonsoft.Json.JsonProperty("access_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("access_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))] + public DateTimeOffset? AccessTime { get; set; } + + /// + /// 获取或设置过期时间。 + /// + [Newtonsoft.Json.JsonProperty("expired_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("expired_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 获取或设置接入失败原因。 + /// + [Newtonsoft.Json.JsonProperty("access_fail_reason")] + [System.Text.Json.Serialization.JsonPropertyName("access_fail_reason")] + public string? AccessFailReason { get; set; } + + /// + /// 获取或设置能力信息列表。 + /// + [Newtonsoft.Json.JsonProperty("ability_info")] + [System.Text.Json.Serialization.JsonPropertyName("ability_info")] + public Types.Ability[]? AbilityList { get; set; } + } + } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置第三方开票模式相关信息。 + /// + [Newtonsoft.Json.JsonProperty("third_mode")] + [System.Text.Json.Serialization.JsonPropertyName("third_mode")] + public Types.ThirdPartyMode? ThirdPartyMode { get; set; } + + /// + /// 获取或设置数电发票模式相关信息。 + /// + [Newtonsoft.Json.JsonProperty("digital_tax_mode")] + [System.Text.Json.Serialization.JsonPropertyName("digital_tax_mode")] + public Types.DigitalTaxMode? DigitalTaxMode { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs index b2c44c2a..27446f75 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs @@ -10,6 +10,20 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("callback_url")] [System.Text.Json.Serialization.JsonPropertyName("callback_url")] - public string CallbackUrl { get; set; } = default!; + public string? CallbackUrl { get; set; } + + /// + /// 获取或设置是否展示开发票入口开关。 + /// + [Newtonsoft.Json.JsonProperty("show_fapiao_cell")] + [System.Text.Json.Serialization.JsonPropertyName("show_fapiao_cell")] + public bool? RequireShowFapiaoCell { get; set; } + + /// + /// 获取或设置是否支持开电子专票。 + /// + [Newtonsoft.Json.JsonProperty("support_vat_fapiao")] + [System.Text.Json.Serialization.JsonPropertyName("support_vat_fapiao")] + public bool? IsSupportVATFapiao { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs index 53a2f76c..f4ae107f 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs @@ -10,14 +10,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("sub_mch_code")] [System.Text.Json.Serialization.JsonPropertyName("sub_mch_code")] - public string? SubMerchantId { get; set; } + public string SubMerchantId { get; set; } = string.Empty; /// /// 获取或设置回调地址。 /// [Newtonsoft.Json.JsonProperty("callback_url")] [System.Text.Json.Serialization.JsonPropertyName("callback_url")] - public string CallbackUrl { get; set; } = string.Empty; + public string? CallbackUrl { get; set; } /// /// 获取或设置是否展示开发票入口开关。 @@ -25,5 +25,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [Newtonsoft.Json.JsonProperty("show_fapiao_cell")] [System.Text.Json.Serialization.JsonPropertyName("show_fapiao_cell")] public bool? RequireShowFapiaoCell { get; set; } + + /// + /// 获取或设置是否支持开电子专票。 + /// + [Newtonsoft.Json.JsonProperty("support_vat_fapiao")] + [System.Text.Json.Serialization.JsonPropertyName("support_vat_fapiao")] + public bool? IsSupportVATFapiao { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs index 1a84b32f..e3e88004 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs @@ -3,13 +3,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 表示 [PATCH] /new-tax-control-fapiao/merchant/development-config 接口的响应。 /// - public class ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse : WechatTenpayResponse + public class ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse : GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse { - /// - /// 获取或设置回调地址。 - /// - [Newtonsoft.Json.JsonProperty("callback_url")] - [System.Text.Json.Serialization.JsonPropertyName("callback_url")] - public string CallbackUrl { get; set; } = default!; } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.cs index aac095f8..fbb3754b 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.cs @@ -72,5 +72,33 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)] [WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)] public string? UserEmail { get; set; } + + /// + /// 获取或设置订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int? Amount { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string? OutTradeNumber { get; set; } + + /// + /// 获取或设置开具发票类型。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_bill_type")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")] + public string? FapiaoBillType { get; set; } + + /// + /// 获取或设置用户留言信息。 + /// + [Newtonsoft.Json.JsonProperty("user_apply_message")] + [System.Text.Json.Serialization.JsonPropertyName("user_apply_message")] + public string? UserApplyMessage { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlResponse.cs index 1b1bd078..9e9ad85c 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlResponse.cs @@ -20,10 +20,10 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models public string MiniProgramPagePath { get; set; } = default!; /// - /// 获取或设置小程序用户名。 + /// 获取或设置小程序账号。 /// [Newtonsoft.Json.JsonProperty("miniprogram_user_name")] [System.Text.Json.Serialization.JsonPropertyName("miniprogram_user_name")] - public string? MiniProgramUsername { get; set; } = default!; + public string? MiniProgramUsername { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MerchantOperationManage/EnhancedDueDiligence/UploadMerchantOperationManageEnhancedDueDiligenceFileRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MerchantOperationManage/EnhancedDueDiligence/UploadMerchantOperationManageEnhancedDueDiligenceFileRequest.cs index fb9308c8..1d40cde8 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MerchantOperationManage/EnhancedDueDiligence/UploadMerchantOperationManageEnhancedDueDiligenceFileRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MerchantOperationManage/EnhancedDueDiligence/UploadMerchantOperationManageEnhancedDueDiligenceFileRequest.cs @@ -33,7 +33,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("file_digest")] [System.Text.Json.Serialization.JsonPropertyName("file_digest")] - public string? FileDigest { get; set; } + public string? FileHash { get; set; } /// /// 获取或设置文件 Conent-Type。如果不指定将由系统自动生成。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/TaxiInvoice/Card/UploadTaxiInvoiceCardFileRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/TaxiInvoice/Card/UploadTaxiInvoiceCardFileRequest.cs index 08883b51..423170a6 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/TaxiInvoice/Card/UploadTaxiInvoiceCardFileRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/TaxiInvoice/Card/UploadTaxiInvoiceCardFileRequest.cs @@ -16,17 +16,18 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// /// 获取或设置文件内容哈希算法。 + /// 默认值:"SM3" /// [Newtonsoft.Json.JsonProperty("digest_algorithm")] [System.Text.Json.Serialization.JsonPropertyName("digest_algorithm")] - public string FileHashAlgorithm { get; set; } = string.Empty; + public string FileHashAlgorithm { get; set; } = "SM3"; /// - /// 获取或设置文件内容哈希值。 + /// 获取或设置文件内容哈希值。如果不指定将由系统自动生成。 /// [Newtonsoft.Json.JsonProperty("digest")] [System.Text.Json.Serialization.JsonPropertyName("digest")] - public string FileHashValue { get; set; } = string.Empty; + public string? FileHash { get; set; } /// /// 获取或设置公司商户号。 diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardRequest.json index b20a6de4..c6434d80 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardRequest.json +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardRequest.json @@ -9,7 +9,11 @@ "bank_name": "测试银行", "bank_account": "62001234567890", "phone": "18507550000", - "email": "123110@qq.com" + "email": "123110@qq.com", + "amount": 1000, + "out_trade_no": "order_20200701_123456", + "fapiao_bill_type": "COMM_FAPIAO", + "user_apply_message": "用户留言" }, "fapiao_card_information": [ { diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.json new file mode 100644 index 00000000..7adcdd62 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.json @@ -0,0 +1,50 @@ +{ + "sub_mchid": "example_sub_mchid", + "fapiao_apply_id": "example_fapiao_apply_id", + "buyer_information": { + "type": "INDIVIDUAL", + "name": "深圳市南山区测试企业", + "taxpayer_id": "202003261233701778", + "address": "深圳市南山区深南大道10000号", + "telephone": "075512345678", + "bank_name": "测试银行", + "bank_account": "62001234567890", + "phone": "mI7HGEJ4Q2B91IGjHrl7FNN9QuFPDfzeXoaJM4B8ZghZPzXK+vNotEZu/Gthm87Szv0MK2AoC0/3ZMDgltMtdoY6O0qZ4F1iXiwCuqkkBe+9M4ggvdzpPGM+fyed2QU1seUGbii5RVVVB9s+zLEQ8nv74vsgl77MZx14nd5obtCcfAvPfDJob3oG7FqlThmYKJqjiOwBvvQse7p9R8onj/POzSrbM8re8ZYGp4LcehXopTLdk2ZVWRv8bnJgKZWArAcqMdahq4jY2UVYeY4vpMmq4xuRTYk6xNXvowBBKK2SX8SqM+jm1USyoBIazLu4oaNFNdBO3fip1a1rFW0vRw==", + "email": "NzJy3r0Z2u2Vs5l+WSH0A3CZ1oGlCZ66aa2wUlMXNmACbd4wU8LqqYCuTG4cYWxrVUSmviV59/Uy9vLdIwuHZVrMalYAZGtb8inWGhDj3wUqQnPkmBKBVGIWG5Y6XJmMvpXW6rIKsdzxs8NwWj30cRNfjanLxiWc0aIgl8Knwo0JcxlcYLo38T9ntsrRkQZMQEWHaMYnzjp7ysLbp6yW83OZb/NwEufERBdPnIbDbVE7DUd5MGhvO+tlr2YC1b4VCsrDmjryuTD5nvYYCGHyfXW2CM23hZdBm9tPc+mU18Z9d4XkasnfsecGWd2ISkpPmnk3DtapnD64Nw8JyLtkgw==", + "amount": 1000, + "out_trade_no": "order_20200701_123456", + "fapiao_bill_type": "COMM_FAPIAO", + "user_apply_message": "用户留言" + }, + "fapiao_information": { + "fapiao_id": "20200701123456", + "total_amount": 382895, + "items": [ + { + "tax_code": "3010101020203000000", + "goods_name": "*xxx*服务", + "specification": "米", + "unit": "米", + "quantity": 100000000, + "total_amount": 429900, + "tax_rate": 1300, + "discount": false, + "preferential_policy_code": 1 + } + ], + "export_business_policy_code": 1, + "vat_refund_levy_code": 1, + "billing_person_id": "128279891283", + "billing_person": "example_billing_person", + "fapiao_bill_type": "COMM_FAPIAO", + "transaction_information": [ + { + "pay_channel": "WECHAT_PAY", + "transaction_id": "4200000008202508080512076713", + "out_trade_no": "order_20200701_123456", + "amount": 382895 + } + ], + "remark": "备注" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest.json new file mode 100644 index 00000000..024348ea --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest.json @@ -0,0 +1,62 @@ +{ + "sub_mchid": "1900000109", + "fapiao_apply_id": "4200000444201910177461284488", + "buyer_information": { + "type": "INDIVIDUAL", + "name": "深圳市南山区测试企业", + "taxpayer_id": "202003261233701778", + "address": "深圳市南山区深南大道10000号", + "telephone": "075512345678", + "bank_name": "测试银行", + "bank_account": "62001234567890", + "phone": "mI7HGEJ4Q2B91IGjHrl7FNN9QuFPDfzeXoaJM4B8ZghZPzXK+vNotEZu/Gthm87Szv0MK2AoC0/3ZMDgltMtdoY6O0qZ4F1iXiwCuqkkBe+9M4ggvdzpPGM+fyed2QU1seUGbii5RVVVB9s+zLEQ8nv74vsgl77MZx14nd5obtCcfAvPfDJob3oG7FqlThmYKJqjiOwBvvQse7p9R8onj/POzSrbM8re8ZYGp4LcehXopTLdk2ZVWRv8bnJgKZWArAcqMdahq4jY2UVYeY4vpMmq4xuRTYk6xNXvowBBKK2SX8SqM+jm1USyoBIazLu4oaNFNdBO3fip1a1rFW0vRw==", + "email": "NzJy3r0Z2u2Vs5l+WSH0A3CZ1oGlCZ66aa2wUlMXNmACbd4wU8LqqYCuTG4cYWxrVUSmviV59/Uy9vLdIwuHZVrMalYAZGtb8inWGhDj3wUqQnPkmBKBVGIWG5Y6XJmMvpXW6rIKsdzxs8NwWj30cRNfjanLxiWc0aIgl8Knwo0JcxlcYLo38T9ntsrRkQZMQEWHaMYnzjp7ysLbp6yW83OZb/NwEufERBdPnIbDbVE7DUd5MGhvO+tlr2YC1b4VCsrDmjryuTD5nvYYCGHyfXW2CM23hZdBm9tPc+mU18Z9d4XkasnfsecGWd2ISkpPmnk3DtapnD64Nw8JyLtkgw==", + "amount": 1000, + "out_trade_no": "order_20200701_123456", + "fapiao_bill_type": "COMM_FAPIAO", + "user_apply_message": "用户留言" + }, + "fapiao_information": { + "fapiao_id": "20200701123456", + "total_amount": 382895, + "items": [ + { + "tax_code": "3010101020203000000", + "goods_name": "*经营租赁*车辆停放服务", + "specification": "米", + "unit": "METER", + "quantity": 100000000, + "total_amount": 429900, + "tax_rate": 1300, + "discount": false, + "preferential_policy_code": 1, + "real_estate_leasing_information": { + "province": "重庆市", + "city": "涪陵区", + "address": "xx街道xx小区", + "lease_period_start": "2025-01-01T10:00:00+08:00", + "lease_period_end": "2025-07-01T12:00:00+08:00", + "cross_city_flag": true, + "certificate_no": "OVgc/slzCvzSebaz46sUA4tJmm5GbNC0Tkp0oKmuHev9aTDzzcNIy5fKuywKWa0aYIWPyitr3wCYVPUw5Bnw1VUr6jn9eCeQPQye2t+zNuuCM0vmr1NNhdI3a2FNIx5HxkBrdM0XuiLt2/46UaWuzcUbZ52CCtZGgRzxeuj6oF/RKVG+dzT2HOm3kbYi1cUM10hARPKN+kV84I5WnFglX1cPM7s+OHkWvj38xEAfJBJfj3lf0UTRo", + "plate_no": [ + "渝A12345" + ] + } + } + ], + "export_business_policy_code": 1, + "vat_refund_levy_code": 1, + "billing_person_id": "187776276864872", + "billing_person": "张伟", + "fapiao_bill_type": "COMM_FAPIAO", + "transaction_information": [ + { + "pay_channel": "WECHAT_PAY", + "transaction_id": "4200000008202508080512076713", + "out_trade_no": "order_20200701_123456", + "amount": 382895 + } + ], + "remark": "备注" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.json index 872024fe..b1b52a55 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.json +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.json @@ -45,7 +45,11 @@ "bank_name": "测试银行", "bank_account": "62001234567890", "phone": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6zB", - "email": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6za" + "email": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6za", + "amount": 1000, + "out_trade_no": "order_20200701_123456", + "fapiao_bill_type": "COMM_FAPIAO", + "user_apply_message": "用户留言" }, "extra_information": { "payee": "张三", @@ -68,7 +72,9 @@ "discount": false } ], - "remark": "备注" + "remark": "备注", + "fapiao_error_code": "BIZ_ERROR", + "fapiao_error_message": "开票失败。授信额度不足,请联系主管税务机关或者登录电子税务局提额/申报。" } ] } diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse.json new file mode 100644 index 00000000..95a24d3d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoMerchant/GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse.json @@ -0,0 +1,5 @@ +{ + "invite_url": "https://wxacurl.cn?xxx=", + "miniprogram_appid": "wxb1170446a4c0a5a2", + "miniprogram_path": "pages/xxxPage" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse.json new file mode 100644 index 00000000..747ef538 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/FapiaoMerchant/QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse.json @@ -0,0 +1,17 @@ +{ + "total_count": 50, + "offset": 10, + "limit": 1, + "mch_invite_result_list": [ + { + "sub_mchid": "1999192837", + "mch_invite_status": "MCH_INVITE_SUCC", + "ep_name": "示例(深圳)有限公司", + "tax_id": "9144050071126766XG", + "invite_code": "code_20200101_123", + "operate_time": "2020-07-01T00:00:00", + "invite_failed_code": "UNKNOWN_TAX_INFO", + "invite_failed_reason": "示例失败原因" + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusResponse.json new file mode 100644 index 00000000..70ed433e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/CheckNewTaxControlFapiaoMerchantStatusResponse.json @@ -0,0 +1,25 @@ +{ + "sub_mchid": "1900000109", + "third_mode": { + "status": "ENABLED" + }, + "digital_tax_mode": { + "status": "ENABLED", + "billing_person_info": [ + { + "id": "187776276864872", + "name": "张伟" + } + ], + "access_time": "2020-07-01T12:00:00+08:00", + "expired_time": "2020-07-02T12:00:00+08:00", + "access_fail_reason": "失败原因", + "ability_info": [ + { + "type": "BASE_ABILITY", + "status": "AUTHORIZED", + "authorize_fail_reason": "失败原因" + } + ] + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.json index fbef91b0..ad413972 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.json +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.json @@ -1,5 +1,6 @@ { "callback_url": "https://pay.weixin.qq.com/callback", "sub_mch_code": "1900000109", - "show_fapiao_cell": false + "show_fapiao_cell": false, + "support_vat_fapiao": false } diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.json index 26e9fa12..8acb31ed 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.json +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.json @@ -1,3 +1,5 @@ { - "callback_url": "https://pay.weixin.qq.com/callback" + "callback_url": "https://pay.weixin.qq.com/callback", + "show_fapiao_cell": false, + "support_vat_fapiao": false } diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.json index 4651491a..315cad70 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.json +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.json @@ -7,5 +7,9 @@ "bank_name": "测试银行", "bank_account": "62001234567890", "phone": "18507550000", - "email": "123110@qq.com" + "email": "123110@qq.com", + "amount": 1000, + "out_trade_no": "order_20200701_123456", + "fapiao_bill_type": "COMM_FAPIAO", + "user_apply_message": "用户留言" } diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs index c858b673..3f4aa867 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs @@ -1693,6 +1693,59 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests } } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /new-tax-control-fapiao/fapiaomerchant/getspinviteurl)")] + public async Task TestEncryptRequestSensitiveProperty_GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest() + { + static Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest GenerateMockRequestModel() + { + return new Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest() + { + OperateUser = MOCK_PLAIN_STR + }; + } + + static void AssertMockRequestModel(Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest request, Func decryptor) + { + Assert.NotEqual(MOCK_PLAIN_STR, request.OperateUser!); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.OperateUser!)); + Assert.Equal(MOCK_CERT_SN, request.WechatpaySerialNumber!, 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.ExecuteGetNewTaxControlFapiaoMerchantServicePartnerInviteUrlAsync(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.ExecuteGetNewTaxControlFapiaoMerchantServicePartnerInviteUrlAsync(request); + AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!); + } + } + } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /papay/insurance-sign/contracts/pre-entrust-sign/h5)")] public async Task TestEncryptRequestSensitiveProperty_PresignPAPayInsuranceSignContractEntrustH5Request() {