diff --git a/docs/WechatTenpayV3/Basic_ModelDefinition.md b/docs/WechatTenpayV3/Basic_ModelDefinition.md index d1222619..337244a0 100644 --- a/docs/WechatTenpayV3/Basic_ModelDefinition.md +++ b/docs/WechatTenpayV3/Basic_ModelDefinition.md @@ -82,6 +82,7 @@ | √ | 其他:微信点餐订单 | 合作伙伴 | | | √ | 其他:微信寄快递 | 合作伙伴 | | | √ | 其他:品牌小店营销 | 合作伙伴 | | +| √ | 其他:银行多笔立减 | 直连商户 | | | √ | 其他:银行定向促活 | 直连商户 & 合作伙伴 | | | √ | 其他:银行提现免费券 | 合作伙伴 | | | √ | 其他:银行周周惠 | 合作伙伴 | | @@ -580,6 +581,12 @@ - 发放消费卡:`SendMarketingBusifavorCoupon` + - 银行多笔立减 + + - 查询绑定多笔立减活动的代金券详情:`GetMarketingBankFavorUserCoupon` + + - 给指定用户报名多笔立减活动:`SendMarketingBankFavorUserBankMultipleActivityCoupon` + - 银行定向促活 - 导入定向用户协议号:`UploadMarketingBankPackagesTasks` diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingBankFavorExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingBankFavorExtensions.cs new file mode 100644 index 00000000..b3d7a91d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingBankFavorExtensions.cs @@ -0,0 +1,59 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + public static class WechatTenpayClientExecuteMarketingBankFavorExtensions + { + /// + /// 异步调用 [GET] /marketing/bank-favor/users/{openid}/coupons/{coupon_id} 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteGetMarketingBankFavorUserCouponAsync(this WechatTenpayClient client, Models.GetMarketingBankFavorUserCouponRequest 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, "marketing", "bank-favor", "users", request.OpenId, "coupons", request.CouponId) + .SetQueryParam("appid", request.AppId); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + /// 异步调用 [POST] /marketing/bank-favor/users/{openid}/bank-multi-activity 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteSendMarketingBankFavorUserBankMultipleActivityCouponAsync(this WechatTenpayClient client, Models.SendMarketingBankFavorUserBankMultipleActivityCouponRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (request.StockCreatorMerchantId is null) + request.StockCreatorMerchantId = client.Credentials.MerchantId; + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "marketing", "bank-favor", "users", request.OpenId, "bank-multi-activity"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/GetMarketingBankFavorUserCouponRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/GetMarketingBankFavorUserCouponRequest.cs new file mode 100644 index 00000000..a9e80cbb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/GetMarketingBankFavorUserCouponRequest.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/bank-favor/users/{openid}/coupons/{coupon_id} 接口的请求。 + /// + public class GetMarketingBankFavorUserCouponRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户 OpenId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置代金券 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string CouponId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/GetMarketingBankFavorUserCouponResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/GetMarketingBankFavorUserCouponResponse.cs new file mode 100644 index 00000000..01a70a58 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/GetMarketingBankFavorUserCouponResponse.cs @@ -0,0 +1,135 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/bank-favor/users/{openid}/coupons/{coupon_id} 接口的响应。 + /// + public class GetMarketingBankFavorUserCouponResponse : WechatTenpayResponse + { + public static class Types + { + public class UsedAmountList + { + /// + /// 获取或设置已用金额列表(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("used_amounts")] + [System.Text.Json.Serialization.JsonPropertyName("used_amounts")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public int[] Items { get; set; } = default!; + } + } + + /// + /// 获取或设置批次 ID。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置创建批次的商户号。 + /// + [Newtonsoft.Json.JsonProperty("stock_creator_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("stock_creator_mchid")] + public string StockCreatorMerchantId { get; set; } = default!; + + /// + /// 获取或设置代金券 ID。 + /// + [Newtonsoft.Json.JsonProperty("coupon_id")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_id")] + public string CouponId { get; set; } = default!; + + /// + /// 获取或设置代金券名称。 + /// + [Newtonsoft.Json.JsonProperty("coupon_name")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_name")] + public string CouponName { get; set; } = default!; + + /// + /// 获取或设置代金券状态。 + /// + [Newtonsoft.Json.JsonProperty("coupon_state")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_state")] + public string CouponState { get; set; } = default!; + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置领券时间。 + /// + [Newtonsoft.Json.JsonProperty("receive_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("receive_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))] + public DateTimeOffset ReceiveTime { get; set; } + + /// + /// 获取或设置券可使用开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableBeginTime { get; set; } + + /// + /// 获取或设置券可使用结束时间。 + /// + [Newtonsoft.Json.JsonProperty("available_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableEndTime { get; set; } + + /// + /// 获取或设置用户 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置多笔立减活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { get; set; } = default!; + + /// + /// 获取或设置券最大使用次数。 + /// + [Newtonsoft.Json.JsonProperty("max_use_number")] + [System.Text.Json.Serialization.JsonPropertyName("max_use_number")] + public int MaxUseCount { get; set; } + + /// + /// 获取或设置券剩余可用次数。 + /// + [Newtonsoft.Json.JsonProperty("available_number")] + [System.Text.Json.Serialization.JsonPropertyName("available_number")] + public int AvailableCount { get; set; } + + /// + /// 获取或设置券已使用次数。 + /// + [Newtonsoft.Json.JsonProperty("used_number")] + [System.Text.Json.Serialization.JsonPropertyName("used_number")] + public int UsedCount { get; set; } + + /// + /// 获取或设置已用金额列表。 + /// + [Newtonsoft.Json.JsonProperty("use_amount_list")] + [System.Text.Json.Serialization.JsonPropertyName("use_amount_list")] + public Types.UsedAmountList? UsedAmountList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponRequest.cs new file mode 100644 index 00000000..1c8f7fda --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponRequest.cs @@ -0,0 +1,50 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/bank-favor/users/{openid}/bank-multi-activity 接口的请求。 + /// + public class SendMarketingBankFavorUserBankMultipleActivityCouponRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次 ID。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置创建批次的商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("stock_creator_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("stock_creator_mchid")] + public string? StockCreatorMerchantId { get; set; } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户 OpenId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置多笔立减活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { get; set; } = string.Empty; + + /// + /// 获取或设置商户单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponResponse.cs new file mode 100644 index 00000000..c460068b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponResponse.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/bank-favor/users/{openid}/bank-multi-activity 接口的响应。 + /// + public class SendMarketingBankFavorUserBankMultipleActivityCouponResponse : WechatTenpayResponse + { + /// + /// 获取或设置代金券 ID。 + /// + [Newtonsoft.Json.JsonProperty("coupon_id")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_id")] + public string CouponId { get; set; } = default!; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/MarketingBankFavor/GetMarketingBankFavorUserCouponResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/MarketingBankFavor/GetMarketingBankFavorUserCouponResponse.json new file mode 100644 index 00000000..13c86efc --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/MarketingBankFavor/GetMarketingBankFavorUserCouponResponse.json @@ -0,0 +1,20 @@ +{ + "stock_creator_mchid": "9800064", + "stock_id": "9865888", + "coupon_id": "98674556", + "coupon_name": "微信支付代金券", + "coupon_state": "COUPON_STATE_UNKNOW", + "receive_time": "2015-05-20T13:29:35.120+08:00", + "available_begin_time": "2015-05-20T13:29:35.120+08:00", + "available_end_time": "2015-05-20T13:29:35.120+08:00", + "activity_id": "186745560", + "max_use_number": 5, + "available_number": 3, + "used_number": 2, + "use_amount_list": { + "used_amounts": [ + "200" + ] + }, + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponRequest.json new file mode 100644 index 00000000..2cab1759 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponRequest.json @@ -0,0 +1,7 @@ +{ + "stock_id": "9865888", + "activity_id": "186745560", + "out_request_no": "6122352020010133287985742", + "appid": "wx57849631bb367f52", + "stock_creator_mchid": "9800064" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponResponse.json new file mode 100644 index 00000000..80c63b5e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/MarketingBankFavor/SendMarketingBankFavorUserBankMultipleActivityCouponResponse.json @@ -0,0 +1,3 @@ +{ + "coupon_id": "9856888" +}