From 17b8478115b51a9448707f3c3879867338b6ce06 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 14 Mar 2025 09:45:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(tenpayv3):=20=E6=96=B0=E5=A2=9E=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E6=94=B6=E4=BB=98=E9=80=9A=E8=B5=84=E9=87=91=E5=87=BA?= =?UTF-8?q?=E5=A2=83=E9=80=80=E5=9B=9E=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/WechatTenpayV3/Basic_ModelDefinition.md | 4 + ...ayClientExecuteFundsToOverseaExtensions.cs | 54 ++++++++++- .../CreateFundsToOverseaReturnOrderRequest.cs | 50 ++++++++++ ...CreateFundsToOverseaReturnOrderResponse.cs | 9 ++ ...rseaReturnOrderByOutReturnNumberRequest.cs | 22 +++++ ...seaReturnOrderByOutReturnNumberResponse.cs | 91 +++++++++++++++++++ ...reateFundsToOverseaReturnOrderRequest.json | 8 ++ ...eateFundsToOverseaReturnOrderResponse.json | 13 +++ ...aReturnOrderByOutReturnNumberResponse.json | 13 +++ 9 files changed, 260 insertions(+), 4 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberResponse.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberResponse.json diff --git a/docs/WechatTenpayV3/Basic_ModelDefinition.md b/docs/WechatTenpayV3/Basic_ModelDefinition.md index f84313dd..9f919d93 100644 --- a/docs/WechatTenpayV3/Basic_ModelDefinition.md +++ b/docs/WechatTenpayV3/Basic_ModelDefinition.md @@ -998,6 +998,10 @@ - 获取购付汇账单文件下载链接:`GetFundsToOverseaBillDownloadUrl` + - 申请资金出境退回:`CreateFundsToOverseaReturnOrder` + + - 查询出境退回结果:`GetFundsToOverseaReturnOrderByOutReturnNumber` + - 平台收付通(下载账单) - 申请交易账单:`GetBillTradeBill` diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteFundsToOverseaExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteFundsToOverseaExtensions.cs index ad467a63..086f5920 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteFundsToOverseaExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteFundsToOverseaExtensions.cs @@ -13,7 +13,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// 异步调用 [GET] /funds-to-oversea/transactions/{transaction_id}/available_abroad_amounts 接口。 /// /// REF:
- /// + /// ///
/// /// @@ -36,7 +36,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// 异步调用 [POST] /funds-to-oversea/orders 接口。 /// /// REF:
- /// + /// ///
/// /// @@ -58,7 +58,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// 异步调用 [GET] /funds-to-oversea/orders/{out_order_id} 接口。 /// /// REF:
- /// + /// ///
/// /// @@ -82,7 +82,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// 异步调用 [GET] /funds-to-oversea/bill-download-url 接口。 /// /// REF:
- /// + /// ///
/// /// @@ -101,5 +101,51 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); } + + /// + /// 异步调用 [POST] /funds-to-oversea/return/return-orders 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteCreateFundsToOverseaReturnOrderAsync(this WechatTenpayClient client, Models.CreateFundsToOverseaReturnOrderRequest 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, "funds-to-oversea", "return", "return-orders"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [GET] /funds-to-oversea/return/return-orders/out-return-no/{out_return_no} 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteGetFundsToOverseaReturnOrderByOutReturnNumberAsync(this WechatTenpayClient client, Models.GetFundsToOverseaReturnOrderByOutReturnNumberRequest 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, "funds-to-oversea", "return", "return-orders", "out-return-no", request.OutReturnNumber) + .SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderRequest.cs new file mode 100644 index 00000000..6636b8a1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderRequest.cs @@ -0,0 +1,50 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /funds-to-oversea/return/return-orders 接口的请求。 + /// + public class CreateFundsToOverseaReturnOrderRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置商户出境退回单号。 + /// + [Newtonsoft.Json.JsonProperty("out_return_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_return_no")] + public string OutReturnNumber { get; set; } = string.Empty; + + /// + /// 获取或设置商户出境单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_id")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_id")] + public string OutOrderId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { get; set; } = string.Empty; + + /// + /// 获取或设置退回金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderResponse.cs new file mode 100644 index 00000000..de4f02ff --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /funds-to-oversea/return/return-orders 接口的响应。 + /// + public class CreateFundsToOverseaReturnOrderResponse : GetFundsToOverseaReturnOrderByOutReturnNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberRequest.cs new file mode 100644 index 00000000..ad8e618b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /funds-to-oversea/return/return-orders/out-return-no/{out_return_no} 接口的请求。 + /// + public class GetFundsToOverseaReturnOrderByOutReturnNumberRequest : 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 OutReturnNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberResponse.cs new file mode 100644 index 00000000..0129ea39 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberResponse.cs @@ -0,0 +1,91 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /funds-to-oversea/return/return-orders/out-return-no/{out_return_no} 接口的响应。 + /// + public class GetFundsToOverseaReturnOrderByOutReturnNumberResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置商户出境退回单号。 + /// + [Newtonsoft.Json.JsonProperty("out_return_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_return_no")] + public string OutReturnNumber { get; set; } = default!; + + /// + /// 获取或设置微信出境退回单号。 + /// + [Newtonsoft.Json.JsonProperty("return_id")] + [System.Text.Json.Serialization.JsonPropertyName("return_id")] + public string ReturnId { get; set; } = default!; + + /// + /// 获取或设置商户出境单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_id")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_id")] + public string OutOrderId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { get; set; } = default!; + + /// + /// 获取或设置退回金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置出境退回状态。 + /// + [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("success_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("success_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))] + public DateTimeOffset? SuccessTime { get; set; } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderRequest.json new file mode 100644 index 00000000..98d05abb --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderRequest.json @@ -0,0 +1,8 @@ +{ + "out_return_no": "R20250220103930", + "sub_mchid": "1900000109", + "out_order_id": "merchant_1123123", + "transaction_id": "420000000000000010", + "refund_id": "5017752501201407033233368018", + "amount": 100 +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderResponse.json new file mode 100644 index 00000000..161a1a6c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/CreateFundsToOverseaReturnOrderResponse.json @@ -0,0 +1,13 @@ +{ + "out_return_no": "R20250220103930", + "sub_mchid": "1900000109", + "return_id": "2375897293812", + "out_order_id": "merchant_1123123", + "transaction_id": "420000000000000010", + "refund_id": "5017752501201407033233368018", + "amount": 100, + "state": "PROCESSING", + "create_time": "2025-02-20T10:29:35+08:00", + "success_time": "2025-02-22T10:29:35+08:00", + "fail_reason": "RETURN_AMOUNT_NOT_ENOUGH" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberResponse.json new file mode 100644 index 00000000..161a1a6c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/FundsToOversea/GetFundsToOverseaReturnOrderByOutReturnNumberResponse.json @@ -0,0 +1,13 @@ +{ + "out_return_no": "R20250220103930", + "sub_mchid": "1900000109", + "return_id": "2375897293812", + "out_order_id": "merchant_1123123", + "transaction_id": "420000000000000010", + "refund_id": "5017752501201407033233368018", + "amount": 100, + "state": "PROCESSING", + "create_time": "2025-02-20T10:29:35+08:00", + "success_time": "2025-02-22T10:29:35+08:00", + "fail_reason": "RETURN_AMOUNT_NOT_ENOUGH" +}