Browse Source

1. 从AddQPayHttpClient 拆分出 AddQPayCertificateHttpClient.
2. 从AddWeChatPayHttpClient 拆分出 AddWeChatPayCertificateHttpClient.
3. WeChatPay/QPay 证书相关请求 增加 certificateName 参数 默认为 "Default"

Roc 7 years ago
parent
commit
3dd093b806

+ 3 - 27
README.MD

@@ -58,38 +58,14 @@ Essensoft.AspNetCore.Payment.UnionPay       | [![NuGet](https://img.shields.io/n
 
 ## 参考开发环境
 * Windows 10
-* VS2017 15.8.4
+* VS2017 15.8.5
 * .NET Core SDK 2.1.402 (x64)
 
 ## 使用方式
 
-### 关于Payment使用 HttpClient 默认/证书 配置介绍 (目前仅WeChatPay\QPay部分API有使用到API证书配置) 
+* [使用配置 HttpClient](docs/Using-HttpClient.md)
 
-* 以WeChatPay为例,有以下几种方式:
-1. 添加默认HttpClient供WeChatPayClient使用. (未使用到API证书时适用)
-```
-services.AddWeChatPayHttpClient();
-```
-
-2. 添加默认HttpClient和证书HttpClient供WeChatPayClient使用.
-
-* 根据证书路径
-```
-services.AddWeChatPayHttpClient(new X509Certificate2(Configuration["WeChatPay:Certificate"], Configuration["WeChatPay:MchId"], X509KeyStorageFlags.MachineKeySet));
-```
-
-* 根据证书Base64String
-```
-services.AddWeChatPayHttpClient(new X509Certificate2(Convert.FromBase64String(Configuration["WeChatPay:Certificate"]), Configuration["WeChatPay:MchId"], X509KeyStorageFlags.MachineKeySet));
-```
-
-3.  自行配置HttpClient供WeChatPayClient使用.
-```
-services.AddHttpClient(WeChatPayOptions.DefaultClientName);
-services.AddHttpClient(WeChatPayOptions.CertificateClientName).ConfigurePrimaryHttpMessageHandler(() => { ... });
-```
-
-详情见示例项目:NewWebApplicationSample / WebApplicationSample</p>
+* [参考示例项目](samples/NewWebApplicationSample)
 
 <p align="center">
     <img src="http://p687qfgw0.bkt.clouddn.com/NewWebApplicationSample.png">

+ 33 - 0
docs/Using-HttpClient.md

@@ -0,0 +1,33 @@
+# 关于Payment中使用 HttpClient 配置介绍
+
+* 以WeChatPay为例,有以下几种方式:
+
+1. 添加默认HttpClient供WeChatPayClient使用. (未使用到API证书时适用)
+```
+services.AddWeChatPayHttpClient();
+```
+
+2. 添加默认HttpClient和证书HttpClient供WeChatPayClient使用 (目前仅WeChatPay\QPay部分API有使用到API证书配置) 
+
+* 根据证书路径
+```
+services.AddWeChatPayHttpClient();
+services.AddWeChatPayCertificateHttpClient(new X509Certificate2(Configuration["WeChatPay:Certificate"], Configuration["WeChatPay:MchId"], X509KeyStorageFlags.MachineKeySet));
+//services.AddWeChatPayCertificateHttpClient("certificateName1", new X509Certificate2(Configuration["WeChatPay:Certificate"], Configuration["WeChatPay:MchId"], X509KeyStorageFlags.MachineKeySet));
+//若配置证书名为"certificateName1", 则执行请求时需要配置证书名(该API请求需要证书的情况下), 如: await _client.ExecuteAsync(request, "certificateName1");
+```
+
+* 根据证书Base64String
+```
+services.AddWeChatPayHttpClient();
+services.AddWeChatPayCertificateHttpClient(new X509Certificate2(Convert.FromBase64String(Configuration["WeChatPay:Certificate"]), Configuration["WeChatPay:MchId"], X509KeyStorageFlags.MachineKeySet));
+//services.AddWeChatPayCertificateHttpClient("certificateName1", new X509Certificate2(Convert.FromBase64String(Configuration["WeChatPay:Certificate"]), Configuration["WeChatPay:MchId"], X509KeyStorageFlags.MachineKeySet));
+//若配置证书名为"certificateName1", 则执行请求时需要配置证书名(该API请求需要证书的情况下), 如: await _client.ExecuteAsync(request, "certificateName1");
+```
+
+3.  自行配置HttpClient供WeChatPayClient使用 (目前仅WeChatPay\QPay部分API有使用到API证书配置) 
+```
+services.AddHttpClient(WeChatPayOptions.DefaultClientName);
+services.AddHttpClient(WeChatPayOptions.CertificateClientName + "." + "Default").ConfigurePrimaryHttpMessageHandler(() => { ... });
+// "Default" 为默认执行请求的API证书名, 可自行配置.
+```

+ 4 - 2
samples/NewWebApplicationSample/Startup.cs

@@ -47,14 +47,16 @@ namespace NewWebApplicationSample
 
             services.AddQPay();
             services.AddQPayHttpClient();
-            //services.AddQPayHttpClient(new X509Certificate2(Convert.FromBase64String(Configuration["QPay:Certificate"]), Configuration["QPay:MchId"], X509KeyStorageFlags.MachineKeySet));
+            //services.AddQPayCertificateHttpClient(new X509Certificate2(Convert.FromBase64String(Configuration["QPay:Certificate"]), Configuration["QPay:MchId"], X509KeyStorageFlags.MachineKeySet));
+            //services.AddQPayCertificateHttpClient("Default", new X509Certificate2(Convert.FromBase64String(Configuration["QPay:Certificate"]), Configuration["QPay:MchId"], X509KeyStorageFlags.MachineKeySet));
 
             services.AddUnionPay();
             services.AddUnionPayHttpClient();
 
             services.AddWeChatPay();
             services.AddWeChatPayHttpClient();
-            //services.AddWeChatPayHttpClient(new X509Certificate2(Convert.FromBase64String(Configuration["WeChatPay:Certificate"]), Configuration["WeChatPay:MchId"], X509KeyStorageFlags.MachineKeySet));
+            //services.AddWeChatPayCertificateHttpClient(new X509Certificate2(Convert.FromBase64String(Configuration["WeChatPay:Certificate"]), Configuration["WeChatPay:MchId"], X509KeyStorageFlags.MachineKeySet));
+            //services.AddWeChatPayCertificateHttpClient("Default", new X509Certificate2(Convert.FromBase64String(Configuration["WeChatPay:Certificate"]), Configuration["WeChatPay:MchId"], X509KeyStorageFlags.MachineKeySet));
 
             services.AddLianLianPay();
             services.AddLianLianPayHttpClient();

+ 2 - 1
src/Essensoft.AspNetCore.Payment.QPay/IQPayClient.cs

@@ -15,7 +15,8 @@ namespace Essensoft.AspNetCore.Payment.QPay
         /// 执行QPay Certificate API请求。
         /// </summary>
         /// <param name="request">具体的QPay Certificate API请求</param>
+        /// <param name="certificateName">请求所使用证书的名称</param>
         /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(IQPayCertificateRequest<T> request) where T : QPayResponse;
+        Task<T> ExecuteAsync<T>(IQPayCertificateRequest<T> request, string certificateName) where T : QPayResponse;
     }
 }

+ 2 - 3
src/Essensoft.AspNetCore.Payment.QPay/QPayClient.cs

@@ -1,6 +1,5 @@
 using System;
 using System.Net.Http;
-using System.Text;
 using System.Threading.Tasks;
 using Essensoft.AspNetCore.Payment.QPay.Parser;
 using Essensoft.AspNetCore.Payment.QPay.Utility;
@@ -83,7 +82,7 @@ namespace Essensoft.AspNetCore.Payment.QPay
 
         #region IQPayClient Members
 
-        public async Task<T> ExecuteAsync<T>(IQPayCertificateRequest<T> request) where T : QPayResponse
+        public async Task<T> ExecuteAsync<T>(IQPayCertificateRequest<T> request, string certificateName = "Default") where T : QPayResponse
         {
             // 字典排序
             var sortedTxtParams = new QPayDictionary(request.GetParameters())
@@ -101,7 +100,7 @@ namespace Essensoft.AspNetCore.Payment.QPay
             var content = QPayUtility.BuildContent(sortedTxtParams);
             Logger?.LogTrace(0, "Request:{content}", content);
 
-            using (var client = ClientFactory.CreateClient(QPayOptions.CertificateClientName))
+            using (var client = ClientFactory.CreateClient(QPayOptions.CertificateClientName + "." + certificateName))
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content);
                 Logger?.LogTrace(1, "Response:{body}", body);

+ 14 - 12
src/Essensoft.AspNetCore.Payment.QPay/ServiceCollectionExtensions.cs

@@ -2,7 +2,6 @@ using System;
 using System.Net.Http;
 using System.Security.Cryptography.X509Certificates;
 using Essensoft.AspNetCore.Payment.QPay;
-using Essensoft.AspNetCore.Payment.QPay.Utility;
 
 namespace Microsoft.Extensions.DependencyInjection
 {
@@ -30,24 +29,27 @@ namespace Microsoft.Extensions.DependencyInjection
         public static void AddQPayHttpClient(
             this IServiceCollection services)
         {
-            services.AddQPayHttpClient(certificate: null);
+            services.AddHttpClient(QPayOptions.DefaultClientName);
         }
 
-        public static void AddQPayHttpClient(
+        public static void AddQPayCertificateHttpClient(
             this IServiceCollection services,
             X509Certificate2 certificate)
         {
-            services.AddHttpClient(QPayOptions.DefaultClientName);
+            services.AddQPayCertificateHttpClient(certificateName: "Default", certificate: certificate);
+        }
 
-            if (certificate != null)
+        public static void AddQPayCertificateHttpClient(
+            this IServiceCollection services,
+            string certificateName,
+            X509Certificate2 certificate)
+        {
+            services.AddHttpClient(QPayOptions.CertificateClientName + "." + certificateName).ConfigurePrimaryHttpMessageHandler(() =>
             {
-                services.AddHttpClient(QPayOptions.CertificateClientName).ConfigurePrimaryHttpMessageHandler(() =>
-                {
-                    var handler = new HttpClientHandler();
-                    handler.ClientCertificates.Add(certificate);
-                    return handler;
-                });
-            }
+                var handler = new HttpClientHandler();
+                handler.ClientCertificates.Add(certificate);
+                return handler;
+            });
         }
     }
 }

+ 2 - 1
src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayClient.cs

@@ -15,8 +15,9 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
         /// 执行WeChatPay Certificate API请求。
         /// </summary>
         /// <param name="request">具体的WeChatPay Certificate API请求</param>
+        /// <param name="certificateName">请求所使用证书的名称</param>
         /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(IWeChatPayCertificateRequest<T> request) where T : WeChatPayResponse;
+        Task<T> ExecuteAsync<T>(IWeChatPayCertificateRequest<T> request, string certificateName) where T : WeChatPayResponse;
 
 
         /// <summary>

+ 14 - 12
src/Essensoft.AspNetCore.Payment.WeChatPay/ServiceCollectionExtensions.cs

@@ -2,7 +2,6 @@ using System;
 using System.Net.Http;
 using System.Security.Cryptography.X509Certificates;
 using Essensoft.AspNetCore.Payment.WeChatPay;
-using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Microsoft.Extensions.DependencyInjection
 {
@@ -30,24 +29,27 @@ namespace Microsoft.Extensions.DependencyInjection
         public static void AddWeChatPayHttpClient(
             this IServiceCollection services)
         {
-            services.AddWeChatPayHttpClient(certificate: null);
+            services.AddHttpClient(WeChatPayOptions.DefaultClientName);
         }
 
-        public static void AddWeChatPayHttpClient(
+        public static void AddWeChatPayCertificateHttpClient(
             this IServiceCollection services,
             X509Certificate2 certificate)
         {
-            services.AddHttpClient(WeChatPayOptions.DefaultClientName);
+            services.AddWeChatPayCertificateHttpClient(certificateName: "Default", certificate: certificate);
+        }
 
-            if (certificate != null)
+        public static void AddWeChatPayCertificateHttpClient(
+            this IServiceCollection services,
+            string certificateName,
+            X509Certificate2 certificate)
+        {
+            services.AddHttpClient(WeChatPayOptions.CertificateClientName + "." + certificateName).ConfigurePrimaryHttpMessageHandler(() =>
             {
-                services.AddHttpClient(WeChatPayOptions.CertificateClientName).ConfigurePrimaryHttpMessageHandler(() =>
-                {
-                    var handler = new HttpClientHandler();
-                    handler.ClientCertificates.Add(certificate);
-                    return handler;
-                });
-            }
+                var handler = new HttpClientHandler();
+                handler.ClientCertificates.Add(certificate);
+                return handler;
+            });
         }
     }
 }

+ 4 - 4
src/Essensoft.AspNetCore.Payment.WeChatPay/WeChatPayClient.cs

@@ -29,7 +29,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
         private const string timeStamp = "timeStamp";
         private const string nonceStr = "nonceStr";
         private const string signType = "signType";
-        private const string paySign = "paySign";        
+        private const string paySign = "paySign";
 
         public virtual ILogger Logger { get; set; }
 
@@ -61,7 +61,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
             if (string.IsNullOrEmpty(Options.Key))
             {
                 throw new ArgumentNullException(nameof(Options.Key));
-            }          
+            }
         }
 
         #endregion
@@ -102,7 +102,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
 
         #region IWeChatPayClient Members
 
-        public async Task<T> ExecuteAsync<T>(IWeChatPayCertificateRequest<T> request) where T : WeChatPayResponse
+        public async Task<T> ExecuteAsync<T>(IWeChatPayCertificateRequest<T> request, string certificateName = "Default") where T : WeChatPayResponse
         {
             var signType = true; // ture:MD5,false:HMAC-SHA256
             var excludeSignType = true;
@@ -199,7 +199,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
             var content = WeChatPayUtility.BuildContent(sortedTxtParams);
             Logger?.LogTrace(0, "Request:{content}", content);
 
-            using (var client = ClientFactory.CreateClient(WeChatPayOptions.CertificateClientName))
+            using (var client = ClientFactory.CreateClient(WeChatPayOptions.CertificateClientName + "." + certificateName))
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content);