diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteProductExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteProductExtensions.cs index 7fc28735..7db2be2e 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteProductExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteProductExtensions.cs @@ -1583,5 +1583,67 @@ namespace SKIT.FlurlHttpClient.Wechat.Api return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } #endregion + + #region Qrcode + /// + /// 异步调用 [POST] /product/qrcode/gen 接口。 + /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/ministore/minishopopencomponent/API/qrcode/gen_qrcode.html + /// + /// + /// + /// + /// + public static async Task ExecuteProductQrcodeGenerateAsync(this WechatApiClient client, Models.ProductQrcodeGenerateRequest 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, "product", "qrcode", "gen") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /product/qrcode/get 接口。 + /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/ministore/minishopopencomponent/API/qrcode/get_qrcode.html + /// + /// + /// + /// + /// + public static async Task ExecuteProductQrcodeGetAsync(this WechatApiClient client, Models.ProductQrcodeGetRequest 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, "product", "qrcode", "get") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /product/qrcode/check 接口。 + /// REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/ministore/minishopopencomponent/API/qrcode/check_qrcode.html + /// + /// + /// + /// + /// + public static async Task ExecuteProductQrcodeCheckAsync(this WechatApiClient client, Models.ProductQrcodeCheckRequest 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, "product", "qrcode", "check") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeCheckRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeCheckRequest.cs new file mode 100644 index 00000000..f7dfa373 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeCheckRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /product/qrcode/check 接口的请求。 + /// + public class ProductQrcodeCheckRequest : WechatApiRequest + { + /// + /// 获取或设置二维码 Ticket。 + /// + [Newtonsoft.Json.JsonProperty("ticket")] + [System.Text.Json.Serialization.JsonPropertyName("ticket")] + public string QrcodeTicket { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeCheckResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeCheckResponse.cs new file mode 100644 index 00000000..47cda5cf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeCheckResponse.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /product/qrcode/check 接口的响应。 + /// + public class ProductQrcodeCheckResponse : WechatApiResponse + { + /// + /// 获取或设置自检业务返回错误码。 + /// + [Newtonsoft.Json.JsonProperty("self_check_err_code")] + [System.Text.Json.Serialization.JsonPropertyName("self_check_err_code")] + public int SelfCheckErrorCode { get; set; } + + /// + /// 获取或设置自检业务返回错误码。 + /// + [Newtonsoft.Json.JsonProperty("self_check_err_msg")] + [System.Text.Json.Serialization.JsonPropertyName("self_check_err_msg")] + public string? SelfCheckErrorMessage { get; set; } + + /// + /// 获取或设置扫码状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public int Status { get; set; } + + /// + /// 获取或设置扫码者身份。 + /// + [Newtonsoft.Json.JsonProperty("scan_user_type")] + [System.Text.Json.Serialization.JsonPropertyName("scan_user_type")] + public int? ScanUserType { get; set; } + + public override bool IsSuccessful() + { + return base.IsSuccessful() && SelfCheckErrorCode == 0; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGenerateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGenerateRequest.cs new file mode 100644 index 00000000..66517aaf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGenerateRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /product/qrcode/gen 接口的请求。 + /// + public class ProductQrcodeGenerateRequest : WechatApiRequest + { + /// + /// 获取或设置需要验证的身份。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public int Type { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGenerateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGenerateResponse.cs new file mode 100644 index 00000000..027872e3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGenerateResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /product/qrcode/gen 接口的响应。 + /// + public class ProductQrcodeGenerateResponse : WechatApiResponse + { + /// + /// 获取或设置二维码 Ticket。 + /// + [Newtonsoft.Json.JsonProperty("qrcode_ticket")] + [System.Text.Json.Serialization.JsonPropertyName("qrcode_ticket")] + public string QrcodeTicket { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGetRequest.cs new file mode 100644 index 00000000..7dfc239d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGetRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /product/qrcode/get 接口的请求。 + /// + public class ProductQrcodeGetRequest : WechatApiRequest + { + /// + /// 获取或设置二维码 Ticket。 + /// + [Newtonsoft.Json.JsonProperty("ticket")] + [System.Text.Json.Serialization.JsonPropertyName("ticket")] + public string QrcodeTicket { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGetResponse.cs new file mode 100644 index 00000000..7e28955c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Product/Qrcode/ProductQrcodeGetResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /product/qrcode/get 接口的响应。 + /// + public class ProductQrcodeGetResponse : WechatApiResponse + { + /// + /// 获取或设置经 Base64 编码的二维码二进制流。 + /// + [Newtonsoft.Json.JsonProperty("qrcode_buf")] + [System.Text.Json.Serialization.JsonPropertyName("qrcode_buf")] + public string EncodingQrcodeBuffer { get; set; } = default!; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeCheckRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeCheckRequest.json new file mode 100644 index 00000000..26462bbb --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeCheckRequest.json @@ -0,0 +1,3 @@ +{ + "ticket": "05ba627d5b73b6f3ef0dcfc7" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeCheckResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeCheckResponse.json new file mode 100644 index 00000000..2db5d4c5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeCheckResponse.json @@ -0,0 +1,8 @@ +{ + "errcode": 0, + "errmsg": "ok", + "status": 0, + "self_check_err_code": 0, + "self_check_err_msg": "", + "scan_user_type": 1 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGenerateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGenerateRequest.json new file mode 100644 index 00000000..7d5b7e26 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGenerateRequest.json @@ -0,0 +1,3 @@ +{ + "type": 1 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGenerateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGenerateResponse.json new file mode 100644 index 00000000..d11c18a6 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGenerateResponse.json @@ -0,0 +1,5 @@ +{ + "errcode": 0, + "errmsg": "ok", + "qrcode_ticket": "xxxxx" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGetRequest.json new file mode 100644 index 00000000..26462bbb --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGetRequest.json @@ -0,0 +1,3 @@ +{ + "ticket": "05ba627d5b73b6f3ef0dcfc7" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGetResponse.json new file mode 100644 index 00000000..759f8125 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Product/Qrcode/ProductQrcodeGetResponse.json @@ -0,0 +1,5 @@ +{ + "errcode": 0, + "errmsg": "ok", + "qrcode_buf": "xxxxx" +} \ No newline at end of file