diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Extensions/WechatOpenAIClientExecuteOpenApiExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Extensions/WechatOpenAIClientExecuteOpenApiExtensions.cs
new file mode 100644
index 00000000..c22cee76
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Extensions/WechatOpenAIClientExecuteOpenApiExtensions.cs
@@ -0,0 +1,71 @@
+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.OpenAI
+{
+ public static class WechatOpenAIClientExecuteOpenApiExtensions
+ {
+ ///
+ /// 异步调用 [POST] /v1/openapi/create 接口。
+ /// REF: https://developers.weixin.qq.com/doc/aispeech/openapi/api/v1/openapi/create.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteOpenApiCreateAsync(this WechatOpenAIClient client, Models.OpenApiCreateRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateRequest(request, HttpMethod.Post, "v1", "openapi", "create");
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /v1/openapi/reset 接口。
+ /// REF: https://developers.weixin.qq.com/doc/aispeech/openapi/api/v1/openapi/reset.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteOpenApiResetAsync(this WechatOpenAIClient client, Models.OpenApiResetRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateRequest(request, HttpMethod.Post, "v1", "openapi", "reset");
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /v1/openapi/get_detail 接口。
+ /// REF: https://developers.weixin.qq.com/doc/aispeech/openapi/api/v1/openapi/get_detail.html
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteOpenApiGetDetailAsync(this WechatOpenAIClient client, Models.OpenApiGetDetailRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateRequest(request, HttpMethod.Get, "v1", "openapi", "get_detail");
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiCreateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiCreateRequest.cs
new file mode 100644
index 00000000..a1dbf79d
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiCreateRequest.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models
+{
+ ///
+ /// 表示 [POST] /v1/openapi/create 接口的请求。
+ ///
+ public class OpenApiCreateRequest : WechatOpenAIRequest
+ {
+ ///
+ /// 获取或设置联系人名字。
+ ///
+ [Newtonsoft.Json.JsonProperty("name")]
+ [System.Text.Json.Serialization.JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置联系电话。
+ ///
+ [Newtonsoft.Json.JsonProperty("phone")]
+ [System.Text.Json.Serialization.JsonPropertyName("phone")]
+ public string PhoneNumber { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置微信号。
+ ///
+ [Newtonsoft.Json.JsonProperty("wechat")]
+ [System.Text.Json.Serialization.JsonPropertyName("wechat")]
+ public string Wechat { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置邮箱。
+ ///
+ [Newtonsoft.Json.JsonProperty("email")]
+ [System.Text.Json.Serialization.JsonPropertyName("email")]
+ public string Email { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("address")]
+ [System.Text.Json.Serialization.JsonPropertyName("address")]
+ public string? Address { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiCreateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiCreateResponse.cs
new file mode 100644
index 00000000..46bb03ad
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiCreateResponse.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models
+{
+ ///
+ /// 表示 [POST] /v1/openapi/create 接口的响应。
+ ///
+ public class OpenApiCreateResponse : WechatOpenAIResponse
+ {
+ public static class Types
+ {
+ public class Data
+ {
+ ///
+ /// 获取或设置 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置 Token。
+ ///
+ [Newtonsoft.Json.JsonProperty("token")]
+ [System.Text.Json.Serialization.JsonPropertyName("token")]
+ public string Token { get; set; } = default!;
+
+ ///
+ /// 获取或设置 EncodingAESKey。
+ ///
+ [Newtonsoft.Json.JsonProperty("aes_key")]
+ [System.Text.Json.Serialization.JsonPropertyName("aes_key")]
+ public string EncodingAESKey { get; set; } = default!;
+ }
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiGetDetailRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiGetDetailRequest.cs
new file mode 100644
index 00000000..141b163c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiGetDetailRequest.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models
+{
+ ///
+ /// 表示 [GET] /v1/openapi/get_detail 接口的请求。
+ ///
+ public class OpenApiGetDetailRequest : WechatOpenAIRequest
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiGetDetailResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiGetDetailResponse.cs
new file mode 100644
index 00000000..c395df40
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiGetDetailResponse.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models
+{
+ ///
+ /// 表示 [GET] /v1/openapi/get_detail 接口的响应。
+ ///
+ public class OpenApiGetDetailResponse : WechatOpenAIResponse
+ {
+ public static class Types
+ {
+ public class Data : OpenApiCreateResponse.Types.Data
+ {
+ }
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiResetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiResetRequest.cs
new file mode 100644
index 00000000..2d3cc0b8
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiResetRequest.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models
+{
+ ///
+ /// 表示 [POST] /v1/openapi/reset 接口的请求。
+ ///
+ public class OpenApiResetRequest : WechatOpenAIRequest
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiResetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiResetResponse.cs
new file mode 100644
index 00000000..6807fa33
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/OpenApi/OpenApiResetResponse.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models
+{
+ ///
+ /// 表示 [POST] /v1/openapi/reset 接口的响应。
+ ///
+ public class OpenApiResetResponse : WechatOpenAIResponse
+ {
+ public static class Types
+ {
+ public class Data : OpenApiCreateResponse.Types.Data
+ {
+ }
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/Skill/SkillSaveResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/Skill/SkillSaveResponse.cs
index 2f2f5804..173ca2cb 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/Skill/SkillSaveResponse.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.OpenAI/Models/Skill/SkillSaveResponse.cs
@@ -17,7 +17,7 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI.Models
///
[Newtonsoft.Json.JsonProperty("id")]
[System.Text.Json.Serialization.JsonPropertyName("id")]
- public long SkillId { get; set; } = default!;
+ public long SkillId { get; set; }
}
}
}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiCreateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiCreateRequest.json
new file mode 100644
index 00000000..eb94ef09
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiCreateRequest.json
@@ -0,0 +1,7 @@
+{
+ "name": "张三",
+ "phone": "18833008888",
+ "wechat": "aaaa",
+ "email": "123@qq.com",
+ "address": "北京市海淀区中国技术交易大厦F7"
+}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiCreateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiCreateResponse.json
new file mode 100644
index 00000000..24a8af89
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiCreateResponse.json
@@ -0,0 +1,10 @@
+{
+ "code": 0,
+ "msg": "请求成功",
+ "request_id": "255i0ug8-l9q4-3801-44ft-w7csjn9e5142",
+ "data": {
+ "appid": "5i2YaWnq56844yh",
+ "token": "d9tvK4Z3jHp0SW3758x89550oj789k",
+ "aes_key": "lKq5xB3W675330C6ftaLm3n3gb450Iz4ee880K2Hz16"
+ }
+}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiGetDetailRequest.json b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiGetDetailRequest.json
new file mode 100644
index 00000000..22fdca1b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiGetDetailRequest.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiGetDetailResponse.json b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiGetDetailResponse.json
new file mode 100644
index 00000000..24a8af89
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiGetDetailResponse.json
@@ -0,0 +1,10 @@
+{
+ "code": 0,
+ "msg": "请求成功",
+ "request_id": "255i0ug8-l9q4-3801-44ft-w7csjn9e5142",
+ "data": {
+ "appid": "5i2YaWnq56844yh",
+ "token": "d9tvK4Z3jHp0SW3758x89550oj789k",
+ "aes_key": "lKq5xB3W675330C6ftaLm3n3gb450Iz4ee880K2Hz16"
+ }
+}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiResetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiResetRequest.json
new file mode 100644
index 00000000..22fdca1b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiResetRequest.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiResetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiResetResponse.json
new file mode 100644
index 00000000..24a8af89
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/ModelSamples/OpenApi/OpenApiResetResponse.json
@@ -0,0 +1,10 @@
+{
+ "code": 0,
+ "msg": "请求成功",
+ "request_id": "255i0ug8-l9q4-3801-44ft-w7csjn9e5142",
+ "data": {
+ "appid": "5i2YaWnq56844yh",
+ "token": "d9tvK4Z3jHp0SW3758x89550oj789k",
+ "aes_key": "lKq5xB3W675330C6ftaLm3n3gb450Iz4ee880K2Hz16"
+ }
+}
\ No newline at end of file