Explorar o código

UnionPay 实现(#26)

Roc %!s(int64=6) %!d(string=hai) anos
pai
achega
d754dec78e

+ 4 - 2
samples/WebApplicationSample/Controllers/NotifyController.cs

@@ -393,10 +393,12 @@ namespace WebApplicationSample.Controllers
     public class UnionPayNotifyController : Controller
     {
         private readonly IUnionPayNotifyClient _client;
+        private readonly IOptions<UnionPayOptions> _optionsAccessor;
 
-        public UnionPayNotifyController(IUnionPayNotifyClient client)
+        public UnionPayNotifyController(IUnionPayNotifyClient client, IOptions<UnionPayOptions> optionsAccessor)
         {
             _client = client;
+            _optionsAccessor = optionsAccessor;
         }
 
         /// <summary>
@@ -409,7 +411,7 @@ namespace WebApplicationSample.Controllers
         {
             try
             {
-                var notify = await _client.ExecuteAsync<UnionPayGatewayPayFrontConsumeNotify>(Request);
+                var notify = await _client.ExecuteAsync<UnionPayGatewayPayFrontConsumeNotify>(Request, _optionsAccessor.Value);
                 Console.WriteLine("OrderId: " + notify.OrderId + " respCode :" + notify.RespCode);
                 return UnionPayNotifyResult.Success;
             }

+ 6 - 3
samples/WebApplicationSample/Controllers/UnionPayController.cs

@@ -4,6 +4,7 @@ using Essensoft.AspNetCore.Payment.UnionPay;
 using Essensoft.AspNetCore.Payment.UnionPay.Notify;
 using Essensoft.AspNetCore.Payment.UnionPay.Request;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
 using WebApplicationSample.Models;
 
 namespace WebApplicationSample.Controllers
@@ -12,11 +13,13 @@ namespace WebApplicationSample.Controllers
     {
         private readonly IUnionPayClient _client;
         private readonly IUnionPayNotifyClient _notifyClient;
+        private readonly IOptions<UnionPayOptions> _optionsAccessor;
 
-        public UnionPayController(IUnionPayClient client, IUnionPayNotifyClient notifyClient)
+        public UnionPayController(IUnionPayClient client, IUnionPayNotifyClient notifyClient, IOptions<UnionPayOptions> optionsAccessor)
         {
             _client = client;
             _notifyClient = notifyClient;
+            _optionsAccessor = optionsAccessor;
         }
 
         /// <summary>
@@ -60,7 +63,7 @@ namespace WebApplicationSample.Controllers
                 FrontUrl = viewModel.FrontUrl,
                 BackUrl = viewModel.BackUrl
             };
-            var response = await _client.PageExecuteAsync(request);
+            var response = await _client.PageExecuteAsync(request, _optionsAccessor.Value);
             return Content(response.Body, "text/html", Encoding.UTF8);
         }
 
@@ -73,7 +76,7 @@ namespace WebApplicationSample.Controllers
         {
             try
             {
-                var notify = await _notifyClient.ExecuteAsync<UnionPayGatewayPayFrontConsumeReturn>(Request);
+                var notify = await _notifyClient.ExecuteAsync<UnionPayGatewayPayFrontConsumeReturn>(Request, _optionsAccessor.Value);
                 ViewData["response"] = "支付成功";
                 return View();
             }

+ 4 - 20
src/Essensoft.AspNetCore.Payment.UnionPay/IUnionPayClient.cs

@@ -12,33 +12,17 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
         /// </summary>
         /// <typeparam name="T">领域对象</typeparam>
         /// <param name="request">具体的UnionPay API请求</param>
+        /// <param name="options">配置选项</param>
         /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(IUnionPayRequest<T> request) where T : UnionPayResponse;
+        Task<T> ExecuteAsync<T>(IUnionPayRequest<T> request, UnionPayOptions options) where T : UnionPayResponse;
 
         /// <summary>
         /// 执行UnionPay API请求。
         /// </summary>
         /// <typeparam name="T">领域对象</typeparam>
         /// <param name="request">具体的UnionPay API请求</param>
-        /// <param name="optionsName">配置选项名称</param>
+        /// <param name="options">配置选项</param>
         /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(IUnionPayRequest<T> request, string optionsName) where T : UnionPayResponse;
-
-        /// <summary>
-        /// 执行UnionPay API请求。
-        /// </summary>
-        /// <typeparam name="T">领域对象</typeparam>
-        /// <param name="request">具体的UnionPay API请求</param>
-        /// <returns>领域对象</returns>
-        Task<T> PageExecuteAsync<T>(IUnionPayRequest<T> request) where T : UnionPayResponse;
-
-        /// <summary>
-        /// 执行UnionPay API请求。
-        /// </summary>
-        /// <typeparam name="T">领域对象</typeparam>
-        /// <param name="request">具体的UnionPay API请求</param>
-        /// <param name="optionsName">配置选项名称</param>
-        /// <returns>领域对象</returns>
-        Task<T> PageExecuteAsync<T>(IUnionPayRequest<T> request, string optionsName) where T : UnionPayResponse;
+        Task<T> PageExecuteAsync<T>(IUnionPayRequest<T> request, UnionPayOptions options) where T : UnionPayResponse;
     }
 }

+ 2 - 10
src/Essensoft.AspNetCore.Payment.UnionPay/IUnionPayNotifyClient.cs

@@ -13,16 +13,8 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
         /// </summary>
         /// <typeparam name="T">领域对象</typeparam>
         /// <param name="request">控制器的请求</param>
+        /// <param name="options">配置选项</param>
         /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(HttpRequest request) where T : UnionPayNotify;
-
-        /// <summary>
-        /// 执行UnionPay通知请求解析。
-        /// </summary>
-        /// <typeparam name="T">领域对象</typeparam>
-        /// <param name="request">控制器的请求</param>
-        /// <param name="optionsName">配置选项名称</param>
-        /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(HttpRequest request, string optionsName) where T : UnionPayNotify;
+        Task<T> ExecuteAsync<T>(HttpRequest request, UnionPayOptions options) where T : UnionPayNotify;
     }
 }

+ 5 - 2
src/Essensoft.AspNetCore.Payment.UnionPay/ServiceCollectionExtensions.cs

@@ -15,8 +15,11 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
             this IServiceCollection services,
             Action<UnionPayOptions> setupAction)
         {
-            services.AddScoped<IUnionPayClient, UnionPayClient>();
-            services.AddScoped<IUnionPayNotifyClient, UnionPayNotifyClient>();
+            services.AddHttpClient(nameof(UnionPayClient));
+
+            services.AddSingleton<IUnionPayClient, UnionPayClient>();
+            services.AddSingleton<IUnionPayNotifyClient, UnionPayNotifyClient>();
+
             if (setupAction != null)
             {
                 services.Configure(setupAction);

+ 6 - 28
src/Essensoft.AspNetCore.Payment.UnionPay/UnionPayClient.cs

@@ -6,8 +6,6 @@ using System.Threading.Tasks;
 using Essensoft.AspNetCore.Payment.UnionPay.Parser;
 using Essensoft.AspNetCore.Payment.UnionPay.Request;
 using Essensoft.AspNetCore.Payment.UnionPay.Utility;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
 
 namespace Essensoft.AspNetCore.Payment.UnionPay
 {
@@ -24,34 +22,22 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
         private const string ENCRYPTCERTID = "encryptCertId";
         private const string ACCNO = "accNo";
 
-        private readonly ILogger _logger;
-        private readonly IHttpClientFactory _clientFactory;
-        private readonly IOptionsSnapshot<UnionPayOptions> _optionsSnapshotAccessor;
+        private readonly IHttpClientFactory _httpClientFactory;
 
         #region UnionPayClient Constructors
 
         public UnionPayClient(
-            ILogger<UnionPayClient> logger,
-            IHttpClientFactory clientFactory,
-            IOptionsSnapshot<UnionPayOptions> optionsAccessor)
+            IHttpClientFactory httpClientFactory)
         {
-            _logger = logger;
-            _clientFactory = clientFactory;
-            _optionsSnapshotAccessor = optionsAccessor;
+            _httpClientFactory = httpClientFactory;
         }
 
         #endregion
 
         #region IUnionPayClient Members
 
-        public async Task<T> ExecuteAsync<T>(IUnionPayRequest<T> request) where T : UnionPayResponse
+        public async Task<T> ExecuteAsync<T>(IUnionPayRequest<T> request, UnionPayOptions options) where T : UnionPayResponse
         {
-            return await ExecuteAsync(request, null);
-        }
-
-        public async Task<T> ExecuteAsync<T>(IUnionPayRequest<T> request, string optionsName) where T : UnionPayResponse
-        {
-            var options = _optionsSnapshotAccessor.Get(optionsName);
             var version = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion();
 
             var merId = options.MerId;
@@ -86,12 +72,10 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
             UnionPaySignature.Sign(txtParams, options.SignCertificate.certId, options.SignCertificate.key, options.SecureKey);
 
             var query = UnionPayUtility.BuildQuery(txtParams);
-            _logger.Log(options.LogLevel, "Request:{query}", query);
 
-            using (var client = _clientFactory.CreateClient())
+            using (var client = _httpClientFactory.CreateClient(nameof(UnionPayClient)))
             {
                 var body = await client.DoPostAsync(request.GetRequestUrl(options.TestMode), query);
-                _logger.Log(options.LogLevel, "Response:{content}", body);
 
                 var dictionary = ParseQueryString(body);
 
@@ -112,14 +96,8 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
 
         #region IUnionPayClient Members
 
-        public Task<T> PageExecuteAsync<T>(IUnionPayRequest<T> request) where T : UnionPayResponse
-        {
-            return PageExecuteAsync(request, null);
-        }
-
-        public Task<T> PageExecuteAsync<T>(IUnionPayRequest<T> request, string optionsName) where T : UnionPayResponse
+        public Task<T> PageExecuteAsync<T>(IUnionPayRequest<T> request, UnionPayOptions options) where T : UnionPayResponse
         {
-            var options = _optionsSnapshotAccessor.Get(optionsName);
             var version = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion();
             var merId = options.MerId;
 

+ 3 - 18
src/Essensoft.AspNetCore.Payment.UnionPay/UnionPayNotifyClient.cs

@@ -1,26 +1,16 @@
-using System;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
 using Essensoft.AspNetCore.Payment.UnionPay.Parser;
 using Essensoft.AspNetCore.Payment.UnionPay.Utility;
 using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
 
 namespace Essensoft.AspNetCore.Payment.UnionPay
 {
     public class UnionPayNotifyClient : IUnionPayNotifyClient
     {
-        private readonly ILogger _logger;
-        private readonly IOptionsSnapshot<UnionPayOptions> _optionsSnapshotAccessor;
-
         #region UnionPayNotifyClient Constructors
 
-        public UnionPayNotifyClient(
-            ILogger<UnionPayNotifyClient> logger,
-            IOptionsSnapshot<UnionPayOptions> optionsAccessor)
+        public UnionPayNotifyClient()
         {
-            _logger = logger;
-            _optionsSnapshotAccessor = optionsAccessor;
         }
 
         #endregion
@@ -32,14 +22,9 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
             return await ExecuteAsync<T>(request, null);
         }
 
-        public async Task<T> ExecuteAsync<T>(HttpRequest request, string optionsName) where T : UnionPayNotify
+        public async Task<T> ExecuteAsync<T>(HttpRequest request, UnionPayOptions options) where T : UnionPayNotify
         {
-            var options = _optionsSnapshotAccessor.Get(optionsName);
             var parameters = await GetParametersAsync(request);
-
-            var query = UnionPayUtility.BuildQuery(parameters);
-            _logger.Log(options.LogLevel, "Request:{query}", query);
-
             var parser = new UnionPayDictionaryParser<T>();
             var rsp = parser.Parse(parameters);
             CheckNotifySign(parameters, options);