diff --git a/docs/WechatTenpayV3/Advanced_ModelDefinition.md b/docs/WechatTenpayV3/Advanced_ModelDefinition.md index 3f677259..f5e063fc 100644 --- a/docs/WechatTenpayV3/Advanced_ModelDefinition.md +++ b/docs/WechatTenpayV3/Advanced_ModelDefinition.md @@ -41,6 +41,7 @@ | √ | 营销工具:委托营销 | 直连商户 & 服务商 | | | √ | 营销工具:消费卡 | 直连商户 & 服务商 | | | √ | 营销工具:支付有礼 | 直连商户 & 服务商 | | +| √ | 营销工具:代扣服务切卡组件 | 直连商户 & 服务商 | | | √ | 营销工具:图片上传(营销专用) | 直连商户 & 服务商 | | | × | 营销工具:现金红包 | 直连商户 & 服务商 | 官方未提供 v3 API | | √ | 营销工具:银行定向促活 | 直连商户 & 服务商 | | @@ -366,6 +367,10 @@ - 删除活动发券商户号:`DeleteMarketingPayGiftActivityMerchant` + - 代扣服务切卡组件 + + - 出行券切卡组件预下单:`CreateIndustryCouponToken` + - 图片上传(营销专用):`UploadMarketingMediaImage` - 银行定向促活 @@ -922,6 +927,10 @@ - 删除活动发券商户号:`DeleteMarketingPayGiftActivityMerchant` + - 代扣服务切卡组件 + + - 出行券切卡组件预下单:`CreateIndustryCouponToken` + - 图片上传(营销专用):`UploadMarketingMediaImage` - 资金应用 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteIndustryCouponExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteIndustryCouponExtensions.cs new file mode 100644 index 00000000..00a3c57d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteIndustryCouponExtensions.cs @@ -0,0 +1,34 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供出行券相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteIndustryCouponExtensions + { + /// + /// 异步调用 [POST] /industry-coupon/tokens 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_9_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_9_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateIndustryCouponTokenAsync(this WechatTenpayClient client, Models.CreateIndustryCouponTokenRequest 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, "industry-coupon", "tokens"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/IndustryCoupon/CreateIndustryCouponTokenRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/IndustryCoupon/CreateIndustryCouponTokenRequest.cs new file mode 100644 index 00000000..98daaeeb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/IndustryCoupon/CreateIndustryCouponTokenRequest.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /industry-coupon/tokens 接口的请求。 + /// + public class CreateIndustryCouponTokenRequest : WechatTenpayRequest + { + public static class Types + { + public class Coupon + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public int StockId { get; set; } + + /// + /// 获取或设置券 ID。 + /// + [Newtonsoft.Json.JsonProperty("coupon_id")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_id")] + public string CouponId { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置用户的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("open_id")] + [System.Text.Json.Serialization.JsonPropertyName("open_id")] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置券列表。 + /// + [Newtonsoft.Json.JsonProperty("coupon_list")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_list")] + public IList CouponList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/IndustryCoupon/CreateIndustryCouponTokenResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/IndustryCoupon/CreateIndustryCouponTokenResponse.cs new file mode 100644 index 00000000..2c92c522 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/IndustryCoupon/CreateIndustryCouponTokenResponse.cs @@ -0,0 +1,27 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /industry-coupon/tokens 接口的响应。 + /// + [WechatTenpaySensitive] + public class CreateIndustryCouponTokenResponse : WechatTenpayResponse + { + /// + /// 获取或设置切卡组件 Token。 + /// + [Newtonsoft.Json.JsonProperty("token")] + [System.Text.Json.Serialization.JsonPropertyName("token")] + public string Token { get; set; } = default!; + + /// + /// 获取或设置 Token 过期时间。 + /// + [Newtonsoft.Json.JsonProperty("expires_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("expires_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ExpireTime { get; set; } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/IndustryCoupon/CreateIndustryCouponTokenRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/IndustryCoupon/CreateIndustryCouponTokenRequest.json new file mode 100644 index 00000000..da97c0a7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/IndustryCoupon/CreateIndustryCouponTokenRequest.json @@ -0,0 +1,9 @@ +{ + "coupon_list": [ + { + "coupon_id": "11004999626", + "stock_id": 16474341 + } + ], + "open_id": "obLatjrR8kUDlj4-nofQsPAJAAFI" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/IndustryCoupon/CreateIndustryCouponTokenResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/IndustryCoupon/CreateIndustryCouponTokenResponse.json new file mode 100644 index 00000000..7cdc164c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/IndustryCoupon/CreateIndustryCouponTokenResponse.json @@ -0,0 +1,4 @@ +{ + "expires_time": "2015-05-20T13:29:35+08:00", + "token": "16824f40-aec1-11e8-a69c-f7a44da04f19" +}