From b7fec2b22c2305e612f868f3e17ab047a592beb5 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 11 Aug 2023 20:24:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(tenpayv3):=20=E6=96=B0=E5=A2=9E=E7=94=B5?= =?UTF-8?q?=E5=AD=90=E5=B0=8F=E7=A5=A8=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ecuteMarketingShoppingReceiptExtensions.cs | 119 +++++++++++++++ ...TenpayClientExecutePayDevicesExtensions.cs | 50 +++++++ ...ingShoppingReceiptCustomEntranceRequest.cs | 97 +++++++++++++ ...ngShoppingReceiptCustomEntranceResponse.cs | 9 ++ ...ngReceiptCustomEntranceByBrandIdRequest.cs | 15 ++ ...gReceiptCustomEntranceByBrandIdResponse.cs | 102 +++++++++++++ ...ingShoppingReceiptCustomEntranceRequest.cs | 84 +++++++++++ ...ngShoppingReceiptCustomEntranceResponse.cs | 9 ++ ...MarketingShoppingReceiptJumpInfoRequest.cs | 74 ++++++++++ ...arketingShoppingReceiptJumpInfoResponse.cs | 92 ++++++++++++ .../UploadMarketingShoppingReceiptRequest.cs | 105 ++++++++++++++ .../UploadMarketingShoppingReceiptResponse.cs | 136 ++++++++++++++++++ ...CreatePayDevicePrinterPrintOrderRequest.cs | 102 +++++++++++++ ...reatePayDevicePrinterPrintOrderResponse.cs | 9 ++ ...nterPrintOrderByPrintOrderNumberRequest.cs | 22 +++ ...terPrintOrderByPrintOrderNumberResponse.cs | 107 ++++++++++++++ ...gShoppingReceiptCustomEntranceRequest.json | 14 ++ ...ShoppingReceiptCustomEntranceResponse.json | 16 +++ ...eceiptCustomEntranceByBrandIdResponse.json | 16 +++ ...gShoppingReceiptCustomEntranceRequest.json | 13 ++ ...ShoppingReceiptCustomEntranceResponse.json | 16 +++ ...rketingShoppingReceiptJumpInfoRequest.json | 11 ++ ...ketingShoppingReceiptJumpInfoResponse.json | 15 ++ ...UploadMarketingShoppingReceiptRequest.json | 11 ++ ...ploadMarketingShoppingReceiptResponse.json | 18 +++ ...eatePayDevicePrinterPrintOrderRequest.json | 21 +++ ...rPrintOrderByPrintOrderNumberResponse.json | 23 +++ .../TestCase_RequestEncryptionTests.cs | 38 +++++ .../TestCase_ResponseDecryptionTests.cs | 124 +++++++++++----- 29 files changed, 1430 insertions(+), 38 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingShoppingReceiptExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayDevicesExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberResponse.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberResponse.json diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingShoppingReceiptExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingShoppingReceiptExtensions.cs new file mode 100644 index 00000000..c2a7b9c9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingShoppingReceiptExtensions.cs @@ -0,0 +1,119 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + public static class WechatTenpayClientExecuteMarketingShoppingReceiptExtensions + { + /// + /// 异步调用 [POST] /marketing/shopping-receipt/shoppingreceipts 接口。 + /// REF: https://pay.weixin.qq.com/docs/partner/apis/shopping-receipt/shopping-receipts/upload-shopping-receipt.html + /// + /// + /// + /// + /// + public static async Task ExecuteUploadMarketingShoppingReceiptAsync(this WechatTenpayClient client, Models.UploadMarketingShoppingReceiptRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (request.FileName == null) + request.FileName = Guid.NewGuid().ToString("N").ToLower() + ".png"; + + if (request.FileHash == null) + request.FileHash = BitConverter.ToString(Utilities.SHA256Utility.Hash(request.FileBytes)).Replace("-", string.Empty).ToLower(); + + if (request.FileContentType == null) + request.FileContentType = Utilities.FileNameToContentTypeMapper.GetContentTypeForImage(request.FileName!) ?? "image/png"; + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "marketing", "shopping-receipt", "shoppingreceipts"); + + using var httpContent = Utilities.FileHttpContentBuilder.Build(fileName: request.FileName, fileBytes: request.FileBytes, fileContentType: request.FileContentType, fileMetaJson: client.JsonSerializer.Serialize(request)); + return await client.SendRequestAsync(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/shopping-receipt/merchantshoppingreceiptjumpinfos 接口。 + /// REF: https://pay.weixin.qq.com/docs/partner/apis/shopping-receipt/merchant-shopping-receipt-jump-infos/create-merchant-shopping-receipt-jump-info.html + /// + /// + /// + /// + /// + public static async Task ExecuteSetMarketingShoppingReceiptJumpInfoAsync(this WechatTenpayClient client, Models.SetMarketingShoppingReceiptJumpInfoRequest 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, "marketing", "shopping-receipt", "merchantshoppingreceiptjumpinfos"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + #region CustomEntrance + /// + /// 异步调用 [POST] /marketing/shopping-receipt/customentrances 接口。 + /// REF: https://pay.weixin.qq.com/docs/partner/apis/shopping-receipt/custom-entrances/create-custom-entrance.html + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMarketingShoppingReceiptCustomEntranceAsync(this WechatTenpayClient client, Models.CreateMarketingShoppingReceiptCustomEntranceRequest 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, "marketing", "shopping-receipt", "customentrances"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/shopping-receipt/customentrances/{brand_id} 接口。 + /// REF: https://pay.weixin.qq.com/docs/partner/apis/shopping-receipt/custom-entrances/query-custom-entrance.html + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingShoppingReceiptCustomEntranceByBrandIdAsync(this WechatTenpayClient client, Models.GetMarketingShoppingReceiptCustomEntranceByBrandIdRequest 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, "marketing", "shopping-receipt", "customentrances", request.BrandId); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [PATCH] /marketing/shopping-receipt/customentrances/{brand_id} 接口。 + /// REF: https://pay.weixin.qq.com/docs/partner/apis/shopping-receipt/custom-entrances/update-custom-entrance.html + /// + /// + /// + /// + /// + public static async Task ExecuteModifyMarketingShoppingReceiptCustomEntranceAsync(this WechatTenpayClient client, Models.ModifyMarketingShoppingReceiptCustomEntranceRequest 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"), "marketing", "shopping-receipt", "customentrances", request.BrandId); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayDevicesExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayDevicesExtensions.cs new file mode 100644 index 00000000..273ed383 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayDevicesExtensions.cs @@ -0,0 +1,50 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + public static class WechatTenpayClientExecutePayDevicesExtensions + { + #region Printers + /// + /// 异步调用 [POST] /pay-devices/printers/{device_id}/print-orders 接口。 + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayDevicePrinterPrintOrderAsync(this WechatTenpayClient client, Models.CreatePayDevicePrinterPrintOrderRequest 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, "pay-devices", "printers", request.DeviceId, "print-orders"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /pay-devices/printers/{device_id}/print-orders/{print_order_no} 接口。 + /// + /// + /// + /// + /// + public static async Task ExecuteGetPayDevicePrinterPrintOrderByPrintOrderNumberAsync(this WechatTenpayClient client, Models.GetPayDevicePrinterPrintOrderByPrintOrderNumberRequest 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, "pay-devices", "printers", request.DeviceId, "print-orders", request.PrintOrderNumber); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceRequest.cs new file mode 100644 index 00000000..793e1903 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceRequest.cs @@ -0,0 +1,97 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/shopping-receipt/customentrances 接口的请求。 + /// + public class CreateMarketingShoppingReceiptCustomEntranceRequest : WechatTenpayRequest + { + public static class Types + { + public class JumpLink + { + /// + /// 获取或设置小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_appid")] + public string MiniProgramAppId { get; set; } = string.Empty; + + /// + /// 获取或设置小程序页面路径。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_path")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_path")] + public string MiniProgramPagePath { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置自定义入口种类。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance_type")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance_type")] + public string CustomEntranceType { get; set; } = string.Empty; + + /// + /// 获取或设置副标题。 + /// + [Newtonsoft.Json.JsonProperty("subtitle")] + [System.Text.Json.Serialization.JsonPropertyName("subtitle")] + public string SubTitle { get; set; } = string.Empty; + + /// + /// 获取或设置商品缩略图 URL。 + /// + [Newtonsoft.Json.JsonProperty("goods_thumbnail_url")] + [System.Text.Json.Serialization.JsonPropertyName("goods_thumbnail_url")] + public string? GoodsThumbnailUrl { get; set; } + + /// + /// 获取或设置入口展示开始时间。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset StartTime { get; set; } + + /// + /// 获取或设置入口展示结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset EndTime { get; set; } + + /// + /// 获取或设置自定义入口状态。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance_state")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance_state")] + public string CustomEntranceState { get; set; } = string.Empty; + + /// + /// 获取或设置品牌 ID。 + /// + [Newtonsoft.Json.JsonProperty("brand_id")] + [System.Text.Json.Serialization.JsonPropertyName("brand_id")] + public string BrandId { get; set; } = string.Empty; + + /// + /// 获取或设置请求业务单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置跳转信息。 + /// + [Newtonsoft.Json.JsonProperty("jump_link")] + [System.Text.Json.Serialization.JsonPropertyName("jump_link")] + public Types.JumpLink JumpLink { get; set; } = new Types.JumpLink(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceResponse.cs new file mode 100644 index 00000000..260d4a43 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/shopping-receipt/customentrances 接口的响应。 + /// + public class CreateMarketingShoppingReceiptCustomEntranceResponse : GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdRequest.cs new file mode 100644 index 00000000..1fc9bd9b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/shopping-receipt/customentrances/{brand_id} 接口的请求。 + /// + public class GetMarketingShoppingReceiptCustomEntranceByBrandIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置品牌 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BrandId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse.cs new file mode 100644 index 00000000..bbfe6463 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse.cs @@ -0,0 +1,102 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/shopping-receipt/customentrances/{brand_id} 接口的响应。 + /// + public class GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse : WechatTenpayResponse + { + public static class Types + { + public class JumpLink : CreateMarketingShoppingReceiptCustomEntranceRequest.Types.JumpLink + { + } + } + + /// + /// 获取或设置自定义入口种类。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance_type")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance_type")] + public string CustomEntranceType { get; set; } = default!; + + /// + /// 获取或设置副标题。 + /// + [Newtonsoft.Json.JsonProperty("subtitle")] + [System.Text.Json.Serialization.JsonPropertyName("subtitle")] + public string SubTitle { get; set; } = default!; + + /// + /// 获取或设置商品缩略图 URL。 + /// + [Newtonsoft.Json.JsonProperty("goods_thumbnail_url")] + [System.Text.Json.Serialization.JsonPropertyName("goods_thumbnail_url")] + public string? GoodsThumbnailUrl { get; set; } + + /// + /// 获取或设置入口展示开始时间。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset StartTime { get; set; } + + /// + /// 获取或设置入口展示结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset EndTime { get; set; } + + /// + /// 获取或设置自定义入口状态。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance_state")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance_state")] + public string CustomEntranceState { get; set; } = default!; + + /// + /// 获取或设置品牌 ID。 + /// + [Newtonsoft.Json.JsonProperty("brand_id")] + [System.Text.Json.Serialization.JsonPropertyName("brand_id")] + public string BrandId { get; set; } = default!; + + /// + /// 获取或设置请求业务单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置跳转信息。 + /// + [Newtonsoft.Json.JsonProperty("jump_link")] + [System.Text.Json.Serialization.JsonPropertyName("jump_link")] + public Types.JumpLink JumpLink { get; set; } = default!; + + /// + /// 获取或设置创建时间。 + /// + [Newtonsoft.Json.JsonProperty("create_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("create_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset CreateTime { get; set; } + + /// + /// 获取或设置修改时间。 + /// + [Newtonsoft.Json.JsonProperty("modify_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("modify_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ModifyTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceRequest.cs new file mode 100644 index 00000000..b0bb8ec4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceRequest.cs @@ -0,0 +1,84 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /marketing/shopping-receipt/customentrances/{brand_id} 接口的请求。 + /// + public class ModifyMarketingShoppingReceiptCustomEntranceRequest : WechatTenpayRequest + { + public static class Types + { + public class JumpLink : CreateMarketingShoppingReceiptCustomEntranceRequest.Types.JumpLink + { + } + } + + /// + /// 获取或设置自定义入口种类。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance_type")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance_type")] + public string? CustomEntranceType { get; set; } + + /// + /// 获取或设置副标题。 + /// + [Newtonsoft.Json.JsonProperty("subtitle")] + [System.Text.Json.Serialization.JsonPropertyName("subtitle")] + public string? SubTitle { get; set; } + + /// + /// 获取或设置商品缩略图 URL。 + /// + [Newtonsoft.Json.JsonProperty("goods_thumbnail_url")] + [System.Text.Json.Serialization.JsonPropertyName("goods_thumbnail_url")] + public string? GoodsThumbnailUrl { get; set; } + + /// + /// 获取或设置入口展示开始时间。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? StartTime { get; set; } + + /// + /// 获取或设置入口展示结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? EndTime { get; set; } + + /// + /// 获取或设置自定义入口状态。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance_state")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance_state")] + public string? CustomEntranceState { get; set; } + + /// + /// 获取或设置品牌 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BrandId { get; set; } = string.Empty; + + /// + /// 获取或设置请求业务单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置跳转信息。 + /// + [Newtonsoft.Json.JsonProperty("jump_link")] + [System.Text.Json.Serialization.JsonPropertyName("jump_link")] + public Types.JumpLink? JumpLink { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceResponse.cs new file mode 100644 index 00000000..3ecbbf46 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /marketing/shopping-receipt/customentrances/{brand_id} 接口的响应。 + /// + public class ModifyMarketingShoppingReceiptCustomEntranceResponse : GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoRequest.cs new file mode 100644 index 00000000..d6c6098e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoRequest.cs @@ -0,0 +1,74 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/shopping-receipt/merchantshoppingreceiptjumpinfos 接口的请求。 + /// + public class SetMarketingShoppingReceiptJumpInfoRequest : WechatTenpayRequest + { + public static class Types + { + public class JumpLink + { + /// + /// 获取或设置小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("merchant_appid")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_appid")] + public string MiniProgramAppId { get; set; } = string.Empty; + + /// + /// 获取或设置小程序页面路径。 + /// + [Newtonsoft.Json.JsonProperty("merchant_path")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_path")] + public string MiniProgramPagePath { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置微信支付商户号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_mchid")] + public string? TransactionMerchantId { get; set; } + + /// + /// 获取或设置微信支付子商户号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_sub_mchid")] + public string? TransactionSubMerchantId { get; set; } + + /// + /// 获取或设置用户 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置上传时间。 + /// + [Newtonsoft.Json.JsonProperty("merchant_upload_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("merchant_upload_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? UploadTime { get; set; } + + /// + /// 获取或设置跳转信息。 + /// + [Newtonsoft.Json.JsonProperty("jump_info")] + [System.Text.Json.Serialization.JsonPropertyName("jump_info")] + public Types.JumpLink JumpLink { get; set; } = new Types.JumpLink(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoResponse.cs new file mode 100644 index 00000000..d6f1cdc1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoResponse.cs @@ -0,0 +1,92 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/shopping-receipt/merchantshoppingreceiptjumpinfos 接口的响应。 + /// + public class SetMarketingShoppingReceiptJumpInfoResponse : WechatTenpayResponse + { + public static class Types + { + public class MerchantJumpInfo + { + public static class Types + { + public class JumpLink : SetMarketingShoppingReceiptJumpInfoRequest.Types.JumpLink + { + } + } + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置微信支付商户号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_mchid")] + public string? TransactionMerchantId { get; set; } + + /// + /// 获取或设置微信支付子商户号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_sub_mchid")] + public string? TransactionSubMerchantId { get; set; } + + /// + /// 获取或设置用户 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置上传时间。 + /// + [Newtonsoft.Json.JsonProperty("merchant_upload_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("merchant_upload_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? UploadTime { get; set; } + + /// + /// 获取或设置跳转信息。 + /// + [Newtonsoft.Json.JsonProperty("jump_info")] + [System.Text.Json.Serialization.JsonPropertyName("jump_info")] + public Types.JumpLink JumpLink { get; set; } = default!; + + /// + /// 获取或设置创建时间。 + /// + [Newtonsoft.Json.JsonProperty("create_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("create_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset CreateTime { get; set; } + + /// + /// 获取或设置修改时间。 + /// + [Newtonsoft.Json.JsonProperty("modify_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("modify_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ModifyTime { get; set; } + } + } + + /// + /// 获取或设置商家电子小票跳转信息。 + /// + [Newtonsoft.Json.JsonProperty("merchant_jump_info")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_jump_info")] + public Types.MerchantJumpInfo MerchantJumpInfo { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptRequest.cs new file mode 100644 index 00000000..52ffc3c5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptRequest.cs @@ -0,0 +1,105 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/shopping-receipt/shoppingreceipts 接口的请求。 + /// + [WechatTenpaySensitive] + public class UploadMarketingShoppingReceiptRequest : WechatTenpayRequest + { + public static class Types + { + public class MerchantContactInformation + { + /// + /// 获取或设置售后咨询电话(需使用平台公钥/证书加密)。 + /// + [Newtonsoft.Json.JsonProperty("consultation_phone_number")] + [System.Text.Json.Serialization.JsonPropertyName("consultation_phone_number")] + [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? ConsultationPhoneNumber { get; set; } + } + } + + /// + /// 获取或设置文件字节数组。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] FileBytes { get; set; } = Array.Empty(); + + /// + /// 获取或设置文件名(必须以 jpg、png 为后缀)。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FileName { get; set; } + + /// + /// 获取或设置文件摘要。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonProperty("sha256")] + [System.Text.Json.Serialization.JsonPropertyName("sha256")] + public string? FileHash { get; set; } + + /// + /// 获取或设置文件 Conent-Type。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FileContentType { get; set; } + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置微信支付商户号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_mchid")] + public string? TransactionMerchantId { get; set; } + + /// + /// 获取或设置微信支付子商户号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_sub_mchid")] + public string? TransactionSubMerchantId { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string? OutTradeNumber { get; set; } + + /// + /// 获取或设置用户 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置与商家的联系渠道信息。 + /// + [Newtonsoft.Json.JsonProperty("merchant_contact_information")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_contact_information")] + public Types.MerchantContactInformation? MerchantContactInformation { get; set; } + + /// + /// 获取或设置上传时间。 + /// + [Newtonsoft.Json.JsonProperty("upload_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("upload_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? UploadTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptResponse.cs new file mode 100644 index 00000000..6a706f6b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptResponse.cs @@ -0,0 +1,136 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/shopping-receipt/shoppingreceipts 接口的响应。 + /// + [WechatTenpaySensitive] + public class UploadMarketingShoppingReceiptResponse : WechatTenpayResponse + { + public static class Types + { + public class Receipt + { + public static class Types + { + public class MerchantContactInformation + { + /// + /// 获取或设置售后咨询电话(需使用商户私钥解密)。 + /// + [Newtonsoft.Json.JsonProperty("consultation_phone_number")] + [System.Text.Json.Serialization.JsonPropertyName("consultation_phone_number")] + [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? ConsultationPhoneNumber { get; set; } + } + } + + /// + /// 获取或设置电子小票 ID。 + /// + [Newtonsoft.Json.JsonProperty("receipt_id")] + [System.Text.Json.Serialization.JsonPropertyName("receipt_id")] + public string ReceiptId { get; set; } = default!; + + /// + /// 获取或设置审核状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置文件图片类型。 + /// + [Newtonsoft.Json.JsonProperty("image_type")] + [System.Text.Json.Serialization.JsonPropertyName("image_type")] + public string FileImageType { get; set; } = default!; + + /// + /// 获取或设置文件摘要。 + /// + [Newtonsoft.Json.JsonProperty("sha256")] + [System.Text.Json.Serialization.JsonPropertyName("sha256")] + public string FileHash { get; set; } = default!; + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置微信支付商户号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_mchid")] + public string? TransactionMerchantId { get; set; } + + /// + /// 获取或设置微信支付子商户号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_sub_mchid")] + public string? TransactionSubMerchantId { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string? OutTradeNumber { get; set; } + + /// + /// 获取或设置用户 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置与商家的联系渠道。 + /// + [Newtonsoft.Json.JsonProperty("merchant_contact_information")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_contact_information")] + public Types.MerchantContactInformation? MerchantContactInformation { get; set; } + + /// + /// 获取或设置上传时间。 + /// + [Newtonsoft.Json.JsonProperty("upload_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("upload_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? UploadTime { get; set; } + + /// + /// 获取或设置创建时间。 + /// + [Newtonsoft.Json.JsonProperty("create_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("create_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset CreateTime { get; set; } + + /// + /// 获取或设置修改时间。 + /// + [Newtonsoft.Json.JsonProperty("modify_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("modify_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ModifyTime { get; set; } + } + } + + /// + /// 获取或设置电子小票信息。 + /// + [Newtonsoft.Json.JsonProperty("receipt")] + [System.Text.Json.Serialization.JsonPropertyName("receipt")] + public Types.Receipt Receipt { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderRequest.cs new file mode 100644 index 00000000..7d210901 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderRequest.cs @@ -0,0 +1,102 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay-devices/printers/{device_id}/print-orders 接口的请求。 + /// + public class CreatePayDevicePrinterPrintOrderRequest : WechatTenpayRequest + { + public static class Types + { + public class Variable + { + /// + /// 获取或设置键。 + /// + [Newtonsoft.Json.JsonProperty("key")] + [System.Text.Json.Serialization.JsonPropertyName("key")] + public string Key { get; set; } = string.Empty; + + /// + /// 获取或设置值。 + /// + [Newtonsoft.Json.JsonProperty("value")] + [System.Text.Json.Serialization.JsonPropertyName("value")] + public string Value { get; set; } = string.Empty; + } + + public class Table + { + public static class Types + { + public class Row + { + /// + /// 获取或设置单元格值列表。 + /// + [Newtonsoft.Json.JsonProperty("cell_list")] + [System.Text.Json.Serialization.JsonPropertyName("cell_list")] + public IList CellList { get; set; } = new List(); + } + } + + /// + /// 获取或设置键。 + /// + [Newtonsoft.Json.JsonProperty("key")] + [System.Text.Json.Serialization.JsonPropertyName("key")] + public string Key { get; set; } = string.Empty; + + /// + /// 获取或设置行列表。 + /// + [Newtonsoft.Json.JsonProperty("row_list")] + [System.Text.Json.Serialization.JsonPropertyName("row_list")] + public IList RowList { get; set; } = new List(); + } + } + + /// + /// 获取或设置小票机设备号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string DeviceId { get; set; } = string.Empty; + + /// + /// 获取或设置打印单号。 + /// + [Newtonsoft.Json.JsonProperty("print_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("print_order_no")] + public string PrintOrderNumber { get; set; } = string.Empty; + + /// + /// 获取或设置模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("template_id")] + [System.Text.Json.Serialization.JsonPropertyName("template_id")] + public string TemplateId { get; set; } = string.Empty; + + /// + /// 获取或设置通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置变量列表。 + /// + [Newtonsoft.Json.JsonProperty("variable_list")] + [System.Text.Json.Serialization.JsonPropertyName("variable_list")] + public IList? VariableList { get; set; } + + /// + /// 获取或设置表格变量列表。 + /// + [Newtonsoft.Json.JsonProperty("table_list")] + [System.Text.Json.Serialization.JsonPropertyName("table_list")] + public IList? TableList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderResponse.cs new file mode 100644 index 00000000..b8205167 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay-devices/printers/{device_id}/print-orders 接口的响应。 + /// + public class CreatePayDevicePrinterPrintOrderResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberRequest.cs new file mode 100644 index 00000000..509690ab --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay-devices/printers/{device_id}/print-orders/{print_order_no} 接口的请求。 + /// + public class GetPayDevicePrinterPrintOrderByPrintOrderNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置小票机设备号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string DeviceId { get; set; } = string.Empty; + + /// + /// 获取或设置打印单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string PrintOrderNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberResponse.cs new file mode 100644 index 00000000..6efac997 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberResponse.cs @@ -0,0 +1,107 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay-devices/printers/{device_id}/print-orders/{print_order_no} 接口的响应。 + /// + public class GetPayDevicePrinterPrintOrderByPrintOrderNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class Variable + { + /// + /// 获取或设置键。 + /// + [Newtonsoft.Json.JsonProperty("key")] + [System.Text.Json.Serialization.JsonPropertyName("key")] + public string Key { get; set; } = default!; + + /// + /// 获取或设置值。 + /// + [Newtonsoft.Json.JsonProperty("value")] + [System.Text.Json.Serialization.JsonPropertyName("value")] + public string Value { get; set; } = default!; + } + + public class Table + { + public static class Types + { + public class Row + { + /// + /// 获取或设置单元格值列表。 + /// + [Newtonsoft.Json.JsonProperty("cell_list")] + [System.Text.Json.Serialization.JsonPropertyName("cell_list")] + public string[] CellList { get; set; } = default!; + } + } + + /// + /// 获取或设置键。 + /// + [Newtonsoft.Json.JsonProperty("key")] + [System.Text.Json.Serialization.JsonPropertyName("key")] + public string Key { get; set; } = default!; + + /// + /// 获取或设置行列表。 + /// + [Newtonsoft.Json.JsonProperty("row_list")] + [System.Text.Json.Serialization.JsonPropertyName("row_list")] + public Types.Row[] RowList { get; set; } = default!; + } + } + + /// + /// 获取或设置打印单号。 + /// + [Newtonsoft.Json.JsonProperty("print_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("print_order_no")] + public string PrintOrderNumber { get; set; } = default!; + + /// + /// 获取或设置模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("template_id")] + [System.Text.Json.Serialization.JsonPropertyName("template_id")] + public string TemplateId { get; set; } = default!; + + /// + /// 获取或设置通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置打印状态。 + /// + [Newtonsoft.Json.JsonProperty("print_state")] + [System.Text.Json.Serialization.JsonPropertyName("print_state")] + public string PrintState { get; set; } = default!; + + /// + /// 获取或设置打印状态描述。 + /// + [Newtonsoft.Json.JsonProperty("print_state_description")] + [System.Text.Json.Serialization.JsonPropertyName("print_state_description")] + public string PrintStateDescription { get; set; } = default!; + + /// + /// 获取或设置变量列表。 + /// + [Newtonsoft.Json.JsonProperty("variable_list")] + [System.Text.Json.Serialization.JsonPropertyName("variable_list")] + public Types.Variable[]? VariableList { get; set; } + + /// + /// 获取或设置表格变量列表。 + /// + [Newtonsoft.Json.JsonProperty("table_list")] + [System.Text.Json.Serialization.JsonPropertyName("table_list")] + public Types.Table[]? TableList { get; set; } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceRequest.json new file mode 100644 index 00000000..53b32fa2 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceRequest.json @@ -0,0 +1,14 @@ +{ + "custom_entrance_type": "MERCHANT_ACTIVITY", + "subtitle": "双十一8折活动", + "goods_thumbnail_url": "https://qpic.cn/xxx", + "start_time": "2015-05-20T13:29:35+08:00", + "end_time": "2015-05-20T13:29:35+08:00", + "custom_entrance_state": "ONLINE", + "brand_id": "1014", + "out_request_no": "6122352020010133287985742", + "jump_link": { + "mini_programs_appid": "wxea9c30a90fs8d3fe", + "mini_programs_path": "/pages/bonus/bonus" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceResponse.json new file mode 100644 index 00000000..e0ea0140 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/CreateMarketingShoppingReceiptCustomEntranceResponse.json @@ -0,0 +1,16 @@ +{ + "custom_entrance_type": "MERCHANT_ACTIVITY", + "subtitle": "双十一8折活动", + "goods_thumbnail_url": "https://qpic.cn/xxx", + "custom_entrance_state": "ONLINE", + "start_time": "2015-05-20T13:29:35+08:00", + "end_time": "2019-12-31T13:29:35.120+08:00", + "brand_id": "1014", + "create_time": "2015-05-20T13:29:35+08:00", + "modify_time": "2015-05-20T13:29:35+08:00", + "out_request_no": "100002322019090134234sfdf", + "jump_link": { + "mini_programs_appid": "wxea9c30a90fs8d3fe", + "mini_programs_path": "/pages/bonus/bonus" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse.json new file mode 100644 index 00000000..e0ea0140 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/GetMarketingShoppingReceiptCustomEntranceByBrandIdResponse.json @@ -0,0 +1,16 @@ +{ + "custom_entrance_type": "MERCHANT_ACTIVITY", + "subtitle": "双十一8折活动", + "goods_thumbnail_url": "https://qpic.cn/xxx", + "custom_entrance_state": "ONLINE", + "start_time": "2015-05-20T13:29:35+08:00", + "end_time": "2019-12-31T13:29:35.120+08:00", + "brand_id": "1014", + "create_time": "2015-05-20T13:29:35+08:00", + "modify_time": "2015-05-20T13:29:35+08:00", + "out_request_no": "100002322019090134234sfdf", + "jump_link": { + "mini_programs_appid": "wxea9c30a90fs8d3fe", + "mini_programs_path": "/pages/bonus/bonus" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceRequest.json new file mode 100644 index 00000000..b53adf34 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceRequest.json @@ -0,0 +1,13 @@ +{ + "custom_entrance_type": "MERCHANT_ACTIVITY", + "subtitle": "双十一8折活动", + "goods_thumbnail_url": "https://qpic.cn/xxx", + "custom_entrance_state": "ONLINE", + "start_time": "2019-12-31T13:29:35.120+08:00", + "end_time": "2019-12-31T13:29:35.120+08:00", + "out_request_no": "100002322019090134234sfdf", + "jump_link": { + "mini_programs_appid": "wxea9c30a90fs8d3fe", + "mini_programs_path": "/pages/bonus/bonus" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceResponse.json new file mode 100644 index 00000000..e0ea0140 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/CustomEntrance/ModifyMarketingShoppingReceiptCustomEntranceResponse.json @@ -0,0 +1,16 @@ +{ + "custom_entrance_type": "MERCHANT_ACTIVITY", + "subtitle": "双十一8折活动", + "goods_thumbnail_url": "https://qpic.cn/xxx", + "custom_entrance_state": "ONLINE", + "start_time": "2015-05-20T13:29:35+08:00", + "end_time": "2019-12-31T13:29:35.120+08:00", + "brand_id": "1014", + "create_time": "2015-05-20T13:29:35+08:00", + "modify_time": "2015-05-20T13:29:35+08:00", + "out_request_no": "100002322019090134234sfdf", + "jump_link": { + "mini_programs_appid": "wxea9c30a90fs8d3fe", + "mini_programs_path": "/pages/bonus/bonus" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoRequest.json new file mode 100644 index 00000000..3e62d1df --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoRequest.json @@ -0,0 +1,11 @@ +{ + "transaction_id": "4200000008202209139188072801", + "transaction_mchid": "1230000109", + "transaction_sub_mchid": "1230000109", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "merchant_upload_time": "2021-05-20T13:29:35.120+08:00", + "jump_info": { + "merchant_appid": "example_merchant_appid", + "merchant_path": "example_merchant_path" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoResponse.json new file mode 100644 index 00000000..9a3878c9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/SetMarketingShoppingReceiptJumpInfoResponse.json @@ -0,0 +1,15 @@ +{ + "merchant_jump_info": { + "transaction_id": "4200000008202209139188072801", + "transaction_mchid": "1230000109", + "transaction_sub_mchid": "1230000109", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "merchant_upload_time": "2021-05-20T13:29:35.120+08:00", + "jump_info": { + "merchant_appid": "example_merchant_appid", + "merchant_path": "example_merchant_path" + }, + "create_time": "2015-05-20T13:29:35+08:00", + "modify_time": "2015-05-20T13:29:35+08:00" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptRequest.json new file mode 100644 index 00000000..1d968c6c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptRequest.json @@ -0,0 +1,11 @@ +{ + "merchant_contact_information": { + "consultation_phone_number": "pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==" + }, + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "sha256": "2969f98ef4763da62670d3aee5d456b56a8f3447c0178da21445206aa400a464", + "transaction_id": "1217752501201407033233368018", + "transaction_mchid": "1230000109", + "transaction_sub_mchid": "1230000109", + "upload_time": "2021-05-20T13:29:35.120+08:00" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptResponse.json new file mode 100644 index 00000000..f04fce54 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/MarketingShoppingReceipt/UploadMarketingShoppingReceiptResponse.json @@ -0,0 +1,18 @@ +{ + "receipt": { + "create_time": "2015-05-20T13:29:35+08:00", + "image_type": "PNG", + "merchant_contact_information": { + "consultation_phone_number": "pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==" + }, + "modify_time": "2015-05-20T13:29:35+08:00", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "receipt_id": "121630001", + "sha256": "2969f98ef4763da62670d3aee5d456b56a8f3447c0178da21445206aa400a464", + "state": "WAIT_REVIEW", + "transaction_id": "1217752501201407033233368018", + "transaction_mchid": "1230000109", + "transaction_sub_mchid": "1230000109", + "upload_time": "2021-05-20T13:29:35.120+08:00" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderRequest.json new file mode 100644 index 00000000..a90ebe78 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/PayDevices/Printers/CreatePayDevicePrinterPrintOrderRequest.json @@ -0,0 +1,21 @@ +{ + "print_order_no": "wx8888888888888888", + "template_id": "pt_02583429616371386640209536", + "notify_url": "https:\/\/payapp.weixin.qq.com\/callback", + "variable_list": [ + { + "key": "", + "value": "" + } + ], + "table_list": [ + { + "key": "", + "row_list": [ + { + "cell_list": [ "string" ] + } + ] + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberResponse.json new file mode 100644 index 00000000..906a6de8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/PayDevices/Printers/GetPayDevicePrinterPrintOrderByPrintOrderNumberResponse.json @@ -0,0 +1,23 @@ +{ + "print_order_no": "wx8888888888888888", + "template_id": "pt_02583429616371386640209536", + "notify_url": "https:\/\/payapp.weixin.qq.com\/callback", + "print_state": "PRINT_STATE_SUCCESS", + "print_state_description": "打印结束", + "variable_list": [ + { + "key": "", + "value": "" + } + ], + "table_list": [ + { + "key": "", + "row_list": [ + { + "cell_list": [ "string" ] + } + ] + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs index afbf1f26..2d89fbf9 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs @@ -600,6 +600,44 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests AssertMockRequestModel(reqB2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /marketing/shopping-receipt/shoppingreceipts)")] + public async Task TestEncryptRequestSensitiveProperty_UploadMarketingShoppingReceiptRequest() + { + static Models.UploadMarketingShoppingReceiptRequest GenerateMockRequestModel() + { + return new Models.UploadMarketingShoppingReceiptRequest() + { + MerchantContactInformation = new Models.UploadMarketingShoppingReceiptRequest.Types.MerchantContactInformation() + { + ConsultationPhoneNumber = MOCK_PLAIN_STR + } + }; + } + + static void AssertMockRequestModel(Models.UploadMarketingShoppingReceiptRequest request, Func decryptor) + { + Assert.NotEqual(MOCK_PLAIN_STR, request.MerchantContactInformation!.ConsultationPhoneNumber!); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.MerchantContactInformation!.ConsultationPhoneNumber!)); + 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).ExecuteUploadMarketingShoppingReceiptAsync(reqB1); + AssertMockRequestModel(reqB1, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, cipher)); + + var reqB2 = GenerateMockRequestModel(); + await CreateMockClientUseSM2(autoEncrypt: true).ExecuteUploadMarketingShoppingReceiptAsync(reqB2); + AssertMockRequestModel(reqB2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); + } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /mch_operate/risk/withdrawl-apply)")] public async Task TestEncryptRequestSensitiveProperty_CreateMerchantOperateRiskWithdrawlApplyRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs index edf46e22..375d8f21 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs @@ -52,7 +52,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetBillSubMerchantFundflowBillAsync(new Models.GetBillSubMerchantFundflowBillRequest()); @@ -60,7 +60,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetBillSubMerchantFundflowBillAsync(new Models.GetBillSubMerchantFundflowBillRequest()); @@ -178,7 +178,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetEcommerceApplymentByOutRequestNumberAsync(new Models.GetEcommerceApplymentByOutRequestNumberRequest()); @@ -186,7 +186,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetEcommerceApplymentByOutRequestNumberAsync(new Models.GetEcommerceApplymentByOutRequestNumberRequest()); @@ -226,7 +226,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetEcommerceBillFundflowBillAsync(new Models.GetEcommerceBillFundflowBillRequest()); @@ -234,13 +234,61 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetEcommerceBillFundflowBillAsync(new Models.GetEcommerceBillFundflowBillRequest()); AssertMockResponseModel(resB2); } + [Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /marketing/shopping-receipt/shoppingreceipts)")] + public async Task TestDecryptResponseSensitiveProperty_UploadMarketingShoppingReceiptResponse() + { + static Models.UploadMarketingShoppingReceiptResponse GenerateMockResponseModel(Func encryptor) + { + return new Models.UploadMarketingShoppingReceiptResponse() + { + RawStatus = (int)HttpStatusCode.OK, + Receipt = new Models.UploadMarketingShoppingReceiptResponse.Types.Receipt() + { + MerchantContactInformation = new Models.UploadMarketingShoppingReceiptResponse.Types.Receipt.Types.MerchantContactInformation() + { + ConsultationPhoneNumber = encryptor.Invoke(MOCK_PLAIN_STR) + } + } + }; + } + + static void AssertMockResponseModel(Models.UploadMarketingShoppingReceiptResponse response) + { + Assert.Equal(MOCK_PLAIN_STR, response.Receipt.MerchantContactInformation!.ConsultationPhoneNumber!); + } + + 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, + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( + GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) + ) + ).ExecuteUploadMarketingShoppingReceiptAsync(new Models.UploadMarketingShoppingReceiptRequest()); + AssertMockResponseModel(resB1); + + var resB2 = await CreateMockClientUseSM2( + autoDecrypt: true, + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( + GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) + ) + ).ExecuteUploadMarketingShoppingReceiptAsync(new Models.UploadMarketingShoppingReceiptRequest()); + AssertMockResponseModel(resB2); + } + [Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /merchants/{sub_mchid})")] public async Task TestDecryptResponseSensitiveProperty_GetHKSubMerchantResponse() { @@ -275,7 +323,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain, "Pkcs1Padding")) ) ).ExecuteGetHKSubMerchantAsync(new Models.GetHKSubMerchantRequest()); @@ -283,7 +331,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetHKSubMerchantAsync(new Models.GetHKSubMerchantRequest()); @@ -323,7 +371,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteQueryMerchantServiceComplaintsAsync(new Models.QueryMerchantServiceComplaintsRequest()); @@ -331,7 +379,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteQueryMerchantServiceComplaintsAsync(new Models.QueryMerchantServiceComplaintsRequest()); @@ -365,7 +413,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetMerchantServiceComplaintByComplaintIdAsync(new Models.GetMerchantServiceComplaintByComplaintIdRequest()); @@ -373,7 +421,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetMerchantServiceComplaintByComplaintIdAsync(new Models.GetMerchantServiceComplaintByComplaintIdRequest()); @@ -418,7 +466,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetNewTaxControlFapiaoApplicationByFapiaoApplyIdAsync(new Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest()); @@ -426,7 +474,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetNewTaxControlFapiaoApplicationByFapiaoApplyIdAsync(new Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest()); @@ -462,7 +510,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetNewTaxControlFapiaoUserTitleAsync(new Models.GetNewTaxControlFapiaoUserTitleRequest()); @@ -470,7 +518,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetNewTaxControlFapiaoUserTitleAsync(new Models.GetNewTaxControlFapiaoUserTitleRequest()); @@ -504,7 +552,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetPartnerTransferBatchDetailByDetailIdAsync(new Models.GetPartnerTransferBatchDetailByDetailIdRequest()); @@ -512,7 +560,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetPartnerTransferBatchDetailByDetailIdAsync(new Models.GetPartnerTransferBatchDetailByDetailIdRequest()); @@ -546,7 +594,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetPartnerTransferBatchDetailByOutDetailNumberAsync(new Models.GetPartnerTransferBatchDetailByOutDetailNumberRequest()); @@ -554,7 +602,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetPartnerTransferBatchDetailByOutDetailNumberAsync(new Models.GetPartnerTransferBatchDetailByOutDetailNumberRequest()); @@ -594,7 +642,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetPayScoreMerchantBillAsync(new Models.GetPayScoreMerchantBillRequest()); @@ -602,7 +650,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetPayScoreMerchantBillAsync(new Models.GetPayScoreMerchantBillRequest()); @@ -644,7 +692,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteQuerySmartGuidesAsync(new Models.QuerySmartGuidesRequest()); @@ -652,7 +700,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteQuerySmartGuidesAsync(new Models.QuerySmartGuidesRequest()); @@ -686,7 +734,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetTransferBatchDetailByOutDetailNumberAsync(new Models.GetTransferBatchDetailByOutDetailNumberRequest()); @@ -694,7 +742,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetTransferBatchDetailByOutDetailNumberAsync(new Models.GetTransferBatchDetailByOutDetailNumberRequest()); @@ -728,7 +776,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB1 = await CreateMockClientUseRSA( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)) ) ).ExecuteGetTransferBatchDetailByDetailIdAsync(new Models.GetTransferBatchDetailByDetailIdRequest()); @@ -736,7 +784,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests var resB2 = await CreateMockClientUseSM2( autoDecrypt: true, - mockResponseContent: new FlurlSystemTextJsonSerializer().Serialize( + mockResponse: new FlurlSystemTextJsonSerializer().Serialize( GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)) ) ).ExecuteGetTransferBatchDetailByDetailIdAsync(new Models.GetTransferBatchDetailByDetailIdRequest()); @@ -763,28 +811,28 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests public class MockHttpMessageHandler : DelegatingHandler { - private readonly string? _mockResponseContent; + private readonly string? _mockResponse; - public MockHttpMessageHandler(HttpMessageHandler innerHandler, string? mockResponseContent) + public MockHttpMessageHandler(HttpMessageHandler innerHandler, string? mockResponse) : base(innerHandler) { - _mockResponseContent = mockResponseContent; + _mockResponse = mockResponse; } protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { - bool hasContent = !string.IsNullOrEmpty(_mockResponseContent); + bool hasContent = !string.IsNullOrEmpty(_mockResponse); var resp = new HttpResponseMessage { StatusCode = hasContent ? HttpStatusCode.OK : HttpStatusCode.NoContent, - Content = hasContent ? new StringContent(_mockResponseContent!, Encoding.UTF8) : new ByteArrayContent(Array.Empty()), + Content = hasContent ? new StringContent(_mockResponse!, Encoding.UTF8) : new ByteArrayContent(Array.Empty()), }; - resp.Headers.TryAddWithoutValidation("Content-Length", hasContent ? Encoding.UTF8.GetBytes(_mockResponseContent!).Length.ToString() : (0).ToString()); + resp.Headers.TryAddWithoutValidation("Content-Length", hasContent ? Encoding.UTF8.GetBytes(_mockResponse!).Length.ToString() : (0).ToString()); return Task.FromResult(resp); } } - private static WechatTenpayClient CreateMockClientUseRSA(bool autoDecrypt, string? mockResponseContent = null) + private static WechatTenpayClient CreateMockClientUseRSA(bool autoDecrypt, string? mockResponse = null) { var client = new WechatTenpayClient(new WechatTenpayClientOptions() { @@ -794,11 +842,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests MerchantV3Secret = Guid.NewGuid().ToString("N"), AutoDecryptResponseSensitiveProperty = autoDecrypt }); - client.Configure(settings => settings.FlurlHttpClientFactory = new MockHttpClientFactory(mockResponseContent)); + client.Configure(settings => settings.FlurlHttpClientFactory = new MockHttpClientFactory(mockResponse)); return client; } - private static WechatTenpayClient CreateMockClientUseSM2(bool autoDecrypt, string? mockResponseContent = null) + private static WechatTenpayClient CreateMockClientUseSM2(bool autoDecrypt, string? mockResponse = null) { var client = new WechatTenpayClient(new WechatTenpayClientOptions() { @@ -809,7 +857,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests SignScheme = Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, AutoDecryptResponseSensitiveProperty = autoDecrypt }); - client.Configure(settings => settings.FlurlHttpClientFactory = new MockHttpClientFactory(mockResponseContent)); + client.Configure(settings => settings.FlurlHttpClientFactory = new MockHttpClientFactory(mockResponse)); return client; } }