diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipCloseEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipCloseEvent.cs
new file mode 100644
index 00000000..174dc05d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipCloseEvent.cs
@@ -0,0 +1,31 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Events
+{
+ ///
+ /// 表示 EVENT.channels_ec_vip_close 事件的数据。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/callback/member/user_join_vip.html
+ ///
+ public class ChannelsECVipCloseEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
+ {
+ public static class Types
+ {
+ public class User
+ {
+ ///
+ /// 获取或设置注销时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("close_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("close_time")]
+ [System.Xml.Serialization.XmlElement("close_time")]
+ public long CloseTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置用户信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_info")]
+ [System.Xml.Serialization.XmlElement("user_info")]
+ public Types.User User { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipGradeInfoUpgradeEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipGradeInfoUpgradeEvent.cs
new file mode 100644
index 00000000..e1d03981
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipGradeInfoUpgradeEvent.cs
@@ -0,0 +1,40 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Events
+{
+ ///
+ /// 表示 EVENT.channels_ec_vip_grade_info_update 事件的数据。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/callback/member/usergrade_update.html
+ ///
+ public class ChannelsECVipGradeInfoUpgradeEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
+ {
+ public static class Types
+ {
+ public class User
+ {
+ ///
+ /// 获取或设置会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("grade")]
+ [System.Text.Json.Serialization.JsonPropertyName("grade")]
+ [System.Xml.Serialization.XmlElement("grade")]
+ public int Grade { get; set; }
+
+ ///
+ /// 获取或设置经验值。
+ ///
+ [Newtonsoft.Json.JsonProperty("experience_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("experience_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("experience_value")]
+ public int ExperienceValue { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置用户信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_info")]
+ [System.Xml.Serialization.XmlElement("user_info")]
+ public Types.User User { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipJoinEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipJoinEvent.cs
new file mode 100644
index 00000000..2fe0d326
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipJoinEvent.cs
@@ -0,0 +1,39 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Events
+{
+ ///
+ /// 表示 EVENT.channels_ec_vip_join 事件的数据。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/callback/member/user_join_vip.html
+ ///
+ public class ChannelsECVipJoinEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
+ {
+ public static class Types
+ {
+ public class User
+ {
+ ///
+ /// 获取或设置手机号码。
+ ///
+ [Newtonsoft.Json.JsonProperty("phone_number")]
+ [System.Text.Json.Serialization.JsonPropertyName("phone_number")]
+ [System.Xml.Serialization.XmlElement("phone_number")]
+ public string PhoneNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置加入时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("join_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("join_time")]
+ [System.Xml.Serialization.XmlElement("join_time")]
+ public long JoinTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置用户信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_info")]
+ [System.Xml.Serialization.XmlElement("user_info")]
+ public Types.User User { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipScoreExchangeEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipScoreExchangeEvent.cs
new file mode 100644
index 00000000..67391cf4
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipScoreExchangeEvent.cs
@@ -0,0 +1,83 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Events
+{
+ ///
+ /// 表示 EVENT.channels_ec_vip_score_exchange 事件的数据。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/callback/score/user_score_exchange.html
+ ///
+ public class ChannelsECVipScoreExchangeEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
+ {
+ public static class Types
+ {
+ public class Exchange
+ {
+ public static class Types
+ {
+ public class Coupon
+ {
+ ///
+ /// 获取或设置优惠券 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("related_coupon_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("related_coupon_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("related_coupon_id")]
+ public long CouponId { get; set; }
+ }
+
+ public class Product
+ {
+ ///
+ /// 获取或设置商品 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("related_product_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("related_product_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("related_product_id")]
+ public long CouponId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置兑换类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("score_item_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("score_item_type")]
+ [System.Xml.Serialization.XmlElement("score_item_type")]
+ public int ScoreItemType { get; set; }
+
+ ///
+ /// 获取或设置兑换积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_score")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_score")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("pay_score")]
+ public int PayScore { get; set; }
+
+ ///
+ /// 获取或设置兑换的优惠券信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("coupon_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("coupon_info")]
+ [System.Xml.Serialization.XmlElement("coupon_info", IsNullable = true)]
+ public Types.Coupon? Coupon { get; set; }
+
+ ///
+ /// 获取或设置兑换的商品信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_info")]
+ [System.Xml.Serialization.XmlElement("product_info", IsNullable = true)]
+ public Types.Product? Product { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置兑换信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("exchange_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("exchange_info")]
+ [System.Xml.Serialization.XmlElement("exchange_info")]
+ public Types.Exchange Exchange { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipScoreUpdateEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipScoreUpdateEvent.cs
new file mode 100644
index 00000000..650448b1
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipScoreUpdateEvent.cs
@@ -0,0 +1,57 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Events
+{
+ ///
+ /// 表示 EVENT.channels_ec_vip_score_update 事件的数据。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/callback/score/user_score_update.html
+ ///
+ public class ChannelsECVipScoreUpdateEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
+ {
+ public static class Types
+ {
+ public class User
+ {
+ ///
+ /// 获取或设置会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("grade")]
+ [System.Text.Json.Serialization.JsonPropertyName("grade")]
+ [System.Xml.Serialization.XmlElement("grade")]
+ public int Grade { get; set; }
+
+ ///
+ /// 获取或设置当前积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("score")]
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("score")]
+ public int Score { get; set; }
+
+ ///
+ /// 获取或设置本次改动积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("delta_score")]
+ [System.Text.Json.Serialization.JsonPropertyName("delta_score")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("delta_score")]
+ public int DeltaScore { get; set; }
+
+ ///
+ /// 获取或设置流水类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("flow_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("flow_type")]
+ [System.Xml.Serialization.XmlElement("flow_type")]
+ public int FlowType { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置用户信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_info")]
+ [System.Xml.Serialization.XmlElement("user_info")]
+ public Types.User User { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipTaskAwardEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipTaskAwardEvent.cs
new file mode 100644
index 00000000..2d95e34f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/ChannelsEC/ChannelsECVipTaskAwardEvent.cs
@@ -0,0 +1,79 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Events
+{
+ ///
+ /// 表示 EVENT.channels_ec_vip_task_award 事件的数据。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/callback/member/user_finish_task.html
+ ///
+ public class ChannelsECVipTaskAwardEvent : WechatApiEvent, WechatApiEvent.Serialization.IJsonSerializable, WechatApiEvent.Serialization.IXmlSerializable
+ {
+ public static class Types
+ {
+ public class Task
+ {
+ public static class Types
+ {
+ public class AwardInfo
+ {
+ ///
+ /// 获取或设置奖励类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("award_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("award_type")]
+ [System.Xml.Serialization.XmlElement("award_type")]
+ public int AwardType { get; set; }
+
+ ///
+ /// 获取或设置奖励的优惠券 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("coupon_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("coupon_id")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("coupon_id", IsNullable = true)]
+ public long? CouponId { get; set; }
+
+ ///
+ /// 获取或设置奖励的积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("gain_score")]
+ [System.Text.Json.Serialization.JsonPropertyName("gain_score")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ [System.Xml.Serialization.XmlElement("gain_score", IsNullable = true)]
+ public int? GainScore { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置任务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_id")]
+ [System.Xml.Serialization.XmlElement("task_id")]
+ public long TaskId { get; set; }
+
+ ///
+ /// 获取或设置任务名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_name")]
+ [System.Xml.Serialization.XmlElement("task_name")]
+ public string TaskName { get; set; } = default!;
+
+ ///
+ /// 获取或设置奖励信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("award_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("award_info")]
+ [System.Xml.Serialization.XmlElement("award_info")]
+ public Types.AwardInfo AwardInfo { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置任务信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_info")]
+ [System.Xml.Serialization.XmlElement("task_info")]
+ public Types.Task Task { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
index 6f7367cc..7e846470 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteChannelsExtensions.cs
@@ -1811,6 +1811,296 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
}
#endregion
+ #region ECVip
+ #region ECVip/ExperienceValue
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/experiencevalue/set 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/experiencevalue/set.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipExperienceValueSetAsync(this WechatApiClient client, Models.ChannelsECVipExperienceValueSetRequest 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, "channels", "ec", "vip", "experiencevalue", "set")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
+ #region ECVip/Grade
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/grade/card/add 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/grade/add.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipGradeCardAddAsync(this WechatApiClient client, Models.ChannelsECVipGradeCardAddRequest 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, "channels", "ec", "vip", "grade", "card", "add")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /channels/ec/vip/grade/card/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/grade/get.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipGradeCardGetAsync(this WechatApiClient client, Models.ChannelsECVipGradeCardGetRequest 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, "channels", "ec", "vip", "grade", "card", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/grade/card/update 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/grade/add.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipGradeCardUpdateAsync(this WechatApiClient client, Models.ChannelsECVipGradeCardUpdateRequest 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, "channels", "ec", "vip", "grade", "card", "update")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
+ #region ECVip/Score
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/score/set 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/score/set_conf.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipScoreSetAsync(this WechatApiClient client, Models.ChannelsECVipScoreSetRequest 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, "channels", "ec", "vip", "score", "set")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /channels/ec/vip/score/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/score/get_conf.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipScoreGetAsync(this WechatApiClient client, Models.ChannelsECVipScoreGetRequest 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, "channels", "ec", "vip", "score", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+
+ #region ECVip/User
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/user/info/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/member/get.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipUserInfoGetAsync(this WechatApiClient client, Models.ChannelsECVipUserInfoGetRequest 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, "channels", "ec", "vip", "user", "info", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/user/list/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/member/get_list.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipUserListGetAsync(this WechatApiClient client, Models.ChannelsECVipUserListGetRequest 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, "channels", "ec", "vip", "user", "list", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/user/experiencevalue/update 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/experiencevalue/update_user.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipUserExperienceValueUpdateAsync(this WechatApiClient client, Models.ChannelsECVipUserExperienceValueUpdateRequest 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, "channels", "ec", "vip", "user", "experiencevalue", "update")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/user/grade/update 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/grade/update_user.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipUserGradeUpdateAsync(this WechatApiClient client, Models.ChannelsECVipUserGradeUpdateRequest 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, "channels", "ec", "vip", "user", "grade", "update")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/user/score/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/score/get_user_score.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipUserScoreGetAsync(this WechatApiClient client, Models.ChannelsECVipUserScoreGetRequest 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, "channels", "ec", "vip", "user", "score", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/user/score/flowrecord/get 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/score/get_user_flow_record.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipUserScoreFlowRecordGetAsync(this WechatApiClient client, Models.ChannelsECVipUserScoreFlowRecordGetRequest 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, "channels", "ec", "vip", "user", "score", "flowrecord", "get")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/user/score/increase 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/score/incr_user_score.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipUserScoreIncreaseAsync(this WechatApiClient client, Models.ChannelsECVipUserScoreIncreaseRequest 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, "channels", "ec", "vip", "user", "score", "increase")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /channels/ec/vip/user/score/decrease 接口。
+ /// REF: https://developers.weixin.qq.com/doc/channels/API/vip/score/incr_user_score.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteChannelsECVipUserScoreDecreaseAsync(this WechatApiClient client, Models.ChannelsECVipUserScoreDecreaseRequest 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, "channels", "ec", "vip", "user", "score", "decrease")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
+ #endregion
+
#region ECFunds
///
/// 异步调用 [POST] /channels/ec/funds/getbalance 接口。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/ExperienceValue/ChannelsECVipExperienceValueSetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/ExperienceValue/ChannelsECVipExperienceValueSetRequest.cs
new file mode 100644
index 00000000..6e725277
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/ExperienceValue/ChannelsECVipExperienceValueSetRequest.cs
@@ -0,0 +1,80 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/experiencevalue/set 接口的请求。
+ ///
+ public class ChannelsECVipExperienceValueSetRequest : WechatApiRequest, IInferable
+ {
+ public static class Types
+ {
+ public class Config
+ {
+ public static class Types
+ {
+ public class PayAmountRule
+ {
+ ///
+ /// 获取或设置消费金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_value")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualNullableIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int? PayAmount { get; set; }
+
+ ///
+ /// 获取或设置消费门槛金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_amount_floor")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualNullableIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_amount_floor")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int? PayAmountFloor { get; set; }
+
+ ///
+ /// 获取或设置获得的经验值。
+ ///
+ [Newtonsoft.Json.JsonProperty("gain_value")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualNullableIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("gain_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int? GainExperienceValue { get; set; }
+ }
+
+ public class PayTimesRule
+ {
+ ///
+ /// 获取或设置获得的经验值。
+ ///
+ [Newtonsoft.Json.JsonProperty("gain_value")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualNullableIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("gain_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int? GainExperienceValue { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置消费金额规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_amount_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_amount_rule")]
+ public Types.PayAmountRule? PayAmountRule { get; set; }
+
+ ///
+ /// 获取或设置消费次数规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_time_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_time_rule")]
+ public Types.PayTimesRule? PayTimesRule { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置配置信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("conf")]
+ [System.Text.Json.Serialization.JsonPropertyName("conf")]
+ public Types.Config Config { get; set; } = new Types.Config();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/ExperienceValue/ChannelsECVipExperienceValueSetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/ExperienceValue/ChannelsECVipExperienceValueSetResponse.cs
new file mode 100644
index 00000000..2d3a5198
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/ExperienceValue/ChannelsECVipExperienceValueSetResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/experiencevalue/set 接口的响应。
+ ///
+ public class ChannelsECVipExperienceValueSetResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardAddRequest.cs
new file mode 100644
index 00000000..dca5eb71
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardAddRequest.cs
@@ -0,0 +1,40 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/grade/card/add 接口的请求。
+ ///
+ public class ChannelsECVipGradeCardAddRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("grade")]
+ [System.Text.Json.Serialization.JsonPropertyName("grade")]
+ public int Grade { get; set; }
+
+ ///
+ /// 获取或设置会员等级名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string? Name { get; set; }
+
+ ///
+ /// 获取或设置经验值门槛。
+ ///
+ [Newtonsoft.Json.JsonProperty("experience_value_threshold")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("experience_value_threshold")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int ExperienceValueThreshold { get; set; }
+
+ ///
+ /// 获取或设置经验值倍数(×10)。
+ ///
+ [Newtonsoft.Json.JsonProperty("experience_value_multiple")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("experience_value_multiple")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int ExperienceValueMultiple { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardAddResponse.cs
new file mode 100644
index 00000000..fdf6799a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardAddResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/grade/card/add 接口的响应。
+ ///
+ public class ChannelsECVipGradeCardAddResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardGetRequest.cs
new file mode 100644
index 00000000..020f9a09
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardGetRequest.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /channels/ec/vip/grade/card/get 接口的请求。
+ ///
+ public class ChannelsECVipGradeCardGetRequest : WechatApiRequest, IInferable
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardGetResponse.cs
new file mode 100644
index 00000000..9d471686
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardGetResponse.cs
@@ -0,0 +1,169 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /channels/ec/vip/grade/card/get 接口的响应。
+ ///
+ public class ChannelsECVipGradeCardGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class ExperienceValueConfig
+ {
+ public static class Types
+ {
+ public class PayAmountRule
+ {
+ ///
+ /// 获取或设置消费金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int? PayAmount { get; set; }
+
+ ///
+ /// 获取或设置消费门槛金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_amount_floor")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_amount_floor")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int? PayAmountFloor { get; set; }
+
+ ///
+ /// 获取或设置获得的经验值。
+ ///
+ [Newtonsoft.Json.JsonProperty("gain_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("gain_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int? GainExperienceValue { get; set; }
+ }
+
+ public class PayTimesRule
+ {
+ ///
+ /// 获取或设置获得的经验值。
+ ///
+ [Newtonsoft.Json.JsonProperty("gain_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("gain_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int? GainExperienceValue { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置消费金额规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_amount_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_amount_rule")]
+ public Types.PayAmountRule? PayAmountRule { get; set; }
+
+ ///
+ /// 获取或设置消费次数规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_time_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_time_rule")]
+ public Types.PayTimesRule? PayTimesRule { get; set; }
+ }
+
+ public class GradeCardConfig
+ {
+ public static class Types
+ {
+ public class GradeCard
+ {
+ public static class Types
+ {
+ public class AuditInfo
+ {
+ ///
+ /// 获取或设置审核状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public int Status { get; set; }
+
+ ///
+ /// 获取或设置最新会员等级名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("latest_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("latest_name")]
+ public string? LatestName { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("grade")]
+ [System.Text.Json.Serialization.JsonPropertyName("grade")]
+ public int Grade { get; set; }
+
+ ///
+ /// 获取或设置会员等级名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("valid_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("valid_name")]
+ public string Name { get; set; } = default!;
+
+ ///
+ /// 获取或设置经验值门槛。
+ ///
+ [Newtonsoft.Json.JsonProperty("experience_value_threshold")]
+ [System.Text.Json.Serialization.JsonPropertyName("experience_value_threshold")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int ExperienceValueThreshold { get; set; }
+
+ ///
+ /// 获取或设置经验值倍数(×10)。
+ ///
+ [Newtonsoft.Json.JsonProperty("experience_value_multiple")]
+ [System.Text.Json.Serialization.JsonPropertyName("experience_value_multiple")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int ExperienceValueMultiple { get; set; }
+
+ ///
+ /// 获取或设置审核信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("audit_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("audit_info")]
+ public Types.AuditInfo? AuditInfo { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置会员等级列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("grade_card_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("grade_card_list")]
+ public Types.GradeCard[] GradeCardList { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置经验值配置信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("experience_value_conf")]
+ [System.Text.Json.Serialization.JsonPropertyName("experience_value_conf")]
+ public Types.ExperienceValueConfig? ExperienceValueConfig { get; set; }
+
+ ///
+ /// 获取或设置会员等级配置信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("card_conf")]
+ [System.Text.Json.Serialization.JsonPropertyName("card_conf")]
+ public Types.GradeCardConfig? GradeCardConfig { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("info")]
+ [System.Text.Json.Serialization.JsonPropertyName("info")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardUpdateRequest.cs
new file mode 100644
index 00000000..b09e5354
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardUpdateRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/grade/card/update 接口的请求。
+ ///
+ public class ChannelsECVipGradeCardUpdateRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("grade")]
+ [System.Text.Json.Serialization.JsonPropertyName("grade")]
+ public int Grade { get; set; }
+
+ ///
+ /// 获取或设置会员等级名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string? Name { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardUpdateResponse.cs
new file mode 100644
index 00000000..e0e1a3b7
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Grade/ChannelsECVipGradeCardUpdateResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/grade/card/update 接口的响应。
+ ///
+ public class ChannelsECVipGradeCardUpdateResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreGetRequest.cs
new file mode 100644
index 00000000..ab17e196
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreGetRequest.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /channels/ec/vip/score/get 接口的请求。
+ ///
+ public class ChannelsECVipScoreGetRequest : WechatApiRequest, IInferable
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreGetResponse.cs
new file mode 100644
index 00000000..acb61dc3
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreGetResponse.cs
@@ -0,0 +1,108 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /channels/ec/vip/score/get 接口的响应。
+ ///
+ public class ChannelsECVipScoreGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class Config
+ {
+ public static class Types
+ {
+ public class GainRule
+ {
+ public static class Types
+ {
+ public class PayAmountRule
+ {
+ ///
+ /// 获取或设置消费积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int? PayValue { get; set; }
+ }
+
+ public class PayTimesRule
+ {
+ ///
+ /// 获取或设置获得积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("gain_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("gain_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int? GainValue { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置消费金额规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_amount_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_amount_rule")]
+ public Types.PayAmountRule? PayAmountRule { get; set; }
+
+ ///
+ /// 获取或设置消费次数规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_time_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_time_rule")]
+ public Types.PayTimesRule? PayTimesRule { get; set; }
+ }
+
+ public class DeductRule
+ {
+ ///
+ /// 获取或设置是否开启。
+ ///
+ [Newtonsoft.Json.JsonProperty("open_mgr")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.NumericalBooleanConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("open_mgr")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumericalBooleanConverter))]
+ public bool IsOpen { get; set; }
+
+ ///
+ /// 获取或设置抵扣比例(单位:百分数)。
+ ///
+ [Newtonsoft.Json.JsonProperty("ratio")]
+ [System.Text.Json.Serialization.JsonPropertyName("ratio")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int? Ratio { get; set; }
+
+ ///
+ /// 获取或设置抵扣上限。
+ ///
+ [Newtonsoft.Json.JsonProperty("limit")]
+ [System.Text.Json.Serialization.JsonPropertyName("limit")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int? Limit { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置获取规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("gain_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("gain_rule")]
+ public Types.GainRule? GainRule { get; set; }
+
+ ///
+ /// 获取或设置抵扣规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("deduct_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("deduct_rule")]
+ public Types.DeductRule? DeductRule { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置配置信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("conf")]
+ [System.Text.Json.Serialization.JsonPropertyName("conf")]
+ public Types.Config Config { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreSetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreSetRequest.cs
new file mode 100644
index 00000000..477e6eab
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreSetRequest.cs
@@ -0,0 +1,112 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/score/set 接口的请求。
+ ///
+ public class ChannelsECVipScoreSetRequest : WechatApiRequest, IInferable
+ {
+ public static class Types
+ {
+ public class Config
+ {
+ public static class Types
+ {
+ public class GainRule
+ {
+ public static class Types
+ {
+ public class PayAmountRule
+ {
+ ///
+ /// 获取或设置消费积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_value")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualNullableIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int? PayValue { get; set; }
+ }
+
+ public class PayTimesRule
+ {
+ ///
+ /// 获取或设置获得积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("gain_value")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualNullableIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("gain_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int? GainValue { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置消费金额规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_amount_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_amount_rule")]
+ public Types.PayAmountRule? PayAmountRule { get; set; }
+
+ ///
+ /// 获取或设置消费次数规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("pay_time_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("pay_time_rule")]
+ public Types.PayTimesRule? PayTimesRule { get; set; }
+ }
+
+ public class DeductRule
+ {
+ ///
+ /// 获取或设置是否开启。
+ ///
+ [Newtonsoft.Json.JsonProperty("open_mgr")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.NumericalBooleanConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("open_mgr")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumericalBooleanConverter))]
+ public bool IsOpen { get; set; }
+
+ ///
+ /// 获取或设置抵扣比例(单位:百分数)。
+ ///
+ [Newtonsoft.Json.JsonProperty("ratio")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualNullableIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("ratio")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int? Ratio { get; set; }
+
+ ///
+ /// 获取或设置抵扣上限。
+ ///
+ [Newtonsoft.Json.JsonProperty("limit")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualNullableIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("limit")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int? Limit { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置获取规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("gain_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("gain_rule")]
+ public Types.GainRule? GainRule { get; set; }
+
+ ///
+ /// 获取或设置抵扣规则信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("deduct_rule")]
+ [System.Text.Json.Serialization.JsonPropertyName("deduct_rule")]
+ public Types.DeductRule? DeductRule { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置配置信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("conf")]
+ [System.Text.Json.Serialization.JsonPropertyName("conf")]
+ public Types.Config Config { get; set; } = new Types.Config();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreSetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreSetResponse.cs
new file mode 100644
index 00000000..8fa8de73
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/Score/ChannelsECVipScoreSetResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/score/set 接口的响应。
+ ///
+ public class ChannelsECVipScoreSetResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserExperienceValueUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserExperienceValueUpdateRequest.cs
new file mode 100644
index 00000000..d93fefcb
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserExperienceValueUpdateRequest.cs
@@ -0,0 +1,24 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/experiencevalue/update 接口的请求。
+ ///
+ public class ChannelsECVipUserExperienceValueUpdateRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置经验值。
+ ///
+ [Newtonsoft.Json.JsonProperty("experience_value")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualIntegerConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("experience_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int ExperienceValue { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserExperienceValueUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserExperienceValueUpdateResponse.cs
new file mode 100644
index 00000000..e74ed270
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserExperienceValueUpdateResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/experiencevalue/update 接口的响应。
+ ///
+ public class ChannelsECVipUserExperienceValueUpdateResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserGradeUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserGradeUpdateRequest.cs
new file mode 100644
index 00000000..5fbba94b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserGradeUpdateRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/grade/update 接口的请求。
+ ///
+ public class ChannelsECVipUserGradeUpdateRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("grade")]
+ [System.Text.Json.Serialization.JsonPropertyName("grade")]
+ public int Grade { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserGradeUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserGradeUpdateResponse.cs
new file mode 100644
index 00000000..464fb382
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserGradeUpdateResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/grade/update 接口的响应。
+ ///
+ public class ChannelsECVipUserGradeUpdateResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserInfoGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserInfoGetRequest.cs
new file mode 100644
index 00000000..75db0cb1
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserInfoGetRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/info/get 接口的请求。
+ ///
+ public class ChannelsECVipUserInfoGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置是否需要获取手机号码。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_phone_number")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_phone_number")]
+ public bool? RequirePhoneNumber { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserInfoGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserInfoGetResponse.cs
new file mode 100644
index 00000000..5d2fe700
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserInfoGetResponse.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/info/get 接口的响应。
+ ///
+ public class ChannelsECVipUserInfoGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class VipInfo : ChannelsECVipUserListGetResponse.Types.VipInfo
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置会员信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("info")]
+ [System.Text.Json.Serialization.JsonPropertyName("info")]
+ public Types.VipInfo VipInfo { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserListGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserListGetRequest.cs
new file mode 100644
index 00000000..ec9c8095
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserListGetRequest.cs
@@ -0,0 +1,31 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/list/get 接口的请求。
+ ///
+ public class ChannelsECVipUserListGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置是否需要获取手机号码。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_phone_number")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_phone_number")]
+ public bool? RequirePhoneNumber { get; set; }
+
+ ///
+ /// 获取或设置分页页数。
+ /// 默认值:1
+ ///
+ [Newtonsoft.Json.JsonProperty("page_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_num")]
+ public int Page { get; set; } = 1;
+
+ ///
+ /// 获取或设置分页每页数量。
+ /// 默认值:10
+ ///
+ [Newtonsoft.Json.JsonProperty("page_size")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_size")]
+ public int Limit { get; set; } = 10;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserListGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserListGetResponse.cs
new file mode 100644
index 00000000..2ed66042
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserListGetResponse.cs
@@ -0,0 +1,87 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/list/get 接口的响应。
+ ///
+ public class ChannelsECVipUserListGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class VipInfo
+ {
+ public static class Types
+ {
+ public class UserInfo
+ {
+ ///
+ /// 获取或设置手机号码。
+ ///
+ [Newtonsoft.Json.JsonProperty("phone_number")]
+ [System.Text.Json.Serialization.JsonPropertyName("phone_number")]
+ public string PhoneNumber { get; set; } = default!;
+ }
+
+ public class UserGradeInfo
+ {
+ ///
+ /// 获取或设置会员等级。
+ ///
+ [Newtonsoft.Json.JsonProperty("grade")]
+ [System.Text.Json.Serialization.JsonPropertyName("grade")]
+ public int Grade { get; set; }
+
+ ///
+ /// 获取或设置经验值。
+ ///
+ [Newtonsoft.Json.JsonProperty("experience_value")]
+ [System.Text.Json.Serialization.JsonPropertyName("experience_value")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int ExperienceValue { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = default!;
+
+ ///
+ /// 获取或设置用户的 UnionId。
+ ///
+ [Newtonsoft.Json.JsonProperty("unionid")]
+ [System.Text.Json.Serialization.JsonPropertyName("unionid")]
+ public string? UnionId { get; set; }
+
+ ///
+ /// 获取或设置用户信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_info")]
+ public Types.UserInfo? UserInfo { get; set; }
+
+ ///
+ /// 获取或设置用户等级信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_grade_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_grade_info")]
+ public Types.UserGradeInfo? UserGradeInfo { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置会员列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.VipInfo[] VipList { get; set; } = default!;
+
+ ///
+ /// 获取或设置总数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_num")]
+ public int TotalCount { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreDecreaseRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreDecreaseRequest.cs
new file mode 100644
index 00000000..8a67386a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreDecreaseRequest.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/score/decrease 接口的请求。
+ ///
+ public class ChannelsECVipUserScoreDecreaseRequest : ChannelsECVipUserScoreIncreaseRequest, IInferable
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreDecreaseResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreDecreaseResponse.cs
new file mode 100644
index 00000000..25d22cc4
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreDecreaseResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/score/decrease 接口的响应。
+ ///
+ public class ChannelsECVipUserScoreDecreaseResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetRequest.cs
new file mode 100644
index 00000000..4e7c8a0f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetRequest.cs
@@ -0,0 +1,31 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/score/flowrecord/get 接口的请求。
+ ///
+ public class ChannelsECVipUserScoreFlowRecordGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置分页页数。
+ /// 默认值:1
+ ///
+ [Newtonsoft.Json.JsonProperty("page_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_num")]
+ public int Page { get; set; } = 1;
+
+ ///
+ /// 获取或设置分页每页数量。
+ /// 默认值:10
+ ///
+ [Newtonsoft.Json.JsonProperty("page_size")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_size")]
+ public int Limit { get; set; } = 10;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetResponse.cs
new file mode 100644
index 00000000..d5ce9cc0
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetResponse.cs
@@ -0,0 +1,50 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/score/flowrecord/get 接口的响应。
+ ///
+ public class ChannelsECVipUserScoreFlowRecordGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class FlowRecord
+ {
+ ///
+ /// 获取或设置用户积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("score")]
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int Score { get; set; }
+
+ ///
+ /// 获取或设置来源。
+ ///
+ [Newtonsoft.Json.JsonProperty("source")]
+ [System.Text.Json.Serialization.JsonPropertyName("source")]
+ public int Source { get; set; }
+
+ ///
+ /// 获取或设置备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("remark")]
+ public string? Remark { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置积分流水列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.FlowRecord[] FlowRecordList { get; set; } = default!;
+
+ ///
+ /// 获取或设置总数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("total_num")]
+ [System.Text.Json.Serialization.JsonPropertyName("total_num")]
+ public int TotalCount { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreGetRequest.cs
new file mode 100644
index 00000000..67f0464a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreGetRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/score/get 接口的请求。
+ ///
+ public class ChannelsECVipUserScoreGetRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreGetResponse.cs
new file mode 100644
index 00000000..2590368d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreGetResponse.cs
@@ -0,0 +1,29 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/score/get 接口的响应。
+ ///
+ public class ChannelsECVipUserScoreGetResponse : WechatApiResponse
+ {
+ public static class Types
+ {
+ public class UserInfo
+ {
+ ///
+ /// 获取或设置用户积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("score")]
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
+ public int Score { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置用户信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("info")]
+ [System.Text.Json.Serialization.JsonPropertyName("info")]
+ public Types.UserInfo UserInfo { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreIncreaseRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreIncreaseRequest.cs
new file mode 100644
index 00000000..fb47d8b9
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreIncreaseRequest.cs
@@ -0,0 +1,37 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/score/increase 接口的请求。
+ ///
+ public class ChannelsECVipUserScoreIncreaseRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置用户的 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置用户积分。
+ ///
+ [Newtonsoft.Json.JsonProperty("score")]
+ [System.Text.Json.Serialization.JsonPropertyName("score")]
+ [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString)]
+ public int Score { get; set; }
+
+ ///
+ /// 获取或设置请求唯一 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("request_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("request_id")]
+ public string RequestId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("remark")]
+ public string? Remark { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreIncreaseResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreIncreaseResponse.cs
new file mode 100644
index 00000000..0dfc26f1
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Channels/ECVip/User/ChannelsECVipUserScoreIncreaseResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [POST] /channels/ec/vip/user/score/increase 接口的响应。
+ ///
+ public class ChannelsECVipUserScoreIncreaseResponse : WechatApiResponse
+ {
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipCloseEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipCloseEvent.json
new file mode 100644
index 00000000..d161311f
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipCloseEvent.json
@@ -0,0 +1,10 @@
+{
+ "ToUserName": "gh_*",
+ "FromUserName": "OPENID",
+ "CreateTime": 1662480000,
+ "MsgType": "event",
+ "Event": "channels_ec_vip_close",
+ "user_info": {
+ "close_time": 1662480000
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipGradeInfoUpgradeEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipGradeInfoUpgradeEvent.json
new file mode 100644
index 00000000..dae84a7b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipGradeInfoUpgradeEvent.json
@@ -0,0 +1,11 @@
+{
+ "ToUserName": "gh_*",
+ "FromUserName": "OPENID",
+ "CreateTime": 1662480000,
+ "MsgType": "event",
+ "Event": "channels_ec_vip_grade_info_update",
+ "user_info": {
+ "grade": 2,
+ "experience_value": 100
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipJoinEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipJoinEvent.json
new file mode 100644
index 00000000..c6f6dfc2
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipJoinEvent.json
@@ -0,0 +1,11 @@
+{
+ "ToUserName": "gh_*",
+ "FromUserName": "OPENID",
+ "CreateTime": 1662480000,
+ "MsgType": "event",
+ "Event": "channels_ec_vip_join",
+ "user_info": {
+ "join_time": 1662480000,
+ "phone_number": "123456789"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipScoreExchangeEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipScoreExchangeEvent.json
new file mode 100644
index 00000000..b8da8c1d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipScoreExchangeEvent.json
@@ -0,0 +1,17 @@
+{
+ "ToUserName": "gh_*",
+ "FromUserName": "OPENID",
+ "CreateTime": 1662480000,
+ "MsgType": "event",
+ "Event": "channels_ec_vip_score_exchange",
+ "exchange_info": {
+ "pay_score": 100,
+ "score_item_type": 1,
+ "coupon_info": {
+ "related_coupon_id": 1234
+ },
+ "product_info": {
+ "related_product_id": 1234
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipScoreUpdateEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipScoreUpdateEvent.json
new file mode 100644
index 00000000..62948a8b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipScoreUpdateEvent.json
@@ -0,0 +1,12 @@
+{
+ "ToUserName": "gh_*",
+ "FromUserName": "OPENID",
+ "CreateTime": 1662480000,
+ "MsgType": "event",
+ "Event": "channels_ec_vip_score_update",
+ "user_info": {
+ "score": 100,
+ "delta_score": -10,
+ "flow_type": 3
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipTaskAwardEvent.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipTaskAwardEvent.json
new file mode 100644
index 00000000..3d58716c
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/ChannelsEC/ChannelsECVipTaskAwardEvent.json
@@ -0,0 +1,16 @@
+{
+ "ToUserName": "gh_*",
+ "FromUserName": "OPENID",
+ "CreateTime": 1662480000,
+ "MsgType": "event",
+ "Event": "channels_ec_vip_task_award",
+ "task_info": {
+ "task_id": 123,
+ "task_name": "任务名称",
+ "award_info": {
+ "award_type": 1,
+ "coupon_id": 1234,
+ "gain_score": 100
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/ExperienceValue/ChannelsECVipExperienceValueSetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/ExperienceValue/ChannelsECVipExperienceValueSetRequest.json
new file mode 100644
index 00000000..2be5deb6
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/ExperienceValue/ChannelsECVipExperienceValueSetRequest.json
@@ -0,0 +1,12 @@
+{
+ "conf": {
+ "pay_amount_rule": {
+ "pay_value": "100",
+ "gain_value": "1",
+ "pay_amount_floor": "100"
+ },
+ "pay_time_rule": {
+ "gain_value": "1"
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Grade/ChannelsECVipGradeCardAddRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Grade/ChannelsECVipGradeCardAddRequest.json
new file mode 100644
index 00000000..a1dd575f
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Grade/ChannelsECVipGradeCardAddRequest.json
@@ -0,0 +1,6 @@
+{
+ "grade": 1,
+ "name": "VIP1",
+ "experience_value_threshold": "100",
+ "experience_value_multiple": 10
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Grade/ChannelsECVipGradeCardGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Grade/ChannelsECVipGradeCardGetResponse.json
new file mode 100644
index 00000000..ff8814d7
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Grade/ChannelsECVipGradeCardGetResponse.json
@@ -0,0 +1,40 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "info": {
+ "experience_value_conf": {
+ "pay_amount_rule": {
+ "pay_value": "100",
+ "gain_value": "1",
+ "pay_amount_floor": "100"
+ },
+ "pay_time_rule": {
+ "gain_value": "1"
+ }
+ },
+ "card_conf": {
+ "grade_card_list": [
+ {
+ "grade": 1,
+ "valid_name": "VIP1",
+ "experience_value_threshold": "100",
+ "experience_value_multiple": 10,
+ "audit_info": {
+ "latest_name": "VIP1",
+ "status": 1
+ }
+ },
+ {
+ "grade": 2,
+ "valid_name": "VIP2",
+ "experience_value_threshold": "200",
+ "experience_value_multiple": 12,
+ "audit_info": {
+ "latest_name": "高级会员",
+ "status": 0
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Grade/ChannelsECVipGradeCardUpdateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Grade/ChannelsECVipGradeCardUpdateRequest.json
new file mode 100644
index 00000000..16c6ea54
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Grade/ChannelsECVipGradeCardUpdateRequest.json
@@ -0,0 +1,4 @@
+{
+ "grade": 1,
+ "name": "VIP1"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Score/ChannelsECVipScoreGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Score/ChannelsECVipScoreGetResponse.json
new file mode 100644
index 00000000..489eb76d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Score/ChannelsECVipScoreGetResponse.json
@@ -0,0 +1,19 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "conf": {
+ "gain_rule": {
+ "pay_amount_rule": {
+ "pay_value": "100"
+ },
+ "pay_time_rule": {
+ "gain_value": "1"
+ }
+ },
+ "deduct_rule": {
+ "open_mgr": 1,
+ "ratio": "100",
+ "limit": "100"
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Score/ChannelsECVipScoreSetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Score/ChannelsECVipScoreSetRequest.json
new file mode 100644
index 00000000..2b1eaec5
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/Score/ChannelsECVipScoreSetRequest.json
@@ -0,0 +1,17 @@
+{
+ "conf": {
+ "gain_rule": {
+ "pay_amount_rule": {
+ "pay_value": "100"
+ },
+ "pay_time_rule": {
+ "gain_value": "1"
+ }
+ },
+ "deduct_rule": {
+ "open_mgr": 1,
+ "ratio": "100",
+ "limit": "100"
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserExperienceValueUpdateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserExperienceValueUpdateRequest.json
new file mode 100644
index 00000000..9ea24733
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserExperienceValueUpdateRequest.json
@@ -0,0 +1,4 @@
+{
+ "openid": "OPENID",
+ "experience_value": "100"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserGradeUpdateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserGradeUpdateRequest.json
new file mode 100644
index 00000000..456af3b3
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserGradeUpdateRequest.json
@@ -0,0 +1,4 @@
+{
+ "openid": "OPENID",
+ "grade": 1
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserInfoGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserInfoGetRequest.json
new file mode 100644
index 00000000..12d92daa
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserInfoGetRequest.json
@@ -0,0 +1,4 @@
+{
+ "openid": "OPENID",
+ "need_phone_number": true
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserInfoGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserInfoGetResponse.json
new file mode 100644
index 00000000..002daf53
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserInfoGetResponse.json
@@ -0,0 +1,15 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "info": {
+ "openid": "OPENID",
+ "unionid": "UNIONID",
+ "user_info": {
+ "phone_number": "123456789"
+ },
+ "user_grade_info": {
+ "grade": 1,
+ "experience_value": "100"
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserListGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserListGetRequest.json
new file mode 100644
index 00000000..6dfd9877
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserListGetRequest.json
@@ -0,0 +1,5 @@
+{
+ "need_phone_number": true,
+ "page_num": 1,
+ "page_size": 1
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserListGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserListGetResponse.json
new file mode 100644
index 00000000..6d527371
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserListGetResponse.json
@@ -0,0 +1,18 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "list": [
+ {
+ "openid": "OPENID",
+ "unionid": "UNIONID",
+ "user_info": {
+ "phone_number": "123456789"
+ },
+ "user_grade_info": {
+ "grade": 1,
+ "experience_value": "100"
+ }
+ }
+ ],
+ "total_num": 100
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreDecreaseRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreDecreaseRequest.json
new file mode 100644
index 00000000..b7ac93af
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreDecreaseRequest.json
@@ -0,0 +1,6 @@
+{
+ "openid": "OPENID",
+ "score": "100",
+ "remark": "备注",
+ "request_id": "REQUEST_ID"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetRequest.json
new file mode 100644
index 00000000..1835dc3a
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetRequest.json
@@ -0,0 +1,5 @@
+{
+ "openid": "OPENID",
+ "page_num": 1,
+ "page_size": 200
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetResponse.json
new file mode 100644
index 00000000..06553262
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreFlowRecordGetResponse.json
@@ -0,0 +1,12 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "list": [
+ {
+ "score": "100",
+ "source": 1,
+ "remark": "备注"
+ }
+ ],
+ "total_num": 100
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreGetRequest.json
new file mode 100644
index 00000000..af7ee63b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreGetRequest.json
@@ -0,0 +1,3 @@
+{
+ "openid": "OPENID"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreGetResponse.json
new file mode 100644
index 00000000..94bffe6c
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreGetResponse.json
@@ -0,0 +1,7 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "info": {
+ "score": "100"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreIncreaseRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreIncreaseRequest.json
new file mode 100644
index 00000000..b7ac93af
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Channels/ECVip/User/ChannelsECVipUserScoreIncreaseRequest.json
@@ -0,0 +1,6 @@
+{
+ "openid": "OPENID",
+ "score": "100",
+ "remark": "备注",
+ "request_id": "REQUEST_ID"
+}