From efea78944119490bf2b4fc952574df6f4f6f2cf8 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Thu, 30 Mar 2023 23:14:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(tenpayv3):=20=E6=96=B0=E5=A2=9E=E7=A7=9F?= =?UTF-8?q?=E7=94=A8=E5=85=85=E7=94=B5=E5=AE=9D=E9=9A=94=E5=A4=9C=E5=BD=92?= =?UTF-8?q?=E8=BF=98=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 | 1 + ...payClientExecuteHirePowerBankExtensions.cs | 72 +++++++++++++++++ ...reateHirePowerBankInsuranceOrderRequest.cs | 36 +++++++++ ...eateHirePowerBankInsuranceOrderResponse.cs | 9 +++ ...nkInsuranceOrderByOutOrderNumberRequest.cs | 15 ++++ ...kInsuranceOrderByOutOrderNumberResponse.cs | 79 +++++++++++++++++++ ...werBankUserQualificationByOpenIdRequest.cs | 15 ++++ ...erBankUserQualificationByOpenIdResponse.cs | 15 ++++ ...ateHirePowerBankInsuranceOrderRequest.json | 6 ++ ...teHirePowerBankInsuranceOrderResponse.json | 11 +++ ...nsuranceOrderByOutOrderNumberResponse.json | 11 +++ ...BankUserQualificationByOpenIdResponse.json | 3 + 12 files changed, 273 insertions(+) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHirePowerBankExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/CreateHirePowerBankInsuranceOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/CreateHirePowerBankInsuranceOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdResponse.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/CreateHirePowerBankInsuranceOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/CreateHirePowerBankInsuranceOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdResponse.json diff --git a/docs/WechatTenpayV3/Basic_ModelDefinition.md b/docs/WechatTenpayV3/Basic_ModelDefinition.md index dcc6a6be..809cecd5 100644 --- a/docs/WechatTenpayV3/Basic_ModelDefinition.md +++ b/docs/WechatTenpayV3/Basic_ModelDefinition.md @@ -45,6 +45,7 @@ | √ | 行业方案:电商收付通 | 服务商 | | | √ | 行业方案:智慧商圈 | 直连商户 & 服务商 | | | √ | 行业方案:微信支付分停车服务 | 直连商户 & 服务商 | | +| √ | 行业方案:租用充电宝隔夜归还 | 直连商户 | | | √ | 营销工具:代金券 | 直连商户 & 服务商 | | | √ | 营销工具:商家券 | 直连商户 & 服务商 | | | √ | 营销工具:委托营销 | 直连商户 & 服务商 | | diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHirePowerBankExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHirePowerBankExtensions.cs new file mode 100644 index 00000000..7942a9e1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHirePowerBankExtensions.cs @@ -0,0 +1,72 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供租用充电宝隔夜归还相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteHirePowerBankExtensions + { + /// + /// 异步调用 [POST] /hire-power-bank/insurance-orders 接口。 + /// REF: https://pay.weixin.qq.com/docs/merchant/apis/hire-power-bank-insurance/insurance-orders/create-insurance-order.html + /// + /// + /// + /// + /// + public static async Task ExecuteCreateHirePowerBankInsuranceOrderAsync(this WechatTenpayClient client, Models.CreateHirePowerBankInsuranceOrderRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "hire-power-bank", "insurance-orders"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /hire-power-bank/insurance-orders/{out_order_no} 接口。 + /// REF: https://pay.weixin.qq.com/docs/merchant/apis/hire-power-bank-insurance/insurance-orders/get-by-out-trade-no.html + /// + /// + /// + /// + /// + public static async Task ExecuteGetHirePowerBankInsuranceOrderByOutOrderNumberAsync(this WechatTenpayClient client, Models.GetHirePowerBankInsuranceOrderByOutOrderNumberRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Get, "hire-power-bank", "insurance-orders", request.OutOrderNumber); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /hire-power-bank/user-qualifications/{openid} 接口。 + /// REF: https://pay.weixin.qq.com/docs/merchant/apis/hire-power-bank-insurance/insurance-orders/get-qualification-by-open-id.html + /// + /// + /// + /// + /// + public static async Task ExecuteGetHirePowerBankUserQualificationByOpenIdAsync(this WechatTenpayClient client, Models.GetHirePowerBankUserQualificationByOpenIdRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Get, "hire-power-bank", "user-qualifications", request.OpenId); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/CreateHirePowerBankInsuranceOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/CreateHirePowerBankInsuranceOrderRequest.cs new file mode 100644 index 00000000..040509cc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/CreateHirePowerBankInsuranceOrderRequest.cs @@ -0,0 +1,36 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /hire-power-bank/insurance-orders 接口的请求。 + /// + public class CreateHirePowerBankInsuranceOrderRequest : WechatTenpayRequest + { + /// + /// 获取或设置商户保险订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { 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("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string NotifyUrl { get; set; } = string.Empty; + + /// + /// 获取或设置支付分服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string? ServiceId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/CreateHirePowerBankInsuranceOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/CreateHirePowerBankInsuranceOrderResponse.cs new file mode 100644 index 00000000..2e361fa7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/CreateHirePowerBankInsuranceOrderResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /hire-power-bank/insurance-orders 接口的响应。 + /// + public class CreateHirePowerBankInsuranceOrderResponse : GetHirePowerBankInsuranceOrderByOutOrderNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberRequest.cs new file mode 100644 index 00000000..fd818df6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /hire-power-bank/insurance-orders/{out_order_no} 接口的请求。 + /// + public class GetHirePowerBankInsuranceOrderByOutOrderNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置商户保险订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutOrderNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberResponse.cs new file mode 100644 index 00000000..a5a2944b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberResponse.cs @@ -0,0 +1,79 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /hire-power-bank/insurance-orders/{out_order_no} 接口的响应。 + /// + public class GetHirePowerBankInsuranceOrderByOutOrderNumberResponse : WechatTenpayResponse + { + /// + /// 获取或设置商户保险订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置保险订单 ID。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + + /// + /// 获取或设置用户的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置最大理赔次数。 + /// + [Newtonsoft.Json.JsonProperty("max_claim_count")] + [System.Text.Json.Serialization.JsonPropertyName("max_claim_count")] + public int MaxClaimCount { get; set; } + + /// + /// 获取或设置已理赔次数。 + /// + [Newtonsoft.Json.JsonProperty("claimed_count")] + [System.Text.Json.Serialization.JsonPropertyName("claimed_count")] + public int ClaimedCount { get; set; } + + /// + /// 获取或设置保险订单领取状态。 + /// + [Newtonsoft.Json.JsonProperty("order_receive_state")] + [System.Text.Json.Serialization.JsonPropertyName("order_receive_state")] + public string ReceiveState { get; set; } = default!; + + /// + /// 获取或设置保险订单领取时间。 + /// + [Newtonsoft.Json.JsonProperty("order_receive_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("order_receive_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ReceiveTime { get; set; } + + /// + /// 获取或设置保险订单开始时间。 + /// + [Newtonsoft.Json.JsonProperty("order_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("order_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? BeginTime { get; set; } + + /// + /// 获取或设置保险订单结束时间。 + /// + [Newtonsoft.Json.JsonProperty("order_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("order_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? EndTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdRequest.cs new file mode 100644 index 00000000..6c99b7bd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /hire-power-bank/user-qualifications/{openid} 接口的请求。 + /// + public class GetHirePowerBankUserQualificationByOpenIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置用户的 OpenId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdResponse.cs new file mode 100644 index 00000000..6f2aedde --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdResponse.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /hire-power-bank/user-qualifications/{openid} 接口的响应。 + /// + public class GetHirePowerBankUserQualificationByOpenIdResponse : WechatTenpayResponse + { + /// + /// 获取或设置是否具有领取资格。 + /// + [Newtonsoft.Json.JsonProperty("qualified_user")] + [System.Text.Json.Serialization.JsonPropertyName("qualified_user")] + public bool IsQualifiedUser { get; set; } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/CreateHirePowerBankInsuranceOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/CreateHirePowerBankInsuranceOrderRequest.json new file mode 100644 index 00000000..5cdb3201 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/CreateHirePowerBankInsuranceOrderRequest.json @@ -0,0 +1,6 @@ +{ + "out_order_no": "6e8369071cd942c0476613f9d1ce9ca3", + "openid": "实例值", + "notify_url": "https://api.test.com", + "service_id": "实例值" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/CreateHirePowerBankInsuranceOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/CreateHirePowerBankInsuranceOrderResponse.json new file mode 100644 index 00000000..479f20ce --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/CreateHirePowerBankInsuranceOrderResponse.json @@ -0,0 +1,11 @@ +{ + "order_id": "1234323JKHDFE1243252", + "out_order_no": "6e8369071cd942c0476613f9d1ce9ca3", + "openid": "2323dfsdf342342", + "max_claim_count": 3, + "claimed_count": 1, + "order_receive_time": "2015-05-20T13:29:35.120+08:00", + "order_begin_time": "2015-05-20T13:29:35.120+08:00", + "order_end_time": "2015-05-20T13:29:35.120+08:00", + "order_receive_state": "RECEIVING" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberResponse.json new file mode 100644 index 00000000..479f20ce --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/GetHirePowerBankInsuranceOrderByOutOrderNumberResponse.json @@ -0,0 +1,11 @@ +{ + "order_id": "1234323JKHDFE1243252", + "out_order_no": "6e8369071cd942c0476613f9d1ce9ca3", + "openid": "2323dfsdf342342", + "max_claim_count": 3, + "claimed_count": 1, + "order_receive_time": "2015-05-20T13:29:35.120+08:00", + "order_begin_time": "2015-05-20T13:29:35.120+08:00", + "order_end_time": "2015-05-20T13:29:35.120+08:00", + "order_receive_state": "RECEIVING" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdResponse.json new file mode 100644 index 00000000..6ed25c2f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/HirePowerBank/GetHirePowerBankUserQualificationByOpenIdResponse.json @@ -0,0 +1,3 @@ +{ + "qualified_user": true +}