diff --git a/docs/WechatTenpayV3/Basic_ModelDefinition.md b/docs/WechatTenpayV3/Basic_ModelDefinition.md index ad95e7c4..7108bdc7 100644 --- a/docs/WechatTenpayV3/Basic_ModelDefinition.md +++ b/docs/WechatTenpayV3/Basic_ModelDefinition.md @@ -42,6 +42,7 @@ | √ | 经营能力:微信先享卡 | 直连商户 | | | √ | 经营能力:支付即服务 | 直连商户 & 服务商 | | | √ | 经营能力:点金计划 | 服务商 | | +| √ | 经营能力:区块链电子发票 | 直连商户 | | | √ | 经营能力:出租车电子发票 | 服务商 | | | √ | 行业方案:电商收付通 | 服务商 | | | √ | 行业方案:智慧商圈 | 直连商户 & 服务商 | | diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/NewTaxControlFapiao/FapiaoResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/NewTaxControlFapiao/FapiaoResource.cs new file mode 100644 index 00000000..b50b34e9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/NewTaxControlFapiao/FapiaoResource.cs @@ -0,0 +1,71 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events +{ + /// + /// 表示 FAPIAO.USER_APPLIED 通知的数据。 + /// 标识 FAPIAO.CARD_INSERTED 通知的数据。 + /// 标识 FAPIAO.CARD_DISCARDED 通知的数据。 + /// 标识 FAPIAO.ISSUED 通知的数据。 + /// 标识 FAPIAO.REVERSED 通知的数据。 + /// + public class FapiaoResource : WechatTenpayEvent.Types.IDecryptedResource + { + public static class Types + { + public class Fapiao + { + /// + /// 获取或设置商户发票单号。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_id")] + public string FapiaoId { get; set; } = default!; + + /// + /// 获取或设置发票状态。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_status")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_status")] + public string FapiaoStatus { get; set; } = default!; + + /// + /// 获取或设置卡包状态。 + /// + [Newtonsoft.Json.JsonProperty("card_status")] + [System.Text.Json.Serialization.JsonPropertyName("card_status")] + public string CardStatus { get; set; } = default!; + } + } + + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置发票申请单号。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_apply_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_apply_id")] + public string FapiaoApplyId { get; set; } = default!; + + /// + /// 获取或设置用户填写时间。 + /// + [Newtonsoft.Json.JsonProperty("apply_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("apply_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ApplyTime { get; set; } + + /// + /// 获取或设置发票列表。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_information")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_information")] + public Types.Fapiao[]? FapiaoList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteNewTaxControlFapiaoExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteNewTaxControlFapiaoExtensions.cs new file mode 100644 index 00000000..0255617a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteNewTaxControlFapiaoExtensions.cs @@ -0,0 +1,328 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电子发票相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteNewTaxControlFapiaoExtensions + { + #region CardTemplate + /// + /// 异步调用 [POST] /new-tax-control-fapiao/card-template 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateNewTaxControlFapiaoCardTemplateAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoCardTemplateRequest 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 + .CreateRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "card-template"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion + + #region Merchant + /// + /// 异步调用 [PATCH] /new-tax-control-fapiao/merchant/development-config 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_18.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteModifyNewTaxControlFapiaoMerchantDevelopmentConfigAsync(this WechatTenpayClient client, Models.ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest 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 + .CreateRequest(request, new HttpMethod("PATCH"), "new-tax-control-fapiao", "merchant", "development-config"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /new-tax-control-fapiao/merchant/development-config 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_18.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetNewTaxControlFapiaoMerchantDevelopmentConfigAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoMerchantDevelopmentConfigRequest 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 + .CreateRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "merchant", "development-config"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /new-tax-control-fapiao/merchant/base-information 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetNewTaxControlFapiaoMerchantBaseInformationAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoMerchantBaseInformationRequest 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 + .CreateRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "merchant", "base-information"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /new-tax-control-fapiao/merchant/tax-codes 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryNewTaxControlFapiaoMerchantTaxCodesAsync(this WechatTenpayClient client, Models.QueryNewTaxControlFapiaoMerchantTaxCodesRequest 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 + .CreateRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "merchant", "tax-codes") + .SetQueryParam("offset", request.Offset) + .SetQueryParam("limit", request.Limit); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion + + #region UserTitle + /// + /// 异步调用 [GET] /new-tax-control-fapiao/user-title/title-url 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_6.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetNewTaxControlFapiaoUserTitleUrlAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoUserTitleUrlRequest 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 + .CreateRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "user-title", "title-url") + .SetQueryParam("fapiao_apply_id", request.FapiaoApplyId) + .SetQueryParam("source", request.Source) + .SetQueryParam("total_amount", request.TotalAmount) + .SetQueryParam("appid", request.AppId) + .SetQueryParam("openid", request.OpenId); + + if (request.SellerName != null) + flurlReq.SetQueryParam("seller_name", request.SellerName); + + if (request.RequireShowMobileCell != null) + flurlReq.SetQueryParam("show_phone_cell", request.RequireShowMobileCell.Value ? "true" : "false"); + + if (request.RequireMustInputMobile != null) + flurlReq.SetQueryParam("must_input_phone", request.RequireMustInputMobile.Value ? "true" : "false"); + + if (request.RequireShowEmailCell != null) + flurlReq.SetQueryParam("show_email_cell", request.RequireShowEmailCell.Value ? "true" : "false"); + + if (request.RequireMustInputEmail != null) + flurlReq.SetQueryParam("must_input_email", request.RequireMustInputEmail.Value ? "true" : "false"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /new-tax-control-fapiao/user-title 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_7.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetNewTaxControlFapiaoUserTitleAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoUserTitleRequest 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 + .CreateRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "user-title") + .SetQueryParam("fapiao_apply_id", request.FapiaoApplyId) + .SetQueryParam("scene", request.Scene); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion + + #region FapiaoApplication + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_8.shtml + /// + /// + /// + /// + /// + 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 + .CreateRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/reverse 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_10.shtml + /// + /// + /// + /// + /// + 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 + .CreateRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "reverse"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_9.shtml + /// + /// + /// + /// + /// + 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 + .CreateRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId); + + if (request.FapiaoId != null) + flurlReq.SetQueryParam("fapiao_id", request.FapiaoId); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/fapiao-files 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_9.shtml + /// + /// + /// + /// + /// + 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 + .CreateRequest(request, HttpMethod.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "fapiao-files"); + + if (request.FapiaoId != null) + flurlReq.SetQueryParam("fapiao_id", request.FapiaoId); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /{download_url} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_21.shtml + /// (请注意此接口不受构造 时指定的 参数控制。) + /// + /// + /// + /// + /// + 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 == null) + request.MerchantId = client.Credentials.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Get, request.DownloadUrl) + .WithUrl(request.DownloadUrl) + .SetQueryParam("mchid", request.MerchantId) + .SetQueryParam("openid", request.OpenId) + .SetQueryParam("fapiao_id", request.FapiaoId) + .SetQueryParam("invoice_code", request.FapiaoCode) + .SetQueryParam("invoice_no", request.FapiaoNumber); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/upload-fapiao-file 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_14.shtml + /// + /// + /// + /// + /// + 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 + .CreateRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", "upload-fapiao-file"); + + using var httpContent = Utilities.FileHttpContentBuilder.Build(fileName: "file.pdf", fileBytes: request.FileBytes, fileContentType: "application/pdf", fileMetaJson: client.JsonSerializer.Serialize(request)); + return await client.SendRequestAsync(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/insert-cards 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/Offline/apis/chapter4_8_15.shtml + /// + /// + /// + /// + /// + 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 + .CreateRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "insert-cards"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateRequest.cs new file mode 100644 index 00000000..0fdb7787 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateRequest.cs @@ -0,0 +1,90 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/card-template 接口的请求。 + /// + public class CreateNewTaxControlFapiaoCardTemplateRequest : WechatTenpayRequest + { + public static class Types + { + public class CartTemplate + { + public static class Types + { + public class CustomCell + { + /// + /// 获取或设置文字。 + /// + [Newtonsoft.Json.JsonProperty("words")] + [System.Text.Json.Serialization.JsonPropertyName("words")] + public string Words { get; set; } = string.Empty; + + /// + /// 获取或设置描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置跳转链接。 + /// + [Newtonsoft.Json.JsonProperty("jump_url")] + [System.Text.Json.Serialization.JsonPropertyName("jump_url")] + public string? JumpUrl { get; set; } + + /// + /// 获取或设置跳转小程序的用户名。 + /// + [Newtonsoft.Json.JsonProperty("miniprogram_user_name")] + [System.Text.Json.Serialization.JsonPropertyName("miniprogram_user_name")] + public string? MiniProgramUsername { get; set; } + + /// + /// 获取或设置跳转小程序的页面路径。 + /// + [Newtonsoft.Json.JsonProperty("miniprogram_path")] + [System.Text.Json.Serialization.JsonPropertyName("miniprogram_path")] + public string? MiniProgramPagePath { get; set; } + } + } + + /// + /// 获取或设置收款方名称。 + /// + [Newtonsoft.Json.JsonProperty("payee_name")] + [System.Text.Json.Serialization.JsonPropertyName("payee_name")] + public string? PayeeName { get; set; } + + /// + /// 获取或设置卡券 Logo 地址。 + /// + [Newtonsoft.Json.JsonProperty("logo_url")] + [System.Text.Json.Serialization.JsonPropertyName("logo_url")] + public string? LogoUrl { get; set; } + + /// + /// 获取或设置卡券自定义信息。 + /// + [Newtonsoft.Json.JsonProperty("custom_cell")] + [System.Text.Json.Serialization.JsonPropertyName("custom_cell")] + public Types.CustomCell? CustomCell { get; set; } + } + } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("card_appid")] + [System.Text.Json.Serialization.JsonPropertyName("card_appid")] + public string CardAppId { get; set; } = string.Empty; + + /// + /// 获取或设置卡券模板信息。 + /// + [Newtonsoft.Json.JsonProperty("card_template_information")] + [System.Text.Json.Serialization.JsonPropertyName("card_template_information")] + public Types.CartTemplate CartTemplate { get; set; } = new Types.CartTemplate(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateResponse.cs new file mode 100644 index 00000000..e7ed4b95 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateResponse.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/card-template 接口的响应。 + /// + public class CreateNewTaxControlFapiaoCardTemplateResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("card_appid")] + [System.Text.Json.Serialization.JsonPropertyName("card_appid")] + public string CardAppId { get; set; } = default!; + + /// + /// 获取或设置卡券模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("card_id")] + [System.Text.Json.Serialization.JsonPropertyName("card_id")] + public string CardTemplateId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardRequest.cs new file mode 100644 index 00000000..a5e09299 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardRequest.cs @@ -0,0 +1,303 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/insert-cards 接口的请求。 + /// + [WechatTenpaySensitive] + public class CreateNewTaxControlFapiaoApplicationCardRequest : WechatTenpayRequest + { + public static class Types + { + public class Buyer : CreateNewTaxControlFapiaoApplicationRequest.Types.Buyer + { + } + + public class FapiaoCard + { + public static class Types + { + public class Seller + { + /// + /// 获取或设置销售方名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// + /// 获取或设置纳税人识别号。 + /// + [Newtonsoft.Json.JsonProperty("taxpayer_id")] + [System.Text.Json.Serialization.JsonPropertyName("taxpayer_id")] + public string TaxpayerId { get; set; } = string.Empty; + + /// + /// 获取或设置地址。 + /// + [Newtonsoft.Json.JsonProperty("address")] + [System.Text.Json.Serialization.JsonPropertyName("address")] + public string? Address { get; set; } + + /// + /// 获取或设置电话。 + /// + [Newtonsoft.Json.JsonProperty("telephone")] + [System.Text.Json.Serialization.JsonPropertyName("telephone")] + public string? PhoneNumber { get; set; } + + /// + /// 获取或设置开户银行。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string? BankName { get; set; } + + /// + /// 获取或设置银行账号。 + /// + [Newtonsoft.Json.JsonProperty("bank_account")] + [System.Text.Json.Serialization.JsonPropertyName("bank_account")] + public string? BankAccountNumber { get; set; } + } + + public class Extra + { + /// + /// 获取或设置收款人。 + /// + [Newtonsoft.Json.JsonProperty("payee")] + [System.Text.Json.Serialization.JsonPropertyName("payee")] + public string? Payee { get; set; } + + /// + /// 获取或设置复核人。 + /// + [Newtonsoft.Json.JsonProperty("reviewer")] + [System.Text.Json.Serialization.JsonPropertyName("reviewer")] + public string? Reviewer { get; set; } + + /// + /// 获取或设置开票人。 + /// + [Newtonsoft.Json.JsonProperty("drawer")] + [System.Text.Json.Serialization.JsonPropertyName("drawer")] + public string Drawer { get; set; } = string.Empty; + } + + public class Item + { + /// + /// 获取或设置货物或应税劳务或服务编码。 + /// + [Newtonsoft.Json.JsonProperty("tax_code")] + [System.Text.Json.Serialization.JsonPropertyName("tax_code")] + public string TaxCode { get; set; } = string.Empty; + + /// + /// 获取或设置货物或应税劳务或服务名称。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string GoodsName { get; set; } = string.Empty; + + /// + /// 获取或设置规格型号。 + /// + [Newtonsoft.Json.JsonProperty("specification")] + [System.Text.Json.Serialization.JsonPropertyName("specification")] + public string? Specification { get; set; } + + /// + /// 获取或设置单位。 + /// + [Newtonsoft.Json.JsonProperty("unit")] + [System.Text.Json.Serialization.JsonPropertyName("unit")] + public string? Unit { get; set; } + + /// + /// 获取或设置数量。 + /// + [Newtonsoft.Json.JsonProperty("quantity")] + [System.Text.Json.Serialization.JsonPropertyName("quantity")] + public int Quantity { get; set; } + + /// + /// 获取或设置单价(单位:10^-6分)。 + /// + [Newtonsoft.Json.JsonProperty("unit_price")] + [System.Text.Json.Serialization.JsonPropertyName("unit_price")] + public long UnitPrice { get; set; } + + /// + /// 获取或设置单行金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置单行税额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("tax_amount")] + [System.Text.Json.Serialization.JsonPropertyName("tax_amount")] + public int TaxAmount { get; set; } + + /// + /// 获取或设置单行合计(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置税率(单位:万分数)。 + /// + [Newtonsoft.Json.JsonProperty("tax_rate")] + [System.Text.Json.Serialization.JsonPropertyName("tax_rate")] + public int TaxRate { get; set; } + + /// + /// 获取或设置税收优惠政策标识。 + /// 默认值:NO_FAVORABLE + /// + [Newtonsoft.Json.JsonProperty("tax_prefer_mark")] + [System.Text.Json.Serialization.JsonPropertyName("tax_prefer_mark")] + public string TaxPreferMark { get; set; } = "NO_FAVORABLE"; + + /// + /// 获取或设置是否是折扣行。 + /// + [Newtonsoft.Json.JsonProperty("discount")] + [System.Text.Json.Serialization.JsonPropertyName("discount")] + public bool IsDiscount { get; set; } + } + } + + /// + /// 获取或设置发票文件 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_media_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_media_id")] + public string FapiaoMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置发票号码。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_number")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_number")] + public string FapiaoNumber { get; set; } = string.Empty; + + /// + /// 获取或设置发票代码。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_code")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_code")] + public string FapiaoCode { get; set; } = string.Empty; + + /// + /// 获取或设置开票时间。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset FapiaoTime { get; set; } + + /// + /// 获取或设置校验码。 + /// + [Newtonsoft.Json.JsonProperty("check_code")] + [System.Text.Json.Serialization.JsonPropertyName("check_code")] + public string CheckCode { get; set; } = string.Empty; + + /// + /// 获取或设置密码。 + /// + [Newtonsoft.Json.JsonProperty("password")] + [System.Text.Json.Serialization.JsonPropertyName("password")] + public string Password { get; set; } = string.Empty; + + /// + /// 获取或设置总价税合计(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置总税额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("tax_amount")] + [System.Text.Json.Serialization.JsonPropertyName("tax_amount")] + public int TaxAmount { get; set; } + + /// + /// 获取或设置总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置销售方信息。 + /// + [Newtonsoft.Json.JsonProperty("seller_information")] + [System.Text.Json.Serialization.JsonPropertyName("seller_information")] + public Types.Seller Seller { get; set; } = new Types.Seller(); + + /// + /// 获取或设置额外信息。 + /// + [Newtonsoft.Json.JsonProperty("extra_information")] + [System.Text.Json.Serialization.JsonPropertyName("extra_information")] + public Types.Extra Extra { get; set; } = new Types.Extra(); + + /// + /// 获取或设置发票行列表。 + /// + [Newtonsoft.Json.JsonProperty("items")] + [System.Text.Json.Serialization.JsonPropertyName("items")] + public IList? ItemList { get; set; } + + /// + /// 获取或设置备注信息。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + } + } + + /// + /// 获取或设置发票申请单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoApplyId { get; set; } = string.Empty; + + /// + /// 获取或设置开票场景。 + /// + [Newtonsoft.Json.JsonProperty("scene")] + [System.Text.Json.Serialization.JsonPropertyName("scene")] + public string Scene { 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_card_information")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_card_information")] + public IList FapiaoCardList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardResponse.cs new file mode 100644 index 00000000..9d30406e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/insert-cards 接口的响应。 + /// + public class CreateNewTaxControlFapiaoApplicationCardResponse : 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 new file mode 100644 index 00000000..9a852c83 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRequest.cs @@ -0,0 +1,227 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications 接口的请求。 + /// + [WechatTenpaySensitive] + public class CreateNewTaxControlFapiaoApplicationRequest : WechatTenpayRequest + { + public static class Types + { + public class Buyer + { + /// + /// 获取或设置购买方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置购买方名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// + /// 获取或设置纳税人识别号。 + /// + [Newtonsoft.Json.JsonProperty("taxpayer_id")] + [System.Text.Json.Serialization.JsonPropertyName("taxpayer_id")] + public string? TaxpayerId { get; set; } + + /// + /// 获取或设置地址。 + /// + [Newtonsoft.Json.JsonProperty("address")] + [System.Text.Json.Serialization.JsonPropertyName("address")] + public string? Address { get; set; } + + /// + /// 获取或设置电话。 + /// + [Newtonsoft.Json.JsonProperty("telephone")] + [System.Text.Json.Serialization.JsonPropertyName("telephone")] + public string? PhoneNumber { get; set; } + + /// + /// 获取或设置开户银行。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string? BankName { get; set; } + + /// + /// 获取或设置银行账号。 + /// + [Newtonsoft.Json.JsonProperty("bank_account")] + [System.Text.Json.Serialization.JsonPropertyName("bank_account")] + public string? BankAccountNumber { get; set; } + + /// + /// 获取或设置用户手机号码。 + /// + [Newtonsoft.Json.JsonProperty("phone")] + [System.Text.Json.Serialization.JsonPropertyName("phone")] + [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? UserMobileNumber { get; set; } + + /// + /// 获取或设置用户邮箱地址。 + /// + [Newtonsoft.Json.JsonProperty("email")] + [System.Text.Json.Serialization.JsonPropertyName("email")] + [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; } + } + + public class Fapiao + { + public static class Types + { + public class Item + { + /// + /// 获取或设置货物或应税劳务或服务编码。 + /// + [Newtonsoft.Json.JsonProperty("tax_code")] + [System.Text.Json.Serialization.JsonPropertyName("tax_code")] + public string TaxCode { get; set; } = string.Empty; + + /// + /// 获取或设置货物或应税劳务或服务分类。 + /// + [Newtonsoft.Json.JsonProperty("goods_category")] + [System.Text.Json.Serialization.JsonPropertyName("goods_category")] + public string? GoodsCategory { get; set; } + + /// + /// 获取或设置货物或应税劳务或服务名称。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string? GoodsName { get; set; } + + /// + /// 获取或设置规格型号。 + /// + [Newtonsoft.Json.JsonProperty("specification")] + [System.Text.Json.Serialization.JsonPropertyName("specification")] + public string? Specification { get; set; } + + /// + /// 获取或设置单位。 + /// + [Newtonsoft.Json.JsonProperty("unit")] + [System.Text.Json.Serialization.JsonPropertyName("unit")] + public string? Unit { get; set; } + + /// + /// 获取或设置数量。 + /// + [Newtonsoft.Json.JsonProperty("quantity")] + [System.Text.Json.Serialization.JsonPropertyName("quantity")] + public int Quantity { get; set; } + + /// + /// 获取或设置单行合计(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置税率(单位:万分数)。 + /// + [Newtonsoft.Json.JsonProperty("tax_rate")] + [System.Text.Json.Serialization.JsonPropertyName("tax_rate")] + public int? TaxRate { get; set; } + + /// + /// 获取或设置税收优惠政策标识。 + /// + [Newtonsoft.Json.JsonProperty("tax_prefer_mark")] + [System.Text.Json.Serialization.JsonPropertyName("tax_prefer_mark")] + public string? TaxPreferMark { get; set; } + + /// + /// 获取或设置是否是折扣行。 + /// + [Newtonsoft.Json.JsonProperty("discount")] + [System.Text.Json.Serialization.JsonPropertyName("discount")] + public bool IsDiscount { 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("need_list")] + [System.Text.Json.Serialization.JsonPropertyName("need_list")] + public bool RequireItemList { get; set; } + + /// + /// 获取或设置发票行列表。 + /// + [Newtonsoft.Json.JsonProperty("items")] + [System.Text.Json.Serialization.JsonPropertyName("items")] + public IList? ItemList { get; set; } + + /// + /// 获取或设置备注信息。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { 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("scene")] + [System.Text.Json.Serialization.JsonPropertyName("scene")] + public string Scene { 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 IList FapiaoList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationResponse.cs new file mode 100644 index 00000000..c18d0bb1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications 接口的响应。 + /// + public class CreateNewTaxControlFapiaoApplicationResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/DownloadNewTaxControlFapiaoApplicationFileRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/DownloadNewTaxControlFapiaoApplicationFileRequest.cs new file mode 100644 index 00000000..114635d6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/DownloadNewTaxControlFapiaoApplicationFileRequest.cs @@ -0,0 +1,50 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /{download_url} 接口的请求。 + /// + public class DownloadNewTaxControlFapiaoApplicationFileRequest : WechatTenpayRequest + { + /// + /// 获取或设置发票文件下载地址。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string DownloadUrl { get; set; } = string.Empty; + + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? MerchantId { get; set; } + + /// + /// 获取或设置商户发票单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoId { get; set; } = string.Empty; + + /// + /// 获取或设置发票代码。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoCode { get; set; } = string.Empty; + + /// + /// 获取或设置发票号码。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoNumber { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/DownloadNewTaxControlFapiaoApplicationFileResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/DownloadNewTaxControlFapiaoApplicationFileResponse.cs new file mode 100644 index 00000000..e2d26a45 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/DownloadNewTaxControlFapiaoApplicationFileResponse.cs @@ -0,0 +1,13 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /{download_url} 接口的响应。 + /// + public class DownloadNewTaxControlFapiaoApplicationFileResponse : WechatTenpayResponse + { + public override bool IsSuccessful() + { + return base.IsSuccessful() && RawBytes?.Length > 0; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest.cs new file mode 100644 index 00000000..17e79ca7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id} 接口的请求。 + /// + public class GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置发票申请单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoApplyId { get; set; } = string.Empty; + + /// + /// 获取或设置商户发票单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FapiaoId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.cs new file mode 100644 index 00000000..d379f8fe --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.cs @@ -0,0 +1,388 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id} 接口的响应。 + /// + [WechatTenpaySensitive] + public class GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse : WechatTenpayResponse + { + public static class Types + { + public class Fapiao + { + public static class Types + { + public class FapiaoDetail + { + /// + /// 获取或设置发票代码。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_code")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_code")] + public string FapiaoCode { get; set; } = default!; + + /// + /// 获取或设置发票号码。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_number")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_number")] + public string FapiaoNumber { get; set; } = default!; + + /// + /// 获取或设置校验码。 + /// + [Newtonsoft.Json.JsonProperty("check_code")] + [System.Text.Json.Serialization.JsonPropertyName("check_code")] + public string CheckCode { get; set; } = default!; + + /// + /// 获取或设置密码。 + /// + [Newtonsoft.Json.JsonProperty("password")] + [System.Text.Json.Serialization.JsonPropertyName("password")] + public string Password { get; set; } = default!; + + /// + /// 获取或设置开票时间。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset FapiaoTime { get; set; } + } + + public class FapiaoCard + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("card_appid")] + [System.Text.Json.Serialization.JsonPropertyName("card_appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("card_openid")] + [System.Text.Json.Serialization.JsonPropertyName("card_openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置电子发票卡券模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("card_id")] + [System.Text.Json.Serialization.JsonPropertyName("card_id")] + public string? CardTemplateId { get; set; } + + /// + /// 获取或设置电子发票在卡包中的编码。 + /// + [Newtonsoft.Json.JsonProperty("card_code")] + [System.Text.Json.Serialization.JsonPropertyName("card_code")] + public string? CardCode { get; set; } + + /// + /// 获取或设置发票卡券状态。 + /// + [Newtonsoft.Json.JsonProperty("card_status")] + [System.Text.Json.Serialization.JsonPropertyName("card_status")] + public string? CardStatus { get; set; } + } + + public class Buyer + { + /// + /// 获取或设置购买方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置购买方名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置纳税人识别号。 + /// + [Newtonsoft.Json.JsonProperty("taxpayer_id")] + [System.Text.Json.Serialization.JsonPropertyName("taxpayer_id")] + public string? TaxpayerId { get; set; } + + /// + /// 获取或设置地址。 + /// + [Newtonsoft.Json.JsonProperty("address")] + [System.Text.Json.Serialization.JsonPropertyName("address")] + public string? Address { get; set; } + + /// + /// 获取或设置电话。 + /// + [Newtonsoft.Json.JsonProperty("telephone")] + [System.Text.Json.Serialization.JsonPropertyName("telephone")] + public string? PhoneNumber { get; set; } + + /// + /// 获取或设置开户银行。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string? BankName { get; set; } + + /// + /// 获取或设置银行账号。 + /// + [Newtonsoft.Json.JsonProperty("bank_account")] + [System.Text.Json.Serialization.JsonPropertyName("bank_account")] + public string? BankAccountNumber { get; set; } + + /// + /// 获取或设置用户手机号码。 + /// + [Newtonsoft.Json.JsonProperty("phone")] + [System.Text.Json.Serialization.JsonPropertyName("phone")] + [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? UserMobileNumber { get; set; } + + /// + /// 获取或设置用户邮箱地址。 + /// + [Newtonsoft.Json.JsonProperty("email")] + [System.Text.Json.Serialization.JsonPropertyName("email")] + [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; } + } + + public class Seller : GetNewTaxControlFapiaoMerchantBaseInformationResponse.Types.Seller + { + } + + public class Extra + { + /// + /// 获取或设置收款人。 + /// + [Newtonsoft.Json.JsonProperty("payee")] + [System.Text.Json.Serialization.JsonPropertyName("payee")] + public string? Payee { get; set; } + + /// + /// 获取或设置复核人。 + /// + [Newtonsoft.Json.JsonProperty("reviewer")] + [System.Text.Json.Serialization.JsonPropertyName("reviewer")] + public string? Reviewer { get; set; } + + /// + /// 获取或设置开票人。 + /// + [Newtonsoft.Json.JsonProperty("drawer")] + [System.Text.Json.Serialization.JsonPropertyName("drawer")] + public string Drawer { get; set; } = default!; + } + + public class Item + { + /// + /// 获取或设置货物或应税劳务或服务编码。 + /// + [Newtonsoft.Json.JsonProperty("tax_code")] + [System.Text.Json.Serialization.JsonPropertyName("tax_code")] + public string TaxCode { get; set; } = string.Empty; + + /// + /// 获取或设置货物或应税劳务或服务名称。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string GoodsName { get; set; } = string.Empty; + + /// + /// 获取或设置规格型号。 + /// + [Newtonsoft.Json.JsonProperty("specification")] + [System.Text.Json.Serialization.JsonPropertyName("specification")] + public string? Specification { get; set; } + + /// + /// 获取或设置单位。 + /// + [Newtonsoft.Json.JsonProperty("unit")] + [System.Text.Json.Serialization.JsonPropertyName("unit")] + public string? Unit { get; set; } + + /// + /// 获取或设置数量。 + /// + [Newtonsoft.Json.JsonProperty("quantity")] + [System.Text.Json.Serialization.JsonPropertyName("quantity")] + public int Quantity { get; set; } + + /// + /// 获取或设置单价(单位:10^-6分)。 + /// + [Newtonsoft.Json.JsonProperty("unit_price")] + [System.Text.Json.Serialization.JsonPropertyName("unit_price")] + public long UnitPrice { get; set; } + + /// + /// 获取或设置单行金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置单行税额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("tax_amount")] + [System.Text.Json.Serialization.JsonPropertyName("tax_amount")] + public int TaxAmount { get; set; } + + /// + /// 获取或设置单行合计(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置税率(单位:万分数)。 + /// + [Newtonsoft.Json.JsonProperty("tax_rate")] + [System.Text.Json.Serialization.JsonPropertyName("tax_rate")] + public int TaxRate { get; set; } + + /// + /// 获取或设置税收优惠政策标识。 + /// + [Newtonsoft.Json.JsonProperty("tax_prefer_mark")] + [System.Text.Json.Serialization.JsonPropertyName("tax_prefer_mark")] + public string? TaxPreferMark { get; set; } + + /// + /// 获取或设置是否是折扣行。 + /// + [Newtonsoft.Json.JsonProperty("discount")] + [System.Text.Json.Serialization.JsonPropertyName("discount")] + public bool IsDiscount { get; set; } + } + } + + /// + /// 获取或设置商户发票单号。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_id")] + public string FapiaoId { get; set; } = default!; + + /// + /// 获取或设置发票状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string FapiaoStatus { get; set; } = default!; + + /// + /// 获取或设置总价税合计(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置总税额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("tax_amount")] + [System.Text.Json.Serialization.JsonPropertyName("tax_amount")] + public int TaxAmount { get; set; } + + /// + /// 获取或设置总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置蓝字发票信息。 + /// + [Newtonsoft.Json.JsonProperty("blue_fapiao")] + [System.Text.Json.Serialization.JsonPropertyName("blue_fapiao")] + public Types.FapiaoDetail? BlueFapiao { get; set; } + + /// + /// 获取或设置红字发票信息。 + /// + [Newtonsoft.Json.JsonProperty("red_fapiao")] + [System.Text.Json.Serialization.JsonPropertyName("red_fapiao")] + public Types.FapiaoDetail? RedFapiao { get; set; } + + /// + /// 获取或设置电子发票卡券信息。 + /// + [Newtonsoft.Json.JsonProperty("card_information")] + [System.Text.Json.Serialization.JsonPropertyName("card_information")] + public Types.FapiaoCard? FapiaoCard { get; set; } + + /// + /// 获取或设置购买方信息。 + /// + [Newtonsoft.Json.JsonProperty("buyer_information")] + [System.Text.Json.Serialization.JsonPropertyName("buyer_information")] + public Types.Buyer Buyer { get; set; } = default!; + + /// + /// 获取或设置销售方信息。 + /// + [Newtonsoft.Json.JsonProperty("seller_information")] + [System.Text.Json.Serialization.JsonPropertyName("seller_information")] + public Types.Seller Seller { get; set; } = default!; + + /// + /// 获取或设置额外信息。 + /// + [Newtonsoft.Json.JsonProperty("extra_information")] + [System.Text.Json.Serialization.JsonPropertyName("extra_information")] + public Types.Extra Extra { get; set; } = new Types.Extra(); + + /// + /// 获取或设置发票行列表。 + /// + [Newtonsoft.Json.JsonProperty("items")] + [System.Text.Json.Serialization.JsonPropertyName("items")] + public Types.Item[]? ItemList { get; set; } + + /// + /// 获取或设置备注信息。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + } + } + + /// + /// 获取或设置发票信息列表。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_information")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_information")] + public Types.Fapiao[] FapiaoList { get; set; } = default!; + + /// + /// 获取或设置发票数量。 + /// + [Newtonsoft.Json.JsonProperty("total_count")] + [System.Text.Json.Serialization.JsonPropertyName("total_count")] + public int TotalCount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationFilesRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationFilesRequest.cs new file mode 100644 index 00000000..48c1b082 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationFilesRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/fapiao-files 接口的请求。 + /// + public class GetNewTaxControlFapiaoApplicationFilesRequest : WechatTenpayRequest + { + /// + /// 获取或设置发票申请单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoApplyId { get; set; } = string.Empty; + + /// + /// 获取或设置商户发票单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FapiaoId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationFilesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationFilesResponse.cs new file mode 100644 index 00000000..c6265667 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationFilesResponse.cs @@ -0,0 +1,42 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/fapiao-files 接口的响应。 + /// + public class GetNewTaxControlFapiaoApplicationFilesResponse : WechatTenpayResponse + { + public static class Types + { + public class FapiaoFile + { + /// + /// 获取或设置商户发票单号。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_id")] + public string FapiaoId { get; set; } = default!; + + /// + /// 获取或设置发票状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string FapiaoStatus { get; set; } = default!; + + /// + /// 获取或设置发票文件下载地址。 + /// + [Newtonsoft.Json.JsonProperty("download_url")] + [System.Text.Json.Serialization.JsonPropertyName("download_url")] + public string? DownloadUrl { get; set; } + } + } + + /// + /// 获取或设置发票文件列表。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_download_info_list")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_download_info_list")] + public Types.FapiaoFile[] FapiaoFile { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/ReverseNewTaxControlFapiaoApplicationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/ReverseNewTaxControlFapiaoApplicationRequest.cs new file mode 100644 index 00000000..d6e98dab --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/ReverseNewTaxControlFapiaoApplicationRequest.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/reverse 接口的请求。 + /// + public class ReverseNewTaxControlFapiaoApplicationRequest : WechatTenpayRequest + { + public static class Types + { + public class Fapiao + { + /// + /// 获取或设置商户发票单号。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_id")] + public string FapiaoId { get; set; } = string.Empty; + + /// + /// 获取或设置发票号码。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_number")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_number")] + public string FapiaoNumber { get; set; } = string.Empty; + + /// + /// 获取或设置发票代码。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_code")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_code")] + public string FapiaoCode { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置发票申请单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoApplyId { get; set; } = string.Empty; + + /// + /// 获取或设置冲红原因。 + /// + [Newtonsoft.Json.JsonProperty("reverse_reason")] + [System.Text.Json.Serialization.JsonPropertyName("reverse_reason")] + public string ReverseReason { get; set; } = string.Empty; + + /// + /// 获取或设置电子发票信息列表。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_information")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_information")] + public IList FapiaoList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/ReverseNewTaxControlFapiaoApplicationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/ReverseNewTaxControlFapiaoApplicationResponse.cs new file mode 100644 index 00000000..616a5187 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/ReverseNewTaxControlFapiaoApplicationResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/reverse 接口的响应。 + /// + public class ReverseNewTaxControlFapiaoApplicationResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.cs new file mode 100644 index 00000000..e3344617 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.cs @@ -0,0 +1,39 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/upload-fapiao-file 接口的请求。 + /// + public class UploadNewTaxControlFapiaoApplicationFapiaoFileRequest : WechatTenpayRequest + { + /// + /// 获取或设置文件字节数组。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] FileBytes { get; set; } = Array.Empty(); + + /// + /// 获取或设置文件类型。 + /// 默认值:PDF + /// + [Newtonsoft.Json.JsonProperty("file_type")] + [System.Text.Json.Serialization.JsonPropertyName("file_type")] + public string FileType { get; set; } = "PDF"; + + /// + /// 获取或设置文件内容哈希算法。 + /// + [Newtonsoft.Json.JsonProperty("digest_alogrithm")] + [System.Text.Json.Serialization.JsonPropertyName("digest_alogrithm")] + public string FileHashAlgorithm { get; set; } = string.Empty; + + /// + /// 获取或设置文件内容哈希值。 + /// + [Newtonsoft.Json.JsonProperty("digest")] + [System.Text.Json.Serialization.JsonPropertyName("digest")] + public string FileHashValue { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileResponse.cs new file mode 100644 index 00000000..e35069f5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileResponse.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /new-tax-control-fapiao/fapiao-applications/upload-fapiao-file 接口的响应。 + /// + public class UploadNewTaxControlFapiaoApplicationFapiaoFileResponse : WechatTenpayResponse + { + /// + /// 获取或设置发票文件 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("fapiao_media_id")] + [System.Text.Json.Serialization.JsonPropertyName("fapiao_media_id")] + public string FapiaoMediaId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantBaseInformationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantBaseInformationRequest.cs new file mode 100644 index 00000000..dd62ce9c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantBaseInformationRequest.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/merchant/base-information 接口的请求。 + /// + public class GetNewTaxControlFapiaoMerchantBaseInformationRequest : WechatTenpayRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantBaseInformationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantBaseInformationResponse.cs new file mode 100644 index 00000000..548e8fa0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantBaseInformationResponse.cs @@ -0,0 +1,94 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/merchant/base-information 接口的响应。 + /// + public class GetNewTaxControlFapiaoMerchantBaseInformationResponse : WechatTenpayResponse + { + public static class Types + { + public class Seller + { + /// + /// 获取或设置销售方名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置纳税人识别号。 + /// + [Newtonsoft.Json.JsonProperty("taxpayer_id")] + [System.Text.Json.Serialization.JsonPropertyName("taxpayer_id")] + public string TaxpayerId { get; set; } = default!; + + /// + /// 获取或设置地址。 + /// + [Newtonsoft.Json.JsonProperty("address")] + [System.Text.Json.Serialization.JsonPropertyName("address")] + public string? Address { get; set; } + + /// + /// 获取或设置电话。 + /// + [Newtonsoft.Json.JsonProperty("telephone")] + [System.Text.Json.Serialization.JsonPropertyName("telephone")] + public string? PhoneNumber { get; set; } + + /// + /// 获取或设置开户银行。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string? BankName { get; set; } + + /// + /// 获取或设置银行账号。 + /// + [Newtonsoft.Json.JsonProperty("bank_account")] + [System.Text.Json.Serialization.JsonPropertyName("bank_account")] + public string? BankAccountNumber { get; set; } + } + + public class Extra + { + /// + /// 获取或设置收款人。 + /// + [Newtonsoft.Json.JsonProperty("payee")] + [System.Text.Json.Serialization.JsonPropertyName("payee")] + public string? Payee { get; set; } + + /// + /// 获取或设置复核人。 + /// + [Newtonsoft.Json.JsonProperty("reviewer")] + [System.Text.Json.Serialization.JsonPropertyName("reviewer")] + public string? Reviewer { get; set; } + + /// + /// 获取或设置开票人。 + /// + [Newtonsoft.Json.JsonProperty("drawer")] + [System.Text.Json.Serialization.JsonPropertyName("drawer")] + public string Drawer { get; set; } = default!; + } + } + + /// + /// 获取或设置销售方信息。 + /// + [Newtonsoft.Json.JsonProperty("seller_information")] + [System.Text.Json.Serialization.JsonPropertyName("seller_information")] + public Types.Seller Seller { get; set; } = default!; + + /// + /// 获取或设置额外信息。 + /// + [Newtonsoft.Json.JsonProperty("extra_information")] + [System.Text.Json.Serialization.JsonPropertyName("extra_information")] + public Types.Extra Extra { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs new file mode 100644 index 00000000..2e06156d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/merchant/development-config 接口的请求。 + /// + public class GetNewTaxControlFapiaoMerchantDevelopmentConfigRequest : WechatTenpayRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs new file mode 100644 index 00000000..b2c44c2a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/merchant/development-config 接口的响应。 + /// + public class GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse : WechatTenpayResponse + { + /// + /// 获取或设置回调地址。 + /// + [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/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs new file mode 100644 index 00000000..a9476694 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /new-tax-control-fapiao/merchant/development-config 接口的请求。 + /// + public class ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest : WechatTenpayRequest + { + /// + /// 获取或设置回调地址。 + /// + [Newtonsoft.Json.JsonProperty("callback_url")] + [System.Text.Json.Serialization.JsonPropertyName("callback_url")] + public string CallbackUrl { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs new file mode 100644 index 00000000..1a84b32f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /new-tax-control-fapiao/merchant/development-config 接口的响应。 + /// + public class ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse : WechatTenpayResponse + { + /// + /// 获取或设置回调地址。 + /// + [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/Merchant/QueryNewTaxControlFapiaoMerchantTaxCodesRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/QueryNewTaxControlFapiaoMerchantTaxCodesRequest.cs new file mode 100644 index 00000000..0beec987 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/QueryNewTaxControlFapiaoMerchantTaxCodesRequest.cs @@ -0,0 +1,23 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/merchant/tax-codes 接口的请求。 + /// + public class QueryNewTaxControlFapiaoMerchantTaxCodesRequest : WechatTenpayRequest + { + /// + /// 获取或设置分页起始位置。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Offset { get; set; } + + /// + /// 获取或设置分页每页数量。 + /// 默认值:10 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Limit { get; set; } = 10; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/QueryNewTaxControlFapiaoMerchantTaxCodesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/QueryNewTaxControlFapiaoMerchantTaxCodesResponse.cs new file mode 100644 index 00000000..d877cae7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/Merchant/QueryNewTaxControlFapiaoMerchantTaxCodesResponse.cs @@ -0,0 +1,70 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/merchant/tax-codes 接口的响应。 + /// + public class QueryNewTaxControlFapiaoMerchantTaxCodesResponse : WechatTenpayResponse + { + public static class Types + { + public class Tax + { + /// + /// 获取或设置货物或应税劳务或服务编码。 + /// + [Newtonsoft.Json.JsonProperty("tax_code")] + [System.Text.Json.Serialization.JsonPropertyName("tax_code")] + public string TaxCode { get; set; } = default!; + + /// + /// 获取或设置货物或应税劳务或服务名称。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string GoodsName { get; set; } = default!; + + /// + /// 获取或设置税率(单位:万分数)。 + /// + [Newtonsoft.Json.JsonProperty("tax_rate")] + [System.Text.Json.Serialization.JsonPropertyName("tax_rate")] + public int TaxRate { get; set; } + + /// + /// 获取或设置税收优惠政策标识。 + /// + [Newtonsoft.Json.JsonProperty("tax_prefer_mark")] + [System.Text.Json.Serialization.JsonPropertyName("tax_prefer_mark")] + public string TaxPreferMark { get; set; } = default!; + } + } + + /// + /// 获取或设置商品和服务税收分类对照信息列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Tax[] TaxList { get; set; } = default!; + + /// + /// 获取或设置分页起始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { get; set; } + + /// + /// 获取或设置分页每页数量。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置总数量。 + /// + [Newtonsoft.Json.JsonProperty("total_count")] + [System.Text.Json.Serialization.JsonPropertyName("total_count")] + public int TotalCount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleRequest.cs new file mode 100644 index 00000000..601a78f2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/user-title 接口的请求。 + /// + public class GetNewTaxControlFapiaoUserTitleRequest : WechatTenpayRequest + { + /// + /// 获取或设置发票申请单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoApplyId { get; set; } = string.Empty; + + /// + /// 获取或设置开票场景。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string Scene { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.cs new file mode 100644 index 00000000..d7c74a03 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.cs @@ -0,0 +1,76 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/user-title 接口的响应。 + /// + [WechatTenpaySensitive] + public class GetNewTaxControlFapiaoUserTitleResponse : WechatTenpayResponse + { + /// + /// 获取或设置购买方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置购买方名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置纳税人识别号。 + /// + [Newtonsoft.Json.JsonProperty("taxpayer_id")] + [System.Text.Json.Serialization.JsonPropertyName("taxpayer_id")] + public string? TaxpayerId { get; set; } + + /// + /// 获取或设置地址。 + /// + [Newtonsoft.Json.JsonProperty("address")] + [System.Text.Json.Serialization.JsonPropertyName("address")] + public string? Address { get; set; } + + /// + /// 获取或设置电话。 + /// + [Newtonsoft.Json.JsonProperty("telephone")] + [System.Text.Json.Serialization.JsonPropertyName("telephone")] + public string? PhoneNumber { get; set; } + + /// + /// 获取或设置开户银行。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string? BankName { get; set; } + + /// + /// 获取或设置银行账号。 + /// + [Newtonsoft.Json.JsonProperty("bank_account")] + [System.Text.Json.Serialization.JsonPropertyName("bank_account")] + public string? BankAccountNumber { get; set; } + + /// + /// 获取或设置用户手机号码。 + /// + [Newtonsoft.Json.JsonProperty("phone")] + [System.Text.Json.Serialization.JsonPropertyName("phone")] + [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? UserMobileNumber { get; set; } + + /// + /// 获取或设置用户邮箱地址。 + /// + [Newtonsoft.Json.JsonProperty("email")] + [System.Text.Json.Serialization.JsonPropertyName("email")] + [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; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlRequest.cs new file mode 100644 index 00000000..5de1df92 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlRequest.cs @@ -0,0 +1,78 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/user-title/title-url 接口的请求。 + /// + public class GetNewTaxControlFapiaoUserTitleUrlRequest : WechatTenpayRequest + { + /// + /// 获取或设置发票申请单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string FapiaoApplyId { get; set; } = string.Empty; + + /// + /// 获取或设置开票来源。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string Source { get; set; } = string.Empty; + + /// + /// 获取或设置总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int TotalAmount { get; set; } + + /// + /// 获取或设置开票来源微信 AppId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置销售方名称。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? SellerName { get; set; } + + /// + /// 获取或设置是否需要展示手机号填写栏。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public bool? RequireShowMobileCell { get; set; } + + /// + /// 获取或设置是否必须填写手机号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public bool? RequireMustInputMobile { get; set; } + + /// + /// 获取或设置是否需要展示邮箱地址填写栏。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public bool? RequireShowEmailCell { get; set; } + + /// + /// 获取或设置是否必须填写邮箱地址。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public bool? RequireMustInputEmail { 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 new file mode 100644 index 00000000..1b1bd078 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlResponse.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /new-tax-control-fapiao/user-title/title-url 接口的响应。 + /// + public class GetNewTaxControlFapiaoUserTitleUrlResponse : WechatTenpayResponse + { + /// + /// 获取或设置小程序 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!; + + /// + /// 获取或设置小程序用户名。 + /// + [Newtonsoft.Json.JsonProperty("miniprogram_user_name")] + [System.Text.Json.Serialization.JsonPropertyName("miniprogram_user_name")] + public string? MiniProgramUsername { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/TaxiInvoice/Card/CreateTaxiInvoiceCardRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/TaxiInvoice/Card/CreateTaxiInvoiceCardRequest.cs index 3e73338e..9f9c0461 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/TaxiInvoice/Card/CreateTaxiInvoiceCardRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/TaxiInvoice/Card/CreateTaxiInvoiceCardRequest.cs @@ -35,7 +35,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("taxpayer_id")] [System.Text.Json.Serialization.JsonPropertyName("taxpayer_id")] - public string? TaxPayerId { get; set; } + public string? TaxpayerId { get; set; } /// /// 获取或设置地址。 @@ -80,7 +80,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("taxpayer_id")] [System.Text.Json.Serialization.JsonPropertyName("taxpayer_id")] - public string TaxPayerId { get; set; } = string.Empty; + public string TaxpayerId { get; set; } = string.Empty; /// /// 获取或设置地址。 @@ -135,7 +135,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models public string Drawer { get; set; } = string.Empty; } - public class LineItem + public class Item { /// /// 获取或设置货物或应税劳务或服务编码。 @@ -315,7 +315,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("items")] [System.Text.Json.Serialization.JsonPropertyName("items")] - public IList? LineItemList { get; set; } + public IList? ItemList { get; set; } /// /// 获取或设置备注信息。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayResponse.cs index 9e589ad2..9b3cb6cb 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayResponse.cs @@ -120,12 +120,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 public virtual Dictionary? ErrorDetail { get; set; } /// - /// 获取一个值,该值指示调用微信 API 是否成功(即 HTTP 状态码为 200 或 204、且 code 值为空)。 + /// 获取一个值,该值指示调用微信 API 是否成功(即 HTTP 状态码为 200/202/204、且 code 值为空)。 /// /// public virtual bool IsSuccessful() { - return (RawStatus == 200 || RawStatus == 204) && string.IsNullOrEmpty(ErrorCode); + return (RawStatus >= 200 && RawStatus <= 204) && string.IsNullOrEmpty(ErrorCode); } } } diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/EventSamples/NewTaxControlFapiao/FapiaoResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/EventSamples/NewTaxControlFapiao/FapiaoResource.json new file mode 100644 index 00000000..841d5abe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/EventSamples/NewTaxControlFapiao/FapiaoResource.json @@ -0,0 +1,12 @@ +{ + "mchid": "1900000109", + "fapiao_apply_id": "4200000444201910177461284488", + "apply_time": "2020-07-01T12:00:00+08:00", + "fapiao_information": [ + { + "fapiao_id": "20200701123456", + "fapiao_status": "ISSUED", + "card_status": "INSERTED" + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateRequest.json new file mode 100644 index 00000000..4dc2cd18 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateRequest.json @@ -0,0 +1,14 @@ +{ + "card_appid": "wxb1170446a4c0a5a2", + "card_template_information": { + "payee_name": "某公司", + "logo_url": "http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZJkmG8xXhiaHqkKSVMMWeN3hLut7X7hicFNjakmxibMLGWpXrEXB33367o7zHN0CwngnQY7zb7g/0", + "custom_cell": { + "words": "电子发票", + "description": "查看发票", + "jump_url": "http://www.qq.com", + "miniprogram_user_name": "gh_86a091e50ad4@app", + "miniprogram_path": "pages/xxxPage" + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateResponse.json new file mode 100644 index 00000000..11f2ef10 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/CardTemplate/CreateNewTaxControlFapiaoCardTemplateResponse.json @@ -0,0 +1,4 @@ +{ + "card_appid": "wxb1170446a4c0a5a2", + "card_id": "p4gLgvn_cxVCQez17kaBJnZHPcXs" +} 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 new file mode 100644 index 00000000..b20a6de4 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationCardRequest.json @@ -0,0 +1,57 @@ +{ + "scene": "WITH_WECHATPAY", + "buyer_information": { + "type": "ORGANIZATION", + "name": "深圳市南山区测试企业", + "taxpayer_id": "202003261233701778", + "address": "深圳市南山区深南大道10000号", + "telephone": "075512345678", + "bank_name": "测试银行", + "bank_account": "62001234567890", + "phone": "18507550000", + "email": "123110@qq.com" + }, + "fapiao_card_information": [ + { + "fapiao_media_id": "ASNFZ4mrze/+3LqYdlQyEA==", + "fapiao_number": "12897794", + "fapiao_code": "044001911211", + "fapiao_time": "2020-07-01T12:00:00+08:00", + "check_code": "69001808340631374774", + "password": "006>299-375/326>2+7/*0-+<351059<80<4*/5>+<11631+*3030/5*37+/-243159658+013>3409*044>4-/1+/9->*>69501*6++1997--21", + "total_amount": 382895, + "tax_amount": 44050, + "amount": 338845, + "seller_information": { + "name": "深圳市南山区测试公司", + "taxpayer_id": "202003261233701778", + "address": "深圳市南山区深南大道10000号", + "telephone": "075512345678", + "bank_name": "测试银行", + "bank_account": "62001234567890" + }, + "extra_information": { + "payee": "张三", + "reviewer": "李四", + "drawer": "王五" + }, + "items": [ + { + "tax_code": "3010101020203000000", + "goods_name": "出租汽车客运服务", + "specification": "A4", + "unit": "次", + "quantity": 100000000, + "unit_price": 380442000000, + "amount": 380442, + "tax_amount": 49458, + "total_amount": 429900, + "tax_rate": 1300, + "tax_prefer_mark": "NO_FAVORABLE", + "discount": false + } + ], + "remark": "备注" + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRequest.json new file mode 100644 index 00000000..682aad0a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/CreateNewTaxControlFapiaoApplicationRequest.json @@ -0,0 +1,37 @@ +{ + "scene": "WITH_WECHATPAY", + "fapiao_apply_id": "4200000444201910177461284488", + "buyer_information": { + "type": "ORGANIZATION", + "name": "深圳市南山区测试企业", + "taxpayer_id": "202003261233701778", + "address": "深圳市南山区深南大道10000号", + "telephone": "075512345678", + "bank_name": "测试银行", + "bank_account": "62001234567890", + "phone": "18507550000", + "email": "123110@qq.com" + }, + "fapiao_information": [ + { + "fapiao_id": "20200701123456", + "total_amount": 382895, + "need_list": false, + "remark": "备注", + "items": [ + { + "tax_code": "3010101020203000000", + "goods_category": "运输服务", + "goods_name": "出租汽车客运服务", + "specification": "A4", + "unit": "次", + "quantity": 100000000, + "total_amount": 429900, + "tax_rate": 1300, + "tax_prefer_mark": "NO_FAVORABLE", + "discount": false + } + ] + } + ] +} 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 new file mode 100644 index 00000000..872024fe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.json @@ -0,0 +1,74 @@ +{ + "total_count": 5, + "fapiao_information": [ + { + "fapiao_id": "20200701123456", + "status": "ISSUED", + "blue_fapiao": { + "fapiao_code": "044001911211", + "fapiao_number": "12897794", + "check_code": "69001808340631374774", + "password": "006>299-375/326>2+7/*0-+<351059<80<4*/5>+<11631+*3030/5*37+/-243159658+013>3409*044>4-/1+/9->*>69501*6+21997--21", + "fapiao_time": "2020-07-01T12:00:00+08:00" + }, + "red_fapiao": { + "fapiao_code": "044001911211", + "fapiao_number": "12897794", + "check_code": "69001808340631374774", + "password": "006>299-375/326>2+7/*0-+<351059<80<4*/5>+<11631+*3030/5*37+/-243159658+013>3409*044>4-/1+/9->*>69501*6+21997--21", + "fapiao_time": "2020-07-01T12:00:00+08:00" + }, + "card_information": { + "card_appid": "wxab8acb865bb1637e", + "card_openid": "plN5twRbHym_j-QcqCzstl0HmwEs", + "card_id": "p4gLgvlAYSEOpeXGFVJRFxgop6iY", + "card_code": "379550244162", + "card_status": "INSERT_ACCEPTED" + }, + "total_amount": 382895, + "tax_amount": 44050, + "amount": 338845, + "seller_information": { + "name": "深圳市南山区测试公司", + "taxpayer_id": "202003261233701778", + "address": "深圳市南山区深南大道10000号", + "telephone": "075512345678", + "bank_name": "测试银行", + "bank_account": "62001234567890" + }, + "buyer_information": { + "type": "ORGANIZATION", + "name": "深圳市南山区测试企业", + "taxpayer_id": "202003261233701778", + "address": "深圳市南山区深南大道10000号", + "telephone": "075512345678", + "bank_name": "测试银行", + "bank_account": "62001234567890", + "phone": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6zB", + "email": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6za" + }, + "extra_information": { + "payee": "张三", + "reviewer": "李四", + "drawer": "王五" + }, + "items": [ + { + "tax_code": "3010101020203000000", + "goods_name": "出租汽车客运服务", + "specification": "A4", + "unit": "次", + "quantity": 100000000, + "unit_price": 380442000000, + "amount": 380442, + "tax_amount": 49458, + "total_amount": 429900, + "tax_rate": 1300, + "tax_prefer_mark": "NO_FAVORABLE", + "discount": false + } + ], + "remark": "备注" + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationFilesResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationFilesResponse.json new file mode 100644 index 00000000..9c8fd37b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoApplicationFilesResponse.json @@ -0,0 +1,9 @@ +{ + "fapiao_download_info_list": [ + { + "download_url": "https://pay.wechatpay.cn/invoicing/fapiao/fapiao-file", + "fapiao_id": "20200701123456", + "status": "ISSUED" + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoMerchantBaseInformationResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoMerchantBaseInformationResponse.json new file mode 100644 index 00000000..ddc02b75 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/GetNewTaxControlFapiaoMerchantBaseInformationResponse.json @@ -0,0 +1,15 @@ +{ + "seller_information": { + "name": "深圳市南山区测试公司", + "taxpayer_id": "202003261233701778", + "address": "深圳市南山区深南大道10000号", + "telephone": "075512345678", + "bank_name": "测试银行", + "bank_account": "62001234567890" + }, + "extra_information": { + "payee": "张三", + "reviewer": "李四", + "drawer": "王五" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/ReverseNewTaxControlFapiaoApplicationRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/ReverseNewTaxControlFapiaoApplicationRequest.json new file mode 100644 index 00000000..78d61264 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/ReverseNewTaxControlFapiaoApplicationRequest.json @@ -0,0 +1,10 @@ +{ + "reverse_reason": "退款", + "fapiao_information": [ + { + "fapiao_id": "20200701123456", + "fapiao_code": "044001911211", + "fapiao_number": "12897794" + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.json new file mode 100644 index 00000000..6d42dca6 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileRequest.json @@ -0,0 +1,5 @@ +{ + "digest": "addca90a6a290b9642dbaccffdf01e8c22aa348940b2e96754169ba08c19e5db", + "digest_alogrithm": "SM3", + "file_type": "PDF" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileResponse.json new file mode 100644 index 00000000..3b315699 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/FapiaoApplications/UploadNewTaxControlFapiaoApplicationFapiaoFileResponse.json @@ -0,0 +1,3 @@ +{ + "fapiao_media_id": "ASNFZ4mrze/+3LqYdlQyEA==" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.json new file mode 100644 index 00000000..26e9fa12 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/Merchant/GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse.json @@ -0,0 +1,3 @@ +{ + "callback_url": "https://pay.weixin.qq.com/callback" +} 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 new file mode 100644 index 00000000..26e9fa12 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigRequest.json @@ -0,0 +1,3 @@ +{ + "callback_url": "https://pay.weixin.qq.com/callback" +} 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 new file mode 100644 index 00000000..26e9fa12 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/Merchant/ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse.json @@ -0,0 +1,3 @@ +{ + "callback_url": "https://pay.weixin.qq.com/callback" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/Merchant/QueryNewTaxControlFapiaoMerchantTaxCodesResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/Merchant/QueryNewTaxControlFapiaoMerchantTaxCodesResponse.json new file mode 100644 index 00000000..49f71d35 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/Merchant/QueryNewTaxControlFapiaoMerchantTaxCodesResponse.json @@ -0,0 +1,13 @@ +{ + "offset": "0", + "limit": 5, + "data": [ + { + "tax_code": "3010101020203000000", + "goods_name": "出租汽车客运服务", + "tax_rate": 1300, + "tax_prefer_mark": "NO_FAVORABLE" + } + ], + "total_count": 20 +} 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 new file mode 100644 index 00000000..4651491a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleResponse.json @@ -0,0 +1,11 @@ +{ + "type": "ORGANIZATION", + "name": "深圳市南山区测试企业", + "taxpayer_id": "202003261233701778", + "address": "深圳市南山区深南大道10000号", + "telephone": "075512345678", + "bank_name": "测试银行", + "bank_account": "62001234567890", + "phone": "18507550000", + "email": "123110@qq.com" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlResponse.json new file mode 100644 index 00000000..2da400f6 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/NewTaxControlFapiao/UserTitle/GetNewTaxControlFapiaoUserTitleUrlResponse.json @@ -0,0 +1,5 @@ +{ + "miniprogram_appid": "wxb1170446a4c0a5a2", + "miniprogram_path": "pages/xxxPage", + "miniprogram_user_name": "gh_86a091e50ad4@app" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs index 782fd7cf..cbea80a2 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs @@ -647,6 +647,88 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests AssertMockRequestModel(reqB2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /new-tax-control-fapiao/fapiao-applications)")] + public async Task TestEncryptRequestSensitiveProperty_CreateNewTaxControlFapiaoApplicationRequest() + { + static Models.CreateNewTaxControlFapiaoApplicationRequest GenerateMockRequestModel() + { + return new Models.CreateNewTaxControlFapiaoApplicationRequest() + { + Buyer = new Models.CreateNewTaxControlFapiaoApplicationRequest.Types.Buyer() + { + UserMobileNumber = MOCK_PLAIN_STR, + UserEmail = MOCK_PLAIN_STR + } + }; + } + + static void AssertMockRequestModel(Models.CreateNewTaxControlFapiaoApplicationRequest request, Func decryptor) + { + Assert.NotEqual(MOCK_PLAIN_STR, request.Buyer!.UserMobileNumber!); + Assert.NotEqual(MOCK_PLAIN_STR, request.Buyer!.UserEmail!); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Buyer!.UserMobileNumber!)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Buyer!.UserEmail!)); + Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true); + } + + var reqA1 = GenerateMockRequestModel(); + CreateMockClientUseRSA(autoEncrypt: false).EncryptRequestSensitiveProperty(reqA1); + AssertMockRequestModel(reqA1, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, cipher)); + + var reqA2 = GenerateMockRequestModel(); + CreateMockClientUseSM2(autoEncrypt: false).EncryptRequestSensitiveProperty(reqA2); + AssertMockRequestModel(reqA2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); + + var reqB1 = GenerateMockRequestModel(); + await CreateMockClientUseRSA(autoEncrypt: true).ExecuteCreateNewTaxControlFapiaoApplicationAsync(reqB1); + AssertMockRequestModel(reqB1, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, cipher)); + + var reqB2 = GenerateMockRequestModel(); + await CreateMockClientUseSM2(autoEncrypt: true).ExecuteCreateNewTaxControlFapiaoApplicationAsync(reqB2); + AssertMockRequestModel(reqB2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); + } + + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/insert-cards)")] + public async Task TestEncryptRequestSensitiveProperty_CreateNewTaxControlFapiaoApplicationCardRequest() + { + static Models.CreateNewTaxControlFapiaoApplicationCardRequest GenerateMockRequestModel() + { + return new Models.CreateNewTaxControlFapiaoApplicationCardRequest() + { + Buyer = new Models.CreateNewTaxControlFapiaoApplicationCardRequest.Types.Buyer() + { + UserMobileNumber = MOCK_PLAIN_STR, + UserEmail = MOCK_PLAIN_STR + } + }; + } + + static void AssertMockRequestModel(Models.CreateNewTaxControlFapiaoApplicationCardRequest request, Func decryptor) + { + Assert.NotEqual(MOCK_PLAIN_STR, request.Buyer!.UserMobileNumber!); + Assert.NotEqual(MOCK_PLAIN_STR, request.Buyer!.UserEmail!); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Buyer!.UserMobileNumber!)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Buyer!.UserEmail!)); + Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true); + } + + var reqA1 = GenerateMockRequestModel(); + CreateMockClientUseRSA(autoEncrypt: false).EncryptRequestSensitiveProperty(reqA1); + AssertMockRequestModel(reqA1, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, cipher)); + + var reqA2 = GenerateMockRequestModel(); + CreateMockClientUseSM2(autoEncrypt: false).EncryptRequestSensitiveProperty(reqA2); + AssertMockRequestModel(reqA2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); + + var reqB1 = GenerateMockRequestModel(); + await CreateMockClientUseRSA(autoEncrypt: true).ExecuteCreateNewTaxControlFapiaoApplicationCardAsync(reqB1); + AssertMockRequestModel(reqB1, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, cipher)); + + var reqB2 = GenerateMockRequestModel(); + await CreateMockClientUseSM2(autoEncrypt: true).ExecuteCreateNewTaxControlFapiaoApplicationCardAsync(reqB2); + AssertMockRequestModel(reqB2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); + } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /payroll-card/authentications/pre-order-with-auth)")] public async Task TestEncryptRequestSensitiveProperty_PreOrderWithAuthPayrollCardAuthenticationRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs index a71648c0..edf46e22 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs @@ -380,6 +380,103 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests AssertMockResponseModel(resB2); } + [Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id})")] + public async Task TestDecryptResponseSensitiveProperty_GetNewTaxControlFapiaoApplicationByFapiaoApplyId() + { + static Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse GenerateMockResponseModel(Func encryptor) + { + return new Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse() + { + RawStatus = (int)HttpStatusCode.OK, + FapiaoList = new Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.Types.Fapiao[] + { + new Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.Types.Fapiao() + { + Buyer = new Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse.Types.Fapiao.Types.Buyer() + { + UserMobileNumber = encryptor.Invoke(MOCK_PLAIN_STR), + UserEmail = encryptor.Invoke(MOCK_PLAIN_STR) + } + } + } + }; + } + + static void AssertMockResponseModel(Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse response) + { + Assert.Equal(MOCK_PLAIN_STR, response.FapiaoList[0]!.Buyer!.UserMobileNumber!); + Assert.Equal(MOCK_PLAIN_STR, response.FapiaoList[0]!.Buyer!.UserEmail!); + } + + var resA1 = GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)); + CreateMockClientUseRSA(autoDecrypt: false).DecryptResponseSensitiveProperty(resA1); + AssertMockResponseModel(resA1); + + var resA2 = GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)); + CreateMockClientUseSM2(autoDecrypt: false).DecryptResponseSensitiveProperty(resA2); + AssertMockResponseModel(resA2); + + var resB1 = await CreateMockClientUseRSA( + autoDecrypt: true, + mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) + ) + ).ExecuteGetNewTaxControlFapiaoApplicationByFapiaoApplyIdAsync(new Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest()); + AssertMockResponseModel(resB1); + + var resB2 = await CreateMockClientUseSM2( + autoDecrypt: true, + mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) + ) + ).ExecuteGetNewTaxControlFapiaoApplicationByFapiaoApplyIdAsync(new Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest()); + AssertMockResponseModel(resB2); + } + + [Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /new-tax-control-fapiao/user-title)")] + public async Task TestDecryptResponseSensitiveProperty_GetNewTaxControlFapiaoUserTitle() + { + static Models.GetNewTaxControlFapiaoUserTitleResponse GenerateMockResponseModel(Func encryptor) + { + return new Models.GetNewTaxControlFapiaoUserTitleResponse() + { + RawStatus = (int)HttpStatusCode.OK, + UserMobileNumber = encryptor.Invoke(MOCK_PLAIN_STR), + UserEmail = encryptor.Invoke(MOCK_PLAIN_STR) + }; + } + + static void AssertMockResponseModel(Models.GetNewTaxControlFapiaoUserTitleResponse response) + { + Assert.Equal(MOCK_PLAIN_STR, response.UserMobileNumber!); + Assert.Equal(MOCK_PLAIN_STR, response.UserEmail!); + } + + var resA1 = GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)); + CreateMockClientUseRSA(autoDecrypt: false).DecryptResponseSensitiveProperty(resA1); + AssertMockResponseModel(resA1); + + var resA2 = GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)); + CreateMockClientUseSM2(autoDecrypt: false).DecryptResponseSensitiveProperty(resA2); + AssertMockResponseModel(resA2); + + var resB1 = await CreateMockClientUseRSA( + autoDecrypt: true, + mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) + ) + ).ExecuteGetNewTaxControlFapiaoUserTitleAsync(new Models.GetNewTaxControlFapiaoUserTitleRequest()); + AssertMockResponseModel(resB1); + + var resB2 = await CreateMockClientUseSM2( + autoDecrypt: true, + mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) + ) + ).ExecuteGetNewTaxControlFapiaoUserTitleAsync(new Models.GetNewTaxControlFapiaoUserTitleRequest()); + AssertMockResponseModel(resB2); + } + [Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /partner-transfer/batches/batch-id/{batch_id}/details/detail-id/{detail_id})")] public async Task TestDecryptResponseSensitiveProperty_GetPartnerTransferBatchDetailByDetailIdResponse() {