diff --git a/docs/WechatTenpayV3/Basic_ModelDefinition.md b/docs/WechatTenpayV3/Basic_ModelDefinition.md
index 5372626b..1118a8fc 100644
--- a/docs/WechatTenpayV3/Basic_ModelDefinition.md
+++ b/docs/WechatTenpayV3/Basic_ModelDefinition.md
@@ -941,6 +941,30 @@
- 下载账单:`DownloadBillFile`
+ - 平台收付通(商家转账)
+
+ - 批量商家转账
+
+ - 受理商家转账:`ApplyPlatformSolutionMerchantTransferBatch`
+
+ - 微信支付转账批次单号查询批次单:`GetPlatformSolutionMerchantTransferBatchByBatchId`
+
+ - 微信支付转账明细单号查询明细单:`GetPlatformSolutionMerchantTransferBatchDetailByDetailId`
+
+ - 商户转账批次单号查询批次单:`GetPlatformSolutionMerchantTransferBatchByOutBatchNumber`
+
+ - 商户明细单号查询明细单:`GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumber`
+
+ - 预约商家转账
+
+ - 受理单次预约商家转账:`ApplyPlatformSolutionMerchantTransferReservation`
+
+ - 商户预约单号查询预约商家转账记录:`GetPlatformSolutionMerchantTransferReservationByOutReservationNumber`
+
+ - 关闭预约商家转账记录:`ClosePlatformSolutionMerchantTransferReservation`
+
+ - 微信支付预约单号查询预约商家转账记录:`GetPlatformSolutionMerchantTransferReservationByReservationId`
+
- 代金券
- 创建代金券批次:`CreateMarketingFavorStock`
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceExtensions.cs
index 8e0acf1e..ee89d586 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceExtensions.cs
@@ -311,6 +311,142 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
}
#endregion
+ #region MerchantTransfer
+ ///
+ /// 异步调用 [POST] /ecommerce/mch-transfer/authorizations 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCreateEcommerceMerchantTransferAuthorizationAsync(this WechatTenpayClient client, Models.CreateEcommerceMerchantTransferAuthorizationRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Post, "ecommerce", "mch-transfer", "authorizations");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /ecommerce/mch-transfer/authorizations/{sub_mchid} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetEcommerceMerchantTransferAuthorizationBySubMerchantIdAsync(this WechatTenpayClient client, Models.GetEcommerceMerchantTransferAuthorizationBySubMerchantIdRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Get, "ecommerce", "mch-transfer", "authorizations", request.SubMerchantId);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [POST] /ecommerce/mch-transfer/transfer-bills 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCreateEcommerceMerchantTransferBillAsync(this WechatTenpayClient client, Models.CreateEcommerceMerchantTransferBillRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Post, "ecommerce", "mch-transfer", "transfer-bills");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /ecommerce/mch-transfer/transfer-bills/out-bill-no/{out_bill_no} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetEcommerceMerchantTransferBillByOutBillNumberAsync(this WechatTenpayClient client, Models.GetEcommerceMerchantTransferBillByOutBillNumberRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Get, "ecommerce", "mch-transfer", "transfer-bills", "out-bill-no", request.OutBillNumber)
+ .SetQueryParam("sub_mchid", request.SubMerchantId);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /ecommerce/mch-transfer/transfer-bills/transfer-bill-no/{transfer_bill_no} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetEcommerceMerchantTransferBillByTransferBillNumberAsync(this WechatTenpayClient client, Models.GetEcommerceMerchantTransferBillByTransferBillNumberRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Get, "ecommerce", "mch-transfer", "transfer-bills", "transfer-bill-no", request.TransferBillNumber)
+ .SetQueryParam("sub_mchid", request.SubMerchantId);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [POST] /ecommerce/mch-transfer/transfer-bills/out-bill-no/{out_bill_no}/cancel 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCancelEcommerceMerchantTransferBillAsync(this WechatTenpayClient client, Models.CancelEcommerceMerchantTransferBillRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Post, "ecommerce", "mch-transfer", "transfer-bills", "out-bill-no", request.OutBillNumber, "cancel");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+ #endregion
+
#region ProfitSharing
///
/// 异步调用 [POST] /ecommerce/profitsharing/orders 接口。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePartnerTransferExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePartnerTransferExtensions.cs
index e16b9d3d..1b3b8119 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePartnerTransferExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePartnerTransferExtensions.cs
@@ -50,7 +50,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Get, "partner-transfer", "batches", "out-batch-no", request.OutBatchNumber)
- .SetQueryParam("need_query_detail", request.RequireQueryDetail);
+ .SetQueryParam("need_query_detail", request.RequireQueryDetail ? "true" : "false");
if (request.DetailStatus is not null)
flurlReq.SetQueryParam("detail_status", request.DetailStatus);
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePlatformSolutionExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePlatformSolutionExtensions.cs
new file mode 100644
index 00000000..90471617
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePlatformSolutionExtensions.cs
@@ -0,0 +1,237 @@
+using System;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
+{
+ public static class WechatTenpayClientExecutePlatformSolutionExtensions
+ {
+ #region MerchantTransfer
+ ///
+ /// 异步调用 [POST] /platsolution/mch-transfer/batches/apply 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteApplyPlatformSolutionMerchantTransferBatchAsync(this WechatTenpayClient client, Models.ApplyPlatformSolutionMerchantTransferBatchRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Post, "platsolution", "mch-transfer", "batches", "apply");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /platsolution/mch-transfer/batches/out-batch-no/{out_batch_no} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetPlatformSolutionMerchantTransferBatchByOutBatchNumberAsync(this WechatTenpayClient client, Models.GetPlatformSolutionMerchantTransferBatchByOutBatchNumberRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Get, "platsolution", "mch-transfer", "batches", "out-batch-no", request.OutBatchNumber)
+ .SetQueryParam("sub_mchid", request.SubMerchantId)
+ .SetQueryParam("need_query_detail", request.RequireQueryDetail ? "true" : "false");
+
+ if (request.DetailState is not null)
+ flurlReq.SetQueryParam("detail_state", request.DetailState);
+
+ if (request.Offset is not null)
+ flurlReq.SetQueryParam("offset", request.Offset.Value);
+
+ if (request.Limit is not null)
+ flurlReq.SetQueryParam("limit", request.Limit.Value);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /platsolution/mch-transfer/batches/batch-id/{batch_id} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetPlatformSolutionMerchantTransferBatchByBatchIdAsync(this WechatTenpayClient client, Models.GetPlatformSolutionMerchantTransferBatchByBatchIdRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Get, "platsolution", "mch-transfer", "batches", "batch-id", request.BatchId)
+ .SetQueryParam("sub_mchid", request.SubMerchantId)
+ .SetQueryParam("need_query_detail", request.RequireQueryDetail ? "true" : "false");
+
+ if (request.DetailState is not null)
+ flurlReq.SetQueryParam("detail_state", request.DetailState);
+
+ if (request.Offset is not null)
+ flurlReq.SetQueryParam("offset", request.Offset.Value);
+
+ if (request.Limit is not null)
+ flurlReq.SetQueryParam("limit", request.Limit.Value);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /platsolution/mch-transfer/batches/out-batch-no/{out_batch_no}/details/out-detail-no/{out_detail_no} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberAsync(this WechatTenpayClient client, Models.GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Get, "platsolution", "mch-transfer", "batches", "out-batch-no", request.OutBatchNumber, "details", "out-detail-no", request.OutDetailNumber)
+ .SetQueryParam("sub_mchid", request.SubMerchantId);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /platsolution/mch-transfer/batches/batch-id/{batch_id}/details/detail-id/{detail_id} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetPlatformSolutionMerchantTransferBatchDetailByDetailIdAsync(this WechatTenpayClient client, Models.GetPlatformSolutionMerchantTransferBatchDetailByDetailIdRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Get, "platsolution", "mch-transfer", "batches", "out-batch-no", request.BatchId, "details", "detail-id", request.DetailId)
+ .SetQueryParam("sub_mchid", request.SubMerchantId);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [POST] /platsolution/mch-transfer/reservation/apply 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteApplyPlatformSolutionMerchantTransferReservationAsync(this WechatTenpayClient client, Models.ApplyPlatformSolutionMerchantTransferReservationRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Post, "platsolution", "mch-transfer", "reservation", "apply");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /platsolution/mch-transfer/reservation/out-reservation-no/{out_reservation_no} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetPlatformSolutionMerchantTransferReservationByOutReservationNumberAsync(this WechatTenpayClient client, Models.GetPlatformSolutionMerchantTransferReservationByOutReservationNumberRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Get, "platsolution", "mch-transfer", "reservation", "out-reservation-no", request.OutReservationNumber)
+ .SetQueryParam("sub_mchid", request.SubMerchantId);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /platsolution/mch-transfer/reservation/reservation-id/{reservation_id} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetPlatformSolutionMerchantTransferReservationByReservationIdAsync(this WechatTenpayClient client, Models.GetPlatformSolutionMerchantTransferReservationByReservationIdRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Get, "platsolution", "mch-transfer", "reservation", "reservation-id", request.ReservationId)
+ .SetQueryParam("sub_mchid", request.SubMerchantId);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [POST] /platsolution/mch-transfer/reservation/out-reservation-no/{out_reservation_no}/close 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteClosePlatformSolutionMerchantTransferReservationAsync(this WechatTenpayClient client, Models.ClosePlatformSolutionMerchantTransferReservationRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateFlurlRequest(request, HttpMethod.Post, "platsolution", "mch-transfer", "reservation", "out-reservation-no", request.OutReservationNumber, "close");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+ #endregion
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillRequest.cs
new file mode 100644
index 00000000..0ce29991
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /ecommerce/mch-transfer/transfer-bills/out-bill-no/{out_bill_no}/cancel 接口的请求。
+ ///
+ public class CancelEcommerceMerchantTransferBillRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户转账单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OutBillNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillResponse.cs
new file mode 100644
index 00000000..01780154
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillResponse.cs
@@ -0,0 +1,47 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /ecommerce/mch-transfer/transfer-bills/out-bill-no/{out_bill_no}/cancel 接口的响应。
+ ///
+ public class CancelEcommerceMerchantTransferBillResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户转账单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_bill_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_bill_no")]
+ public string OutBillNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信转账单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_bill_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_bill_no")]
+ public string TransferBillNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置单据状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("state")]
+ [System.Text.Json.Serialization.JsonPropertyName("state")]
+ public string State { get; set; } = default!;
+
+ ///
+ /// 获取或设置更新时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("update_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("update_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset UpdateTime { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationRequest.cs
new file mode 100644
index 00000000..8e3b7a1a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationRequest.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /ecommerce/mch-transfer/authorizations 接口的请求。
+ ///
+ public class CreateEcommerceMerchantTransferAuthorizationRequest : WechatTenpayRequest
+ {
+ public static class Types
+ {
+ public class Agreement
+ {
+ ///
+ /// 获取或设置协议编号。
+ ///
+ [Newtonsoft.Json.JsonProperty("agreement_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("agreement_code")]
+ public string AgreementCode { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置协议版本号。
+ ///
+ [Newtonsoft.Json.JsonProperty("agreement_version")]
+ [System.Text.Json.Serialization.JsonPropertyName("agreement_version")]
+ public string AgreementVersion { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置签约主体。
+ ///
+ [Newtonsoft.Json.JsonProperty("sign_organization")]
+ [System.Text.Json.Serialization.JsonPropertyName("sign_organization")]
+ public string SignOrganization { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置签约时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("sign_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("sign_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset SignTime { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置签约协议列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("agreement_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("agreement_list")]
+ public IList AgreementList { get; set; } = new List();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationResponse.cs
new file mode 100644
index 00000000..9d9f31ef
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationResponse.cs
@@ -0,0 +1,42 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /ecommerce/mch-transfer/authorizations 接口的响应。
+ ///
+ public class CreateEcommerceMerchantTransferAuthorizationResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置授权状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("authorization_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("authorization_state")]
+ public string AuthorizationState { get; set; } = default!;
+
+ ///
+ /// 获取或设置受理时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("accept_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("accept_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset AcceptTime { get; set; }
+
+ ///
+ /// 获取或设置授权时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("authorize_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("authorize_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset? AuthorizeTime { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillRequest.cs
new file mode 100644
index 00000000..c553a3d8
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillRequest.cs
@@ -0,0 +1,81 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /ecommerce/mch-transfer/transfer-bills 接口的请求。
+ ///
+ [WechatTenpaySensitive]
+ public class CreateEcommerceMerchantTransferBillRequest : WechatTenpayRequest
+ {
+ public static class Types
+ {
+ public class TransferDetail : CreateTransferBatchRequest.Types.TransferDetail
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置服务商 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户转账单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_bill_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_bill_no")]
+ public string OutBillNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置转账场景 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_scene_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_scene_id")]
+ public string TransferSceneId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置收款用户 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string? OpenId { get; set; }
+
+ ///
+ /// 获取或设置收款用户姓名(需使用平台公钥/证书加密)。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_name")]
+ [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? UserName { get; set; }
+
+ ///
+ /// 获取或设置转账金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_amount")]
+ public int TransferAmount { get; set; }
+
+ ///
+ /// 获取或设置转账备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_remark")]
+ public string TransferRemark { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置回调通知地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("notify_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("notify_url")]
+ public string? NotifyUrl { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillResponse.cs
new file mode 100644
index 00000000..5d8cdba5
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillResponse.cs
@@ -0,0 +1,61 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /ecommerce/mch-transfer/transfer-bills 接口的响应。
+ ///
+ public class CreateEcommerceMerchantTransferBillResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户转账单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_bill_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_bill_no")]
+ public string OutBillNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信转账单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_bill_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_bill_no")]
+ public string TransferBillNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置单据状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("state")]
+ [System.Text.Json.Serialization.JsonPropertyName("state")]
+ public string State { get; set; } = default!;
+
+ ///
+ /// 获取或设置失败原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("fail_reason")]
+ [System.Text.Json.Serialization.JsonPropertyName("fail_reason")]
+ public string? FailReason { get; set; }
+
+ ///
+ /// 获取或设置创建时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { get; set; }
+
+ ///
+ /// 获取或设置跳转领取页面的信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("package_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("package_info")]
+ public string? PackageInfo { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferAuthorizationBySubMerchantIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferAuthorizationBySubMerchantIdRequest.cs
new file mode 100644
index 00000000..69e43519
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferAuthorizationBySubMerchantIdRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /ecommerce/mch-transfer/authorizations/{sub_mchid} 接口的请求。
+ ///
+ public class GetEcommerceMerchantTransferAuthorizationBySubMerchantIdRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SubMerchantId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferAuthorizationBySubMerchantIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferAuthorizationBySubMerchantIdResponse.cs
new file mode 100644
index 00000000..1832d383
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferAuthorizationBySubMerchantIdResponse.cs
@@ -0,0 +1,33 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /ecommerce/mch-transfer/authorizations/{sub_mchid} 接口的响应。
+ ///
+ public class GetEcommerceMerchantTransferAuthorizationBySubMerchantIdResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置授权状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("authorization_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("authorization_state")]
+ public string AuthorizationState { get; set; } = default!;
+
+ ///
+ /// 获取或设置授权时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("authorize_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("authorize_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset? AuthorizeTime { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByOutBillNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByOutBillNumberRequest.cs
new file mode 100644
index 00000000..4b889bf4
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByOutBillNumberRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /ecommerce/mch-transfer/transfer-bills/out-bill-no/{out_bill_no} 接口的请求。
+ ///
+ public class GetEcommerceMerchantTransferBillByOutBillNumberRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户转账单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OutBillNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByOutBillNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByOutBillNumberResponse.cs
new file mode 100644
index 00000000..a59040af
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByOutBillNumberResponse.cs
@@ -0,0 +1,115 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /ecommerce/mch-transfer/transfer-bills/out-bill-no/{out_bill_no} 接口的响应。
+ ///
+ [WechatTenpaySensitive]
+ public class GetEcommerceMerchantTransferBillByOutBillNumberResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置微信商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置服务商 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户转账单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_bill_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_bill_no")]
+ public string OutBillNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信转账单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_bill_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_bill_no")]
+ public string TransferBillNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置单据状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("state")]
+ [System.Text.Json.Serialization.JsonPropertyName("state")]
+ public string State { get; set; } = default!;
+
+ ///
+ /// 获取或设置转账场景 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_scene_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_scene_id")]
+ public string TransferSceneId { get; set; } = default!;
+
+ ///
+ /// 获取或设置收款用户 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string? OpenId { get; set; }
+
+ ///
+ /// 获取或设置收款用户姓名(需使用商户私钥解密)。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_name")]
+ [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? UserName { get; set; }
+
+ ///
+ /// 获取或设置转账金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_amount")]
+ public int TransferAmount { get; set; }
+
+ ///
+ /// 获取或设置转账备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_remark")]
+ public string TransferRemark { get; set; } = default!;
+
+ ///
+ /// 获取或设置失败原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("fail_reason")]
+ [System.Text.Json.Serialization.JsonPropertyName("fail_reason")]
+ public string? FailReason { get; set; }
+
+ ///
+ /// 获取或设置创建时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { get; set; }
+
+ ///
+ /// 获取或设置更新时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("update_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("update_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset UpdateTime { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByTransferBillNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByTransferBillNumberRequest.cs
new file mode 100644
index 00000000..9a520135
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByTransferBillNumberRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /ecommerce/mch-transfer/transfer-bills/transfer-bill-no/{transfer_bill_no} 接口的请求。
+ ///
+ public class GetEcommerceMerchantTransferBillByTransferBillNumberRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置微信转账单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string TransferBillNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByTransferBillNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByTransferBillNumberResponse.cs
new file mode 100644
index 00000000..24e25e52
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByTransferBillNumberResponse.cs
@@ -0,0 +1,10 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /ecommerce/mch-transfer/transfer-bills/transfer-bill-no/{transfer_bill_no} 接口的响应。
+ ///
+ [WechatTenpaySensitive]
+ public class GetEcommerceMerchantTransferBillByTransferBillNumberResponse : GetEcommerceMerchantTransferBillByOutBillNumberResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchRequest.cs
new file mode 100644
index 00000000..62e01911
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchRequest.cs
@@ -0,0 +1,128 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /platsolution/mch-transfer/batches/apply 接口的请求。
+ ///
+ public class ApplyPlatformSolutionMerchantTransferBatchRequest : WechatTenpayRequest
+ {
+ public static class Types
+ {
+ public class TransferDetail
+ {
+ ///
+ /// 获取或设置商户明细单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_detail_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_detail_no")]
+ public string OutDetailNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置转账金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_amount")]
+ public int TransferAmount { get; set; }
+
+ ///
+ /// 获取或设置转账备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_remark")]
+ public string TransferRemark { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置收款用户 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置微信转账预约单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("reservation_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("reservation_id")]
+ public string ReservationId { get; set; } = string.Empty;
+ }
+ }
+
+ ///
+ /// 获取或设置特约商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置服务商 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sp_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sp_appid")]
+ public string? AppId { get; set; }
+
+ ///
+ /// 获取或设置二级商户 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
+ public string? SubAppId { get; set; }
+
+ ///
+ /// 获取或设置商户批次单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_batch_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_batch_no")]
+ public string OutBatchNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置批次名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("batch_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("batch_name")]
+ public string BatchName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置批次备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("batch_remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("batch_remark")]
+ public string BatchRemark { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置转账场景 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_scene_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_scene_id")]
+ public string TransferSceneId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置转账总金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_amount")]
+ public int TotalAmount { get; set; }
+
+ ///
+ /// 获取或设置转账总笔数。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_num")]
+ public int TotalNumber { get; set; }
+
+ ///
+ /// 获取或设置转账明细列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_detail_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_detail_list")]
+ public IList TransferDetailList { get; set; } = new List();
+
+ ///
+ /// 获取或设置回调通知地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("notify_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("notify_url")]
+ public string? NotifyUrl { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchResponse.cs
new file mode 100644
index 00000000..ad4c6cc4
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchResponse.cs
@@ -0,0 +1,40 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /platsolution/mch-transfer/batches/apply 接口的响应。
+ ///
+ public class ApplyPlatformSolutionMerchantTransferBatchResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置商户批次单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_batch_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_batch_no")]
+ public string OutBatchNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信批次单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("batch_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("batch_id")]
+ public string BatchId { get; set; } = default!;
+
+ ///
+ /// 获取或设置批次创建时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { get; set; }
+
+ ///
+ /// 获取或设置批次状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("batch_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("batch_state")]
+ public string? BatchState { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationRequest.cs
new file mode 100644
index 00000000..6632d863
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationRequest.cs
@@ -0,0 +1,160 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /platsolution/mch-transfer/reservation/apply 接口的请求。
+ ///
+ [WechatTenpaySensitive]
+ public class ApplyPlatformSolutionMerchantTransferReservationRequest : WechatTenpayRequest
+ {
+ public static class Types
+ {
+ public class SceneReportData
+ {
+ public static class Types
+ {
+ public class InsurancePolicy
+ {
+ ///
+ /// 获取或设置保险产品备案编号。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_registration_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_registration_no")]
+ public string? ProductRegistrationNumber { get; set; }
+
+ ///
+ /// 获取或设置保险单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("policy_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("policy_no")]
+ public string PolicyNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置保险名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置取现单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("withdrawal_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("withdrawal_no")]
+ public string? WithdrawalNumber { get; set; }
+
+ ///
+ /// 获取或设置理赔单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("claim_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("claim_no")]
+ public string? ClaimNumber { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置保险保单报备信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("insurance_policy")]
+ [System.Text.Json.Serialization.JsonPropertyName("insurance_policy")]
+ public Types.InsurancePolicy? InsurancePolicy { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置服务商 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sp_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sp_appid")]
+ public string AppId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置二级商户 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
+ public string? SubAppId { get; set; }
+
+ ///
+ /// 获取或设置商户预约单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_reservation_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_reservation_no")]
+ public string OutReservationNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置转账场景 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_scene_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_scene_id")]
+ public string TransferSceneId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置预计最晚转账日期。
+ ///
+ [Newtonsoft.Json.JsonProperty("estimated_date")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("estimated_date")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset? EstimatedDate { get; set; }
+
+ ///
+ /// 获取或设置预计最大转账金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("estimated_max_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("estimated_max_amount")]
+ public int? EstimatedMaxAmount { get; set; }
+
+ ///
+ /// 获取或设置准确转账金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("exact_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("exact_amount")]
+ public int? ExactAmount { get; set; }
+
+ ///
+ /// 获取或设置收款用户 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置收款用户姓名(需使用平台公钥/证书加密)。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_real_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_real_name")]
+ [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? UserName { get; set; }
+
+ ///
+ /// 获取或设置预约备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("reserve_remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("reserve_remark")]
+ public string ReserveRemark { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置回调通知地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("notify_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("notify_url")]
+ public string? NotifyUrl { get; set; }
+
+ ///
+ /// 获取或设置场景报备信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("scene_report_data")]
+ [System.Text.Json.Serialization.JsonPropertyName("scene_report_data")]
+ public Types.SceneReportData? SceneReportData { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationResponse.cs
new file mode 100644
index 00000000..f0a09803
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationResponse.cs
@@ -0,0 +1,54 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /platsolution/mch-transfer/reservation/apply 接口的响应。
+ ///
+ public class ApplyPlatformSolutionMerchantTransferReservationResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户预约单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_reservation_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_reservation_no")]
+ public string OutReservationNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信预约单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("reservation_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("reservation_id")]
+ public string ReservationId { get; set; } = default!;
+
+ ///
+ /// 获取或设置预约记录状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("state")]
+ [System.Text.Json.Serialization.JsonPropertyName("state")]
+ public string State { get; set; } = default!;
+
+ ///
+ /// 获取或设置预约受理时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("accept_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("accept_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset AcceptTime { get; set; }
+
+ ///
+ /// 获取或设置跳转预约页面的信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("package_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("package_info")]
+ public string? PackageInfo { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ClosePlatformSolutionMerchantTransferReservationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ClosePlatformSolutionMerchantTransferReservationRequest.cs
new file mode 100644
index 00000000..e1a9a7a3
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ClosePlatformSolutionMerchantTransferReservationRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /platsolution/mch-transfer/reservation/out-reservation-no/{out_reservation_no}/close 接口的请求。
+ ///
+ public class ClosePlatformSolutionMerchantTransferReservationRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户预约单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OutReservationNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ClosePlatformSolutionMerchantTransferReservationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ClosePlatformSolutionMerchantTransferReservationResponse.cs
new file mode 100644
index 00000000..45aaf7ec
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/ClosePlatformSolutionMerchantTransferReservationResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /platsolution/mch-transfer/reservation/out-reservation-no/{out_reservation_no}/close 接口的响应。
+ ///
+ public class ClosePlatformSolutionMerchantTransferReservationResponse : GetPlatformSolutionMerchantTransferReservationByOutReservationNumberResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByBatchIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByBatchIdRequest.cs
new file mode 100644
index 00000000..d253bf0e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByBatchIdRequest.cs
@@ -0,0 +1,50 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/batches/batch-id/{batch_id} 接口的请求。
+ ///
+ public class GetPlatformSolutionMerchantTransferBatchByBatchIdRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置微信批次单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string BatchId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置是否查询转账明细单。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public bool RequireQueryDetail { get; set; }
+
+ ///
+ /// 获取或设置分页开始位置。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Offset { get; set; }
+
+ ///
+ /// 获取或设置分页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Limit { get; set; }
+
+ ///
+ /// 获取或设置明细状态。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? DetailState { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByBatchIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByBatchIdResponse.cs
new file mode 100644
index 00000000..3b67a487
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByBatchIdResponse.cs
@@ -0,0 +1,47 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/batches/batch-id/{batch_id} 接口的响应。
+ ///
+ public class GetPlatformSolutionMerchantTransferBatchByBatchIdResponse : WechatTenpayResponse
+ {
+ public static class Types
+ {
+ public class TransferBatch : GetPlatformSolutionMerchantTransferBatchByOutBatchNumberResponse.Types.TransferBatch
+ {
+ }
+
+ public class TransferDetail : GetPlatformSolutionMerchantTransferBatchByOutBatchNumberResponse.Types.TransferDetail
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置转账批次信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_batch")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_batch")]
+ public Types.TransferBatch TransferBatch { get; set; } = default!;
+
+ ///
+ /// 获取或设置转账明细单列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.TransferDetail[]? TransferDetailList { get; set; }
+
+ ///
+ /// 获取或设置分页开始位置。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Offset { get; set; }
+
+ ///
+ /// 获取或设置分页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Limit { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByOutBatchNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByOutBatchNumberRequest.cs
new file mode 100644
index 00000000..b198e66e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByOutBatchNumberRequest.cs
@@ -0,0 +1,50 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/batches/out-batch-no/{out_batch_no} 接口的请求。
+ ///
+ public class GetPlatformSolutionMerchantTransferBatchByOutBatchNumberRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户批次单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OutBatchNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置是否查询转账明细单。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public bool RequireQueryDetail { get; set; }
+
+ ///
+ /// 获取或设置分页开始位置。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Offset { get; set; }
+
+ ///
+ /// 获取或设置分页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Limit { get; set; }
+
+ ///
+ /// 获取或设置明细状态。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? DetailState { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByOutBatchNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByOutBatchNumberResponse.cs
new file mode 100644
index 00000000..44bab88c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByOutBatchNumberResponse.cs
@@ -0,0 +1,196 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/batches/out-batch-no/{out_batch_no} 接口的响应。
+ ///
+ public class GetPlatformSolutionMerchantTransferBatchByOutBatchNumberResponse : WechatTenpayResponse
+ {
+ public static class Types
+ {
+ public class TransferBatch
+ {
+ ///
+ /// 获取或设置服务商商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sp_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置特约商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置服务商 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sp_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sp_appid")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置特约商户 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
+ public string? SubAppId { get; set; }
+
+ ///
+ /// 获取或设置商户批次单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_batch_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_batch_no")]
+ public string OutBatchNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信批次单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("batch_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("batch_id")]
+ public string BatchId { get; set; } = default!;
+
+ ///
+ /// 获取或设置批次状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("batch_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("batch_state")]
+ public string BatchState { get; set; } = default!;
+
+ ///
+ /// 获取或设置批次名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("batch_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("batch_name")]
+ public string BatchName { get; set; } = default!;
+
+ ///
+ /// 获取或设置批次备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("batch_remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("batch_remark")]
+ public string BatchRemark { get; set; } = default!;
+
+ ///
+ /// 获取或设置转账场景 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_scene_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_scene_id")]
+ public string TransferSceneId { get; set; } = default!;
+
+ ///
+ /// 获取或设置批次关闭原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("close_reason")]
+ [System.Text.Json.Serialization.JsonPropertyName("close_reason")]
+ public string? CloseReason { get; set; }
+
+ ///
+ /// 获取或设置转账总金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_amount")]
+ public int TotalAmount { get; set; }
+
+ ///
+ /// 获取或设置转账总笔数。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_num")]
+ public int TotalNumber { get; set; }
+
+ ///
+ /// 获取或设置批次创建时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { get; set; }
+
+ ///
+ /// 获取或设置转账成功金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("success_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("success_amount")]
+ public int SuccessAmount { get; set; }
+
+ ///
+ /// 获取或设置转账成功笔数。
+ ///
+ [Newtonsoft.Json.JsonProperty("success_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("success_num")]
+ public int SuccessNumber { get; set; }
+
+ ///
+ /// 获取或设置转账失败金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("failed_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("failed_amount")]
+ public int FailAmount { get; set; }
+
+ ///
+ /// 获取或设置转账失败笔数。
+ ///
+ [Newtonsoft.Json.JsonProperty("failed_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("failed_num")]
+ public int FailNumber { get; set; }
+ }
+
+ public class TransferDetail
+ {
+ ///
+ /// 获取或设置商户明细单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_detail_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_detail_no")]
+ public string OutDetailNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信明细单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("detail_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("detail_id")]
+ public string DetailId { get; set; } = default!;
+
+ ///
+ /// 获取或设置明细状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("detail_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("detail_state")]
+ public string DetailState { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置转账批次信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_batch")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_batch")]
+ public Types.TransferBatch TransferBatch { get; set; } = default!;
+
+ ///
+ /// 获取或设置转账明细单列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.TransferDetail[]? TransferDetailList { get; set; }
+
+ ///
+ /// 获取或设置分页开始位置。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Offset { get; set; }
+
+ ///
+ /// 获取或设置分页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Limit { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByDetailIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByDetailIdRequest.cs
new file mode 100644
index 00000000..5397935e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByDetailIdRequest.cs
@@ -0,0 +1,29 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/batches/batch-id/{batch_id}/details/detail-id/{detail_id} 接口的请求。
+ ///
+ public class GetPlatformSolutionMerchantTransferBatchDetailByDetailIdRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置微信批次单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string BatchId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置微信明细单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string DetailId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse.cs
new file mode 100644
index 00000000..7ae55d62
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/batches/batch-id/{batch_id}/details/detail-id/{detail_id} 接口的响应。
+ ///
+ [WechatTenpaySensitive]
+ public class GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse : GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberRequest.cs
new file mode 100644
index 00000000..7965cbaa
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberRequest.cs
@@ -0,0 +1,29 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/batches/out-batch-no/{out_batch_no}/details/out-detail-no/{out_detail_no} 接口的请求。
+ ///
+ public class GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户批次单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OutBatchNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户明细单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OutDetailNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse.cs
new file mode 100644
index 00000000..27985b8b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse.cs
@@ -0,0 +1,138 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/batches/out-batch-no/{out_batch_no}/details/out-detail-no/{out_detail_no} 接口的响应。
+ ///
+ [WechatTenpaySensitive]
+ public class GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置特约商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置服务商 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sp_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sp_appid")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置特约商户 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
+ public string? SubAppId { get; set; }
+
+ ///
+ /// 获取或设置商户批次单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_batch_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_batch_no")]
+ public string OutBatchNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信批次单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("batch_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("batch_id")]
+ public string BatchId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户明细单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_detail_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_detail_no")]
+ public string OutDetailNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信明细单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("detail_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("detail_id")]
+ public string DetailId { get; set; } = default!;
+
+ ///
+ /// 获取或设置明细状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("detail_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("detail_state")]
+ public string DetailState { get; set; } = default!;
+
+ ///
+ /// 获取或设置转账金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_amount")]
+ public int TransferAmount { get; set; }
+
+ ///
+ /// 获取或设置转账备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_remark")]
+ public string TransferRemark { get; set; } = default!;
+
+ ///
+ /// 获取或设置失败原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("fail_reason")]
+ [System.Text.Json.Serialization.JsonPropertyName("fail_reason")]
+ public string? FailReason { get; set; }
+
+ ///
+ /// 获取或设置收款用户 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = default!;
+
+ ///
+ /// 获取或设置收款银行类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("bank_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("bank_type")]
+ public string? BankType { get; set; }
+
+ ///
+ /// 获取或设置收款用户姓名(需使用商户私钥解密)。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_name")]
+ [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? UserName { get; set; }
+
+ ///
+ /// 获取或设置创建时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { get; set; }
+
+ ///
+ /// 获取或设置转账完成时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_finish_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_finish_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset? TransferFinishTime { get; set; }
+
+ ///
+ /// 获取或设置银行退票时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("bank_refund_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("bank_refund_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset? BankRefundTime { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByOutReservationNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByOutReservationNumberRequest.cs
new file mode 100644
index 00000000..133109c6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByOutReservationNumberRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/reservation/out-reservation-no/{out_reservation_no} 接口的请求。
+ ///
+ public class GetPlatformSolutionMerchantTransferReservationByOutReservationNumberRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户预约单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OutReservationNumber { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByOutReservationNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByOutReservationNumberResponse.cs
new file mode 100644
index 00000000..ff10bfab
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByOutReservationNumberResponse.cs
@@ -0,0 +1,150 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/reservation/out-reservation-no/{out_reservation_no} 接口的响应。
+ ///
+ public class GetPlatformSolutionMerchantTransferReservationByOutReservationNumberResponse : WechatTenpayResponse
+ {
+ public static class Types
+ {
+ public class CloseInfo
+ {
+ ///
+ /// 获取或设置关闭原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("close_reason")]
+ [System.Text.Json.Serialization.JsonPropertyName("close_reason")]
+ public string CloseReason { get; set; } = default!;
+
+ ///
+ /// 获取或设置关闭时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("close_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("close_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset CloseTime { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置服务商商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sp_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string SubMerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置服务商 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sp_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sp_appid")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置二级商户 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
+ public string? SubAppId { get; set; }
+
+ ///
+ /// 获取或设置商户预约单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_reservation_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_reservation_no")]
+ public string OutReservationNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信预约单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("reservation_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("reservation_id")]
+ public string ReservationId { get; set; } = default!;
+
+ ///
+ /// 获取或设置转账场景 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("transfer_scene_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("transfer_scene_id")]
+ public string TransferSceneId { get; set; } = default!;
+
+ ///
+ /// 获取或设置预计最晚转账日期。
+ ///
+ [Newtonsoft.Json.JsonProperty("estimated_date")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("estimated_date")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset? EstimatedDate { get; set; }
+
+ ///
+ /// 获取或设置预计最大转账金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("estimated_max_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("estimated_max_amount")]
+ public int? EstimatedMaxAmount { get; set; }
+
+ ///
+ /// 获取或设置准确转账金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("exact_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("exact_amount")]
+ public int? ExactAmount { get; set; }
+
+ ///
+ /// 获取或设置收款用户 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = default!;
+
+ ///
+ /// 获取或设置收款银行类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("bank_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("bank_type")]
+ public string? BankType { get; set; }
+
+ ///
+ /// 获取或设置预约记录状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("state")]
+ [System.Text.Json.Serialization.JsonPropertyName("state")]
+ public string State { get; set; } = default!;
+
+ ///
+ /// 获取或设置预约受理时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("accept_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("accept_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset AcceptTime { get; set; }
+
+ ///
+ /// 获取或设置确认预约时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("reserve_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("reserve_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset? ReserveTime { get; set; }
+
+ ///
+ /// 获取或设置预约关闭信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("close_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("close_info")]
+ public Types.CloseInfo? CloseInfo { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByReservationIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByReservationIdRequest.cs
new file mode 100644
index 00000000..3aa66909
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByReservationIdRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/reservation/reservation-id/{reservation_id} 接口的请求。
+ ///
+ public class GetPlatformSolutionMerchantTransferReservationByReservationIdRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置二级商户号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SubMerchantId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置微信预约单号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string ReservationId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByReservationIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByReservationIdResponse.cs
new file mode 100644
index 00000000..39bbcc76
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByReservationIdResponse.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /platsolution/mch-transfer/reservation/reservation-id/{reservation_id} 接口的响应。
+ ///
+ public class GetPlatformSolutionMerchantTransferReservationByReservationIdResponse : GetPlatformSolutionMerchantTransferReservationByOutReservationNumberResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Transfer/Batches/CreatePartnerTransferBatchRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Transfer/Batches/CreatePartnerTransferBatchRequest.cs
index 8990ebf7..e54197cb 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Transfer/Batches/CreatePartnerTransferBatchRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Transfer/Batches/CreatePartnerTransferBatchRequest.cs
@@ -1,10 +1,11 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
///
/// 表示 [POST] /partner-transfer/batches 接口的请求。
///
+ [WechatTenpaySensitive]
public class CreatePartnerTransferBatchRequest : WechatTenpayRequest
{
public static class Types
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillRequest.json
new file mode 100644
index 00000000..7d58dc71
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillRequest.json
@@ -0,0 +1,3 @@
+{
+ "sub_mchid": "1900001109"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillResponse.json
new file mode 100644
index 00000000..b6deaba3
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CancelEcommerceMerchantTransferBillResponse.json
@@ -0,0 +1,7 @@
+{
+ "sub_mchid": "1900001109",
+ "out_bill_no": "plfk2020042013",
+ "transfer_bill_no": "1330000071100999991182020050700019480001",
+ "state": "CANCELING",
+ "update_time": "2015-05-20T13:29:35.120+08:00"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationRequest.json
new file mode 100644
index 00000000..4be19fc5
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationRequest.json
@@ -0,0 +1,11 @@
+{
+ "sub_mchid": "1900001109",
+ "agreement_list": [
+ {
+ "agreement_code": "1",
+ "agreement_version": "20230101",
+ "sign_organization": "示例有限责任公司",
+ "sign_time": "2015-05-20T13:29:35.120+08:00"
+ }
+ ]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationResponse.json
new file mode 100644
index 00000000..ee92df11
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferAuthorizationResponse.json
@@ -0,0 +1,6 @@
+{
+ "sub_mchid": "1900001109",
+ "authorization_state": "AUTHORIZE_PROCESSING",
+ "accept_time": "2015-05-20T13:29:35.120+08:00",
+ "authorize_time": "2015-05-20T13:29:35.120+08:00"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillRequest.json
new file mode 100644
index 00000000..8e10abd9
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillRequest.json
@@ -0,0 +1,11 @@
+{
+ "sub_mchid": "1900001109",
+ "appid": "wxf636efh567hg4356",
+ "out_bill_no": "plfk2020042013",
+ "transfer_scene_id": "1000",
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy",
+ "user_name": "757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45",
+ "transfer_amount": 400000,
+ "transfer_remark": "2020年4月报销",
+ "notify_url": "https://www.weixin.qq.com/wxpay/pay.php"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillResponse.json
new file mode 100644
index 00000000..472a61b7
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/CreateEcommerceMerchantTransferBillResponse.json
@@ -0,0 +1,9 @@
+{
+ "sub_mchid": "1900001109",
+ "out_bill_no": "plfk2020042013",
+ "transfer_bill_no": "1330000071100999991182020050700019480001",
+ "create_time": "2015-05-20T13:29:35.120+08:00",
+ "state": "ACCEPTED",
+ "fail_reason": "PAYEE_ACCOUNT_ABNORMAL",
+ "package_info": "affffddafdfafddffda=="
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferAuthorizationBySubMerchantIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferAuthorizationBySubMerchantIdResponse.json
new file mode 100644
index 00000000..83107521
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferAuthorizationBySubMerchantIdResponse.json
@@ -0,0 +1,5 @@
+{
+ "sub_mchid": "1900001109",
+ "authorization_state": "AUTHORIZE_PROCESSING",
+ "authorize_time": "2015-05-20T13:29:35.120+08:00"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByOutBillNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByOutBillNumberResponse.json
new file mode 100644
index 00000000..01acc626
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByOutBillNumberResponse.json
@@ -0,0 +1,16 @@
+{
+ "mchid": "1900001109",
+ "sub_mchid": "1900001121",
+ "out_bill_no": "plfk2020042013",
+ "transfer_bill_no": "1330000071100999991182020050700019480001",
+ "appid": "wxf636efh567hg4356",
+ "transfer_scene_id": "10001",
+ "state": "ACCEPTED",
+ "transfer_amount": 400000,
+ "transfer_remark": "2020年4月报销",
+ "fail_reason": "PAYEE_ACCOUNT_ABNORMAL",
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy",
+ "user_name": "757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45",
+ "create_time": "2015-05-20T13:29:35.120+08:00",
+ "update_time": "2015-05-20T13:29:35.120+08:00"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByTransferBillNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByTransferBillNumberResponse.json
new file mode 100644
index 00000000..01acc626
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/Ecommerce/MerchantTransfer/GetEcommerceMerchantTransferBillByTransferBillNumberResponse.json
@@ -0,0 +1,16 @@
+{
+ "mchid": "1900001109",
+ "sub_mchid": "1900001121",
+ "out_bill_no": "plfk2020042013",
+ "transfer_bill_no": "1330000071100999991182020050700019480001",
+ "appid": "wxf636efh567hg4356",
+ "transfer_scene_id": "10001",
+ "state": "ACCEPTED",
+ "transfer_amount": 400000,
+ "transfer_remark": "2020年4月报销",
+ "fail_reason": "PAYEE_ACCOUNT_ABNORMAL",
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy",
+ "user_name": "757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45",
+ "create_time": "2015-05-20T13:29:35.120+08:00",
+ "update_time": "2015-05-20T13:29:35.120+08:00"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchRequest.json
new file mode 100644
index 00000000..223fa731
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchRequest.json
@@ -0,0 +1,21 @@
+{
+ "sub_mchid": "1900001109",
+ "sp_appid": "wxf636efh567hg4356",
+ "sub_appid": "wxf636efh567hg4356",
+ "out_batch_no": "sjzz20230223",
+ "batch_name": "2023年2月深圳分部报销单",
+ "batch_remark": "2023年2月深圳分部报销单",
+ "total_amount": 4000000,
+ "total_num": 200,
+ "transfer_scene_id": "1000",
+ "transfer_detail_list": [
+ {
+ "out_detail_no": "x23zy545Bd5436",
+ "transfer_amount": 200000,
+ "transfer_remark": "2023年2月报销",
+ "reservation_id": "1330000071100999991182020050700019480001",
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy"
+ }
+ ],
+ "notify_url": "https://www.weixin.qq.com/wxpay/pay.php"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchResponse.json
new file mode 100644
index 00000000..e6b52e9a
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferBatchResponse.json
@@ -0,0 +1,6 @@
+{
+ "out_batch_no": "sjzz20230223",
+ "batch_id": "131000011085109987515042023022300246500006",
+ "create_time": "2023-02-23T13:29:35+08:00",
+ "batch_state": "ACCEPTED"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationRequest.json
new file mode 100644
index 00000000..26abc19f
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationRequest.json
@@ -0,0 +1,23 @@
+{
+ "sub_mchid": "1900001109",
+ "sp_appid": "wxf636efh567hg4356",
+ "sub_appid": "wxf636efh567hg4356",
+ "out_reservation_no": "plfk2020042013",
+ "transfer_scene_id": "1000",
+ "estimated_date": "2019-11-22",
+ "estimated_max_amount": 400000,
+ "exact_amount": 100000,
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy",
+ "user_real_name": "757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45",
+ "reserve_remark": "由于存在收益波动,实际到账资金可能不等于当前金额",
+ "notify_url": "https://www.weixin.qq.com/wxpay/pay.php",
+ "scene_report_data": {
+ "insurance_policy": {
+ "product_registration_no": "40058541257",
+ "policy_no": "202301011651",
+ "name": "养老保险",
+ "withdrawal_no": "202310410941",
+ "claim_no": "202310410941"
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationResponse.json
new file mode 100644
index 00000000..2095edc8
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ApplyPlatformSolutionMerchantTransferReservationResponse.json
@@ -0,0 +1,8 @@
+{
+ "sub_mchid": "1900001109",
+ "out_reservation_no": "plfk2020042013",
+ "reservation_id": "1330000071100999991182020050700019480001",
+ "accept_time": "2015-05-20T13:29:35.120+08:00",
+ "state": "ACCEPTED",
+ "package_info": "affffddafdfafddffda=="
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ClosePlatformSolutionMerchantTransferReservationResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ClosePlatformSolutionMerchantTransferReservationResponse.json
new file mode 100644
index 00000000..a91374e8
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/ClosePlatformSolutionMerchantTransferReservationResponse.json
@@ -0,0 +1,21 @@
+{
+ "sp_mchid": "1900001109",
+ "sub_mchid": "1900001109",
+ "sp_appid": "wxf636efh567hg4356",
+ "sub_appid": "wxf636efh567hg4356",
+ "reservation_id": "1330000071100999991182020050700019480001",
+ "out_reservation_no": "plfk2020042013",
+ "transfer_scene_id": "1000",
+ "estimated_date": "2019-11-22",
+ "estimated_max_amount": 400000,
+ "exact_amount": 100000,
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy",
+ "bank_type": "ICBC_DEBIT",
+ "state": "ACCEPTED",
+ "accept_time": "2015-05-20T13:29:35.120+08:00",
+ "reserve_time": "2015-05-20T13:29:35.120+08:00",
+ "close_info": {
+ "close_time": "2015-05-20T13:29:35.120+08:00",
+ "close_reason": "USER_OVERDUE_UNCONFIRMED"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByBatchIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByBatchIdResponse.json
new file mode 100644
index 00000000..aa6f7676
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByBatchIdResponse.json
@@ -0,0 +1,30 @@
+{
+ "transfer_batch": {
+ "out_batch_no": "sjzz20230223",
+ "batch_id": "131000011085109987515042023022300246500006",
+ "sp_appid": "wxf636efh567hg4356",
+ "sub_mchid": "1900000109",
+ "sub_appid": "wxf636efh567hg4356",
+ "batch_state": "ACCEPTED",
+ "batch_name": "2023年2月深圳分部转账单",
+ "batch_remark": "2023年2月深圳分部报销单",
+ "close_reason": "MERCHANT_REVOCATION",
+ "total_amount": 4000000,
+ "total_num": 200,
+ "create_time": "2023-02-23T13:29:35+08:00",
+ "success_amount": 3900000,
+ "success_num": 199,
+ "failed_amount": 100000,
+ "failed_num": 1,
+ "transfer_scene_id": "1000"
+ },
+ "data": [
+ {
+ "detail_id": "132000011085109987515042023022300246521006",
+ "out_detail_no": "x23zy545Bd5436",
+ "detail_state": "INIT"
+ }
+ ],
+ "offset": 0,
+ "limit": 20
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByOutBatchNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByOutBatchNumberResponse.json
new file mode 100644
index 00000000..aa6f7676
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchByOutBatchNumberResponse.json
@@ -0,0 +1,30 @@
+{
+ "transfer_batch": {
+ "out_batch_no": "sjzz20230223",
+ "batch_id": "131000011085109987515042023022300246500006",
+ "sp_appid": "wxf636efh567hg4356",
+ "sub_mchid": "1900000109",
+ "sub_appid": "wxf636efh567hg4356",
+ "batch_state": "ACCEPTED",
+ "batch_name": "2023年2月深圳分部转账单",
+ "batch_remark": "2023年2月深圳分部报销单",
+ "close_reason": "MERCHANT_REVOCATION",
+ "total_amount": 4000000,
+ "total_num": 200,
+ "create_time": "2023-02-23T13:29:35+08:00",
+ "success_amount": 3900000,
+ "success_num": 199,
+ "failed_amount": 100000,
+ "failed_num": 1,
+ "transfer_scene_id": "1000"
+ },
+ "data": [
+ {
+ "detail_id": "132000011085109987515042023022300246521006",
+ "out_detail_no": "x23zy545Bd5436",
+ "detail_state": "INIT"
+ }
+ ],
+ "offset": 0,
+ "limit": 20
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse.json
new file mode 100644
index 00000000..3259deb1
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse.json
@@ -0,0 +1,19 @@
+{
+ "out_batch_no": "sjzz20230223",
+ "batch_id": "131000011085109987515042023022300246500006",
+ "out_detail_no": "x23zy545Bd5436",
+ "detail_id": "132000011085109987515042023022300246521006",
+ "sp_appid": "wxf636efh567hg4356",
+ "sub_mchid": "1900000109",
+ "sub_appid": "wxf636efh567hg4356",
+ "create_time": "2023-02-23T13:29:35+08:00",
+ "detail_state": "INIT",
+ "transfer_amount": 20000,
+ "transfer_remark": "2023年2月报销",
+ "fail_reason": "ACCOUNT_FROZEN",
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy",
+ "bank_type": "ICBC_DEBIT",
+ "user_name": "757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45",
+ "transfer_finish_time": "2023-02-23T13:29:35+08:00",
+ "bank_refund_time": "2023-02-23T13:29:35+08:00"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse.json
new file mode 100644
index 00000000..3259deb1
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse.json
@@ -0,0 +1,19 @@
+{
+ "out_batch_no": "sjzz20230223",
+ "batch_id": "131000011085109987515042023022300246500006",
+ "out_detail_no": "x23zy545Bd5436",
+ "detail_id": "132000011085109987515042023022300246521006",
+ "sp_appid": "wxf636efh567hg4356",
+ "sub_mchid": "1900000109",
+ "sub_appid": "wxf636efh567hg4356",
+ "create_time": "2023-02-23T13:29:35+08:00",
+ "detail_state": "INIT",
+ "transfer_amount": 20000,
+ "transfer_remark": "2023年2月报销",
+ "fail_reason": "ACCOUNT_FROZEN",
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy",
+ "bank_type": "ICBC_DEBIT",
+ "user_name": "757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45",
+ "transfer_finish_time": "2023-02-23T13:29:35+08:00",
+ "bank_refund_time": "2023-02-23T13:29:35+08:00"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByOutReservationNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByOutReservationNumberResponse.json
new file mode 100644
index 00000000..a91374e8
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByOutReservationNumberResponse.json
@@ -0,0 +1,21 @@
+{
+ "sp_mchid": "1900001109",
+ "sub_mchid": "1900001109",
+ "sp_appid": "wxf636efh567hg4356",
+ "sub_appid": "wxf636efh567hg4356",
+ "reservation_id": "1330000071100999991182020050700019480001",
+ "out_reservation_no": "plfk2020042013",
+ "transfer_scene_id": "1000",
+ "estimated_date": "2019-11-22",
+ "estimated_max_amount": 400000,
+ "exact_amount": 100000,
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy",
+ "bank_type": "ICBC_DEBIT",
+ "state": "ACCEPTED",
+ "accept_time": "2015-05-20T13:29:35.120+08:00",
+ "reserve_time": "2015-05-20T13:29:35.120+08:00",
+ "close_info": {
+ "close_time": "2015-05-20T13:29:35.120+08:00",
+ "close_reason": "USER_OVERDUE_UNCONFIRMED"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByReservationIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByReservationIdResponse.json
new file mode 100644
index 00000000..a91374e8
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PlatformSolution/MerchantTransfer/GetPlatformSolutionMerchantTransferReservationByReservationIdResponse.json
@@ -0,0 +1,21 @@
+{
+ "sp_mchid": "1900001109",
+ "sub_mchid": "1900001109",
+ "sp_appid": "wxf636efh567hg4356",
+ "sub_appid": "wxf636efh567hg4356",
+ "reservation_id": "1330000071100999991182020050700019480001",
+ "out_reservation_no": "plfk2020042013",
+ "transfer_scene_id": "1000",
+ "estimated_date": "2019-11-22",
+ "estimated_max_amount": 400000,
+ "exact_amount": 100000,
+ "openid": "o-MYE42l80oelYMDE34nYD456Xoy",
+ "bank_type": "ICBC_DEBIT",
+ "state": "ACCEPTED",
+ "accept_time": "2015-05-20T13:29:35.120+08:00",
+ "reserve_time": "2015-05-20T13:29:35.120+08:00",
+ "close_info": {
+ "close_time": "2015-05-20T13:29:35.120+08:00",
+ "close_reason": "USER_OVERDUE_UNCONFIRMED"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs
index c4059589..1665a413 100644
--- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs
@@ -512,6 +512,59 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
}
}
+ [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /ecommerce/mch-transfer/transfer-bills)")]
+ public async Task TestEncryptRequestSensitiveProperty_CreateEcommerceMerchantTransferBillRequest()
+ {
+ static Models.CreateEcommerceMerchantTransferBillRequest GenerateMockRequestModel()
+ {
+ return new Models.CreateEcommerceMerchantTransferBillRequest()
+ {
+ UserName = MOCK_PLAIN_STR
+ };
+ }
+
+ static void AssertMockRequestModel(Models.CreateEcommerceMerchantTransferBillRequest request, Func decryptor)
+ {
+ Assert.NotEqual(MOCK_PLAIN_STR, request.UserName!);
+ Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.UserName!));
+ Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true);
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseRSA(autoEncrypt: false))
+ {
+ var request = GenerateMockRequestModel();
+ client.EncryptRequestSensitiveProperty(request);
+ AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
+ }
+
+ using (var client = CreateMockClientUseRSA(autoEncrypt: true))
+ {
+ var request = GenerateMockRequestModel();
+ await client.ExecuteCreateEcommerceMerchantTransferBillAsync(request);
+ AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
+ }
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseSM2(autoEncrypt: false))
+ {
+ var request = GenerateMockRequestModel();
+ client.EncryptRequestSensitiveProperty(request);
+ AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
+ }
+
+ using (var client = CreateMockClientUseSM2(autoEncrypt: true))
+ {
+ var request = GenerateMockRequestModel();
+ await client.ExecuteCreateEcommerceMerchantTransferBillAsync(request);
+ AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
+ }
+ }
+ }
+
[Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /ecommerce/profitsharing/orders)")]
public async Task TestEncryptRequestSensitiveProperty_CreateEcommerceProfitSharingOrderRequest()
{
@@ -1392,6 +1445,58 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
}
}
+ [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /platsolution/mch-transfer/reservation/apply)")]
+ public async Task TestEncryptRequestSensitiveProperty_ApplyPlatformSolutionMerchantTransferReservationRequest()
+ {
+ static Models.ApplyPlatformSolutionMerchantTransferReservationRequest GenerateMockRequestModel()
+ {
+ return new Models.ApplyPlatformSolutionMerchantTransferReservationRequest()
+ {
+ UserName = MOCK_PLAIN_STR
+ };
+ }
+
+ static void AssertMockRequestModel(Models.ApplyPlatformSolutionMerchantTransferReservationRequest request, Func decryptor)
+ {
+ Assert.NotEqual(MOCK_PLAIN_STR, request.UserName!);
+ Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true);
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseRSA(autoEncrypt: false))
+ {
+ var request = GenerateMockRequestModel();
+ client.EncryptRequestSensitiveProperty(request);
+ AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
+ }
+
+ using (var client = CreateMockClientUseRSA(autoEncrypt: true))
+ {
+ var request = GenerateMockRequestModel();
+ await client.ExecuteApplyPlatformSolutionMerchantTransferReservationAsync(request);
+ AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
+ }
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseSM2(autoEncrypt: false))
+ {
+ var request = GenerateMockRequestModel();
+ client.EncryptRequestSensitiveProperty(request);
+ AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
+ }
+
+ using (var client = CreateMockClientUseSM2(autoEncrypt: true))
+ {
+ var request = GenerateMockRequestModel();
+ await client.ExecuteApplyPlatformSolutionMerchantTransferReservationAsync(request);
+ AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
+ }
+ }
+ }
+
[Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /profitsharing/orders)")]
public async Task TestEncryptRequestSensitiveProperty_CreateProfitSharingOrderRequest()
{
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs
index 00a8d18f..56042d60 100644
--- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_ResponseDecryptionTests.cs
@@ -9,7 +9,6 @@ using Xunit;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
{
using SKIT.FlurlHttpClient.Internal;
- using SKIT.FlurlHttpClient.Primitives;
public partial class TestCase_ResponseDecryptionTests
{
@@ -310,6 +309,128 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
}
}
+ [Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /ecommerce/mch-transfer/transfer-bills/out-bill-no/{out_bill_no})")]
+ public async Task TestDecryptResponseSensitiveProperty_GetEcommerceMerchantTransferBillByOutBillNumberResponse()
+ {
+ static Models.GetEcommerceMerchantTransferBillByOutBillNumberResponse GenerateMockResponseModel(Func encryptor)
+ {
+ return SetMockResponseRawStatusAsOk(new Models.GetEcommerceMerchantTransferBillByOutBillNumberResponse()
+ {
+ UserName = encryptor.Invoke(MOCK_PLAIN_STR)
+ });
+ }
+
+ static void AssertMockResponseModel(Models.GetEcommerceMerchantTransferBillByOutBillNumberResponse response)
+ {
+ Assert.Equal(MOCK_PLAIN_STR, response.UserName!);
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseRSA(autoDecrypt: false))
+ {
+ var response = GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)!);
+ client.DecryptResponseSensitiveProperty(response);
+ AssertMockResponseModel(response);
+ }
+
+ using (var client = CreateMockClientUseRSA(
+ autoDecrypt: true,
+ mockResponseContent: new SystemTextJsonSerializer().Serialize(
+ GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)!)
+ )
+ ))
+ {
+ var request = new Models.GetEcommerceMerchantTransferBillByOutBillNumberRequest();
+ var response = await client.ExecuteGetEcommerceMerchantTransferBillByOutBillNumberAsync(request);
+ AssertMockResponseModel(response);
+ }
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseSM2(autoDecrypt: false))
+ {
+ var response = GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)!);
+ client.DecryptResponseSensitiveProperty(response);
+ AssertMockResponseModel(response);
+ }
+
+ using (var client = CreateMockClientUseSM2(
+ autoDecrypt: true,
+ mockResponseContent: new SystemTextJsonSerializer().Serialize(
+ GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)!)
+ )
+ ))
+ {
+ var request = new Models.GetEcommerceMerchantTransferBillByOutBillNumberRequest();
+ var response = await client.ExecuteGetEcommerceMerchantTransferBillByOutBillNumberAsync(request);
+ AssertMockResponseModel(response);
+ }
+ }
+ }
+
+ [Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /ecommerce/mch-transfer/transfer-bills/transfer-bill-no/{transfer_bill_no})")]
+ public async Task TestDecryptResponseSensitiveProperty_GetEcommerceMerchantTransferBillByTransferBillNumberResponse()
+ {
+ static Models.GetEcommerceMerchantTransferBillByTransferBillNumberResponse GenerateMockResponseModel(Func encryptor)
+ {
+ return SetMockResponseRawStatusAsOk(new Models.GetEcommerceMerchantTransferBillByTransferBillNumberResponse()
+ {
+ UserName = encryptor.Invoke(MOCK_PLAIN_STR)
+ });
+ }
+
+ static void AssertMockResponseModel(Models.GetEcommerceMerchantTransferBillByTransferBillNumberResponse response)
+ {
+ Assert.Equal(MOCK_PLAIN_STR, response.UserName!);
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseRSA(autoDecrypt: false))
+ {
+ var response = GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)!);
+ client.DecryptResponseSensitiveProperty(response);
+ AssertMockResponseModel(response);
+ }
+
+ using (var client = CreateMockClientUseRSA(
+ autoDecrypt: true,
+ mockResponseContent: new SystemTextJsonSerializer().Serialize(
+ GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)!)
+ )
+ ))
+ {
+ var request = new Models.GetEcommerceMerchantTransferBillByTransferBillNumberRequest();
+ var response = await client.ExecuteGetEcommerceMerchantTransferBillByTransferBillNumberAsync(request);
+ AssertMockResponseModel(response);
+ }
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseSM2(autoDecrypt: false))
+ {
+ var response = GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)!);
+ client.DecryptResponseSensitiveProperty(response);
+ AssertMockResponseModel(response);
+ }
+
+ using (var client = CreateMockClientUseSM2(
+ autoDecrypt: true,
+ mockResponseContent: new SystemTextJsonSerializer().Serialize(
+ GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)!)
+ )
+ ))
+ {
+ var request = new Models.GetEcommerceMerchantTransferBillByTransferBillNumberRequest();
+ var response = await client.ExecuteGetEcommerceMerchantTransferBillByTransferBillNumberAsync(request);
+ AssertMockResponseModel(response);
+ }
+ }
+ }
+
[Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /marketing/shopping-receipt/shoppingreceipts)")]
public async Task TestDecryptResponseSensitiveProperty_UploadMarketingShoppingReceiptResponse()
{
@@ -829,6 +950,128 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
}
}
+ [Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /platsolution/mch-transfer/batches/batch-id/{batch_id}/details/detail-id/{detail_id})")]
+ public async Task TestDecryptResponseSensitiveProperty_GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse()
+ {
+ static Models.GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse GenerateMockResponseModel(Func encryptor)
+ {
+ return SetMockResponseRawStatusAsOk(new Models.GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse()
+ {
+ UserName = encryptor.Invoke(MOCK_PLAIN_STR)
+ });
+ }
+
+ static void AssertMockResponseModel(Models.GetPlatformSolutionMerchantTransferBatchDetailByDetailIdResponse response)
+ {
+ Assert.Equal(MOCK_PLAIN_STR, response.UserName!);
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseRSA(autoDecrypt: false))
+ {
+ var response = GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)!);
+ client.DecryptResponseSensitiveProperty(response);
+ AssertMockResponseModel(response);
+ }
+
+ using (var client = CreateMockClientUseRSA(
+ autoDecrypt: true,
+ mockResponseContent: new SystemTextJsonSerializer().Serialize(
+ GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)!)
+ )
+ ))
+ {
+ var request = new Models.GetPlatformSolutionMerchantTransferBatchDetailByDetailIdRequest();
+ var response = await client.ExecuteGetPlatformSolutionMerchantTransferBatchDetailByDetailIdAsync(request);
+ AssertMockResponseModel(response);
+ }
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseSM2(autoDecrypt: false))
+ {
+ var response = GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)!);
+ client.DecryptResponseSensitiveProperty(response);
+ AssertMockResponseModel(response);
+ }
+
+ using (var client = CreateMockClientUseSM2(
+ autoDecrypt: true,
+ mockResponseContent: new SystemTextJsonSerializer().Serialize(
+ GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)!)
+ )
+ ))
+ {
+ var request = new Models.GetPlatformSolutionMerchantTransferBatchDetailByDetailIdRequest();
+ var response = await client.ExecuteGetPlatformSolutionMerchantTransferBatchDetailByDetailIdAsync(request);
+ AssertMockResponseModel(response);
+ }
+ }
+ }
+
+ [Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /platsolution/mch-transfer/batches/out-batch-no/{out_batch_no}/details/out-detail-no/{out_detail_no})")]
+ public async Task TestDecryptResponseSensitiveProperty_GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse()
+ {
+ static Models.GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse GenerateMockResponseModel(Func encryptor)
+ {
+ return SetMockResponseRawStatusAsOk(new Models.GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse()
+ {
+ UserName = encryptor.Invoke(MOCK_PLAIN_STR)
+ });
+ }
+
+ static void AssertMockResponseModel(Models.GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberResponse response)
+ {
+ Assert.Equal(MOCK_PLAIN_STR, response.UserName!);
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseRSA(autoDecrypt: false))
+ {
+ var response = GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)!);
+ client.DecryptResponseSensitiveProperty(response);
+ AssertMockResponseModel(response);
+ }
+
+ using (var client = CreateMockClientUseRSA(
+ autoDecrypt: true,
+ mockResponseContent: new SystemTextJsonSerializer().Serialize(
+ GenerateMockResponseModel((plain) => Utilities.RSAUtility.EncryptWithECBByCertificate(RSA_PEM_CERTIFICATE, plain)!)
+ )
+ ))
+ {
+ var request = new Models.GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberRequest();
+ var response = await client.ExecuteGetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberAsync(request);
+ AssertMockResponseModel(response);
+ }
+ }
+
+ if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey))
+ {
+ using (var client = CreateMockClientUseSM2(autoDecrypt: false))
+ {
+ var response = GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)!);
+ client.DecryptResponseSensitiveProperty(response);
+ AssertMockResponseModel(response);
+ }
+
+ using (var client = CreateMockClientUseSM2(
+ autoDecrypt: true,
+ mockResponseContent: new SystemTextJsonSerializer().Serialize(
+ GenerateMockResponseModel((plain) => Utilities.SM2Utility.EncryptByCertificate(SM2_PEM_CERTIFICATE, plain)!)
+ )
+ ))
+ {
+ var request = new Models.GetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberRequest();
+ var response = await client.ExecuteGetPlatformSolutionMerchantTransferBatchDetailByOutDetailNumberAsync(request);
+ AssertMockResponseModel(response);
+ }
+ }
+ }
+
[Fact(DisplayName = "测试用例:解密响应中的敏感数据([GET] /smartguide/guides)")]
public async Task TestDecryptResponseSensitiveProperty_QuerySmartGuidesResponse()
{