diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAdCreativesExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAdCreativesExtensions.cs
new file mode 100644
index 00000000..9032719a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAdCreativesExtensions.cs
@@ -0,0 +1,87 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteAdCreativesExtensions
+ {
+ ///
+ /// 异步调用 [POST] /adcreatives/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdCreativesAddAsync(this WechatAdsClient client, Models.AdCreativesAddRequest 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(HttpMethod.Post, "adcreatives", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /adcreatives/update 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdCreativesUpdateAsync(this WechatAdsClient client, Models.AdCreativesUpdateRequest 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(HttpMethod.Post, "adcreatives", "update")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /adcreatives/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdCreativesGetAsync(this WechatAdsClient client, Models.AdCreativesGetRequest 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(HttpMethod.Get, "adcreatives", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.AdCreativeId.HasValue)
+ flurlReq.SetQueryParam("adcreative_id", request.AdCreativeId.Value);
+
+ if (request.Filters != null && request.Filters.Any())
+ flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAdGroupsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAdGroupsExtensions.cs
new file mode 100644
index 00000000..b0386871
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAdGroupsExtensions.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteAdGroupsExtensions
+ {
+ ///
+ /// 异步调用 [POST] /adgroups/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdGroupsAddAsync(this WechatAdsClient client, Models.AdGroupsAddRequest 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(HttpMethod.Post, "adgroups", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /adgroups/update 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdGroupsUpdateAsync(this WechatAdsClient client, Models.AdGroupsUpdateRequest 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(HttpMethod.Post, "adgroups", "update")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /adgroups/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdGroupsGetAsync(this WechatAdsClient client, Models.AdGroupsGetRequest 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(HttpMethod.Get, "adgroups", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.AdGroupId.HasValue)
+ flurlReq.SetQueryParam("adgroup_id", request.AdGroupId.Value);
+
+ if (request.Filters != null && request.Filters.Any())
+ flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /adgroups/delete 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdGroupsDeleteAsync(this WechatAdsClient client, Models.AdGroupsDeleteRequest 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(HttpMethod.Post, "adgroups", "delete")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAdsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAdsExtensions.cs
new file mode 100644
index 00000000..4e3ecf65
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAdsExtensions.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteAdsExtensions
+ {
+ ///
+ /// 异步调用 [POST] /ads/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdsAddAsync(this WechatAdsClient client, Models.AdsAddRequest 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(HttpMethod.Post, "ads", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /ads/update 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdsUpdateAsync(this WechatAdsClient client, Models.AdsUpdateRequest 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(HttpMethod.Post, "ads", "update")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /ads/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdsGetAsync(this WechatAdsClient client, Models.AdsGetRequest 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(HttpMethod.Get, "ads", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.AdId.HasValue)
+ flurlReq.SetQueryParam("ad_id", request.AdId.Value);
+
+ if (request.Filters != null && request.Filters.Any())
+ flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /ads/delete 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAdsDeleteAsync(this WechatAdsClient client, Models.AdsDeleteRequest 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(HttpMethod.Post, "ads", "delete")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAsyncTasksExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAsyncTasksExtensions.cs
new file mode 100644
index 00000000..2f61dd16
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteAsyncTasksExtensions.cs
@@ -0,0 +1,88 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteAsyncTasksExtensions
+ {
+ ///
+ /// 异步调用 [POST] /async_tasks/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAsyncTasksAddAsync(this WechatAdsClient client, Models.AsyncTasksAddRequest 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(HttpMethod.Post, "async_tasks", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /async_tasks/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAsyncTasksGetAsync(this WechatAdsClient client, Models.AsyncTasksGetRequest 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(HttpMethod.Get, "async_tasks", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.Filters != null && request.Filters.Any())
+ flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ #region Files
+ ///
+ /// 异步调用 [GET] /async_task_files/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteAsyncTaskFilesGetAsync(this WechatAdsClient client, Models.AsyncTaskFilesGetRequest 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(HttpMethod.Get, "async_task_files", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken)
+ .SetQueryParam("task_id", request.TaskId)
+ .SetQueryParam("file_id", request.FileId);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ #endregion
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteCampaignsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteCampaignsExtensions.cs
new file mode 100644
index 00000000..fa8f1a9d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteCampaignsExtensions.cs
@@ -0,0 +1,87 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteCampaignsExtensions
+ {
+ ///
+ /// 异步调用 [POST] /campaigns/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCampaignsAddAsync(this WechatAdsClient client, Models.CampaignsAddRequest 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(HttpMethod.Post, "campaigns", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /campaigns/update 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCampaignsUpdateAsync(this WechatAdsClient client, Models.CampaignsUpdateRequest 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(HttpMethod.Post, "campaigns", "update")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /campaigns/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCampaignsGetAsync(this WechatAdsClient client, Models.CampaignsGetRequest 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(HttpMethod.Get, "campaigns", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.CampaignId.HasValue)
+ flurlReq.SetQueryParam("campaign_id", request.CampaignId.Value);
+
+ if (request.Filters != null && request.Filters.Any())
+ flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteCreditBillsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteCreditBillsExtensions.cs
new file mode 100644
index 00000000..e674c760
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteCreditBillsExtensions.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteCreditBillsExtensions
+ {
+ ///
+ /// 异步调用 [GET] /credit_bills/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCreditBillsGetAsync(this WechatAdsClient client, Models.CreditBillsGetRequest 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(HttpMethod.Get, "credit_bills", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken)
+ .SetQueryParam("bill_year", request.BillYear)
+ .SetQueryParam("bill_month", request.BillMonth);
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteCustomAudiencesExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteCustomAudiencesExtensions.cs
new file mode 100644
index 00000000..7b31564f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteCustomAudiencesExtensions.cs
@@ -0,0 +1,150 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteCustomAudiencesExtensions
+ {
+ ///
+ /// 异步调用 [POST] /custom_audiences/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCustomAudiencesAddAsync(this WechatAdsClient client, Models.CustomAudiencesAddRequest 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(HttpMethod.Post, "custom_audiences", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /custom_audiences/update 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCustomAudiencesUpdateAsync(this WechatAdsClient client, Models.CustomAudiencesUpdateRequest 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(HttpMethod.Post, "custom_audiences", "update")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /custom_audiences/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCustomAudiencesGetAsync(this WechatAdsClient client, Models.CustomAudiencesGetRequest 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(HttpMethod.Get, "custom_audiences", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.CustomAudienceId.HasValue)
+ flurlReq.SetQueryParam("audience_id", request.CustomAudienceId.Value);
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ #region Files
+ ///
+ /// 异步调用 [POST] /custom_audience_files/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCustomAudienceFilesAddAsync(this WechatAdsClient client, Models.CustomAudienceFilesAddRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ string boundary = "--BOUNDARY--" + DateTimeOffset.Now.Ticks.ToString("x");
+ string filename = "file.zip";
+ using var fileContent = new ByteArrayContent(request.FileBytes ?? new byte[0]);
+ using var httpContent = new MultipartFormDataContent(boundary);
+ httpContent.Add(new StringContent(request.CustomAudienceId.ToString()), "audience_id");
+ httpContent.Add(new StringContent(request.UserIdType), "user_id_type");
+ httpContent.Add(new StringContent(request.OperationType), "operation_type");
+ httpContent.Add(fileContent, "\"file\"", "\"" + filename + "\"");
+ httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data; boundary=" + boundary);
+ fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/zip");
+ fileContent.Headers.ContentLength = request.FileBytes?.Length ?? 0;
+ IFlurlRequest flurlReq = client
+ .CreateRequest(HttpMethod.Post, "custom_audience_files", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestAsync(flurlReq, content: httpContent, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /custom_audience_files/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCustomAudienceFilesGetAsync(this WechatAdsClient client, Models.CustomAudienceFilesGetRequest 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(HttpMethod.Get, "custom_audience_files", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.CustomAudienceId.HasValue)
+ flurlReq.SetQueryParam("audience_id", request.CustomAudienceId.Value);
+
+ if (request.CustomAudienceFileId.HasValue)
+ flurlReq.SetQueryParam("custom_audience_file_id", request.CustomAudienceFileId.Value);
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ #endregion
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteEstimationExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteEstimationExtensions.cs
new file mode 100644
index 00000000..015f6136
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteEstimationExtensions.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteEstimationExtensions
+ {
+ ///
+ /// 异步调用 [POST] /estimation/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteEstimationGetAsync(this WechatAdsClient client, Models.EstimationGetRequest 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(HttpMethod.Post, "estimation", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteFundsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteFundsExtensions.cs
new file mode 100644
index 00000000..818a014d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteFundsExtensions.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteFundsExtensions
+ {
+ ///
+ /// 异步调用 [POST] /fund_transfer/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteFundTransferAddAsync(this WechatAdsClient client, Models.FundTransferAddRequest 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(HttpMethod.Post, "fund_transfer", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /funds/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteFundsGetAsync(this WechatAdsClient client, Models.FundsGetRequest 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(HttpMethod.Get, "funds", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /fund_statements_detailed/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteFundStatementsDetailedGetAsync(this WechatAdsClient client, Models.FundStatementsDetailedGetRequest 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(HttpMethod.Get, "fund_statements_detailed", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.DateRange != null)
+ flurlReq.SetQueryParam("date_range", client.JsonSerializer.Serialize(request.DateRange));
+
+ if (!string.IsNullOrEmpty(request.TradeType))
+ flurlReq.SetQueryParam("trade_type", request.TradeType);
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteImagesExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteImagesExtensions.cs
index 4d3dd2a7..0f2eebcc 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteImagesExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteImagesExtensions.cs
@@ -53,7 +53,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
string boundary = "--BOUNDARY--" + DateTimeOffset.Now.Ticks.ToString("x");
using var fileContent = new ByteArrayContent(request.FileBytes ?? new byte[0]);
using var httpContent = new MultipartFormDataContent(boundary);
- httpContent.Add(fileContent, "\"media\"", "\"" + HttpUtility.UrlEncode(request.FileName) + "\"");
+ httpContent.Add(fileContent, "\"file\"", "\"" + HttpUtility.UrlEncode(request.FileName) + "\"");
httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data; boundary=" + boundary);
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(request.FileContentType);
fileContent.Headers.ContentLength = request.FileBytes?.Length ?? 0;
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteQualificationsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteQualificationsExtensions.cs
new file mode 100644
index 00000000..86405d69
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteQualificationsExtensions.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteQualificationsExtensions
+ {
+ ///
+ /// 异步调用 [POST] /qualifications/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteQualificationsAddAsync(this WechatAdsClient client, Models.QualificationsAddRequest 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(HttpMethod.Post, "qualifications", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /qualifications/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteQualificationsGetAsync(this WechatAdsClient client, Models.QualificationsGetRequest 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(HttpMethod.Get, "qualifications", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /qualifications/delete 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteQualificationsDeleteAsync(this WechatAdsClient client, Models.QualificationsDeleteRequest 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(HttpMethod.Post, "qualifications", "delete")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteReportsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteReportsExtensions.cs
new file mode 100644
index 00000000..c917edd5
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteReportsExtensions.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteReportsExtensions
+ {
+ ///
+ /// 异步调用 [GET] /daily_reports/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteDailyReportsGetAsync(this WechatAdsClient client, Models.DailyReportsGetRequest 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(HttpMethod.Get, "daily_reports", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ if (request.DateRange != null)
+ flurlReq.SetQueryParam("date_range", client.JsonSerializer.Serialize(request.DateRange));
+
+ if (!string.IsNullOrEmpty(request.ReportType))
+ flurlReq.SetQueryParam("report_type", request.ReportType);
+
+ if (!string.IsNullOrEmpty(request.ReportLevel))
+ flurlReq.SetQueryParam("level", request.ReportLevel);
+
+ if (request.PageSize.HasValue)
+ flurlReq.SetQueryParam("page_size", request.PageSize.Value);
+
+ if (request.Page.HasValue)
+ flurlReq.SetQueryParam("page", request.Page.Value);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /realtime_cost/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteRealtimeCostGetAsync(this WechatAdsClient client, Models.RealtimeCostGetRequest 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(HttpMethod.Get, "realtime_cost", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken)
+ .SetQueryParam("date", request.DateString)
+ .SetQueryParam("level", request.Level);
+
+ if (request.Filters != null && request.Filters.Any())
+ flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteSpEntrustmentExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteSpEntrustmentExtensions.cs
new file mode 100644
index 00000000..0acf3217
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteSpEntrustmentExtensions.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteSpEntrustmentExtensions
+ {
+ ///
+ /// 异步调用 [POST] /sp_entrustment/add 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteSpEntrustmentAddAsync(this WechatAdsClient client, Models.SpEntrustmentAddRequest 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(HttpMethod.Post, "sp_entrustment", "add")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /sp_entrustment/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteSpEntrustmentGetAsync(this WechatAdsClient client, Models.SpEntrustmentGetRequest 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(HttpMethod.Get, "sp_entrustment", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteTargetingTagsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteTargetingTagsExtensions.cs
new file mode 100644
index 00000000..85fa0040
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Extensions/WechatAdsClientExecuteTargetingTagsExtensions.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads
+{
+ public static class WechatAdsClientExecuteTargetingTagsExtensions
+ {
+ ///
+ /// 异步调用 [GET] /targeting_tags/get 接口。
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteTargetingTagsGetAsync(this WechatAdsClient client, Models.TargetingTagsGetRequest 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(HttpMethod.Get, "targeting_tags", "get")
+ .SetOptions(request)
+ .SetQueryParam("access_token", request.AccessToken)
+ .SetQueryParam("type", request.TagType);
+
+ return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Abstractions/CommonDateRange.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Abstractions/CommonDateRange.cs
new file mode 100644
index 00000000..7c214a45
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Abstractions/CommonDateRange.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models.Abstractions
+{
+ public sealed class CommonDateRange
+ {
+ ///
+ /// 获取或设置开始日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("start_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("start_date")]
+ public string StartDateString { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置结束日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("end_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("end_date")]
+ public string EndDateString { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesAddRequest.cs
new file mode 100644
index 00000000..11b3cd79
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesAddRequest.cs
@@ -0,0 +1,133 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adcreatives/add 接口的请求。
+ ///
+ public class AdCreativesAddRequest : WechatAdsRequest
+ {
+ public static class Types
+ {
+ public class Element
+ {
+ ///
+ /// 获取或设置广告文案。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string? Title { get; set; }
+
+ ///
+ /// 获取或设置广告描述。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string? Description { get; set; }
+
+ ///
+ /// 获取或设置图片 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("image")]
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string? ImageId { get; set; }
+
+ ///
+ /// 获取或设置图片 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("image_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("image_list")]
+ public IList? ImageIdList { get; set; }
+
+ ///
+ /// 获取或设置链接名称类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("link_name_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("link_name_type")]
+ public string? LinkNameType { get; set; }
+ }
+
+ public class Share
+ {
+ ///
+ /// 获取或设置分享标题。
+ ///
+ [Newtonsoft.Json.JsonProperty("share_title")]
+ [System.Text.Json.Serialization.JsonPropertyName("share_title")]
+ public string Title { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置分享描述。
+ ///
+ [Newtonsoft.Json.JsonProperty("share_description")]
+ [System.Text.Json.Serialization.JsonPropertyName("share_description")]
+ public string Description { get; set; } = string.Empty;
+ }
+ }
+
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long CampaignId { get; set; }
+
+ ///
+ /// 获取或设置广告创意名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_name")]
+ public string AdCreativeName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置广告创意规格 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_template_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_template_id")]
+ public int AdCreativeTemplateId { get; set; }
+
+ ///
+ /// 获取或设置广告创意元素信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_elements")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_elements")]
+ public Types.Element AdCreativeElement { get; set; } = new Types.Element();
+
+ ///
+ /// 获取或设置投放站点列表。
+ /// 默认值:["SITE_SET_WECHAT"]
+ ///
+ [Newtonsoft.Json.JsonProperty("site_set")]
+ [System.Text.Json.Serialization.JsonPropertyName("site_set")]
+ public IList SiteList { get; set; } = new List() { "SITE_SET_WECHAT" };
+
+ ///
+ /// 获取或设置目标 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("destination_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("destination_url")]
+ public string DestinationUrl { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置标的物类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_type")]
+ public string ProductType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置标的物 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_refs_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_refs_id")]
+ public string? ProductRefId { get; set; }
+
+ ///
+ /// 获取或设置分享信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("share_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("share_info")]
+ public Types.Share? Share { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesAddResponse.cs
new file mode 100644
index 00000000..a87e12c5
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesAddResponse.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adcreatives/add 接口的响应。
+ ///
+ public class AdCreativesAddResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置广告创意 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_id")]
+ public long AdCreativeId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesGetRequest.cs
new file mode 100644
index 00000000..e94adc3c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesGetRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /adcreatives/get 接口的请求。
+ ///
+ public class AdCreativesGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置广告创意 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public long? AdCreativeId { get; set; }
+
+ ///
+ /// 获取或设置过滤条件。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? Filters { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesGetResponse.cs
new file mode 100644
index 00000000..681b4014
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesGetResponse.cs
@@ -0,0 +1,162 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /adcreatives/get 接口的响应。
+ ///
+ public class AdCreativesGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class AdCreative
+ {
+ public static class Types
+ {
+ public class Element
+ {
+ ///
+ /// 获取或设置广告文案。
+ ///
+ [Newtonsoft.Json.JsonProperty("title")]
+ [System.Text.Json.Serialization.JsonPropertyName("title")]
+ public string? Title { get; set; }
+
+ ///
+ /// 获取或设置广告描述。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string? Description { get; set; }
+
+ ///
+ /// 获取或设置图片 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("image")]
+ [System.Text.Json.Serialization.JsonPropertyName("image")]
+ public string? ImageId { get; set; }
+
+ ///
+ /// 获取或设置图片 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("image_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("image_list")]
+ public string[]? ImageIdList { get; set; }
+
+ ///
+ /// 获取或设置链接名称类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("link_name_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("link_name_type")]
+ public string? LinkNameType { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long CampaignId { get; set; }
+
+ ///
+ /// 获取或设置广告创意 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_id")]
+ public long AdCreativeId { get; set; }
+
+ ///
+ /// 获取或设置广告创意名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_name")]
+ public string AdCreativeName { get; set; } = default!;
+
+ ///
+ /// 获取或设置广告创意规格 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_template_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_template_id")]
+ public int AdCreativeTemplateId { get; set; }
+
+ ///
+ /// 获取或设置广告创意元素信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_elements")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_elements")]
+ public Types.Element AdCreativeElement { get; set; } = default!;
+
+ ///
+ /// 获取或设置投放站点列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("site_set")]
+ [System.Text.Json.Serialization.JsonPropertyName("site_set")]
+ public string[] SiteList { get; set; } = default!;
+
+ ///
+ /// 获取或设置目标 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("destination_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("destination_url")]
+ public string DestinationUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置标的物类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_type")]
+ public string ProductType { get; set; } = default!;
+
+ ///
+ /// 获取或设置标的物 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_refs_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_refs_id")]
+ public string? ProductRefId { get; set; }
+
+ ///
+ /// 获取或设置最近修改时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("last_modified_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("last_modified_time")]
+ public long UpdateTimestamp { get; set; }
+
+ ///
+ /// 获取或设置创建时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("created_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("created_time")]
+ public long CreateTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置广告创意列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.AdCreative[] AdCreativeList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesUpdateRequest.cs
new file mode 100644
index 00000000..48d7cd9f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesUpdateRequest.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adcreatives/update 接口的请求。
+ ///
+ public class AdCreativesUpdateRequest : WechatAdsRequest
+ {
+ public static class Types
+ {
+ public class Element : AdCreativesAddRequest.Types.Element
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置广告创意 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_id")]
+ public long AdCreativeId { get; set; }
+
+ ///
+ /// 获取或设置广告创意名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_name")]
+ public string? AdCreativeName { get; set; }
+
+ ///
+ /// 获取或设置广告创意元素信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_elements")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_elements")]
+ public Types.Element? AdCreativeElement { get; set; }
+
+ ///
+ /// 获取或设置目标 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("destination_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("destination_url")]
+ public string? DestinationUrl { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesUpdateResponse.cs
new file mode 100644
index 00000000..01c30ddf
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdCreatives/AdCreativesUpdateResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adcreatives/update 接口的响应。
+ ///
+ public class AdCreativesUpdateResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsAddRequest.cs
new file mode 100644
index 00000000..0369bd98
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsAddRequest.cs
@@ -0,0 +1,285 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adgroups/add 接口的请求。
+ ///
+ public class AdGroupsAddRequest : WechatAdsRequest
+ {
+ public static class Types
+ {
+ public class Target
+ {
+ public static class Types
+ {
+ public class GeoLocation
+ {
+ public static class Types
+ {
+ public class CustomLocation
+ {
+ ///
+ /// 获取或设置经度。
+ ///
+ [Newtonsoft.Json.JsonProperty("longitude")]
+ [System.Text.Json.Serialization.JsonPropertyName("longitude")]
+ public double Longitude { get; set; }
+
+ ///
+ /// 获取或设置纬度。
+ ///
+ [Newtonsoft.Json.JsonProperty("latitude")]
+ [System.Text.Json.Serialization.JsonPropertyName("latitude")]
+ public double Latitude { get; set; }
+
+ ///
+ /// 获取或设置半径(单位:米)。
+ ///
+ [Newtonsoft.Json.JsonProperty("radius")]
+ [System.Text.Json.Serialization.JsonPropertyName("radius")]
+ public int Radius { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置地点类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("location_types")]
+ [System.Text.Json.Serialization.JsonPropertyName("location_types")]
+ public IList LocationTypes { get; set; } = new List();
+
+ ///
+ /// 获取或设置省市区县 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("regions")]
+ [System.Text.Json.Serialization.JsonPropertyName("regions")]
+ public IList? RegionIds { get; set; }
+
+ ///
+ /// 获取或设置商圈 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("business_districts")]
+ [System.Text.Json.Serialization.JsonPropertyName("business_districts")]
+ public IList? BusinessDistrictIds { get; set; }
+
+ ///
+ /// 获取或设置自定义地理位置列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("custom_locations")]
+ [System.Text.Json.Serialization.JsonPropertyName("custom_locations")]
+ public IList? CustomLocations { get; set; }
+ }
+
+ public class WechatAdBehavior
+ {
+ ///
+ /// 获取或设置包含的行为列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("actions")]
+ [System.Text.Json.Serialization.JsonPropertyName("actions")]
+ public IList? IncludedActions { get; set; }
+
+ ///
+ /// 获取或设置排除的行为列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("excluded_actions")]
+ [System.Text.Json.Serialization.JsonPropertyName("excluded_actions")]
+ public IList? ExcludedActions { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置年龄定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("age")]
+ [System.Text.Json.Serialization.JsonPropertyName("age")]
+ public IList? AgeRanges { get; set; }
+
+ ///
+ /// 获取或设置性别定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("gender")]
+ [System.Text.Json.Serialization.JsonPropertyName("gender")]
+ public IList? GenderTypes { get; set; }
+
+ ///
+ /// 获取或设置学历定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("education")]
+ [System.Text.Json.Serialization.JsonPropertyName("education")]
+ public IList? EducationTypes { get; set; }
+
+ ///
+ /// 获取或设置婚恋状态定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("relationship_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("relationship_status")]
+ public IList? RelationshipStatuses { get; set; }
+
+ ///
+ /// 获取或设置用户付费习惯定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_paying_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_paying_type")]
+ public IList? UserPayingTypes { get; set; }
+
+ ///
+ /// 获取或设置联网方式定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("network_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("network_type")]
+ public IList? NetworkTypes { get; set; }
+
+ ///
+ /// 获取或设置移动运营商定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("network_operator")]
+ [System.Text.Json.Serialization.JsonPropertyName("network_operator")]
+ public IList? NetworkOperatorTypes { get; set; }
+
+ ///
+ /// 获取或设置操作系统定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_os")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_os")]
+ public IList? UserOSTypes { get; set; }
+
+ ///
+ /// 获取或设置移动设备价格定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_price")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_price")]
+ public IList? DevicePriceTypes { get; set; }
+
+ ///
+ /// 获取或设置地理位置定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("geo_location")]
+ [System.Text.Json.Serialization.JsonPropertyName("geo_location")]
+ public Types.GeoLocation? GeoLocation { get; set; }
+
+ ///
+ /// 获取或设置微信广告行为定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("wechat_ad_behavior")]
+ [System.Text.Json.Serialization.JsonPropertyName("wechat_ad_behavior")]
+ public Types.WechatAdBehavior? WechatAdBehavior { get; set; }
+
+ ///
+ /// 获取或设置包含的自定义人群 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("custom_audience")]
+ [System.Text.Json.Serialization.JsonPropertyName("custom_audience")]
+ public IList? IncludedCustomAudienceIds { get; set; }
+
+ ///
+ /// 获取或设置排除的自定义人群 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("excluded_custom_audience")]
+ [System.Text.Json.Serialization.JsonPropertyName("excluded_custom_audience")]
+ public IList? ExcludedCustomAudienceIds { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long CampaignId { get; set; }
+
+ ///
+ /// 获取或设置广告组名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_name")]
+ public string AdGroupName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置投放站点列表。
+ /// 默认值:["SITE_SET_WECHAT"]
+ ///
+ [Newtonsoft.Json.JsonProperty("site_set")]
+ [System.Text.Json.Serialization.JsonPropertyName("site_set")]
+ public IList SiteList { get; set; } = new List() { "SITE_SET_WECHAT" };
+
+ ///
+ /// 获取或设置标的物类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_type")]
+ public string ProductType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置标的物 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_refs_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_refs_id")]
+ public string? ProductRefId { get; set; }
+
+ ///
+ /// 获取或设置定向条件。
+ ///
+ [Newtonsoft.Json.JsonProperty("targeting")]
+ [System.Text.Json.Serialization.JsonPropertyName("targeting")]
+ public Types.Target Target { get; set; } = new Types.Target();
+
+ ///
+ /// 获取或设置优化目标类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("optimization_goal")]
+ [System.Text.Json.Serialization.JsonPropertyName("optimization_goal")]
+ public string OptimizationGoalType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置出价方式类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("billing_event")]
+ [System.Text.Json.Serialization.JsonPropertyName("billing_event")]
+ public string BillingEventType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置广告出价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("bid_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("bid_amount")]
+ public int BidAmount { get; set; }
+
+ ///
+ /// 获取或设置开始投放日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("begin_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("begin_date")]
+ public string BeginDateString { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置结束投放日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("end_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("end_date")]
+ public string EndDateString { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置投放时间段。
+ ///
+ [Newtonsoft.Json.JsonProperty("time_series")]
+ [System.Text.Json.Serialization.JsonPropertyName("time_series")]
+ public string? TimeSeries { get; set; }
+
+ ///
+ /// 获取或设置日限额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("daily_budget")]
+ [System.Text.Json.Serialization.JsonPropertyName("daily_budget")]
+ public int? DailyBudget { get; set; }
+
+ ///
+ /// 获取或设置广告状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("configured_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("configured_status")]
+ public string? ConfiguredStatus { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsAddResponse.cs
new file mode 100644
index 00000000..dbaa2791
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsAddResponse.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adgroups/add 接口的响应。
+ ///
+ public class AdGroupsAddResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置广告组 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_id")]
+ public long AdGroupId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsDeleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsDeleteRequest.cs
new file mode 100644
index 00000000..cadf9595
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsDeleteRequest.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adgroups/delete 接口的请求。
+ ///
+ public class AdGroupsDeleteRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置广告组 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_id")]
+ public long AdGroupId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsDeleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsDeleteResponse.cs
new file mode 100644
index 00000000..5465bd2a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsDeleteResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adgroups/delete 接口的响应。
+ ///
+ public class AdGroupsDeleteResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsGetRequest.cs
new file mode 100644
index 00000000..65b19b69
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsGetRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /adgroups/get 接口的请求。
+ ///
+ public class AdGroupsGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置广告组 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public long? AdGroupId { get; set; }
+
+ ///
+ /// 获取或设置过滤条件。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? Filters { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsGetResponse.cs
new file mode 100644
index 00000000..fcd7fb0b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsGetResponse.cs
@@ -0,0 +1,352 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /adgroups/get 接口的响应。
+ ///
+ public class AdGroupsGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class AdGroup
+ {
+ public class Types
+ {
+ public class Target
+ {
+ public static class Types
+ {
+ public class GeoLocation
+ {
+ public static class Types
+ {
+ public class CustomLocation
+ {
+ ///
+ /// 获取或设置经度。
+ ///
+ [Newtonsoft.Json.JsonProperty("longitude")]
+ [System.Text.Json.Serialization.JsonPropertyName("longitude")]
+ public double Longitude { get; set; }
+
+ ///
+ /// 获取或设置纬度。
+ ///
+ [Newtonsoft.Json.JsonProperty("latitude")]
+ [System.Text.Json.Serialization.JsonPropertyName("latitude")]
+ public double Latitude { get; set; }
+
+ ///
+ /// 获取或设置半径(单位:米)。
+ ///
+ [Newtonsoft.Json.JsonProperty("radius")]
+ [System.Text.Json.Serialization.JsonPropertyName("radius")]
+ public int Radius { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置地点类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("location_types")]
+ [System.Text.Json.Serialization.JsonPropertyName("location_types")]
+ public string[] LocationTypes { get; set; } = new string[0];
+
+ ///
+ /// 获取或设置省市区县 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("regions")]
+ [System.Text.Json.Serialization.JsonPropertyName("regions")]
+ public int[]? RegionIds { get; set; }
+
+ ///
+ /// 获取或设置商圈 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("business_districts")]
+ [System.Text.Json.Serialization.JsonPropertyName("business_districts")]
+ public int[]? BusinessDistrictIds { get; set; }
+
+ ///
+ /// 获取或设置自定义地理位置列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("custom_locations")]
+ [System.Text.Json.Serialization.JsonPropertyName("custom_locations")]
+ public Types.CustomLocation[]? CustomLocations { get; set; }
+ }
+
+ public class WechatAdBehavior
+ {
+ ///
+ /// 获取或设置包含的行为列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("actions")]
+ [System.Text.Json.Serialization.JsonPropertyName("actions")]
+ public string[]? IncludedActions { get; set; }
+
+ ///
+ /// 获取或设置排除的行为列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("excluded_actions")]
+ [System.Text.Json.Serialization.JsonPropertyName("excluded_actions")]
+ public string[]? ExcludedActions { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置年龄定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("age")]
+ [System.Text.Json.Serialization.JsonPropertyName("age")]
+ public string[]? AgeRanges { get; set; }
+
+ ///
+ /// 获取或设置性别定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("gender")]
+ [System.Text.Json.Serialization.JsonPropertyName("gender")]
+ public string[]? GenderTypes { get; set; }
+
+ ///
+ /// 获取或设置学历定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("education")]
+ [System.Text.Json.Serialization.JsonPropertyName("education")]
+ public string[]? EducationTypes { get; set; }
+
+ ///
+ /// 获取或设置婚恋状态定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("relationship_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("relationship_status")]
+ public string[]? RelationshipStatuses { get; set; }
+
+ ///
+ /// 获取或设置用户付费习惯定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_paying_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_paying_type")]
+ public string[]? UserPayingTypes { get; set; }
+
+ ///
+ /// 获取或设置联网方式定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("network_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("network_type")]
+ public string[]? NetworkTypes { get; set; }
+
+ ///
+ /// 获取或设置移动运营商定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("network_operator")]
+ [System.Text.Json.Serialization.JsonPropertyName("network_operator")]
+ public string[]? NetworkOperatorTypes { get; set; }
+
+ ///
+ /// 获取或设置操作系统定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_os")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_os")]
+ public string[]? UserOSTypes { get; set; }
+
+ ///
+ /// 获取或设置移动设备价格定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_price")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_price")]
+ public string[]? DevicePriceTypes { get; set; }
+
+ ///
+ /// 获取或设置地理位置定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("geo_location")]
+ [System.Text.Json.Serialization.JsonPropertyName("geo_location")]
+ public Types.GeoLocation? GeoLocation { get; set; }
+
+ ///
+ /// 获取或设置微信广告行为定向。
+ ///
+ [Newtonsoft.Json.JsonProperty("wechat_ad_behavior")]
+ [System.Text.Json.Serialization.JsonPropertyName("wechat_ad_behavior")]
+ public Types.WechatAdBehavior? WechatAdBehavior { get; set; }
+
+ ///
+ /// 获取或设置包含的自定义人群 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("custom_audience")]
+ [System.Text.Json.Serialization.JsonPropertyName("custom_audience")]
+ public int[]? IncludedCustomAudienceIds { get; set; }
+
+ ///
+ /// 获取或设置排除的自定义人群 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("excluded_custom_audience")]
+ [System.Text.Json.Serialization.JsonPropertyName("excluded_custom_audience")]
+ public int[]? ExcludedCustomAudienceIds { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long CampaignId { get; set; }
+
+ ///
+ /// 获取或设置广告组 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_id")]
+ public long AdGroupId { get; set; }
+
+ ///
+ /// 获取或设置广告组名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_name")]
+ public string AdGroupName { get; set; } = default!;
+
+ ///
+ /// 获取或设置投放站点列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("site_set")]
+ [System.Text.Json.Serialization.JsonPropertyName("site_set")]
+ public string[] SiteList { get; set; } = default!;
+
+ ///
+ /// 获取或设置标的物类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_type")]
+ public string ProductType { get; set; } = default!;
+
+ ///
+ /// 获取或设置标的物 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_refs_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_refs_id")]
+ public string? ProductRefId { get; set; }
+
+ ///
+ /// 获取或设置定向条件。
+ ///
+ [Newtonsoft.Json.JsonProperty("targeting")]
+ [System.Text.Json.Serialization.JsonPropertyName("targeting")]
+ public Types.Target Target { get; set; } = default!;
+
+ ///
+ /// 获取或设置优化目标类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("optimization_goal")]
+ [System.Text.Json.Serialization.JsonPropertyName("optimization_goal")]
+ public string OptimizationGoalType { get; set; } = default!;
+
+ ///
+ /// 获取或设置出价方式类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("billing_event")]
+ [System.Text.Json.Serialization.JsonPropertyName("billing_event")]
+ public string BillingEventType { get; set; } = default!;
+
+ ///
+ /// 获取或设置广告出价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("bid_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("bid_amount")]
+ public int BidAmount { get; set; }
+
+ ///
+ /// 获取或设置开始投放日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("begin_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("begin_date")]
+ public string BeginDateString { get; set; } = default!;
+
+ ///
+ /// 获取或设置结束投放日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("end_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("end_date")]
+ public string EndDateString { get; set; } = default!;
+
+ ///
+ /// 获取或设置投放时间段。
+ ///
+ [Newtonsoft.Json.JsonProperty("time_series")]
+ [System.Text.Json.Serialization.JsonPropertyName("time_series")]
+ public string TimeSeries { get; set; } = default!;
+
+ ///
+ /// 获取或设置日限额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("daily_budget")]
+ [System.Text.Json.Serialization.JsonPropertyName("daily_budget")]
+ public int? DailyBudget { get; set; }
+
+ ///
+ /// 获取或设置广告状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("configured_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("configured_status")]
+ public string ConfiguredStatus { get; set; } = default!;
+
+ ///
+ /// 获取或设置系统状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("system_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("system_status")]
+ public string SystemStatus { get; set; } = default!;
+
+ ///
+ /// 获取或设置审核拒绝原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("reject_message")]
+ [System.Text.Json.Serialization.JsonPropertyName("reject_message")]
+ public string? RejectReason { get; set; }
+
+ ///
+ /// 获取或设置最近修改时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("last_modified_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("last_modified_time")]
+ public long UpdateTimestamp { get; set; }
+
+ ///
+ /// 获取或设置创建时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("created_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("created_time")]
+ public long CreateTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置广告组列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.AdGroup[] AdGroupList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsUpdateRequest.cs
new file mode 100644
index 00000000..171efb59
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsUpdateRequest.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adgroups/update 接口的请求。
+ ///
+ public class AdGroupsUpdateRequest : WechatAdsRequest
+ {
+ public static class Types
+ {
+ public class Target : AdGroupsAddRequest.Types.Target
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置广告组 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_id")]
+ public long AdGroupId { get; set; }
+
+ ///
+ /// 获取或设置广告组名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_name")]
+ public string? AdGroupName { get; set; }
+
+ ///
+ /// 获取或设置定向条件。
+ ///
+ [Newtonsoft.Json.JsonProperty("targeting")]
+ [System.Text.Json.Serialization.JsonPropertyName("targeting")]
+ public Types.Target? Target { get; set; }
+
+ ///
+ /// 获取或设置广告出价(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("bid_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("bid_amount")]
+ public int? BidAmount { get; set; }
+
+ ///
+ /// 获取或设置开始投放日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("begin_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("begin_date")]
+ public string? BeginDateString { get; set; }
+
+ ///
+ /// 获取或设置结束投放日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("end_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("end_date")]
+ public string? EndDateString { get; set; }
+
+ ///
+ /// 获取或设置投放时间段。
+ ///
+ [Newtonsoft.Json.JsonProperty("time_series")]
+ [System.Text.Json.Serialization.JsonPropertyName("time_series")]
+ public string? TimeSeries { get; set; }
+
+ ///
+ /// 获取或设置日限额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("daily_budget")]
+ [System.Text.Json.Serialization.JsonPropertyName("daily_budget")]
+ public int? DailyBudget { get; set; }
+
+ ///
+ /// 获取或设置广告状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("configured_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("configured_status")]
+ public string? ConfiguredStatus { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsUpdateResponse.cs
new file mode 100644
index 00000000..65e279e2
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AdGroups/AdGroupsUpdateResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /adgroups/update 接口的响应。
+ ///
+ public class AdGroupsUpdateResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsAddRequest.cs
new file mode 100644
index 00000000..072097b4
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsAddRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /ads/add 接口的请求。
+ ///
+ public class AdsAddRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置广告组 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_id")]
+ public long AdGroupId { get; set; }
+
+ ///
+ /// 获取或设置广告创意 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative_id")]
+ public long AdCreativeId { get; set; }
+
+ ///
+ /// 获取或设置广告名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("ad_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("ad_name")]
+ public string AdName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置广告状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("configured_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("configured_status")]
+ public string? ConfiguredStatus { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsAddResponse.cs
new file mode 100644
index 00000000..cd354a09
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsAddResponse.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /ads/add 接口的响应。
+ ///
+ public class AdsAddResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置广告 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("ad_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("ad_id")]
+ public long AdId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsDeleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsDeleteRequest.cs
new file mode 100644
index 00000000..b94bd262
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsDeleteRequest.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /ads/delete 接口的请求。
+ ///
+ public class AdsDeleteRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置广告 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("ad_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("ad_id")]
+ public long AdId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsDeleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsDeleteResponse.cs
new file mode 100644
index 00000000..26db8dfb
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsDeleteResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /ads/delete 接口的响应。
+ ///
+ public class AdsDeleteResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsGetRequest.cs
new file mode 100644
index 00000000..51c2fbca
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsGetRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /ads/get 接口的请求。
+ ///
+ public class AdsGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置广告 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public long? AdId { get; set; }
+
+ ///
+ /// 获取或设置过滤条件。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? Filters { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsGetResponse.cs
new file mode 100644
index 00000000..62f9add2
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsGetResponse.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /ads/get 接口的响应。
+ ///
+ public class AdsGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class Ad
+ {
+ public static class Types
+ {
+ public class AdCreative : AdCreativesGetResponse.Types.Data.Types.AdCreative
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long CampaignId { get; set; }
+
+ ///
+ /// 获取或设置广告 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("ad_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("ad_id")]
+ public long AdId { get; set; }
+
+ ///
+ /// 获取或设置广告名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("ad_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("ad_name")]
+ public string AdName { get; set; } = default!;
+
+ ///
+ /// 获取或设置广告组 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_id")]
+ public long AdGroupId { get; set; }
+
+ ///
+ /// 获取或设置广告创意信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("adcreative")]
+ [System.Text.Json.Serialization.JsonPropertyName("adcreative")]
+ public Types.AdCreative AdCreative { get; set; } = default!;
+
+ ///
+ /// 获取或设置广告状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("configured_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("configured_status")]
+ public string ConfiguredStatus { get; set; } = default!;
+
+ ///
+ /// 获取或设置系统状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("system_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("system_status")]
+ public string SystemStatus { get; set; } = default!;
+
+ ///
+ /// 获取或设置审核拒绝原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("reject_message")]
+ [System.Text.Json.Serialization.JsonPropertyName("reject_message")]
+ public string? RejectReason { get; set; }
+
+ ///
+ /// 获取或设置最近修改时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("last_modified_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("last_modified_time")]
+ public long UpdateTimestamp { get; set; }
+
+ ///
+ /// 获取或设置创建时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("created_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("created_time")]
+ public long CreateTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置广告列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.Ad[] AdList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsUpdateRequest.cs
new file mode 100644
index 00000000..5c564b06
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsUpdateRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /ads/update 接口的请求。
+ ///
+ public class AdsUpdateRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置广告 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("ad_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("ad_id")]
+ public long AdId { get; set; }
+
+ ///
+ /// 获取或设置广告名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("ad_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("ad_name")]
+ public string? AdName { get; set; }
+
+ ///
+ /// 获取或设置广告状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("configured_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("configured_status")]
+ public string? ConfiguredStatus { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsUpdateResponse.cs
new file mode 100644
index 00000000..2697bf10
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Ads/AdsUpdateResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /ads/update 接口的响应。
+ ///
+ public class AdsUpdateResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksAddRequest.cs
new file mode 100644
index 00000000..9e8ca240
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksAddRequest.cs
@@ -0,0 +1,124 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /async_tasks/add 接口的请求。
+ ///
+ public class AsyncTasksAddRequest : WechatAdsRequest
+ {
+ public static class Types
+ {
+ public class Specification
+ {
+ public static class Types
+ {
+ public class AdGroupHourlyReportSpec
+ {
+ ///
+ /// 获取或设置查询日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("date")]
+ [System.Text.Json.Serialization.JsonPropertyName("date")]
+ public string DateString { get; set; } = string.Empty;
+ }
+
+ public class AdGroupDailyReportSpec : AdGroupHourlyReportSpec
+ {
+ }
+
+ public class WechatAdvertisingDataSpec
+ {
+ public static class Types
+ {
+ public sealed class TimeRange
+ {
+ ///
+ /// 获取或设置开始时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("begin_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("begin_time")]
+ public long BeginTimestamp { get; set; }
+
+ ///
+ /// 获取或设置结束时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("end_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("end_time")]
+ public long EndTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置查询时间范围)。
+ ///
+ [Newtonsoft.Json.JsonProperty("last_modified_time_range")]
+ [System.Text.Json.Serialization.JsonPropertyName("last_modified_time_range")]
+ public Types.TimeRange TimeRange { get; set; } = new Types.TimeRange();
+
+ ///
+ /// 获取或设置查询字段列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("fields")]
+ [System.Text.Json.Serialization.JsonPropertyName("fields")]
+ public IList FieldList { get; set; } = new List();
+ }
+
+ public class POIHourlyReportSpec : AdGroupHourlyReportSpec
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置广告组小时报表查询条件所需条件信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_type_adgroup_hourly_report_spec")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_type_adgroup_hourly_report_spec")]
+ public Types.AdGroupHourlyReportSpec? AdGroupHourlyReportSpec { get; set; }
+
+ ///
+ /// 获取或设置广告组天报表查询条件所需条件信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_type_adgroup_daily_report_spec")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_type_adgroup_daily_report_spec")]
+ public Types.AdGroupDailyReportSpec? AdGroupDailyReportSpec { get; set; }
+
+ ///
+ /// 获取或设置微信广告数据查询条件所需条件信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_type_wechat_advertising_data_spec")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_type_wechat_advertising_data_spec")]
+ public Types.WechatAdvertisingDataSpec? WechatAdvertisingDataSpec { get; set; }
+
+ ///
+ /// 获取或设置微信门店小时报表查询条件所需条件信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_type_poi_hourly_report_spec")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_type_poi_hourly_report_spec")]
+ public Types.POIHourlyReportSpec? POIHourlyReportSpec { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置任务名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_name")]
+ public string TaskName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置任务类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_type")]
+ public string TaskType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置任务所需条件信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_spec")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_spec")]
+ public Types.Specification TaskSpecification { get; set; } = new Types.Specification();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksAddResponse.cs
new file mode 100644
index 00000000..34097b03
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksAddResponse.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /async_tasks/add 接口的响应。
+ ///
+ public class AsyncTasksAddResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置任务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_id")]
+ public int TaskId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksGetRequest.cs
new file mode 100644
index 00000000..7b39605f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksGetRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /async_tasks/get 接口的请求。
+ ///
+ public class AsyncTasksGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置过滤条件。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? Filters { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksGetResponse.cs
new file mode 100644
index 00000000..8f34cbfd
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/AsyncTasksGetResponse.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /async_tasks/get 接口的响应。
+ ///
+ public class AsyncTasksGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class Task
+ {
+ public static class Types
+ {
+ public class Result
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class File
+ {
+ ///
+ /// 获取或设置文件 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("file_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("file_id")]
+ public int FileId { get; set; }
+
+ ///
+ /// 获取或设置文件 MD5 哈希值。
+ ///
+ [Newtonsoft.Json.JsonProperty("md5")]
+ [System.Text.Json.Serialization.JsonPropertyName("md5")]
+ public string FileHash { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置文件列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("file_info_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("file_info_list")]
+ public Types.File[] FileList { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置错误码。
+ ///
+ [Newtonsoft.Json.JsonProperty("code")]
+ [System.Text.Json.Serialization.JsonPropertyName("code")]
+ public int ErrorCode { get; set; }
+
+ ///
+ /// 获取或设置错误信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("message")]
+ [System.Text.Json.Serialization.JsonPropertyName("message")]
+ public string? ErrorMessage { get; set; }
+
+ ///
+ /// 获取或设置结果数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data? Data { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置任务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_id")]
+ public int TaskId { get; set; } = default!;
+
+ ///
+ /// 获取或设置任务名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_name")]
+ public string TaskName { get; set; } = default!;
+
+ ///
+ /// 获取或设置任务类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("task_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("task_type")]
+ public string TaskType { get; set; } = default!;
+
+ ///
+ /// 获取或设置任务状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public string Status { get; set; } = default!;
+
+ ///
+ /// 获取或设置任务结果信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("result")]
+ [System.Text.Json.Serialization.JsonPropertyName("result")]
+ public Types.Result? Result { get; set; }
+
+ ///
+ /// 获取或设置创建时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("created_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("created_time")]
+ public long CreateTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置任务列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.Task[] TaskList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/Files/AsyncTaskFilesGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/Files/AsyncTaskFilesGetRequest.cs
new file mode 100644
index 00000000..7beae30e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/Files/AsyncTaskFilesGetRequest.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /async_task_files/get 接口的请求。
+ ///
+ public class AsyncTaskFilesGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置任务 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int TaskId { get; set; }
+
+ ///
+ /// 获取或设置任务文件 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int FileId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/Files/AsyncTaskFilesGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/Files/AsyncTaskFilesGetResponse.cs
new file mode 100644
index 00000000..25f584ad
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/AsyncTasks/Files/AsyncTaskFilesGetResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /async_task_files/get 接口的响应。
+ ///
+ public class AsyncTaskFilesGetResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsAddRequest.cs
new file mode 100644
index 00000000..c5ead9e7
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsAddRequest.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /campaigns/add 接口的请求。
+ ///
+ public class CampaignsAddRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置推广计划名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_name")]
+ public string CampaignName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置推广计划类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_type")]
+ public string CampaignType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置推广标的物类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_type")]
+ public string ProductType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置广告状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("configured_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("configured_status")]
+ public string? ConfiguredStatus { get; set; }
+
+ ///
+ /// 获取或设置日消耗限额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("daily_budget")]
+ [System.Text.Json.Serialization.JsonPropertyName("daily_budget")]
+ public int? DailyBudget { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsAddResponse.cs
new file mode 100644
index 00000000..883e6c2b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsAddResponse.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /campaigns/add 接口的响应。
+ ///
+ public class CampaignsAddResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long CampaignId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsGetRequest.cs
new file mode 100644
index 00000000..ab4fc2f9
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsGetRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /campaigns/get 接口的请求。
+ ///
+ public class CampaignsGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public long? CampaignId { get; set; }
+
+ ///
+ /// 获取或设置过滤条件。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? Filters { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsGetResponse.cs
new file mode 100644
index 00000000..f5fe809a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsGetResponse.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /campaigns/get 接口的响应。
+ ///
+ public class CampaignsGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class Campaign
+ {
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long CampaignId { get; set; }
+
+ ///
+ /// 获取或设置推广计划名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_name")]
+ public string CampaignName { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广计划类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_type")]
+ public string CampaignType { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广标的物类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("product_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("product_type")]
+ public string ProductType { get; set; } = default!;
+
+ ///
+ /// 获取或设置广告状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("configured_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("configured_status")]
+ public string ConfiguredStatus { get; set; } = default!;
+
+ ///
+ /// 获取或设置日消耗限额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("daily_budget")]
+ [System.Text.Json.Serialization.JsonPropertyName("daily_budget")]
+ public int? DailyBudget { get; set; }
+
+ ///
+ /// 获取或设置限额到达日期字符串(格式:yyyyMMdd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("budget_reach_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("budget_reach_date")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumberTypedStringConverter))]
+ public string? BudgetReachDateString { get; set; }
+
+ ///
+ /// 获取或设置最近修改时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("last_modified_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("last_modified_time")]
+ public long UpdateTimestamp { get; set; }
+
+ ///
+ /// 获取或设置创建时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("created_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("created_time")]
+ public long CreateTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置推广计划列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.Campaign[] CampaignList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsUpdateRequest.cs
new file mode 100644
index 00000000..bce2f66f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsUpdateRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /campaigns/update 接口的请求。
+ ///
+ public class CampaignsUpdateRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long CampaignId { get; set; }
+
+ ///
+ /// 获取或设置推广计划名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_name")]
+ public string? CampaignName { get; set; }
+
+ ///
+ /// 获取或设置广告状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("configured_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("configured_status")]
+ public string? ConfiguredStatus { get; set; }
+
+ ///
+ /// 获取或设置日消耗限额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("daily_budget")]
+ [System.Text.Json.Serialization.JsonPropertyName("daily_budget")]
+ public int? DailyBudget { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsUpdateResponse.cs
new file mode 100644
index 00000000..355e5fcc
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Campaigns/CampaignsUpdateResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /campaigns/update 接口的响应。
+ ///
+ public class CampaignsUpdateResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CreditBills/CreditBillsGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CreditBills/CreditBillsGetRequest.cs
new file mode 100644
index 00000000..27f48678
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CreditBills/CreditBillsGetRequest.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /credit_bills/get 接口的请求。
+ ///
+ public class CreditBillsGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置账单年份。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int BillYear { get; set; }
+
+ ///
+ /// 获取或设置账单月份。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int BillMonth { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+
+ ///
+ /// 获取或设置微信广告平台的版本号。
+ /// 默认值:v1.1
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? Version { get; set; } = "v1.1";
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CreditBills/CreditBillsGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CreditBills/CreditBillsGetResponse.cs
new file mode 100644
index 00000000..3cb2ad06
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CreditBills/CreditBillsGetResponse.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /credit_bills/get 接口的响应。
+ ///
+ public class CreditBillsGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class CreditBill
+ {
+ ///
+ /// 获取或设置出账单日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("bill_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("bill_date")]
+ public string BillDateString { get; set; } = default!;
+
+ ///
+ /// 获取或设置账单开始时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("start_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("start_time")]
+ public long StartTimestamp { get; set; }
+
+ ///
+ /// 获取或设置账单截止时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("end_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("end_time")]
+ public long EndTimestamp { get; set; }
+
+ ///
+ /// 获取或设置最后还款时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("due_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("due_time")]
+ public long DueTimestamp { get; set; }
+
+ ///
+ /// 获取或设置待还金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("need_repay_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("need_repay_amount")]
+ public int RepayingAmount { get; set; }
+
+ ///
+ /// 获取或设置已还金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("repaid_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("repaid_amount")]
+ public int RepaidAmount { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置资金账户列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.CreditBill[] CreditBillList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesAddRequest.cs
new file mode 100644
index 00000000..8f0cd8ee
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesAddRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /custom_audiences/add 接口的请求。
+ ///
+ public class CustomAudiencesAddRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置自定义人群名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string CustomAudienceName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置自定义人群类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("type")]
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public string CustomAudienceType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置自定义人群描述。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string CustomAudienceDescription { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesAddResponse.cs
new file mode 100644
index 00000000..7d5e889e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesAddResponse.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /custom_audiences/add 接口的响应。
+ ///
+ public class CustomAudiencesAddResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置自定义人群 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("audience_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("audience_id")]
+ public int CustomAudienceId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesGetRequest.cs
new file mode 100644
index 00000000..4b40cb95
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesGetRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /custom_audiences/get 接口的请求。
+ ///
+ public class CustomAudiencesGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置自定义人群 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? CustomAudienceId { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesGetResponse.cs
new file mode 100644
index 00000000..22d37c49
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesGetResponse.cs
@@ -0,0 +1,111 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /custom_audiences/get 接口的响应。
+ ///
+ public class CustomAudiencesGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class CustomAudience
+ {
+ ///
+ /// 获取或设置自定义人群 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("audience_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("audience_id")]
+ public int CustomAudienceId { get; set; }
+
+ ///
+ /// 获取或设置自定义人群名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string CustomAudienceName { get; set; } = default!;
+
+ ///
+ /// 获取或设置自定义人群类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("type")]
+ [System.Text.Json.Serialization.JsonPropertyName("type")]
+ public string CustomAudienceType { get; set; } = default!;
+
+ ///
+ /// 获取或设置自定义人群描述。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string CustomAudienceDescription { get; set; } = default!;
+
+ ///
+ /// 获取或设置处理状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("status")]
+ [System.Text.Json.Serialization.JsonPropertyName("status")]
+ public string Status { get; set; } = default!;
+
+ ///
+ /// 获取或设置错误码。
+ ///
+ [Newtonsoft.Json.JsonProperty("error_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("error_code")]
+ public int ErrorCode { get; set; }
+
+ ///
+ /// 获取或设置用户覆盖数。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_count")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_count")]
+ public int UserCount { get; set; }
+
+ ///
+ /// 获取或设置最近修改时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("last_modified_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("last_modified_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonDateTimeOffsetConverter))]
+ public DateTimeOffset UpdateTime { get; set; }
+
+ ///
+ /// 获取或设置创建时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("created_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("created_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonDateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置自定义人群列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.CustomAudience[] CustomAudienceList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesUpdateRequest.cs
new file mode 100644
index 00000000..b76e0e61
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesUpdateRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /custom_audiences/update 接口的请求。
+ ///
+ public class CustomAudiencesUpdateRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置自定义人群 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("audience_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("audience_id")]
+ public int CustomAudienceId { get; set; }
+
+ ///
+ /// 获取或设置自定义人群名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string? CustomAudienceName { get; set; }
+
+ ///
+ /// 获取或设置自定义人群描述。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string? CustomAudienceDescription { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesUpdateResponse.cs
new file mode 100644
index 00000000..34f69a67
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/CustomAudiencesUpdateResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /custom_audiences/update 接口的响应。
+ ///
+ public class CustomAudiencesUpdateResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesAddRequest.cs
new file mode 100644
index 00000000..bcee189c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesAddRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /custom_audience_files/add 接口的请求。
+ ///
+ public class CustomAudienceFilesAddRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置自定义人群 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int CustomAudienceId { get; set; }
+
+ ///
+ /// 获取或设置用户 ID 类型。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string UserIdType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置文件操作类型。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OperationType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置压缩文件字节数组。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public byte[] FileBytes { get; set; } = new byte[0];
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesAddResponse.cs
new file mode 100644
index 00000000..47fee94c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesAddResponse.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /custom_audience_files/add 接口的响应。
+ ///
+ public class CustomAudienceFilesAddResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置自定义人群数据文件 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("custom_audience_file_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("custom_audience_file_id")]
+ public int CustomAudienceFileId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesGetRequest.cs
new file mode 100644
index 00000000..04d6eae9
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesGetRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /custom_audience_files/get 接口的请求。
+ ///
+ public class CustomAudienceFilesGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置自定义人群 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? CustomAudienceId { get; set; }
+
+ ///
+ /// 获取或设置自定义人群数据文件 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? CustomAudienceFileId { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesGetResponse.cs
new file mode 100644
index 00000000..06ca4f8a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/CustomAudiences/Files/CustomAudienceFilesGetResponse.cs
@@ -0,0 +1,130 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /custom_audience_files/get 接口的响应。
+ ///
+ public class CustomAudienceFilesGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class CustomAudienceFile
+ {
+ ///
+ /// 获取或设置自定义人群 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("audience_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("audience_id")]
+ public int CustomAudienceId { get; set; }
+
+ ///
+ /// 获取或设置自定义人群数据文件 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("custom_audience_file_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("custom_audience_file_id")]
+ public int CustomAudienceFileId { get; set; }
+
+ ///
+ /// 获取或设置自定义人群数据文件名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string CustomAudienceFileName { get; set; } = default!;
+
+ ///
+ /// 获取或设置用户 ID 类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_id_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_id_type")]
+ public string UserIdType { get; set; } = default!;
+
+ ///
+ /// 获取或设置文件操作类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("operation_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("operation_type")]
+ public string OperationType { get; set; } = default!;
+
+ ///
+ /// 获取或设置处理状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("process_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("process_status")]
+ public string ProcessStatus { get; set; } = default!;
+
+ ///
+ /// 获取或设置错误码。
+ ///
+ [Newtonsoft.Json.JsonProperty("process_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("process_code")]
+ public int ErrorCode { get; set; }
+
+ ///
+ /// 获取或设置错误信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("error_message")]
+ [System.Text.Json.Serialization.JsonPropertyName("error_message")]
+ public string? ErrorMessage { get; set; }
+
+ ///
+ /// 获取或设置文件总行数。
+ ///
+ [Newtonsoft.Json.JsonProperty("line_count")]
+ [System.Text.Json.Serialization.JsonPropertyName("line_count")]
+ public int LineCount { get; set; }
+
+ ///
+ /// 获取或设置文件包含的有效行数。
+ ///
+ [Newtonsoft.Json.JsonProperty("valid_line_count")]
+ [System.Text.Json.Serialization.JsonPropertyName("valid_line_count")]
+ public int ValidLineCount { get; set; }
+
+ ///
+ /// 获取或设置文件包含的用户数。
+ ///
+ [Newtonsoft.Json.JsonProperty("user_count")]
+ [System.Text.Json.Serialization.JsonPropertyName("user_count")]
+ public int UserCount { get; set; }
+
+ ///
+ /// 获取或设置创建时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("created_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("created_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonDateTimeOffsetConverter))]
+ public DateTimeOffset CreateTime { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置自定义人群数据文件列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.CustomAudienceFile[] CustomAudienceFileList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Estimation/EstimationGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Estimation/EstimationGetRequest.cs
new file mode 100644
index 00000000..a14b2901
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Estimation/EstimationGetRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /estimation/get 接口的请求。
+ ///
+ public class EstimationGetRequest : WechatAdsRequest
+ {
+ public static class Types
+ {
+ public class Target : AdGroupsAddRequest.Types.Target
+ {
+ }
+ }
+
+ ///
+ /// 获取或设置推广计划类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_type")]
+ public string CampaignType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置定向条件。
+ ///
+ [Newtonsoft.Json.JsonProperty("targeting")]
+ [System.Text.Json.Serialization.JsonPropertyName("targeting")]
+ public Types.Target Target { get; set; } = new Types.Target();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Estimation/EstimationGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Estimation/EstimationGetResponse.cs
new file mode 100644
index 00000000..5c151e11
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Estimation/EstimationGetResponse.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /estimation/get 接口的响应。
+ ///
+ public class EstimationGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置预估覆盖人数。
+ ///
+ [Newtonsoft.Json.JsonProperty("approximate_count")]
+ [System.Text.Json.Serialization.JsonPropertyName("approximate_count")]
+ public int ApproximateCount { get; set; }
+
+ ///
+ /// 获取或设置预估曝光量。
+ ///
+ [Newtonsoft.Json.JsonProperty("impression")]
+ [System.Text.Json.Serialization.JsonPropertyName("impression")]
+ public int ImpressCount { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundStatementsDetailedGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundStatementsDetailedGetRequest.cs
new file mode 100644
index 00000000..d96dbf61
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundStatementsDetailedGetRequest.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /fund_statements_detailed/get 接口的请求。
+ ///
+ public class FundStatementsDetailedGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置时间范围。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public Abstractions.CommonDateRange DateRange { get; set; } = new Abstractions.CommonDateRange();
+
+ ///
+ /// 获取或设置交易类型。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? TradeType { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+
+ ///
+ /// 获取或设置微信广告平台的版本号。
+ /// 默认值:v1.1
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? Version { get; set; } = "v1.1";
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundStatementsDetailedGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundStatementsDetailedGetResponse.cs
new file mode 100644
index 00000000..39472365
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundStatementsDetailedGetResponse.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /fund_statements_detailed/get 接口的响应。
+ ///
+ public class FundStatementsDetailedGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class FundStatement
+ {
+ ///
+ /// 获取或设置资金账户类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("fund_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("fund_type")]
+ public string FundType { get; set; } = default!;
+
+ ///
+ /// 获取或设置余额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("amount")]
+ public int Amount { get; set; }
+
+ ///
+ /// 获取或设置交易单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("bill_number")]
+ [System.Text.Json.Serialization.JsonPropertyName("bill_number")]
+ public string BillNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置交易描述。
+ ///
+ [Newtonsoft.Json.JsonProperty("description")]
+ [System.Text.Json.Serialization.JsonPropertyName("description")]
+ public string Description { get; set; } = default!;
+
+ ///
+ /// 获取或设置交易发生时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("time")]
+ [System.Text.Json.Serialization.JsonPropertyName("time")]
+ public long CreateTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置资金账户列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.FundStatement[] FundStatementList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundTransferAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundTransferAddRequest.cs
new file mode 100644
index 00000000..434ee28d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundTransferAddRequest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /fund_transfer/add 接口的请求。
+ ///
+ public class FundTransferAddRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置资金账户类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("fund_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("fund_type")]
+ public string FundType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("amount")]
+ public int Amount { get; set; }
+
+ ///
+ /// 获取或设置调用方订单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("external_bill_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("external_bill_no")]
+ public string? ExternalBillNumber { get; set; }
+
+ ///
+ /// 获取或设置备注信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("memo")]
+ [System.Text.Json.Serialization.JsonPropertyName("memo")]
+ public string? Memo { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundTransferAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundTransferAddResponse.cs
new file mode 100644
index 00000000..8d96f69e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundTransferAddResponse.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /fund_transfer/add 接口的响应。
+ ///
+ public class FundTransferAddResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置资金账户类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("fund_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("fund_type")]
+ public string FundType { get; set; } = default!;
+
+ ///
+ /// 获取或设置金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("amount")]
+ public int Amount { get; set; }
+
+ ///
+ /// 获取或设置调用方订单号。
+ ///
+ [Newtonsoft.Json.JsonProperty("external_bill_no")]
+ [System.Text.Json.Serialization.JsonPropertyName("external_bill_no")]
+ public string? ExternalBillNumber { get; set; }
+
+ ///
+ /// 获取或设置是否重复转账。
+ ///
+ [Newtonsoft.Json.JsonProperty("is_repeated")]
+ [System.Text.Json.Serialization.JsonPropertyName("is_repeated")]
+ public bool IsRepeated { get; set; }
+
+ ///
+ /// 获取或设置交易时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("time")]
+ [System.Text.Json.Serialization.JsonPropertyName("time")]
+ public long CreateTimestamp { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundsGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundsGetRequest.cs
new file mode 100644
index 00000000..3c4ba86d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundsGetRequest.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /funds/get 接口的请求。
+ ///
+ public class FundsGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置微信广告平台的版本号。
+ /// 默认值:v1.1
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? Version { get; set; } = "v1.1";
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundsGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundsGetResponse.cs
new file mode 100644
index 00000000..553b3710
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Funds/FundsGetResponse.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /funds/get 接口的响应。
+ ///
+ public class FundsGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class Fund
+ {
+ public static class Types
+ {
+ public class Credit
+ {
+ ///
+ /// 获取或设置额度(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("limit_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("limit_amount")]
+ public int LimitAmount { get; set; }
+
+ ///
+ /// 获取或设置可分配金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("usable_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("usable_amount")]
+ public int UsableAmount { get; set; }
+
+ ///
+ /// 获取或设置已用金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("used_amount")]
+ [System.Text.Json.Serialization.JsonPropertyName("used_amount")]
+ public int UsedAmount { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置资金账户类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("fund_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("fund_type")]
+ public string FundType { get; set; } = default!;
+
+ ///
+ /// 获取或设置资金余额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("balance")]
+ [System.Text.Json.Serialization.JsonPropertyName("balance")]
+ public int Balance { get; set; }
+
+ ///
+ /// 获取或设置固定信用金信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("credit_roll_spec")]
+ [System.Text.Json.Serialization.JsonPropertyName("credit_roll_spec")]
+ public Types.Credit? Credit { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置资金账户列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.Fund[] FundList { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesAddRequest.cs
index f69ee2f5..1a0e417a 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesAddRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesAddRequest.cs
@@ -30,7 +30,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
public string? FileContentType { get; set; }
///
- /// 获取或设置图片文件的哈希值。如果不指定将由系统自动生成。
+ /// 获取或设置图片文件的 MD5 哈希值。如果不指定将由系统自动生成。
///
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesGetRequest.cs
index 1924a3a8..d8767343 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesGetRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesGetRequest.cs
@@ -13,7 +13,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
///
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
- public string ImageId { get; set; } = string.Empty;
+ public string? ImageId { get; set; }
///
/// 获取或设置过滤条件。
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesGetResponse.cs
index b27fcb52..0ec0881d 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesGetResponse.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Images/ImagesGetResponse.cs
@@ -52,7 +52,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
public int FileSize { get; set; }
///
- /// 获取或设置图片文件的哈希值。
+ /// 获取或设置图片文件的 MD5 哈希值。
///
[Newtonsoft.Json.JsonProperty("signature")]
[System.Text.Json.Serialization.JsonPropertyName("signature")]
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsAddRequest.cs
new file mode 100644
index 00000000..8fa90732
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsAddRequest.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /qualifications/add 接口的请求。
+ ///
+ public class QualificationsAddRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置资质类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_type")]
+ public string QualificationType { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置资质名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_name")]
+ public string QualificationName { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置资质证明文件图片 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_image_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_image_id")]
+ public string QualificationImageId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsAddResponse.cs
new file mode 100644
index 00000000..3f8da661
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsAddResponse.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /qualifications/add 接口的响应。
+ ///
+ public class QualificationsAddResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置资质 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_id")]
+ public int QualificationId { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsDeleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsDeleteRequest.cs
new file mode 100644
index 00000000..1abc4850
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsDeleteRequest.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /qualifications/delete 接口的请求。
+ ///
+ public class QualificationsDeleteRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置资质 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_id")]
+ public long QualificationId { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsDeleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsDeleteResponse.cs
new file mode 100644
index 00000000..bc578cc5
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsDeleteResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /qualifications/delete 接口的响应。
+ ///
+ public class QualificationsDeleteResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsGetRequest.cs
new file mode 100644
index 00000000..eb443c90
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsGetRequest.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /qualifications/get 接口的请求。
+ ///
+ public class QualificationsGetRequest : WechatAdsRequest
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsGetResponse.cs
new file mode 100644
index 00000000..7a51ecf2
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Qualifications/QualificationsGetResponse.cs
@@ -0,0 +1,93 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /qualifications/get 接口的响应。
+ ///
+ public class QualificationsGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class Qualification
+ {
+ ///
+ /// 获取或设置资质 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_id")]
+ public long QualificationId { get; set; }
+
+ ///
+ /// 获取或设置资质类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_type")]
+ public string QualificationType { get; set; } = default!;
+
+ ///
+ /// 获取或设置资质名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_name")]
+ public string QualificationName { get; set; } = default!;
+
+ ///
+ /// 获取或设置资质证明文件图片 URL。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_url")]
+ public string QualificationImageUrl { get; set; } = default!;
+
+ ///
+ /// 获取或设置资质状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("qualification_status")]
+ [System.Text.Json.Serialization.JsonPropertyName("qualification_status")]
+ public string QualificationStatus { get; set; } = default!;
+
+ ///
+ /// 获取或设置资质有效日期(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("valid_date")]
+ [System.Text.Json.Serialization.JsonPropertyName("valid_date")]
+ public string? ValidDateString { get; set; }
+
+ ///
+ /// 获取或设置审核拒绝原因。
+ ///
+ [Newtonsoft.Json.JsonProperty("reject_message")]
+ [System.Text.Json.Serialization.JsonPropertyName("reject_message")]
+ public string? RejectReason { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置资质列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.Qualification[] QualificationList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/DailyReportsGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/DailyReportsGetRequest.cs
new file mode 100644
index 00000000..b4ca7568
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/DailyReportsGetRequest.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /daily_reports/get 接口的请求。
+ ///
+ public class DailyReportsGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置时间范围。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public Abstractions.CommonDateRange DateRange { get; set; } = new Abstractions.CommonDateRange();
+
+ ///
+ /// 获取或设置报表类型。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? ReportType { get; set; }
+
+ ///
+ /// 获取或设置报表层级。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string? ReportLevel { get; set; }
+
+ ///
+ /// 获取或设置页大小。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? PageSize { get; set; }
+
+ ///
+ /// 获取或设置页码。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public int? Page { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/DailyReportsGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/DailyReportsGetResponse.cs
new file mode 100644
index 00000000..b6a58785
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/DailyReportsGetResponse.cs
@@ -0,0 +1,142 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /daily_reports/get 接口的响应。
+ ///
+ public class DailyReportsGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class DailyReport
+ {
+ ///
+ /// 获取或设置查询日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonProperty("date")]
+ [System.Text.Json.Serialization.JsonPropertyName("date")]
+ public string DateString { get; set; } = default!;
+
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long? CampaignId { get; set; }
+
+ ///
+ /// 获取或设置推广计划名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_name")]
+ public string? CampaignName { get; set; }
+
+ ///
+ /// 获取或设置广告组 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_id")]
+ public long? AdGroupId { get; set; }
+
+ ///
+ /// 获取或设置广告组名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_name")]
+ public string? AdGroupName { get; set; }
+
+ ///
+ /// 获取或设置曝光量。
+ ///
+ [Newtonsoft.Json.JsonProperty("impression")]
+ [System.Text.Json.Serialization.JsonPropertyName("impression")]
+ public int ImpressCount { get; set; }
+
+ ///
+ /// 获取或设置点击量。
+ ///
+ [Newtonsoft.Json.JsonProperty("click")]
+ [System.Text.Json.Serialization.JsonPropertyName("click")]
+ public int ClickCount { get; set; }
+
+ ///
+ /// 获取或设置消耗金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("cost")]
+ [System.Text.Json.Serialization.JsonPropertyName("cost")]
+ public int Cost { get; set; }
+
+ ///
+ /// 获取或设置点赞或评论量。
+ ///
+ [Newtonsoft.Json.JsonProperty("like_or_comment")]
+ [System.Text.Json.Serialization.JsonPropertyName("like_or_comment")]
+ public int LikeOrCommentCount { get; set; }
+
+ ///
+ /// 获取或设置图片点击量。
+ ///
+ [Newtonsoft.Json.JsonProperty("image_click")]
+ [System.Text.Json.Serialization.JsonPropertyName("image_click")]
+ public int ImageClickCount { get; set; }
+
+ ///
+ /// 获取或设置关注量。
+ ///
+ [Newtonsoft.Json.JsonProperty("follow")]
+ [System.Text.Json.Serialization.JsonPropertyName("follow")]
+ public int FollowCount { get; set; }
+
+ ///
+ /// 获取或设置转发量。
+ ///
+ [Newtonsoft.Json.JsonProperty("share")]
+ [System.Text.Json.Serialization.JsonPropertyName("share")]
+ public int ShareCount { get; set; }
+
+ ///
+ /// 获取或设置本地门店访问人次。
+ ///
+ [Newtonsoft.Json.JsonProperty("lbs_wechat_pv")]
+ [System.Text.Json.Serialization.JsonPropertyName("lbs_wechat_pv")]
+ public int LBSWechatPV { get; set; }
+
+ ///
+ /// 获取或设置本地门店访问人数。
+ ///
+ [Newtonsoft.Json.JsonProperty("lbs_wechat_uv")]
+ [System.Text.Json.Serialization.JsonPropertyName("lbs_wechat_uv")]
+ public int LBSWechatUV { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置日报列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.DailyReport[] DailyReportList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/RealtimeCostGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/RealtimeCostGetRequest.cs
new file mode 100644
index 00000000..5564388c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/RealtimeCostGetRequest.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /realtime_cost/get 接口的请求。
+ ///
+ public class RealtimeCostGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置查询日期字符串(格式:yyyy-MM-dd)。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string DateString { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置类型级别。
+ /// 默认值:ADGROUP
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string Level { get; set; } = "ADGROUP";
+
+ ///
+ /// 获取或设置过滤条件。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public IList? Filters { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/RealtimeCostGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/RealtimeCostGetResponse.cs
new file mode 100644
index 00000000..ffb0964c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/Reports/RealtimeCostGetResponse.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /realtime_cost/get 接口的响应。
+ ///
+ public class RealtimeCostGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class RealtimeCost
+ {
+ ///
+ /// 获取或设置推广计划 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("campaign_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("campaign_id")]
+ public long CampaignId { get; set; }
+
+ ///
+ /// 获取或设置广告组 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("adgroup_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("adgroup_id")]
+ public long AdGroupId { get; set; }
+
+ ///
+ /// 获取或设置消耗金额(单位:分)。
+ ///
+ [Newtonsoft.Json.JsonProperty("cost")]
+ [System.Text.Json.Serialization.JsonPropertyName("cost")]
+ public int Cost { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置实时消耗列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.RealtimeCost[] RealtimeCostList { get; set; } = default!;
+
+ ///
+ /// 获取或设置分页信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("page_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("page_info")]
+ public Abstractions.CommonPagination Pagination { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentAddRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentAddRequest.cs
new file mode 100644
index 00000000..41d157f6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentAddRequest.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /sp_entrustment/add 接口的请求。
+ ///
+ public class SpEntrustmentAddRequest : WechatAdsRequest
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentAddResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentAddResponse.cs
new file mode 100644
index 00000000..ea66c714
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentAddResponse.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [POST] /sp_entrustment/add 接口的响应。
+ ///
+ public class SpEntrustmentAddResponse : WechatAdsResponse
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentGetRequest.cs
new file mode 100644
index 00000000..e6f39a85
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentGetRequest.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /sp_entrustment/get 接口的请求。
+ ///
+ public class SpEntrustmentGetRequest : WechatAdsRequest
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentGetResponse.cs
new file mode 100644
index 00000000..41da44ef
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/SpEntrustment/SpEntrustmentGetResponse.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /sp_entrustment/get 接口的响应。
+ ///
+ public class SpEntrustmentGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置是否有授权关系。
+ ///
+ [Newtonsoft.Json.JsonProperty("entrusted")]
+ [System.Text.Json.Serialization.JsonPropertyName("entrusted")]
+ public bool IsEntrusted { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/TargetingTags/TargetingTagsGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/TargetingTags/TargetingTagsGetRequest.cs
new file mode 100644
index 00000000..491060b3
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/TargetingTags/TargetingTagsGetRequest.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /targeting_tags/get 接口的请求。
+ ///
+ public class TargetingTagsGetRequest : WechatAdsRequest
+ {
+ ///
+ /// 获取或设置标签类型。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string TagType { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/TargetingTags/TargetingTagsGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/TargetingTags/TargetingTagsGetResponse.cs
new file mode 100644
index 00000000..c1030585
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Models/TargetingTags/TargetingTagsGetResponse.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
+{
+ ///
+ /// 表示 [GET] /targeting_tags/get 接口的响应。
+ ///
+ public class TargetingTagsGetResponse : WechatAdsResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ public static class Types
+ {
+ public class Tag
+ {
+ ///
+ /// 获取或设置 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("id")]
+ [System.Text.Json.Serialization.JsonPropertyName("id")]
+ public int Id { get; set; }
+
+ ///
+ /// 获取或设置名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; } = default!;
+
+ ///
+ /// 获取或设置上级 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("parent_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("parent_id")]
+ public int ParentId { get; set; }
+
+ ///
+ /// 获取或设置上级名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("parent_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("parent_name")]
+ public string ParentName { get; set; } = default!;
+
+ ///
+ /// 获取或设置城市级别。
+ ///
+ [Newtonsoft.Json.JsonProperty("city_level")]
+ [System.Text.Json.Serialization.JsonPropertyName("city_level")]
+ public string? CityLevel { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置标签列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("list")]
+ [System.Text.Json.Serialization.JsonPropertyName("list")]
+ public Types.Tag[] TagList { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置返回数据。
+ ///
+ [Newtonsoft.Json.JsonProperty("data")]
+ [System.Text.Json.Serialization.JsonPropertyName("data")]
+ public Types.Data Data { get; set; } = default!;
+ }
+}