diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs index 1e35069d..3f53f7b8 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs @@ -98,6 +98,26 @@ namespace SKIT.FlurlHttpClient.Wechat.Api return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } + /// + /// 异步调用 [POST] /cgi-bin/callback/check 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Network_Detection.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinCallbackCheckAsync(this WechatApiClient client, Models.CgibinCallbackCheckRequest 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, "cgi-bin", "callback", "check") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + /// /// 异步调用 [POST] /cgi-bin/clear_quota 接口。 /// REF: https://developers.weixin.qq.com/doc/offiaccount/Message_Management/API_Call_Limits.html diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinCallbackCheckRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinCallbackCheckRequest.cs new file mode 100644 index 00000000..34a2f192 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinCallbackCheckRequest.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/callback/check 接口的请求。 + /// + public class CgibinCallbackCheckRequest : WechatApiRequest + { + /// + /// 获取或设置执行的检测动作。 + /// 默认值:all + /// + [Newtonsoft.Json.JsonProperty("action")] + [System.Text.Json.Serialization.JsonPropertyName("action")] + public string Action { get; set; } = "all"; + + /// + /// 获取或设置指定平台从某个运营商进行检测。 + /// 默认值:DEFAULT + /// + [Newtonsoft.Json.JsonProperty("check_operator")] + [System.Text.Json.Serialization.JsonPropertyName("check_operator")] + public string CheckOperator { get; set; } = "DEFAULT"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinCallbackCheckResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinCallbackCheckResponse.cs new file mode 100644 index 00000000..30955424 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinCallbackCheckResponse.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/callback/check 接口的响应。 + /// + public class CgibinCallbackCheckResponse : WechatApiResponse + { + public static class Types + { + public class DNS + { + /// + /// 获取或设置解析 IP。 + /// + [Newtonsoft.Json.JsonProperty("ip")] + [System.Text.Json.Serialization.JsonPropertyName("ip")] + public string IP { get; set; } = default!; + + /// + /// 获取或设置 IP 对应的运营商。 + /// + [Newtonsoft.Json.JsonProperty("real_operator")] + [System.Text.Json.Serialization.JsonPropertyName("real_operator")] + public string RealOperator { get; set; } = default!; + } + + public class Ping + { + /// + /// 获取或设置 ping IP。 + /// + [Newtonsoft.Json.JsonProperty("ip")] + [System.Text.Json.Serialization.JsonPropertyName("ip")] + public string IP { get; set; } = default!; + + /// + /// 获取或设置 IP 源头的运营商。 + /// + [Newtonsoft.Json.JsonProperty("from_operator")] + [System.Text.Json.Serialization.JsonPropertyName("from_operator")] + public string FromOperator { get; set; } = default!; + + /// + /// 获取或设置丢包率字符串。 + /// + [Newtonsoft.Json.JsonProperty("package_loss")] + [System.Text.Json.Serialization.JsonPropertyName("package_loss")] + public string PackageLossString { get; set; } = default!; + + /// + /// 获取或设置耗时字符串。 + /// + [Newtonsoft.Json.JsonProperty("time")] + [System.Text.Json.Serialization.JsonPropertyName("time")] + public string TimeCostString { get; set; } = default!; + } + } + + /// + /// 获取或设置 DNS 列表。 + /// + [Newtonsoft.Json.JsonProperty("dns")] + [System.Text.Json.Serialization.JsonPropertyName("dns")] + public Types.DNS[]? DNSList { get; set; } + + /// + /// 获取或设置 ping 列表。 + /// + [Newtonsoft.Json.JsonProperty("ping")] + [System.Text.Json.Serialization.JsonPropertyName("ping")] + public Types.Ping[]? PingList { get; set; } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinCallbackCheckRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinCallbackCheckRequest.json new file mode 100644 index 00000000..4a545b4e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinCallbackCheckRequest.json @@ -0,0 +1,4 @@ +{ + "action": "all", + "check_operator": "DEFAULT" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinCallbackCheckResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinCallbackCheckResponse.json new file mode 100644 index 00000000..6044cb74 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinCallbackCheckResponse.json @@ -0,0 +1,26 @@ +{ + "dns": [ + { + "ip": "111.161.64.40", + "real_operator": "UNICOM" + }, + { + "ip": "111.161.64.48", + "real_operator": "UNICOM" + } + ], + "ping": [ + { + "ip": "111.161.64.40", + "from_operator": "UNICOM", + "package_loss": "0%", + "time": "23.079ms" + }, + { + "ip": "111.161.64.48", + "from_operator": "UNICOM", + "package_loss": "0%", + "time": "21.434ms" + } + ] +} \ No newline at end of file