Răsfoiți Sursa

[WeChatPay.V3] WeChatPayResponse 新增 IsError

Roc 3 ani în urmă
părinte
comite
7e476cc9e1

+ 4 - 4
samples/WebApplicationSample/Controllers/WeChatPayV3Controller.cs

@@ -64,7 +64,7 @@ namespace WebApplicationSample.Controllers
 
             var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
 
-            if (response.StatusCode == 200)
+            if (!response.IsError)
             {
                 var req = new WeChatPayAppSdkRequest
                 {
@@ -116,7 +116,7 @@ namespace WebApplicationSample.Controllers
 
             var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
 
-            if (response.StatusCode == 200)
+            if (!response.IsError)
             {
                 var req = new WeChatPayJsApiSdkRequest
                 {
@@ -166,7 +166,7 @@ namespace WebApplicationSample.Controllers
             request.SetBodyModel(model);
 
             var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
-            if (response.StatusCode == 200)
+            if (!response.IsError)
             {
                 // response.CodeUrl 给前端生成二维码
                 ViewData["qrcode"] = response.CodeUrl;
@@ -246,7 +246,7 @@ namespace WebApplicationSample.Controllers
 
             var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
 
-            if (response.StatusCode == 200)
+            if (!response.IsError)
             {
                 var req = new WeChatPayMiniProgramSdkRequest
                 {

+ 7 - 6
src/Essensoft.Paylink.WeChatPay/V3/Extensions/HttpClientExtensions.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Net;
 using System.Net.Http;
 using System.Net.Http.Headers;
 using System.Text;
@@ -21,7 +22,7 @@ namespace Essensoft.Paylink.WeChatPay.V3.Extensions
         private static readonly JsonSerializerOptions jsonSerializerOptions = new() { IgnoreNullValues = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping };
 #endif
 
-        public static async Task<(WeChatPayHeaders headers, string body, int statusCode)> GetAsync<T>(this HttpClient client, IWeChatPayGetRequest<T> request, WeChatPayOptions options) where T : WeChatPayResponse
+        public static async Task<(WeChatPayHeaders headers, string body, HttpStatusCode statusCode)> GetAsync<T>(this HttpClient client, IWeChatPayGetRequest<T> request, WeChatPayOptions options) where T : WeChatPayResponse
         {
             var url = request.GetRequestUrl();
 
@@ -54,13 +55,13 @@ namespace Essensoft.Paylink.WeChatPay.V3.Extensions
             {
                 var headers = GetWeChatPayHeadersFromResponse(resp);
                 var body = await respContent.ReadAsStringAsync();
-                var statusCode = (int)resp.StatusCode;
+                var statusCode = resp.StatusCode;
 
                 return (headers, body, statusCode);
             }
         }
 
-        public static async Task<(WeChatPayHeaders headers, string body, int statusCode)> PostAsync<T>(this HttpClient client, IWeChatPayPostRequest<T> request, WeChatPayOptions options) where T : WeChatPayResponse
+        public static async Task<(WeChatPayHeaders headers, string body, HttpStatusCode statusCode)> PostAsync<T>(this HttpClient client, IWeChatPayPostRequest<T> request, WeChatPayOptions options) where T : WeChatPayResponse
         {
             var url = request.GetRequestUrl();
             var bodyModel = request.GetBodyModel();
@@ -82,13 +83,13 @@ namespace Essensoft.Paylink.WeChatPay.V3.Extensions
             {
                 var headers = GetWeChatPayHeadersFromResponse(resp);
                 var body = await respContent.ReadAsStringAsync();
-                var statusCode = (int)resp.StatusCode;
+                var statusCode = resp.StatusCode;
 
                 return (headers, body, statusCode);
             }
         }
 
-        public static async Task<(WeChatPayHeaders headers, string body, int statusCode)> PostAsync<T>(this HttpClient client, IWeChatPayPrivacyPostRequest<T> request, WeChatPayOptions options, string serialNo) where T : WeChatPayResponse
+        public static async Task<(WeChatPayHeaders headers, string body, HttpStatusCode statusCode)> PostAsync<T>(this HttpClient client, IWeChatPayPrivacyPostRequest<T> request, WeChatPayOptions options, string serialNo) where T : WeChatPayResponse
         {
             var url = request.GetRequestUrl();
             var bodyModel = request.GetBodyModel();
@@ -111,7 +112,7 @@ namespace Essensoft.Paylink.WeChatPay.V3.Extensions
             {
                 var headers = GetWeChatPayHeadersFromResponse(resp);
                 var body = await respContent.ReadAsStringAsync();
-                var statusCode = (int)resp.StatusCode;
+                var statusCode = resp.StatusCode;
 
                 return (headers, body, statusCode);
             }

+ 2 - 1
src/Essensoft.Paylink.WeChatPay/V3/Parser/WeChatPayResponseJsonParser.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Net;
 using System.Text.Encodings.Web;
 using System.Text.Json;
 using System.Text.Json.Serialization;
@@ -14,7 +15,7 @@ namespace Essensoft.Paylink.WeChatPay.V3.Parser
         private static readonly JsonSerializerOptions jsonSerializerOptions = new() { IgnoreNullValues = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping };
 #endif
 
-        public T Parse(string body, int statusCode)
+        public T Parse(string body, HttpStatusCode statusCode)
         {
             T result = null;
 

+ 3 - 3
src/Essensoft.Paylink.WeChatPay/V3/WeChatPayClient.cs

@@ -92,7 +92,7 @@ namespace Essensoft.Paylink.WeChatPay.V3
 
             if (request.GetNeedCheckSign())
             {
-                if (statusCode.ToString().StartsWith("2")) // HTTP状态码为2xx时才验签(200、202、204)。
+                if (!response.IsError)
                 {
                     await CheckResponseSignAsync(headers, body, options);
                 }
@@ -127,7 +127,7 @@ namespace Essensoft.Paylink.WeChatPay.V3
             var parser = new WeChatPayResponseJsonParser<T>();
             var response = parser.Parse(body, statusCode);
 
-            if (statusCode.ToString().StartsWith("2")) // HTTP状态码为2xx时才验签(200、202、204)。
+            if (!response.IsError)
             {
                 await CheckResponseSignAsync(headers, body, options);
             }
@@ -166,7 +166,7 @@ namespace Essensoft.Paylink.WeChatPay.V3
             var parser = new WeChatPayResponseJsonParser<T>();
             var response = parser.Parse(body, statusCode);
 
-            if (statusCode.ToString().StartsWith("2")) // HTTP状态码为2xx时才验签(200、202、204)。
+            if (!response.IsError)
             {
                 await CheckResponseSignAsync(headers, body, options);
             }

+ 3 - 2
src/Essensoft.Paylink.WeChatPay/V3/WeChatPayPlatformCertificateManager.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Concurrent;
 using System.Linq;
+using System.Net;
 using System.Security.Cryptography.X509Certificates;
 using System.Text;
 using System.Threading.Tasks;
@@ -30,7 +31,7 @@ namespace Essensoft.Paylink.WeChatPay.V3
             // 否则重新下载新的微信支付平台证书并更新缓存
             var request = new WeChatPayCertificatesRequest();
             var response = await client.ExecuteAsync(request, options);
-            if (response.StatusCode == 200)
+            if (response.StatusCode == HttpStatusCode.OK)
             {
                 foreach (var certificate in response.Certificates)
                 {
@@ -95,7 +96,7 @@ namespace Essensoft.Paylink.WeChatPay.V3
             // 否则重新下载新的微信支付平台证书并更新缓存
             var request = new WeChatPayCertificatesRequest();
             var response = await client.ExecuteAsync(request, options);
-            if (response.StatusCode == 200)
+            if (response.StatusCode == HttpStatusCode.OK)
             {
                 foreach (var certificate in response.Certificates)
                 {

+ 20 - 13
src/Essensoft.Paylink.WeChatPay/V3/WeChatPayResponse.cs

@@ -1,4 +1,5 @@
-using System.Text.Json.Serialization;
+using System.Net;
+using System.Text.Json.Serialization;
 using Essensoft.Paylink.WeChatPay.V3.Domain;
 
 namespace Essensoft.Paylink.WeChatPay.V3
@@ -8,18 +9,6 @@ namespace Essensoft.Paylink.WeChatPay.V3
     /// </summary>
     public abstract class WeChatPayResponse : WeChatPayObject
     {
-        /// <summary>
-        /// 原始内容
-        /// </summary>
-        [JsonIgnore]
-        public string Body { get; set; }
-
-        /// <summary>
-        /// HTTP状态码
-        /// </summary>
-        [JsonIgnore]
-        public int StatusCode { get; set; }
-
         /// <summary>
         /// 错误码
         /// </summary>
@@ -37,5 +26,23 @@ namespace Essensoft.Paylink.WeChatPay.V3
         /// </summary>
         [JsonPropertyName("detail")]
         public ErrorDetail Detail { get; set; }
+
+        /// <summary>
+        /// 原始内容
+        /// </summary>
+        [JsonIgnore]
+        public string Body { get; set; }
+
+        /// <summary>
+        /// HTTP状态码
+        /// </summary>
+        [JsonIgnore]
+        public HttpStatusCode StatusCode { get; set; }
+
+        /// <summary>
+        /// 响应结果是否错误
+        /// </summary>
+        [JsonIgnore]
+        public bool IsError => StatusCode is not (HttpStatusCode.OK or HttpStatusCode.Accepted or HttpStatusCode.NoContent);
     }
 }