From 02071c04ed714c13c8b51d74f9b9266406dbc148 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Sun, 31 Oct 2021 14:02:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(wxapi):=20=E6=96=B0=E5=A2=9E=20OpenAPI=20?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WechatApiClientExecuteCgibinExtensions.cs | 23 ------ ...ApiClientExecuteCgibinOpenApiExtensions.cs | 77 +++++++++++++++++++ .../CgibinClearQuotaRequest.cs | 0 .../CgibinClearQuotaResponse.cs | 0 .../CgibinOpenApiQuotaGetRequest.cs | 18 +++++ .../CgibinOpenApiQuotaGetResponse.cs | 45 +++++++++++ .../CgibinOpenApiRequestIdGetRequest.cs | 18 +++++ .../CgibinOpenApiRequestIdGetResponse.cs | 59 ++++++++++++++ .../CgibinClearQuotaRequest.json | 0 .../CgibinClearQuotaResponse.json | 0 .../CgibinOpenApiQuotaGetRequest.json | 3 + .../CgibinOpenApiQuotaGetResponse.json | 9 +++ .../CgibinOpenApiRequestIdGetRequest.json | 3 + .../CgibinOpenApiRequestIdGetResponse.json | 12 +++ 14 files changed, 244 insertions(+), 23 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinOpenApiExtensions.cs rename src/SKIT.FlurlHttpClient.Wechat.Api/Models/{Cgibin => CgibinOpenApi}/CgibinClearQuotaRequest.cs (100%) rename src/SKIT.FlurlHttpClient.Wechat.Api/Models/{Cgibin => CgibinOpenApi}/CgibinClearQuotaResponse.cs (100%) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiQuotaGetRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiQuotaGetResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiRequestIdGetRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiRequestIdGetResponse.cs rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/{Cgibin => CgibinOpenApi}/CgibinClearQuotaRequest.json (100%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/{Cgibin => CgibinOpenApi}/CgibinClearQuotaResponse.json (100%) create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiQuotaGetRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiQuotaGetResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiRequestIdGetRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiRequestIdGetResponse.json diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs index 3f53f7b8..5259065f 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs @@ -118,29 +118,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Api 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 - /// - /// - /// - /// - /// - public static async Task ExecuteCgibinClearQuotaAsync(this WechatApiClient client, Models.CgibinClearQuotaRequest request, CancellationToken cancellationToken = default) - { - if (client is null) throw new ArgumentNullException(nameof(client)); - if (request is null) throw new ArgumentNullException(nameof(request)); - - if (request.AppId == null) - request.AppId = client.Credentials.AppId; - - IFlurlRequest flurlReq = client - .CreateRequest(request, HttpMethod.Post, "cgi-bin", "clear_quota") - .SetQueryParam("access_token", request.AccessToken); - - return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); - } - /// /// 异步调用 [POST] /cgi-bin/changeopenid 接口。 /// REF: https://kf.qq.com/faq/1901177NrqMr190117nqYJze.html diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinOpenApiExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinOpenApiExtensions.cs new file mode 100644 index 00000000..448802d4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinOpenApiExtensions.cs @@ -0,0 +1,77 @@ +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.Api +{ + public static class WechatApiClientExecuteCgibinOpenApiExtensions + { + /// + /// 异步调用 [POST] /cgi-bin/clear_quota 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/Message_Management/API_Call_Limits.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinClearQuotaAsync(this WechatApiClient client, Models.CgibinClearQuotaRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (request.AppId == null) + request.AppId = client.Credentials.AppId; + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "cgi-bin", "clear_quota") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/openapi/quota/get 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/openApi/get_api_quota.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinOpenApiQuotaGetAsync(this WechatApiClient client, Models.CgibinOpenApiQuotaGetRequest 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", "openapi", "quota", "get") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/openapi/rid/get 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/openApi/get_rid_info.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinOpenApiRequestIdGetAsync(this WechatApiClient client, Models.CgibinOpenApiRequestIdGetRequest 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", "openapi", "rid", "get") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinClearQuotaRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinClearQuotaRequest.cs similarity index 100% rename from src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinClearQuotaRequest.cs rename to src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinClearQuotaRequest.cs diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinClearQuotaResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinClearQuotaResponse.cs similarity index 100% rename from src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinClearQuotaResponse.cs rename to src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinClearQuotaResponse.cs diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiQuotaGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiQuotaGetRequest.cs new file mode 100644 index 00000000..704d233b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiQuotaGetRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/openapi/quota/get 接口的请求。 + /// + public class CgibinOpenApiQuotaGetRequest : WechatApiRequest + { + /// + /// 获取或设置 API 请求地址。 + /// + [Newtonsoft.Json.JsonProperty("cgi_path")] + [System.Text.Json.Serialization.JsonPropertyName("cgi_path")] + public string CgiPath { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiQuotaGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiQuotaGetResponse.cs new file mode 100644 index 00000000..20c61866 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiQuotaGetResponse.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/openapi/quota/get 接口的响应。 + /// + public class CgibinOpenApiQuotaGetResponse : WechatApiResponse + { + public static class Types + { + public class Quota + { + /// + /// 获取或设置当天该账号可调用该接口的次数。 + /// + [Newtonsoft.Json.JsonProperty("daily_limit")] + [System.Text.Json.Serialization.JsonPropertyName("daily_limit")] + public int DailyLimit { get; set; } + + /// + /// 获取或设置当天已经调用的次数。 + /// + [Newtonsoft.Json.JsonProperty("used")] + [System.Text.Json.Serialization.JsonPropertyName("used")] + public int UsedCount { get; set; } + + /// + /// 获取或设置当天剩余调用次数。 + /// + [Newtonsoft.Json.JsonProperty("remain")] + [System.Text.Json.Serialization.JsonPropertyName("remain")] + public int RemainCount { get; set; } + } + } + + /// + /// 获取或设置额度信息。 + /// + [Newtonsoft.Json.JsonProperty("quota")] + [System.Text.Json.Serialization.JsonPropertyName("quota")] + public Types.Quota Quota { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiRequestIdGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiRequestIdGetRequest.cs new file mode 100644 index 00000000..40962b30 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiRequestIdGetRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/openapi/rid/get 接口的请求。 + /// + public class CgibinOpenApiRequestIdGetRequest : WechatApiRequest + { + /// + /// 获取或设置调用接口报错返回的 rid。 + /// + [Newtonsoft.Json.JsonProperty("rid")] + [System.Text.Json.Serialization.JsonPropertyName("rid")] + public string RequestId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiRequestIdGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiRequestIdGetResponse.cs new file mode 100644 index 00000000..5ec795a9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinOpenApi/CgibinOpenApiRequestIdGetResponse.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/openapi/rid/get 接口的响应。 + /// + public class CgibinOpenApiRequestIdGetResponse : WechatApiResponse + { + public static class Types + { + public class Request + { + /// + /// 获取或设置请求 URL。 + /// + [Newtonsoft.Json.JsonProperty("request_url")] + [System.Text.Json.Serialization.JsonPropertyName("request_url")] + public string RequestUrl { get; set; } = default!; + + /// + /// 获取或设置请求参数。 + /// + [Newtonsoft.Json.JsonProperty("request_body")] + [System.Text.Json.Serialization.JsonPropertyName("request_body")] + public string RequestBody { get; set; } = default!; + + /// + /// 获取或设置返回参数。 + /// + [Newtonsoft.Json.JsonProperty("response_body")] + [System.Text.Json.Serialization.JsonPropertyName("response_body")] + public string ResponseBody { get; set; } = default!; + + /// + /// 获取或设置发起请求的时间戳。 + /// + [Newtonsoft.Json.JsonProperty("invoke_time")] + [System.Text.Json.Serialization.JsonPropertyName("invoke_time")] + public long InvokeTimestamp { get; set; } + + /// + /// 获取或设置请求耗时(单位:毫秒)。 + /// + [Newtonsoft.Json.JsonProperty("cost_in_ms")] + [System.Text.Json.Serialization.JsonPropertyName("cost_in_ms")] + public int CostTime { get; set; } + } + } + + /// + /// 获取或设置请求信息。 + /// + [Newtonsoft.Json.JsonProperty("request")] + [System.Text.Json.Serialization.JsonPropertyName("request")] + public Types.Request Request { get; set; } = default!; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinClearQuotaRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinClearQuotaRequest.json similarity index 100% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinClearQuotaRequest.json rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinClearQuotaRequest.json diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinClearQuotaResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinClearQuotaResponse.json similarity index 100% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinClearQuotaResponse.json rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinClearQuotaResponse.json diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiQuotaGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiQuotaGetRequest.json new file mode 100644 index 00000000..e86ae3e1 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiQuotaGetRequest.json @@ -0,0 +1,3 @@ +{ + "cgi_path": "/wxa/gettemplatedraftlist" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiQuotaGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiQuotaGetResponse.json new file mode 100644 index 00000000..6ab6303a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiQuotaGetResponse.json @@ -0,0 +1,9 @@ +{ + "errcode": 0, + "errmsg": "ok", + "quota": { + "daily_limit": 0, + "used": 0, + "remain": 0 + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiRequestIdGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiRequestIdGetRequest.json new file mode 100644 index 00000000..0c0265d8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiRequestIdGetRequest.json @@ -0,0 +1,3 @@ +{ + "rid": "61725984-6126f6f9-040f19c4" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiRequestIdGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiRequestIdGetResponse.json new file mode 100644 index 00000000..a9886ac8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinOpenApi/CgibinOpenApiRequestIdGetResponse.json @@ -0,0 +1,12 @@ +{ + "errcode": 0, + "errmsg": "ok", + "request": { + "invoke_time": 1635156704, + "cost_in_ms": 30, + "request_url": "access_token=50_Im7xxxx", + "request_body": "", + "response_body": "{\"errcode\":45009,\"errmsg\":\"reach max api daily quota limit rid: 617682e0-09059ac5-34a8e2ea\"}" + } + +}