diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMemberCardOpenExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMemberCardOpenExtensions.cs
new file mode 100644
index 00000000..957cdbe2
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMemberCardOpenExtensions.cs
@@ -0,0 +1,157 @@
+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 WechatTenpayClientExecuteMarketingMemberCardOpenExtensions
+ {
+ ///
+ /// 异步调用 [POST] /marketing/membercard-open/cards 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter3_1.shtml
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCreateMarketingMemberCardOpenCardAsync(this WechatTenpayClient client, Models.CreateMarketingMemberCardOpenCardRequest 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, "marketing", "membercard-open", "cards");
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /marketing/membercard-open/cards/{card_id}/upgrade 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter3_6.shtml
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUpgradeMarketingMemberCardOpenCardAsync(this WechatTenpayClient client, Models.UpgradeMarketingMemberCardOpenCardRequest 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, "marketing", "membercard-open", "cards", request.CardId, "upgrade");
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /marketing/membercard-open/cards/{card_id}/codes/deposit 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter3_7.shtml
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteDepositMarketingMemberCardOpenCardCodesAsync(this WechatTenpayClient client, Models.DepositMarketingMemberCardOpenCardCodesRequest 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, "marketing", "membercard-open", "cards", request.CardId, "codes", "deposit");
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /marketing/membercard-open/cards 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter3_3.shtml
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteQueryMarketingMemberCardOpenCardsAsync(this WechatTenpayClient client, Models.QueryMarketingMemberCardOpenCardsRequest 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, "marketing", "membercard-open", "cards")
+ .SetQueryParam("appid", request.AppId);
+
+ if (request.BrandId != null)
+ flurlReq.SetQueryParam("brand_id", request.BrandId);
+
+ if (request.Limit != null)
+ flurlReq.SetQueryParam("limit", request.Limit.Value.ToString());
+
+ if (request.Offset != null)
+ flurlReq.SetQueryParam("offset", request.Offset.Value.ToString());
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /marketing/membercard-open/cards/{card_id} 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter3_2.shtml
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetMarketingMemberCardOpenCardByCardIdAsync(this WechatTenpayClient client, Models.GetMarketingMemberCardOpenCardByCardIdRequest 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, "marketing", "membercard-open", "cards", request.CardId);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [PATCH] /marketing/membercard-open/cards/{card_id} 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter3_2.shtml
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUpdateMarketingMemberCardOpenCardAsync(this WechatTenpayClient client, Models.UpdateMarketingMemberCardOpenCardRequest 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, new HttpMethod("PATCH"), "marketing", "membercard-open", "cards", request.CardId);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [DELETE] /marketing/membercard-open/cards/{card_id} 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter3_11.shtml
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteDeleteMarketingMemberCardOpenCardAsync(this WechatTenpayClient client, Models.DeleteMarketingMemberCardOpenCardRequest 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.Delete, "marketing", "membercard-open", "cards", request.CardId);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardRequest.cs
new file mode 100644
index 00000000..ff97ea1a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardRequest.cs
@@ -0,0 +1,305 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /marketing/membercard-open/cards 接口的请求。
+ ///
+ public class CreateMarketingMemberCardOpenCardRequest : WechatTenpayRequest
+ {
+ public static class Types
+ {
+ public class Brand
+ {
+ ///
+ /// 获取或设置品牌 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("brand_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("brand_id")]
+ public string BrandId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置展示名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("display_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("display_name")]
+ public string DisplayName { get; set; } = string.Empty;
+ }
+
+ public class Date
+ {
+ ///
+ /// 获取或设置有效期类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("type")]
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public string Type { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置有效期开始时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("available_begin_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
+ public DateTimeOffset? AvailableBeginTime { get; set; }
+
+ ///
+ /// 获取或设置有效期结束时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("available_end_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("available_end_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
+ public DateTimeOffset? AvailableEndTime { get; set; }
+
+ ///
+ /// 获取或设置领取后 N 天内有效。
+ ///
+ [Newtonsoft.Json.JsonProperty("available_day_after_receive")]
+ [System.Text.Json.Serialization.JsonPropertyName("available_day_after_receive")]
+ public int? AvailableDaysAfterReceive { get; set; }
+
+ ///
+ /// 获取或设置领取后 N 天后生效。
+ ///
+ [Newtonsoft.Json.JsonProperty("wait_days_after_receive")]
+ [System.Text.Json.Serialization.JsonPropertyName("wait_days_after_receive")]
+ public int? WaitDaysAfterReceive { get; set; }
+ }
+
+ public class Balance
+ {
+ ///
+ /// 获取或设置是否支持储值。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_balance")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_balance")]
+ public bool? RequireBalance { get; set; }
+
+ ///
+ /// 获取或设置储值小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_appid")]
+ public string? MiniProgramAppId { get; set; }
+
+ ///
+ /// 获取或设置储值小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_path")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_path")]
+ public string? MiniProgramPath { get; set; }
+
+ ///
+ /// 获取或设置储值 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_url")]
+ public string? Url { get; set; }
+ }
+
+ public class UserForm
+ {
+ public static class Types
+ {
+ public class CustomField
+ {
+ ///
+ /// 获取或设置字段类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("type")]
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public string Type { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置字段名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置字段值。
+ ///
+ [Newtonsoft.Json.JsonProperty("values")]
+ [System.Text.Json.Serialization.JsonPropertyName("values")]
+ public IList? Values { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置平台提供的通用开卡信息字段列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("common_field_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("common_field_list")]
+ public IList? CommonFieldList { get; set; }
+
+ ///
+ /// 获取或设置商户自定义的开卡信息字段列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("custom_field_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("custom_field_list")]
+ public IList? CustomFieldList { get; set; }
+ }
+
+ public class AdditionalStatement
+ {
+ ///
+ /// 获取或设置标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string? Title { get; set; }
+
+ ///
+ /// 获取或设置小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string? MiniProgramAppId { get; set; }
+
+ ///
+ /// 获取或设置小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("path")]
+ [System.Text.Json.Serialization.JsonPropertyName("path")]
+ public string? MiniProgramPath { get; set; }
+
+ ///
+ /// 获取或设置 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("url")]
+ [System.Text.Json.Serialization.JsonPropertyName("url")]
+ public string? Url { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置公众号 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置会员卡 Logo 媒体文件地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("logo_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("logo_url")]
+ public string LogoMediaUrl { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置品牌信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("brand")]
+ [System.Text.Json.Serialization.JsonPropertyName("brand")]
+ public Types.Brand Brand { get; set; } = new Types.Brand();
+
+ ///
+ /// 获取或设置卡名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置背景图片媒体文件地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("background_picture_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("background_picture_url")]
+ public string BackgroundPictureMediaUrl { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置使用须知。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string? Description { get; set; }
+
+ ///
+ /// 获取或设置客服电话。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("service_phone")]
+ public string? ServicePhone { get; set; }
+
+ ///
+ /// 获取或设置会员码型。
+ ///
+ [Newtonsoft.Json.JsonProperty("code_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("code_type")]
+ public string CodeType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置会员卡总库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_quantity")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_quantity")]
+ public int? TotalQuantity { get; set; }
+
+ ///
+ /// 获取或设置有效期。
+ ///
+ [Newtonsoft.Json.JsonProperty("date_information")]
+ [System.Text.Json.Serialization.JsonPropertyName("date_information")]
+ public Types.Date Date { get; set; } = new Types.Date();
+
+ ///
+ /// 获取或设置会员卡 Code 分配类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("code_mode")]
+ [System.Text.Json.Serialization.JsonPropertyName("code_mode")]
+ public string? CodeMode { get; set; }
+
+ ///
+ /// 获取或设置是否展示会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_display_level")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_display_level")]
+ public bool? RequireDisplayLevel { get; set; }
+
+ ///
+ /// 获取或设置会员初始等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("init_level")]
+ [System.Text.Json.Serialization.JsonPropertyName("init_level")]
+ public string? InitializedLevel { get; set; }
+
+ ///
+ /// 获取或设置商户请求单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_request_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_request_no")]
+ public string OutRequestNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置储值信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_information")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_information")]
+ public Types.Balance? Balance { get; set; }
+
+ ///
+ /// 获取或设置开卡信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_information_form")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_information_form")]
+ public Types.UserForm? UserForm { get; set; }
+
+ ///
+ /// 获取或设置补充说明信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("additional_statement")]
+ [System.Text.Json.Serialization.JsonPropertyName("additional_statement")]
+ public Types.AdditionalStatement? AdditionalStatement { get; set; }
+
+ ///
+ /// 获取或设置是否启用动态码。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_dynamic_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_dynamic_code")]
+ public bool? RequireDynamicCode { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardResponse.cs
new file mode 100644
index 00000000..fabbb274
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /marketing/membercard-open/cards 接口的响应。
+ ///
+ public class CreateMarketingMemberCardOpenCardResponse : GetMarketingMemberCardOpenCardByCardIdResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DeleteMarketingMemberCardOpenCardRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DeleteMarketingMemberCardOpenCardRequest.cs
new file mode 100644
index 00000000..8c629f19
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DeleteMarketingMemberCardOpenCardRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [DELETE] /marketing/membercard-open/cards/{card_id} 接口的请求。
+ ///
+ public class DeleteMarketingMemberCardOpenCardRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置会员卡 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string CardId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DeleteMarketingMemberCardOpenCardResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DeleteMarketingMemberCardOpenCardResponse.cs
new file mode 100644
index 00000000..eec4bd4e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DeleteMarketingMemberCardOpenCardResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [DELETE] /marketing/membercard-open/cards/{card_id} 接口的响应。
+ ///
+ public class DeleteMarketingMemberCardOpenCardResponse : WechatTenpayResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesRequest.cs
new file mode 100644
index 00000000..500246ff
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesRequest.cs
@@ -0,0 +1,24 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /marketing/membercard-open/cards/{card_id}/codes/deposit 接口的请求。
+ ///
+ public class DepositMarketingMemberCardOpenCardCodesRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置会员卡 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string CardId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置会员卡 Code 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("code")]
+ [System.Text.Json.Serialization.JsonPropertyName("code")]
+ public IList CodeList { get; set; } = new List();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesResponse.cs
new file mode 100644
index 00000000..efde06ff
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesResponse.cs
@@ -0,0 +1,35 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /marketing/membercard-open/cards/{card_id}/codes/deposit 接口的响应。
+ ///
+ public class DepositMarketingMemberCardOpenCardCodesResponse : WechatTenpayResponse
+ {
+ public static class Types
+ {
+ public class Result
+ {
+ ///
+ /// 获取或设置会员卡 Code。
+ ///
+ [Newtonsoft.Json.JsonProperty("code")]
+ [System.Text.Json.Serialization.JsonPropertyName("code")]
+ public string Code { get; set; } = default!;
+
+ ///
+ /// 获取或设置错误信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("result")]
+ [System.Text.Json.Serialization.JsonPropertyName("result")]
+ public string ErrorMessage { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置结果列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Result[] ResultList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdRequest.cs
new file mode 100644
index 00000000..93afa9eb
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /marketing/membercard-open/cards/{card_id} 接口的请求。
+ ///
+ public class GetMarketingMemberCardOpenCardByCardIdRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置会员卡 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string CardId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdResponse.cs
new file mode 100644
index 00000000..cf631d0f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdResponse.cs
@@ -0,0 +1,581 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /marketing/membercard-open/cards/{card_id} 接口的响应。
+ ///
+ public class GetMarketingMemberCardOpenCardByCardIdResponse : WechatTenpayResponse
+ {
+ public static class Types
+ {
+ public class Brand
+ {
+ ///
+ /// 获取或设置品牌 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("brand_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("brand_id")]
+ public string BrandId { get; set; } = default!;
+
+ ///
+ /// 获取或设置展示名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("display_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("display_name")]
+ public string DisplayName { get; set; } = default!;
+ }
+
+ public class Date
+ {
+ ///
+ /// 获取或设置有效期类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("type")]
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public string Type { get; set; } = default!;
+
+ ///
+ /// 获取或设置有效期开始时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("available_begin_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
+ public DateTimeOffset? AvailableBeginTime { get; set; }
+
+ ///
+ /// 获取或设置有效期结束时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("available_end_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("available_end_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
+ public DateTimeOffset? AvailableEndTime { get; set; }
+
+ ///
+ /// 获取或设置领取后 N 天内有效。
+ ///
+ [Newtonsoft.Json.JsonProperty("available_day_after_receive")]
+ [System.Text.Json.Serialization.JsonPropertyName("available_day_after_receive")]
+ public int? AvailableDaysAfterReceive { get; set; }
+
+ ///
+ /// 获取或设置领取后 N 天后生效。
+ ///
+ [Newtonsoft.Json.JsonProperty("wait_days_after_receive")]
+ [System.Text.Json.Serialization.JsonPropertyName("wait_days_after_receive")]
+ public int? WaitDaysAfterReceive { get; set; }
+ }
+
+ public class Balance
+ {
+ ///
+ /// 获取或设置是否支持储值。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_balance")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_balance")]
+ public bool? RequireBalance { get; set; }
+
+ ///
+ /// 获取或设置储值小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_appid")]
+ public string? MiniProgramAppId { get; set; }
+
+ ///
+ /// 获取或设置储值小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_path")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_path")]
+ public string? MiniProgramPath { get; set; }
+
+ ///
+ /// 获取或设置储值 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_url")]
+ public string? Url { get; set; }
+ }
+
+ public class UserForm
+ {
+ public static class Types
+ {
+ public class CustomField
+ {
+ ///
+ /// 获取或设置字段类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("type")]
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public string Type { get; set; } = default!;
+
+ ///
+ /// 获取或设置字段名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; } = default!;
+
+ ///
+ /// 获取或设置字段值。
+ ///
+ [Newtonsoft.Json.JsonProperty("values")]
+ [System.Text.Json.Serialization.JsonPropertyName("values")]
+ public string[]? Values { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置是否允许修改。
+ ///
+ [Newtonsoft.Json.JsonProperty("can_modify_after_activate")]
+ [System.Text.Json.Serialization.JsonPropertyName("can_modify_after_activate")]
+ public bool? CanModifyAfterActivate { get; set; }
+
+ ///
+ /// 获取或设置平台提供的通用开卡信息字段列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("common_field_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("common_field_list")]
+ public string[]? CommonFieldList { get; set; }
+
+ ///
+ /// 获取或设置商户自定义的开卡信息字段列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("custom_field_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("custom_field_list")]
+ public Types.CustomField[]? CustomFieldList { get; set; }
+ }
+
+ public class AdditionalStatement
+ {
+ ///
+ /// 获取或设置标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string? Title { get; set; }
+
+ ///
+ /// 获取或设置小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string? MiniProgramAppId { get; set; }
+
+ ///
+ /// 获取或设置小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("path")]
+ [System.Text.Json.Serialization.JsonPropertyName("path")]
+ public string? MiniProgramPath { get; set; }
+
+ ///
+ /// 获取或设置 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("url")]
+ [System.Text.Json.Serialization.JsonPropertyName("url")]
+ public string? Url { get; set; }
+ }
+
+ public class Bonus
+ {
+ ///
+ /// 获取或设置会员初始积分值。
+ ///
+ [Newtonsoft.Json.JsonProperty("init_bonus")]
+ [System.Text.Json.Serialization.JsonPropertyName("init_bonus")]
+ public int InitializedValue { get; set; }
+
+ ///
+ /// 获取或设置积分值文案。
+ ///
+ [Newtonsoft.Json.JsonProperty("bonus_value_word")]
+ [System.Text.Json.Serialization.JsonPropertyName("bonus_value_word")]
+ public string? ValueWords { get; set; }
+
+ ///
+ /// 获取或设置积分价值项标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("bonus_cost_title")]
+ [System.Text.Json.Serialization.JsonPropertyName("bonus_cost_title")]
+ public string? CostTitle { get; set; }
+
+ ///
+ /// 获取或设置积分价值项文案。
+ ///
+ [Newtonsoft.Json.JsonProperty("bonus_cost_word")]
+ [System.Text.Json.Serialization.JsonPropertyName("bonus_cost_word")]
+ public string? CostWords { get; set; }
+
+ ///
+ /// 获取或设置跳转文案。
+ ///
+ [Newtonsoft.Json.JsonProperty("bonus_jump_word")]
+ [System.Text.Json.Serialization.JsonPropertyName("bonus_jump_word")]
+ public string? JumpWords { get; set; }
+
+ ///
+ /// 获取或设置小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("bonus_jump_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("bonus_jump_appid")]
+ public string? MiniProgramAppId { get; set; }
+
+ ///
+ /// 获取或设置小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("bonus_jump_path")]
+ [System.Text.Json.Serialization.JsonPropertyName("bonus_jump_path")]
+ public string? MiniProgramPath { get; set; }
+
+ ///
+ /// 获取或设置自助小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("bonus_support_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("bonus_support_appid")]
+ public string? SupportMiniProgramAppId { get; set; }
+
+ ///
+ /// 获取或设置自助小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("bonus_support_path")]
+ [System.Text.Json.Serialization.JsonPropertyName("bonus_support_path")]
+ public string? SupportMiniProgramPath { get; set; }
+ }
+
+ public class Favor
+ {
+ ///
+ /// 获取或设置是否展示优惠券。
+ ///
+ [Newtonsoft.Json.JsonProperty("show_coupon")]
+ [System.Text.Json.Serialization.JsonPropertyName("show_coupon")]
+ public bool RequireShowCoupon { get; set; }
+
+ ///
+ /// 获取或设置会员专享价文案。
+ ///
+ [Newtonsoft.Json.JsonProperty("member_price_word")]
+ [System.Text.Json.Serialization.JsonPropertyName("member_price_word")]
+ public string? MemberPriceWords { get; set; }
+
+ ///
+ /// 获取或设置小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("member_price_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("member_price_appid")]
+ public string? MiniProgramAppId { get; set; }
+
+ ///
+ /// 获取或设置小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("member_price_path")]
+ [System.Text.Json.Serialization.JsonPropertyName("member_price_path")]
+ public string? MiniProgramPath { get; set; }
+ }
+
+ public class ServiceModule
+ {
+ public static class Types
+ {
+ public class MiniProgram
+ {
+ ///
+ /// 获取或设置小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("path")]
+ [System.Text.Json.Serialization.JsonPropertyName("path")]
+ public string Path { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置会员服务项 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_module_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("service_module_id")]
+ public string ServiceModuleId { get; set; } = default!;
+
+ ///
+ /// 获取或设置跳转小程序信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("jump_miniprogram")]
+ [System.Text.Json.Serialization.JsonPropertyName("jump_miniprogram")]
+ public Types.MiniProgram? MiniProgram { get; set; }
+ }
+
+ public class Invoice
+ {
+ ///
+ /// 获取或设置跳转文案。
+ ///
+ [Newtonsoft.Json.JsonProperty("fapiao_jump_word")]
+ [System.Text.Json.Serialization.JsonPropertyName("fapiao_jump_word")]
+ public string? JumpWords { get; set; }
+
+ ///
+ /// 获取或设置小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("fapiao_jump_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("fapiao_jump_appid")]
+ public string? MiniProgramAppId { get; set; }
+
+ ///
+ /// 获取或设置小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("fapiao_jump_path")]
+ [System.Text.Json.Serialization.JsonPropertyName("fapiao_jump_path")]
+ public string? MiniProgramPath { get; set; }
+ }
+
+ public class Guide
+ {
+ ///
+ /// 获取或设置联系人名字。
+ ///
+ [Newtonsoft.Json.JsonProperty("staff_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("staff_name")]
+ public string StaffName { get; set; } = default!;
+
+ ///
+ /// 获取或设置联系人头像媒体文件地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("head_image_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("head_image_url")]
+ public string HeadImageMediaUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置联系方式。
+ ///
+ [Newtonsoft.Json.JsonProperty("contact_information_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("contact_information_name")]
+ public string? ContactInformationName { get; set; }
+
+ ///
+ /// 获取或设置联系信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("contact_information_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("contact_information_value")]
+ public string? ContactInformationValue { get; set; }
+
+ ///
+ /// 获取或设置联系电话。
+ ///
+ [Newtonsoft.Json.JsonProperty("phone_number")]
+ [System.Text.Json.Serialization.JsonPropertyName("phone_number")]
+ public string? PhoneNumber { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置会员卡 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("card_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("card_id")]
+ public string CardId { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public string Status { get; set; } = default!;
+
+ ///
+ /// 获取或设置公众号 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡 Logo 媒体文件地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("logo_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("logo_url")]
+ public string LogoMediaUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置品牌信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("brand")]
+ [System.Text.Json.Serialization.JsonPropertyName("brand")]
+ public Types.Brand Brand { get; set; } = default!;
+
+ ///
+ /// 获取或设置卡名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = default!;
+
+ ///
+ /// 获取或设置背景图片媒体文件地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("background_picture_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("background_picture_url")]
+ public string BackgroundPictureMediaUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置使用须知。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string? Description { get; set; }
+
+ ///
+ /// 获取或设置客服电话。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("service_phone")]
+ public string? ServicePhone { get; set; }
+
+ ///
+ /// 获取或设置会员码型。
+ ///
+ [Newtonsoft.Json.JsonProperty("code_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("code_type")]
+ public string CodeType { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡总库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_quantity")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_quantity")]
+ public int TotalQuantity { get; set; }
+
+ ///
+ /// 获取或设置剩余库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("remain_quantity")]
+ [System.Text.Json.Serialization.JsonPropertyName("remain_quantity")]
+ public int? RemainQuantity { get; set; }
+
+ ///
+ /// 获取或设置有效期。
+ ///
+ [Newtonsoft.Json.JsonProperty("date_information")]
+ [System.Text.Json.Serialization.JsonPropertyName("date_information")]
+ public Types.Date Date { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡 Code 分配类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("code_mode")]
+ [System.Text.Json.Serialization.JsonPropertyName("code_mode")]
+ public string? CodeMode { get; set; }
+
+ ///
+ /// 获取或设置是否展示会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_display_level")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_display_level")]
+ public bool? RequireDisplayLevel { get; set; }
+
+ ///
+ /// 获取或设置会员初始等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("init_level")]
+ [System.Text.Json.Serialization.JsonPropertyName("init_level")]
+ public string? InitializedLevel { get; set; }
+
+ ///
+ /// 获取或设置商户请求单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_request_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_request_no")]
+ public string OutRequestNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置储值信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_information")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_information")]
+ public Types.Balance? Balance { get; set; }
+
+ ///
+ /// 获取或设置开卡信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_information_form")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_information_form")]
+ public Types.UserForm? UserForm { get; set; }
+
+ ///
+ /// 获取或设置补充说明信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("additional_statement")]
+ [System.Text.Json.Serialization.JsonPropertyName("additional_statement")]
+ public Types.AdditionalStatement? AdditionalStatement { get; set; }
+
+ ///
+ /// 获取或设置会员积分信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("bonus")]
+ [System.Text.Json.Serialization.JsonPropertyName("bonus")]
+ public Types.Bonus? Bonus { get; set; }
+
+ ///
+ /// 获取或设置会员优惠信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("favor")]
+ [System.Text.Json.Serialization.JsonPropertyName("favor")]
+ public Types.Favor? Favor { get; set; }
+
+ ///
+ /// 获取或设置会员服务项列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_modules")]
+ [System.Text.Json.Serialization.JsonPropertyName("service_modules")]
+ public Types.ServiceModule[]? ServiceModuleList { get; set; }
+
+ ///
+ /// 获取或设置会员发票信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("fapiao")]
+ [System.Text.Json.Serialization.JsonPropertyName("fapiao")]
+ public Types.Invoice? Invoice { get; set; }
+
+ ///
+ /// 获取或设置客服信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("guide")]
+ [System.Text.Json.Serialization.JsonPropertyName("guide")]
+ public Types.Guide? Guide { get; set; }
+
+ ///
+ /// 获取或设置是否启用动态码。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_dynamic_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_dynamic_code")]
+ public bool? RequireDynamicCode { get; set; }
+
+ ///
+ /// 获取或设置创建时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { get; set; }
+
+ ///
+ /// 获取或设置更新时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("update_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("update_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ public DateTimeOffset UpdateTime { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsRequest.cs
new file mode 100644
index 00000000..55bf9917
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsRequest.cs
@@ -0,0 +1,36 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /marketing/membercard-open/cards 接口的请求。
+ ///
+ public class QueryMarketingMemberCardOpenCardsRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置品牌 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? BrandId { get; set; }
+
+ ///
+ /// 获取或设置公众号 AppId。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string AppId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置分页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Limit { get; set; }
+
+ ///
+ /// 获取或设置分页开始位置。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Offset { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsResponse.cs
new file mode 100644
index 00000000..ab559eec
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsResponse.cs
@@ -0,0 +1,239 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /marketing/membercard-open/cards 接口的响应。
+ ///
+ public class QueryMarketingMemberCardOpenCardsResponse : WechatTenpayResponse
+ {
+ public static class Types
+ {
+ public class Card
+ {
+ public static class Types
+ {
+ public class Brand : GetMarketingMemberCardOpenCardByCardIdResponse.Types.Brand
+ {
+ }
+
+ public class Date : GetMarketingMemberCardOpenCardByCardIdResponse.Types.Date
+ {
+ }
+
+ public class Balance : GetMarketingMemberCardOpenCardByCardIdResponse.Types.Balance
+ {
+ }
+
+ public class UserForm : GetMarketingMemberCardOpenCardByCardIdResponse.Types.UserForm
+ {
+ }
+
+ public class AdditionalStatement: GetMarketingMemberCardOpenCardByCardIdResponse.Types.AdditionalStatement
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置会员卡 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("card_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("card_id")]
+ public string CardId { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public string Status { get; set; } = default!;
+
+ ///
+ /// 获取或设置公众号 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡 Logo 媒体文件地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("logo_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("logo_url")]
+ public string LogoMediaUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置品牌信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("brand")]
+ [System.Text.Json.Serialization.JsonPropertyName("brand")]
+ public Types.Brand Brand { get; set; } = default!;
+
+ ///
+ /// 获取或设置卡名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string Title { get; set; } = default!;
+
+ ///
+ /// 获取或设置背景图片媒体文件地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("background_picture_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("background_picture_url")]
+ public string BackgroundPictureMediaUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置使用须知。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string? Description { get; set; }
+
+ ///
+ /// 获取或设置客服电话。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("service_phone")]
+ public string? ServicePhone { get; set; }
+
+ ///
+ /// 获取或设置会员码型。
+ ///
+ [Newtonsoft.Json.JsonProperty("code_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("code_type")]
+ public string CodeType { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡总库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_quantity")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_quantity")]
+ public int TotalQuantity { get; set; }
+
+ ///
+ /// 获取或设置剩余库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("remain_quantity")]
+ [System.Text.Json.Serialization.JsonPropertyName("remain_quantity")]
+ public int? RemainQuantity { get; set; }
+
+ ///
+ /// 获取或设置有效期。
+ ///
+ [Newtonsoft.Json.JsonProperty("date_information")]
+ [System.Text.Json.Serialization.JsonPropertyName("date_information")]
+ public Types.Date Date { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡 Code 分配类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("code_mode")]
+ [System.Text.Json.Serialization.JsonPropertyName("code_mode")]
+ public string? CodeMode { get; set; }
+
+ ///
+ /// 获取或设置是否展示会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_display_level")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_display_level")]
+ public bool? RequireDisplayLevel { get; set; }
+
+ ///
+ /// 获取或设置会员初始等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("init_level")]
+ [System.Text.Json.Serialization.JsonPropertyName("init_level")]
+ public string? InitializedLevel { get; set; }
+
+ ///
+ /// 获取或设置商户请求单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_request_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_request_no")]
+ public string OutRequestNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置储值信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_information")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_information")]
+ public Types.Balance? Balance { get; set; }
+
+ ///
+ /// 获取或设置开卡信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_information_form")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_information_form")]
+ public Types.UserForm? UserForm { get; set; }
+
+ ///
+ /// 获取或设置补充说明信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("additional_statement")]
+ [System.Text.Json.Serialization.JsonPropertyName("additional_statement")]
+ public Types.AdditionalStatement? AdditionalStatement { get; set; }
+
+ ///
+ /// 获取或设置是否启用动态码。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_dynamic_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_dynamic_code")]
+ public bool? RequireDynamicCode { get; set; }
+
+ ///
+ /// 获取或设置创建时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("create_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("create_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { get; set; }
+
+ ///
+ /// 获取或设置更新时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("update_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("update_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ public DateTimeOffset UpdateTime { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置会员卡列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Card[] CardList { get; set; } = default!;
+
+ ///
+ /// 获取或设置是否启用动态码。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_dynamic_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_dynamic_code")]
+ public bool? RequireDynamicCode { get; set; }
+
+ ///
+ /// 获取或设置分页大小。
+ ///
+ [Newtonsoft.Json.JsonProperty("limit")]
+ [System.Text.Json.Serialization.JsonPropertyName("limit")]
+ public int Limit { get; set; }
+
+ ///
+ /// 获取或设置分页开始位置。
+ ///
+ [Newtonsoft.Json.JsonProperty("offset")]
+ [System.Text.Json.Serialization.JsonPropertyName("offset")]
+ public int Offset { get; set; }
+
+ ///
+ /// 获取或设置活动总数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_count")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_count")]
+ public int TotalCount { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardRequest.cs
new file mode 100644
index 00000000..b91c0a86
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardRequest.cs
@@ -0,0 +1,168 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [PATCH] /marketing/membercard-open/cards/{card_id} 接口的请求。
+ ///
+ public class UpdateMarketingMemberCardOpenCardRequest : WechatTenpayRequest
+ {
+ public static class Types
+ {
+ public class Date : CreateMarketingMemberCardOpenCardRequest.Types.Date
+ {
+ }
+
+ public class Balance : CreateMarketingMemberCardOpenCardRequest.Types.Balance
+ {
+ }
+
+ public class UserForm
+ {
+ public static class Types
+ {
+ public class CustomField : CreateMarketingMemberCardOpenCardRequest.Types.UserForm.Types.CustomField
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置是否允许修改。
+ ///
+ [Newtonsoft.Json.JsonProperty("can_modify_after_activate")]
+ [System.Text.Json.Serialization.JsonPropertyName("can_modify_after_activate")]
+ public bool? CanModifyAfterActivate { get; set; }
+
+ ///
+ /// 获取或设置平台提供的通用开卡信息字段列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("common_field_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("common_field_list")]
+ public IList? CommonFieldList { get; set; }
+
+ ///
+ /// 获取或设置商户自定义的开卡信息字段列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("custom_field_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("custom_field_list")]
+ public IList? CustomFieldList { get; set; }
+ }
+
+ public class AdditionalStatement : CreateMarketingMemberCardOpenCardRequest.Types.AdditionalStatement
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置会员卡 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string CardId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置公众号 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string? AppId { get; set; }
+
+ ///
+ /// 获取或设置会员卡 Logo 媒体文件地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("logo_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("logo_url")]
+ public string? LogoMediaUrl { get; set; }
+
+ ///
+ /// 获取或设置卡名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string? Title { get; set; }
+
+ ///
+ /// 获取或设置背景图片媒体文件地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("background_picture_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("background_picture_url")]
+ public string? BackgroundPictureMediaUrl { get; set; }
+
+ ///
+ /// 获取或设置使用须知。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string? Description { get; set; }
+
+ ///
+ /// 获取或设置客服电话。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("service_phone")]
+ public string? ServicePhone { get; set; }
+
+ ///
+ /// 获取或设置会员卡总库存。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_quantity")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_quantity")]
+ public int? TotalQuantity { get; set; }
+
+ ///
+ /// 获取或设置有效期。
+ ///
+ [Newtonsoft.Json.JsonProperty("date_information")]
+ [System.Text.Json.Serialization.JsonPropertyName("date_information")]
+ public Types.Date? Date { get; set; }
+
+ ///
+ /// 获取或设置会员卡 Code 分配类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("code_mode")]
+ [System.Text.Json.Serialization.JsonPropertyName("code_mode")]
+ public int? CodeMode { get; set; }
+
+ ///
+ /// 获取或设置是否展示会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_display_level")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_display_level")]
+ public bool? RequireDisplayLevel { get; set; }
+
+ ///
+ /// 获取或设置会员初始等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("init_level")]
+ [System.Text.Json.Serialization.JsonPropertyName("init_level")]
+ public string? InitializedLevel { get; set; }
+
+ ///
+ /// 获取或设置储值信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance_information")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance_information")]
+ public Types.Balance? Balance { get; set; }
+
+ ///
+ /// 获取或设置开卡信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_information_form")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_information_form")]
+ public Types.UserForm? UserForm { get; set; }
+
+ ///
+ /// 获取或设置补充说明信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("additional_statement")]
+ [System.Text.Json.Serialization.JsonPropertyName("additional_statement")]
+ public Types.AdditionalStatement? AdditionalStatement { get; set; }
+
+ ///
+ /// 获取或设置是否启用动态码。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_dynamic_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_dynamic_code")]
+ public bool? RequireDynamicCode { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardResponse.cs
new file mode 100644
index 00000000..03ffd0ba
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [PATCH] /marketing/membercard-open/cards/{card_id} 接口的响应。
+ ///
+ public class UpdateMarketingMemberCardOpenCardResponse : WechatTenpayResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardRequest.cs
new file mode 100644
index 00000000..d01c85b2
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardRequest.cs
@@ -0,0 +1,29 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /marketing/membercard-open/cards/{card_id}/upgrade 接口的请求。
+ ///
+ public class UpgradeMarketingMemberCardOpenCardRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置会员卡 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string CardId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置品牌 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("brand_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("brand_id")]
+ public string BrandId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置公众号 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardResponse.cs
new file mode 100644
index 00000000..4441575d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /marketing/membercard-open/cards/{card_id}/upgrade 接口的响应。
+ ///
+ public class UpgradeMarketingMemberCardOpenCardResponse : WechatTenpayResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs
index 87efad0f..bd8c68bb 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs
@@ -4,6 +4,7 @@ using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
+using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Flurl.Http;
@@ -148,12 +149,13 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
private async Task GetResposneAsync(IFlurlResponse flurlResponse)
where T : WechatTenpayResponse, new()
{
- string contentType = flurlResponse.Headers.GetAll("Content-Type").FirstOrDefault() ?? string.Empty;
- bool contentTypeIsNotJson =
- (flurlResponse.StatusCode == (int)HttpStatusCode.NoContent) ||
- (flurlResponse.StatusCode == (int)HttpStatusCode.OK && !contentType.StartsWith("application/json") && !contentType.StartsWith("text/json"));
+ string mediaType = flurlResponse.Headers.GetAll("Content-Type").FirstOrDefault() ?? "application/octet-stream";
+ bool jsonable = (flurlResponse.StatusCode != (int)HttpStatusCode.NoContent) &&
+ (mediaType.StartsWith("application/json") || !mediaType.StartsWith("text/json"));
+
+ byte[] bytes = await flurlResponse.GetBytesAsync().ConfigureAwait(false);
+ T result = jsonable ? JsonSerializer.Deserialize(Encoding.UTF8.GetString(bytes)) : new T();
- T result = contentTypeIsNotJson ? new T() : await flurlResponse.GetJsonAsync().ConfigureAwait(false);
result.RawStatus = flurlResponse.StatusCode;
result.RawHeaders = new ReadOnlyDictionary(
flurlResponse.Headers
@@ -163,7 +165,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
v => string.Join(", ", v.Select(e => e.Value))
)
);
- result.RawBytes = await flurlResponse.ResponseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
+ result.RawBytes = bytes;
result.WechatpayRequestId = flurlResponse.Headers.GetAll("Request-ID").FirstOrDefault() ?? string.Empty;
result.WechatpayNonce = flurlResponse.Headers.GetAll("Wechatpay-Nonce").FirstOrDefault() ?? string.Empty;
result.WechatpayTimestamp = flurlResponse.Headers.GetAll("Wechatpay-Timestamp").FirstOrDefault() ?? string.Empty;
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardRequest.json
new file mode 100644
index 00000000..6a682bde
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardRequest.json
@@ -0,0 +1,48 @@
+{
+ "appid": "wxea9c30890f48d5ae",
+ "logo_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "brand": {
+ "brand_id": "1004",
+ "display_name": "微信支付"
+ },
+ "title": "微信支付测试卡",
+ "background_picture_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "description": "使用本会员卡表示你同意xxx公司的协议",
+ "service_phone": "010-8877xxxx",
+ "code_type": "BAR_CODE",
+ "total_quantity": 5000000,
+ "date_information": {
+ "type": "FIX_TIME_RANGE",
+ "available_begin_time": "2020-05-20T13:29:35.120+08:00",
+ "available_end_time": "2030-05-20T13:29:35.120+08:00",
+ "available_day_after_receive": 200,
+ "wait_days_after_receive": 1
+ },
+ "code_mode": "SYSTEM_ALLOCATE",
+ "need_display_level": true,
+ "init_level": "白银会员",
+ "out_request_no": "100002322019090134234sfdf",
+ "balance_information": {
+ "need_balance": false,
+ "balance_appid": "wxea9c30890f48d5ae",
+ "balance_path": "pages/balance/balance",
+ "balance_url": "https://xxx.com"
+ },
+ "user_information_form": {
+ "common_field_list": ["USER_FORM_FLAG_MOBILE", "USER_FORM_FLAG_SEX", "USER_FORM_FLAG_NAME", "USER_FORM_FLAG_BIRTHDAY"],
+ "custom_field_list": [
+ {
+ "type": "TEXT",
+ "name": "喜欢的运动",
+ "values": ["篮球", "足球", "羽毛球"]
+ }
+ ]
+ },
+ "additional_statement": {
+ "title": "xxx会员卡使用须知",
+ "url": "https://xxx.111.com",
+ "appid": "wxea9c30890f48d5ae",
+ "path": "pages/statement/statement"
+ },
+ "need_dynamic_code": false
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardResponse.json
new file mode 100644
index 00000000..93d76abc
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/CreateMarketingMemberCardOpenCardResponse.json
@@ -0,0 +1,53 @@
+{
+ "card_id": "pbLatjvWOibDc5-TBnbUk1pD12o0",
+ "create_time": "2020-05-20T13:29:35.120+08:00",
+ "update_time": "2020-05-20T13:29:35.120+08:00",
+ "remain_quantity": 1004,
+ "status": "NOT_APPROVE",
+ "brand": {
+ "brand_id": "1004",
+ "display_name": "微信支付"
+ },
+ "appid": "wxea9c30890f48d5ae",
+ "logo_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "title": "微信支付测试卡",
+ "background_picture_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "description": "使用本会员卡表示你同意xxx公司的协议",
+ "service_phone": "010-8877xxxx",
+ "code_type": "BAR_CODE",
+ "total_quantity": 5000000,
+ "date_information": {
+ "type": "FIX_TIME_RANGE",
+ "available_begin_time": "2020-05-20T13:29:35.120+08:00",
+ "available_end_time": "2030-05-20T13:29:35.120+08:00",
+ "available_day_after_receive": 200,
+ "wait_days_after_receive": 1
+ },
+ "code_mode": "SYSTEM_ALLOCATE",
+ "need_display_level": true,
+ "init_level": "白银会员",
+ "out_request_no": "100002322019090134234sfdf",
+ "balance_information": {
+ "need_balance": false,
+ "balance_appid": "wxea9c30890f48d5ae",
+ "balance_path": "pages/balance/balance",
+ "balance_url": "https://xxx.com"
+ },
+ "user_information_form": {
+ "common_field_list": ["USER_FORM_FLAG_MOBILE", "USER_FORM_FLAG_SEX", "USER_FORM_FLAG_NAME", "USER_FORM_FLAG_BIRTHDAY"],
+ "custom_field_list": [
+ {
+ "type": "TEXT",
+ "name": "喜欢的运动",
+ "values": ["篮球", "足球", "羽毛球"]
+ }
+ ]
+ },
+ "additional_statement": {
+ "title": "xxx会员卡使用须知",
+ "url": "https://xxx.111.com",
+ "appid": "wxea9c30890f48d5ae",
+ "path": "pages/statement/statement"
+ },
+ "need_dynamic_code": false
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesRequest.json
new file mode 100644
index 00000000..0a52295b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesRequest.json
@@ -0,0 +1,3 @@
+{
+ "code": ["478515832665"]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesResponse.json
new file mode 100644
index 00000000..53321abb
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/DepositMarketingMemberCardOpenCardCodesResponse.json
@@ -0,0 +1,8 @@
+{
+ "data": [
+ {
+ "code": "478515832665",
+ "result": "SUCCESS"
+ }
+ ]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdRequest.json
new file mode 100644
index 00000000..22fdca1b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdRequest.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdResponse.json
new file mode 100644
index 00000000..d6aa6bb0
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/GetMarketingMemberCardOpenCardByCardIdResponse.json
@@ -0,0 +1,92 @@
+{
+ "card_id": "pbLatjvWOibDc5-TBnbUk1pD12o0",
+ "create_time": "2020-05-20T13:29:35.120+08:00",
+ "update_time": "2020-05-20T13:29:35.120+08:00",
+ "remain_quantity": 20,
+ "status": "NOT_APPROVE",
+ "brand": {
+ "brand_id": "1004",
+ "display_name": "微信支付"
+ },
+ "appid": "wxea9c30890f48d5ae",
+ "logo_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "title": "微信支付测试卡",
+ "background_picture_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "description": "使用本会员卡表示你同意xxx公司的协议",
+ "service_phone": "010-8877xxxx",
+ "code_type": "BAR_CODE",
+ "total_quantity": 5000000,
+ "date_information": {
+ "type": "FIX_TIME_RANGE",
+ "available_begin_time": "2020-05-20T13:29:35.120+08:00",
+ "available_end_time": "2030-05-20T13:29:35.120+08:00",
+ "available_day_after_receive": 200,
+ "wait_days_after_receive": 2
+ },
+ "code_mode": "SYSTEM_ALLOCATE",
+ "need_display_level": true,
+ "init_level": "白银会员",
+ "out_request_no": "100002322019090134234sfdf",
+ "balance_information": {
+ "need_balance": false,
+ "balance_appid": "wxea9c30890f48d5ae",
+ "balance_path": "pages/balance/balance",
+ "balance_url": "https://xxx.com"
+ },
+ "user_information_form": {
+ "can_modify_after_activate": false,
+ "common_field_list": ["USER_FORM_FLAG_MOBILE", "USER_FORM_FLAG_SEX", "USER_FORM_FLAG_NAME", "USER_FORM_FLAG_BIRTHDAY"],
+ "custom_field_list": [
+ {
+ "type": "TEXT",
+ "name": "喜欢的运动",
+ "values": ["篮球", "足球", "羽毛球"]
+ }
+ ]
+ },
+ "additional_statement": {
+ "title": "xxx会员卡使用须知",
+ "url": "https://xxx.111.com",
+ "appid": "wxea9c30890f48d5ae",
+ "path": "pages/statement/statement"
+ },
+ "bonus": {
+ "init_bonus": 100,
+ "bonus_value_word": "我的积分",
+ "bonus_cost_title": "积分兑换",
+ "bonus_cost_word": "500积分=2小时免费停车券",
+ "bonus_jump_word": "更多礼品",
+ "bonus_jump_appid": "wxea9c30a90fs8d3fe",
+ "bonus_jump_path": "/pages/bonus/bonus",
+ "bonus_support_appid": "wxea9c30a90fs8d3fe",
+ "bonus_support_path": "pages/selfbonus/selfbonus"
+ },
+ "favor": {
+ "show_coupon": true,
+ "member_price_word": "周二会员全场八折",
+ "member_price_appid": "wxea9c30a90fs8d3fe",
+ "member_price_path": "pages/favor/favor"
+ },
+ "service_modules": [
+ {
+ "service_module_id": "666",
+ "jump_miniprogram": {
+ "appid": "wx37178d097a6851d8",
+ "path": "pages/index/index"
+ }
+ }
+ ],
+ "fapiao": {
+ "fapiao_jump_word": "查看我的发票",
+ "fapiao_jump_appid": "wxea9c30a90fs8d3fe",
+ "fapiao_jump_path": "pages/fapiao/fapiao"
+ },
+ "guide": {
+ "staff_name": "酒店管家-何小明",
+ "head_image_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "contact_information_name": "微信号",
+ "contact_information_value": "weixin123",
+ "phone_number": "0755-12345677"
+ },
+ "need_dynamic_code": false
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsRequest.json
new file mode 100644
index 00000000..22fdca1b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsRequest.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsResponse.json
new file mode 100644
index 00000000..54dc456a
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/QueryMarketingMemberCardOpenCardsResponse.json
@@ -0,0 +1,61 @@
+{
+ "data": [
+ {
+ "card_id": "pbLatjvWOibDc5-TBnbUk1pD12o0",
+ "create_time": "2020-05-20T13:29:35.120+08:00",
+ "update_time": "2020-05-20T13:29:35.120+08:00",
+ "remain_quantity": 20,
+ "status": "NOT_APPROVE",
+ "brand": {
+ "brand_id": "1004",
+ "display_name": "微信支付"
+ },
+ "appid": "wxea9c30890f48d5ae",
+ "logo_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "title": "微信支付测试卡",
+ "background_picture_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "description": "使用本会员卡表示你同意xxx公司的协议,解释权归xxx公司所有",
+ "service_phone": "010-8877xxxx",
+ "code_type": "BAR_CODE",
+ "total_quantity": 5000000,
+ "date_information": {
+ "type": "FIX_TIME_RANGE",
+ "available_begin_time": "2020-05-20T13:29:35.120+08:00",
+ "available_end_time": "2030-05-20T13:29:35.120+08:00",
+ "available_day_after_receive": 200,
+ "wait_days_after_receive": 2
+ },
+ "code_mode": "SYSTEM_ALLOCATE",
+ "need_display_level": true,
+ "init_level": "白银会员",
+ "out_request_no": "100002322019090134234sfdf",
+ "balance_information": {
+ "need_balance": false,
+ "balance_appid": "wxea9c30890f48d5ae",
+ "balance_path": "pages/balance/balance",
+ "balance_url": "https://xxx.com"
+ },
+ "user_information_form": {
+ "can_modify_after_activate": false,
+ "common_field_list": ["USER_FORM_FLAG_MOBILE", "USER_FORM_FLAG_SEX", "USER_FORM_FLAG_NAME", "USER_FORM_FLAG_BIRTHDAY"],
+ "custom_field_list": [
+ {
+ "type": "TEXT",
+ "name": "喜欢的运动",
+ "values": ["篮球", "足球", "羽毛球"]
+ }
+ ]
+ },
+ "additional_statement": {
+ "title": "xxx会员卡使用须知",
+ "url": "https://xxx.111.com",
+ "appid": "wxea9c30890f48d5ae",
+ "path": "pages/statement/statement"
+ }
+ }
+ ],
+ "need_dynamic_code": false,
+ "total_count": 20,
+ "offset": 1,
+ "limit": 20
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardRequest.json
new file mode 100644
index 00000000..a4aba15b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardRequest.json
@@ -0,0 +1,41 @@
+{
+ "appid": "wxea9c30890f48d5ae",
+ "logo_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "title": "微信支付测试卡",
+ "background_picture_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
+ "description": "使用本会员卡表示你同意xxx公司的协议",
+ "service_phone": "010-8877xxxx",
+ "total_quantity": 5000000,
+ "date_information": {
+ "type": "FIX_TIME_RANGE",
+ "available_end_time": "2030-05-20T13:29:35.120+08:00",
+ "available_day_after_receive": 200,
+ "wait_days_after_receive": 2
+ },
+ "need_display_level": false,
+ "init_level": "白银会员",
+ "balance_information": {
+ "need_balance": false,
+ "balance_appid": "wxea9c30890f48d5ae",
+ "balance_path": "pages/balance/balance",
+ "balance_url": "https://xxx.com"
+ },
+ "user_information_form": {
+ "can_modify_after_activate": false,
+ "common_field_list": ["USER_FORM_FLAG_MOBILE", "USER_FORM_FLAG_SEX"],
+ "custom_field_list": [
+ {
+ "type": "TEXT",
+ "name": "喜欢的运动",
+ "values": ["篮球", "足球", "羽毛球"]
+ }
+ ]
+ },
+ "additional_statement": {
+ "title": "xxx会员卡使用须知",
+ "url": "https://xxx.111.com",
+ "appid": "wxea9c30890f48d5ae",
+ "path": "pages/statement/statement"
+ },
+ "need_dynamic_code": false
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardResponse.json
new file mode 100644
index 00000000..22fdca1b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpdateMarketingMemberCardOpenCardResponse.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardRequest.json
new file mode 100644
index 00000000..6e33538f
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardRequest.json
@@ -0,0 +1,4 @@
+{
+ "brand_id": "1001622624",
+ "appid": "wxea9c30890f48d5ae"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardResponse.json
new file mode 100644
index 00000000..22fdca1b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Card/UpgradeMarketingMemberCardOpenCardResponse.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file