فهرست منبع

添加配置 日志等级

Roc 7 سال پیش
والد
کامیت
7eaef4e246

+ 81 - 85
src/Essensoft.AspNetCore.Payment.Alipay/AlipayClient.cs

@@ -50,89 +50,11 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IHttpClientFactory ClientFactory { get; set; }
+        public IHttpClientFactory ClientFactory { get; set; }
 
-        public virtual IOptionsSnapshot<AlipayOptions> OptionsSnapshotAccessor { get; set; }
-
-        #region IAlipayClient Members
-
-        public string BuildHtmlRequest(IDictionary<string, string> sParaTemp, string strMethod, AlipayOptions options)
-        {
-            //待请求参数数组
-            var dicPara = new Dictionary<string, string>(sParaTemp);
-
-            var sbHtml = new StringBuilder();
-            sbHtml.Append("<form id='submit' name='submit' action='" + options.ServerUrl + "?charset=" + options.Charset +
-                 "' method='" + strMethod + "' style='display:none;'>");
-
-            foreach (var temp in dicPara)
-            {
-                sbHtml.Append("<input  name='" + temp.Key + "' value='" + temp.Value + "'/>");
-            }
-            sbHtml.Append("<input type='submit' style='display:none;'></form>");
-            //表单实现自动提交
-            sbHtml.Append("<script>document.forms['submit'].submit();</script>");
-
-            return sbHtml.ToString();
-        }
-
-        #endregion
-
-        #region Common Method
-
-        private AlipayDictionary BuildRequestParams<T>(IAlipayRequest<T> request, string accessToken, string appAuthToken, AlipayOptions options) where T : AlipayResponse
-        {
-            var apiVersion = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion();
-            var result = new AlipayDictionary(request.GetParameters())
-            {
-                // 序列化BizModel
-                { BIZ_CONTENT, Serialize(request.GetBizModel()) },
-                // 添加协议级请求参数,为空的参数后面会自动过滤,这里不做处理。
-                { METHOD, request.GetApiName() },
-                { VERSION, apiVersion },
-                { APP_ID, options.AppId },
-                { FORMAT, options.Format },
-                { TIMESTAMP, DateTime.Now },
-                { ACCESS_TOKEN, accessToken },
-                { SIGN_TYPE, options.SignType },
-                { TERMINAL_TYPE, request.GetTerminalType() },
-                { TERMINAL_INFO, request.GetTerminalInfo() },
-                { PROD_CODE, request.GetProdCode() },
-                { NOTIFY_URL, request.GetNotifyUrl() },
-                { CHARSET, options.Charset },
-                { RETURN_URL, request.GetReturnUrl() },
-                { APP_AUTH_TOKEN, appAuthToken }
-            };
-
-            if (request.GetNeedEncrypt())
-            {
-                if (string.IsNullOrEmpty(result[BIZ_CONTENT]))
-                {
-                    throw new Exception("api request Fail ! The reason: encrypt request is not supported!");
-                }
-
-                if (string.IsNullOrEmpty(options.EncyptKey) || string.IsNullOrEmpty(options.EncyptType))
-                {
-                    throw new Exception("encryptType or encryptKey must not null!");
-                }
-
-                if (!"AES".Equals(options.EncyptType))
-                {
-                    throw new Exception("api only support Aes!");
-                }
-
-                var encryptContent = AES.Encrypt(result[BIZ_CONTENT], options.EncyptKey, AlipaySignature.AES_IV, AESCipherMode.CBC, AESPaddingMode.PKCS7);
-                result.Remove(BIZ_CONTENT);
-                result.Add(BIZ_CONTENT, encryptContent);
-                result.Add(ENCRYPT_TYPE, options.EncyptType);
-            }
-
-            return result;
-        }
-
-        #endregion
+        public IOptionsSnapshot<AlipayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region IAlipayClient Members
 
@@ -230,13 +152,13 @@ namespace Essensoft.AspNetCore.Payment.Alipay
                         }
                     }
                     body = tmpUrl;
-                    Logger?.LogTrace(0, "Request Url:{body}", body);
+                    Logger.Log(options.LogLevel, "Request Url:{body}", body);
                 }
                 else
                 {
                     //输出post表单
                     body = BuildHtmlRequest(txtParams, reqMethod, options);
-                    Logger?.LogTrace(0, "Request Html:{body}", body);
+                    Logger.Log(options.LogLevel, "Request Html:{body}", body);
                 }
             }
 
@@ -319,7 +241,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
             txtParams.Add(SIGN, AlipaySignature.RSASignContent(signContent, options.PrivateRSAParameters, options.SignType));
 
             var query = AlipayUtility.BuildQuery(txtParams);
-            Logger?.LogTrace(0, "Request:{query}", query);
+            Logger.Log(options.LogLevel, "Request:{query}", query);
 
             // 是否需要上传文件
             var body = string.Empty;
@@ -337,7 +259,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
                 }
             }
 
-            Logger?.LogTrace(1, "Response:{body}", body);
+            Logger.Log(options.LogLevel, "Response:{body}", body);
 
             T rsp = null;
             IAlipayParser<T> parser = null;
@@ -415,6 +337,80 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
         #endregion
 
+        #region Common Method
+
+        public string BuildHtmlRequest(IDictionary<string, string> sParaTemp, string strMethod, AlipayOptions options)
+        {
+            //待请求参数数组
+            var dicPara = new Dictionary<string, string>(sParaTemp);
+
+            var sbHtml = new StringBuilder();
+            sbHtml.Append("<form id='submit' name='submit' action='" + options.ServerUrl + "?charset=" + options.Charset +
+                 "' method='" + strMethod + "' style='display:none;'>");
+
+            foreach (var temp in dicPara)
+            {
+                sbHtml.Append("<input  name='" + temp.Key + "' value='" + temp.Value + "'/>");
+            }
+            sbHtml.Append("<input type='submit' style='display:none;'></form>");
+            //表单实现自动提交
+            sbHtml.Append("<script>document.forms['submit'].submit();</script>");
+
+            return sbHtml.ToString();
+        }
+
+        private AlipayDictionary BuildRequestParams<T>(IAlipayRequest<T> request, string accessToken, string appAuthToken, AlipayOptions options) where T : AlipayResponse
+        {
+            var apiVersion = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion();
+            var result = new AlipayDictionary(request.GetParameters())
+            {
+                // 序列化BizModel
+                { BIZ_CONTENT, Serialize(request.GetBizModel()) },
+                // 添加协议级请求参数,为空的参数后面会自动过滤,这里不做处理。
+                { METHOD, request.GetApiName() },
+                { VERSION, apiVersion },
+                { APP_ID, options.AppId },
+                { FORMAT, options.Format },
+                { TIMESTAMP, DateTime.Now },
+                { ACCESS_TOKEN, accessToken },
+                { SIGN_TYPE, options.SignType },
+                { TERMINAL_TYPE, request.GetTerminalType() },
+                { TERMINAL_INFO, request.GetTerminalInfo() },
+                { PROD_CODE, request.GetProdCode() },
+                { NOTIFY_URL, request.GetNotifyUrl() },
+                { CHARSET, options.Charset },
+                { RETURN_URL, request.GetReturnUrl() },
+                { APP_AUTH_TOKEN, appAuthToken }
+            };
+
+            if (request.GetNeedEncrypt())
+            {
+                if (string.IsNullOrEmpty(result[BIZ_CONTENT]))
+                {
+                    throw new Exception("api request Fail ! The reason: encrypt request is not supported!");
+                }
+
+                if (string.IsNullOrEmpty(options.EncyptKey) || string.IsNullOrEmpty(options.EncyptType))
+                {
+                    throw new Exception("encryptType or encryptKey must not null!");
+                }
+
+                if (!"AES".Equals(options.EncyptType))
+                {
+                    throw new Exception("api only support Aes!");
+                }
+
+                var encryptContent = AES.Encrypt(result[BIZ_CONTENT], options.EncyptKey, AlipaySignature.AES_IV, AESCipherMode.CBC, AESPaddingMode.PKCS7);
+                result.Remove(BIZ_CONTENT);
+                result.Add(BIZ_CONTENT, encryptContent);
+                result.Add(ENCRYPT_TYPE, options.EncyptType);
+            }
+
+            return result;
+        }
+
+        #endregion
+
         #region SDK Execute
 
         public Task<T> SdkExecuteAsync<T>(IAlipayRequest<T> request) where T : AlipayResponse

+ 3 - 3
src/Essensoft.AspNetCore.Payment.Alipay/AlipayNotifyClient.cs

@@ -25,9 +25,9 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IOptionsSnapshot<AlipayOptions> OptionsSnapshotAccessor { get; set; }
+        public IOptionsSnapshot<AlipayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region IAlipayNotifyClient Members
 
@@ -41,7 +41,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
             var options = OptionsSnapshotAccessor.Get(optionsName);
             var parameters = await GetParametersAsync(request);
             var query = AlipayUtility.BuildQuery(parameters);
-            Logger?.LogTrace(0, "Request:{query}", query);
+            Logger.Log(options.LogLevel, "Request:{query}", query);
 
             var parser = new AlipayDictionaryParser<T>();
             var rsp = parser.Parse(parameters);

+ 6 - 0
src/Essensoft.AspNetCore.Payment.Alipay/AlipayOptions.cs

@@ -1,5 +1,6 @@
 using System.Security.Cryptography;
 using Essensoft.AspNetCore.Payment.Security;
+using Microsoft.Extensions.Logging;
 
 namespace Essensoft.AspNetCore.Payment.Alipay
 {
@@ -82,5 +83,10 @@ namespace Essensoft.AspNetCore.Payment.Alipay
         /// 加密秘钥
         /// </summary>
         public string EncyptKey { get; set; }
+
+        /// <summary>
+        /// 日志等级
+        /// </summary>
+        public LogLevel LogLevel { get; set; } = LogLevel.Information;
     }
 }

+ 8 - 8
src/Essensoft.AspNetCore.Payment.JDPay/JDPayClient.cs

@@ -30,11 +30,11 @@ namespace Essensoft.AspNetCore.Payment.JDPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IHttpClientFactory ClientFactory { get; set; }
+        public IHttpClientFactory ClientFactory { get; set; }
 
-        public virtual IOptionsSnapshot<JDPayOptions> OptionsSnapshotAccessor { get; set; }
+        public IOptionsSnapshot<JDPayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region IJDPayClient Members
 
@@ -50,12 +50,12 @@ namespace Essensoft.AspNetCore.Payment.JDPay
             var sortedTxtParams = new JDPayDictionary(request.GetParameters());
 
             var content = BuildEncryptXml(request, sortedTxtParams, options);
-            Logger?.LogTrace(0, "Request:{content}", content);
+            Logger.Log(options.LogLevel, "Request:{content}", content);
 
             using (var client = ClientFactory.CreateClient())
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content);
-                Logger?.LogTrace(1, "Response:{content}", body);
+                Logger.Log(options.LogLevel, "Response:{content}", body);
 
                 var parser = new JDPayXmlParser<T>();
                 var rsp = parser.Parse(JDPayUtility.FotmatXmlString(body));
@@ -64,7 +64,7 @@ namespace Essensoft.AspNetCore.Payment.JDPay
                     var encrypt = rsp.Encrypt;
                     var base64EncryptStr = Encoding.UTF8.GetString(Convert.FromBase64String(encrypt));
                     var reqBody = JDPaySecurity.DecryptECB(base64EncryptStr, options.DesKeyBase64);
-                    Logger?.LogTrace(2, "Encrypt Content:{body}", reqBody);
+                    Logger.Log(options.LogLevel, "Encrypt Content:{body}", reqBody);
 
                     var reqBodyDoc = new XmlDocument { XmlResolver = null };
                     reqBodyDoc.LoadXml(reqBody);
@@ -147,12 +147,12 @@ namespace Essensoft.AspNetCore.Payment.JDPay
             var encryptDic = JDPaySecurity.EncryptData(options.PrivateCret, options.Password, options.PublicCert, sortedTxtParams, options.SingKey, options.EncryptType, isEncrypt);
 
             var content = JDPayUtility.BuildQuery(encryptDic);
-            Logger?.LogTrace(0, "Request:{content}", content);
+            Logger.Log(options.LogLevel, "Request:{content}", content);
 
             using (var client = ClientFactory.CreateClient())
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content, "application/x-www-form-urlencoded");
-                Logger?.LogTrace(1, "Response:{content}", body);
+                Logger.Log(options.LogLevel, "Response:{content}", body);
 
                 var rsp = JsonConvert.DeserializeObject<T>(body);
 

+ 5 - 5
src/Essensoft.AspNetCore.Payment.JDPay/JDPayNotifyClient.cs

@@ -27,9 +27,9 @@ namespace Essensoft.AspNetCore.Payment.JDPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IOptionsSnapshot<JDPayOptions> OptionsSnapshotAccessor { get; set; }
+        public IOptionsSnapshot<JDPayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region IJDPayNotifyClient Members
 
@@ -48,7 +48,7 @@ namespace Essensoft.AspNetCore.Payment.JDPay
                 var parameters = GetParameters(request, options, !(rspInstance is JDPayDefrayPayNotifyResponse));
 
                 var query = JDPayUtility.BuildQuery(parameters);
-                Logger?.LogTrace(0, "Request:{query}", query);
+                Logger.Log(options.LogLevel, "Request:{query}", query);
 
                 var parser = new JDPayDictionaryParser<T>();
                 var rsp = parser.Parse(parameters);
@@ -68,7 +68,7 @@ namespace Essensoft.AspNetCore.Payment.JDPay
             if (request.HasTextXmlContentType())
             {
                 var body = await new StreamReader(request.Body).ReadToEndAsync();
-                Logger?.LogTrace(0, "Request:{body}", body);
+                Logger.Log(options.LogLevel, "Request:{body}", body);
 
                 var parser = new JDPayXmlParser<T>();
                 var rsp = parser.Parse(JDPayUtility.FotmatXmlString(body));
@@ -77,7 +77,7 @@ namespace Essensoft.AspNetCore.Payment.JDPay
                     var encrypt = rsp.Encrypt;
                     var base64EncryptStr = Encoding.UTF8.GetString(Convert.FromBase64String(encrypt));
                     var reqBody = JDPaySecurity.DecryptECB(base64EncryptStr, options.DesKeyBase64);
-                    Logger?.LogTrace(1, "Encrypt Content:{reqBody}", reqBody);
+                    Logger.Log(options.LogLevel, "Encrypt Content:{reqBody}", reqBody);
 
                     var reqBodyDoc = new XmlDocument { XmlResolver = null };
                     reqBodyDoc.LoadXml(reqBody);

+ 6 - 0
src/Essensoft.AspNetCore.Payment.JDPay/JDPayOptions.cs

@@ -1,5 +1,6 @@
 using System;
 using Essensoft.AspNetCore.Payment.Security;
+using Microsoft.Extensions.Logging;
 using Org.BouncyCastle.Crypto;
 
 namespace Essensoft.AspNetCore.Payment.JDPay
@@ -101,5 +102,10 @@ namespace Essensoft.AspNetCore.Payment.JDPay
         /// 京东代付 签名类型 SHA-256
         /// </summary>
         public string SignType { get; set; } = "SHA-256";
+
+        /// <summary>
+        /// 日志等级
+        /// </summary>
+        public LogLevel LogLevel { get; set; } = LogLevel.Information;
     }
 }

+ 5 - 5
src/Essensoft.AspNetCore.Payment.LianLianPay/LianLianPayClient.cs

@@ -35,11 +35,11 @@ namespace Essensoft.AspNetCore.Payment.LianLianPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IHttpClientFactory ClientFactory { get; set; }
+        public IHttpClientFactory ClientFactory { get; set; }
 
-        public virtual IOptionsSnapshot<LianLianPayOptions> OptionsSnapshotAccessor { get; set; }
+        public IOptionsSnapshot<LianLianPayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region ILianLianPayClient Members
 
@@ -79,12 +79,12 @@ namespace Essensoft.AspNetCore.Payment.LianLianPay
             {
                 content = Serialize(txtParams);
             }
-            Logger?.LogTrace(0, "Request:{content}", content);
+            Logger.Log(options.LogLevel, "Request:{content}", content);
 
             using (var client = ClientFactory.CreateClient())
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content);
-                Logger?.LogTrace(1, "Response:{body}", body);
+                Logger.Log(options.LogLevel, "Response:{body}", body);
 
                 var parser = new LianLianPayJsonParser<T>();
                 var rsp = parser.Parse(body);

+ 4 - 4
src/Essensoft.AspNetCore.Payment.LianLianPay/LianLianPayNotifyClient.cs

@@ -24,9 +24,9 @@ namespace Essensoft.AspNetCore.Payment.LianLianPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IOptionsSnapshot<LianLianPayOptions> OptionsSnapshotAccessor { get; set; }
+        public IOptionsSnapshot<LianLianPayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region ILianLianPayNotifyClient Members
 
@@ -42,7 +42,7 @@ namespace Essensoft.AspNetCore.Payment.LianLianPay
             {
                 var parameters = await GetParametersAsync(request);
                 var query = LianLianPayUtility.BuildQuery(parameters);
-                Logger?.LogTrace(0, "Request:{query}", query);
+                Logger.Log(options.LogLevel, "Request:{query}", query);
 
                 var parser = new LianLianPayDictionaryParser<T>();
                 var rsp = parser.Parse(parameters);
@@ -53,7 +53,7 @@ namespace Essensoft.AspNetCore.Payment.LianLianPay
             if (request.HasTextJsonContentType())
             {
                 var body = await new StreamReader(request.Body).ReadToEndAsync();
-                Logger?.LogTrace(0, "Request:{body}", body);
+                Logger.Log(options.LogLevel, "Request:{body}", body);
 
                 var parser = new LianLianPayJsonParser<T>();
                 var rsp = parser.Parse(body);

+ 6 - 0
src/Essensoft.AspNetCore.Payment.LianLianPay/LianLianPayOptions.cs

@@ -1,4 +1,5 @@
 using Essensoft.AspNetCore.Payment.Security;
+using Microsoft.Extensions.Logging;
 using Org.BouncyCastle.Crypto;
 
 namespace Essensoft.AspNetCore.Payment.LianLianPay
@@ -58,5 +59,10 @@ namespace Essensoft.AspNetCore.Payment.LianLianPay
         /// 签名方式
         /// </summary>
         public string SignType { get; } = "RSA";
+
+        /// <summary>
+        /// 日志等级
+        /// </summary>
+        public LogLevel LogLevel { get; set; } = LogLevel.Information;
     }
 }

+ 7 - 7
src/Essensoft.AspNetCore.Payment.QPay/QPayClient.cs

@@ -29,11 +29,11 @@ namespace Essensoft.AspNetCore.Payment.QPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IHttpClientFactory ClientFactory { get; set; }
+        public IHttpClientFactory ClientFactory { get; set; }
 
-        public virtual IOptionsSnapshot<QPayOptions> OptionsSnapshotAccessor { get; set; }
+        public IOptionsSnapshot<QPayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region Common Method
 
@@ -84,12 +84,12 @@ namespace Essensoft.AspNetCore.Payment.QPay
             sortedTxtParams.Add(SIGN, QPaySignature.SignWithKey(sortedTxtParams, options.Key));
 
             var content = QPayUtility.BuildContent(sortedTxtParams);
-            Logger?.LogTrace(0, "Request:{content}", content);
+            Logger.Log(options.LogLevel, "Request:{content}", content);
 
             using (var client = ClientFactory.CreateClient())
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content);
-                Logger?.LogTrace(1, "Response:{body}", body);
+                Logger.Log(options.LogLevel, "Response:{body}", body);
 
                 var parser = new QPayXmlParser<T>();
                 var rsp = parser.Parse(body);
@@ -124,11 +124,11 @@ namespace Essensoft.AspNetCore.Payment.QPay
 
             sortedTxtParams.Add(SIGN, QPaySignature.SignWithKey(sortedTxtParams, options.Key));
             var content = QPayUtility.BuildContent(sortedTxtParams);
-            Logger?.LogTrace(0, "Request:{content}", content);
+            Logger.Log(options.LogLevel, "Request:{content}", content);
             using (var client = string.IsNullOrEmpty(certificateName) ? ClientFactory.CreateClient() : ClientFactory.CreateClient(certificateName))
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content);
-                Logger?.LogTrace(1, "Response:{body}", body);
+                Logger.Log(options.LogLevel, "Response:{body}", body);
 
                 var parser = new QPayXmlParser<T>();
                 var rsp = parser.Parse(body);

+ 23 - 23
src/Essensoft.AspNetCore.Payment.QPay/QPayNotifyClient.cs

@@ -24,9 +24,30 @@ namespace Essensoft.AspNetCore.Payment.QPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IOptionsSnapshot<QPayOptions> OptionsSnapshotAccessor { get; set; }
+        public IOptionsSnapshot<QPayOptions> OptionsSnapshotAccessor { get; set; }
+
+        #region IQPayNotifyClient Members
+
+        public async Task<T> ExecuteAsync<T>(HttpRequest request) where T : QPayNotifyResponse
+        {
+            return await ExecuteAsync<T>(request, null);
+        }
+
+        public async Task<T> ExecuteAsync<T>(HttpRequest request, string optionsName) where T : QPayNotifyResponse
+        {
+            var options = string.IsNullOrEmpty(optionsName) ? OptionsSnapshotAccessor.Value : OptionsSnapshotAccessor.Get(optionsName);
+            var body = await new StreamReader(request.Body, Encoding.UTF8).ReadToEndAsync();
+            Logger.Log(options.LogLevel, "Request:{body}", body);
+
+            var parser = new QPayXmlParser<T>();
+            var rsp = parser.Parse(body);
+            CheckNotifySign(rsp, options);
+            return rsp;
+        }
+
+        #endregion
 
         #region Common Method
 
@@ -50,26 +71,5 @@ namespace Essensoft.AspNetCore.Payment.QPay
         }
 
         #endregion
-
-        #region IQPayNotifyClient Members
-
-        public async Task<T> ExecuteAsync<T>(HttpRequest request) where T : QPayNotifyResponse
-        {
-            return await ExecuteAsync<T>(request, null);
-        }
-
-        public async Task<T> ExecuteAsync<T>(HttpRequest request, string optionsName) where T : QPayNotifyResponse
-        {
-            var options = string.IsNullOrEmpty(optionsName) ? OptionsSnapshotAccessor.Value : OptionsSnapshotAccessor.Get(optionsName);
-            var body = await new StreamReader(request.Body, Encoding.UTF8).ReadToEndAsync();
-            Logger?.LogTrace(0, "Request:{body}", body);
-
-            var parser = new QPayXmlParser<T>();
-            var rsp = parser.Parse(body);
-            CheckNotifySign(rsp, options);
-            return rsp;
-        }
-
-        #endregion
     }
 }

+ 8 - 1
src/Essensoft.AspNetCore.Payment.QPay/QPayOptions.cs

@@ -1,4 +1,6 @@
-namespace Essensoft.AspNetCore.Payment.QPay
+using Microsoft.Extensions.Logging;
+
+namespace Essensoft.AspNetCore.Payment.QPay
 {
     public class QPayOptions
     {
@@ -16,5 +18,10 @@
         /// API秘钥
         /// </summary>
         public string Key { get; set; }
+
+        /// <summary>
+        /// 日志等级
+        /// </summary>
+        public LogLevel LogLevel { get; set; } = LogLevel.Information;
     }
 }

+ 5 - 5
src/Essensoft.AspNetCore.Payment.UnionPay/UnionPayClient.cs

@@ -34,11 +34,11 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IHttpClientFactory ClientFactory { get; set; }
+        public IHttpClientFactory ClientFactory { get; set; }
 
-        public virtual IOptionsSnapshot<UnionPayOptions> OptionsSnapshotAccessor { get; set; }
+        public IOptionsSnapshot<UnionPayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region IUnionPayClient Members
 
@@ -75,12 +75,12 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
             UnionPaySignature.Sign(txtParams, options.SignCertificate.certId, options.SignCertificate.key, options.SecureKey);
 
             var query = UnionPayUtility.BuildQuery(txtParams);
-            Logger?.LogTrace(0, "Request:{query}", query);
+            Logger.Log(options.LogLevel, "Request:{query}", query);
 
             using (var client = ClientFactory.CreateClient())
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(options.TestMode), query);
-                Logger?.LogTrace(1, "Response:{content}", body);
+                Logger.Log(options.LogLevel, "Response:{content}", body);
 
                 var dic = ParseQueryString(body);
 

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

@@ -22,9 +22,9 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IOptionsSnapshot<UnionPayOptions> OptionsSnapshotAccessor { get; set; }
+        public IOptionsSnapshot<UnionPayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region IUnionPayNotifyClient Members
 
@@ -39,7 +39,7 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
             var parameters = await GetParametersAsync(request);
 
             var query = UnionPayUtility.BuildQuery(parameters);
-            Logger?.LogTrace(0, "Request:{query}", query);
+            Logger.Log(options.LogLevel, "Request:{query}", query);
 
             var parser = new UnionPayDictionaryParser<T>();
             var rsp = parser.Parse(parameters);

+ 6 - 0
src/Essensoft.AspNetCore.Payment.UnionPay/UnionPayOptions.cs

@@ -1,4 +1,5 @@
 using Essensoft.AspNetCore.Payment.UnionPay.Utility;
+using Microsoft.Extensions.Logging;
 
 namespace Essensoft.AspNetCore.Payment.UnionPay
 {
@@ -111,5 +112,10 @@ namespace Essensoft.AspNetCore.Payment.UnionPay
         /// 测试模式
         /// </summary>
         public bool TestMode { get; set; }
+
+        /// <summary>
+        /// 日志等级
+        /// </summary>
+        public LogLevel LogLevel { get; set; } = LogLevel.Information;
     }
 }

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

@@ -45,35 +45,11 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IHttpClientFactory ClientFactory { get; set; }
+        public IHttpClientFactory ClientFactory { get; set; }
 
-        public virtual IOptionsSnapshot<WeChatPayOptions> OptionsSnapshotAccessor { get; set; }
-
-        #region Common Method
-
-        private void CheckResponseSign(WeChatPayResponse response, WeChatPayOptions options, bool useMD5 = true, bool excludeSignType = true)
-        {
-            if (string.IsNullOrEmpty(response.Body))
-            {
-                throw new Exception("sign check fail: Body is Empty!");
-            }
-
-            if (response.Parameters.TryGetValue("sign", out var sign))
-            {
-                if (response.Parameters["return_code"] == "SUCCESS" && !string.IsNullOrEmpty(sign))
-                {
-                    var cal_sign = WeChatPaySignature.SignWithKey(response.Parameters, options.Key, useMD5, excludeSignType);
-                    if (cal_sign != sign)
-                    {
-                        throw new Exception("sign check fail: check Sign and Data Fail!");
-                    }
-                }
-            }
-        }
-
-        #endregion
+        public IOptionsSnapshot<WeChatPayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region IWeChatPayClient Members
 
@@ -99,12 +75,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
 
             sortedTxtParams.Add(sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key));
             var content = WeChatPayUtility.BuildContent(sortedTxtParams);
-            Logger?.LogTrace(0, "Request:{content}", content);
+            Logger.Log(options.LogLevel, "Request:{content}", content);
 
             using (var client = ClientFactory.CreateClient())
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content);
-                Logger?.LogTrace(1, "Response:{body}", body);
+                Logger.Log(options.LogLevel, "Response:{body}", body);
 
                 var parser = new WeChatPayXmlParser<T>();
                 var rsp = parser.Parse(body);
@@ -217,13 +193,13 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
             sortedTxtParams.Add(sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType, excludeSignType));
 
             var content = WeChatPayUtility.BuildContent(sortedTxtParams);
-            Logger?.LogTrace(0, "Request:{content}", content);
+            Logger.Log(options.LogLevel, "Request:{content}", content);
 
             using (var client = ClientFactory.CreateClient(certificateName))
             {
                 var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content);
 
-                Logger?.LogTrace(1, "Response:{body}", body);
+                Logger.Log(options.LogLevel, "Response:{body}", body);
 
                 var parser = new WeChatPayXmlParser<T>();
                 var rsp = parser.Parse(body);
@@ -277,5 +253,29 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
         }
 
         #endregion
+
+        #region Common Method
+
+        private void CheckResponseSign(WeChatPayResponse response, WeChatPayOptions options, bool useMD5 = true, bool excludeSignType = true)
+        {
+            if (string.IsNullOrEmpty(response.Body))
+            {
+                throw new Exception("sign check fail: Body is Empty!");
+            }
+
+            if (response.Parameters.TryGetValue("sign", out var sign))
+            {
+                if (response.Parameters["return_code"] == "SUCCESS" && !string.IsNullOrEmpty(sign))
+                {
+                    var cal_sign = WeChatPaySignature.SignWithKey(response.Parameters, options.Key, useMD5, excludeSignType);
+                    if (cal_sign != sign)
+                    {
+                        throw new Exception("sign check fail: check Sign and Data Fail!");
+                    }
+                }
+            }
+        }
+
+        #endregion
     }
 }

+ 27 - 27
src/Essensoft.AspNetCore.Payment.WeChatPay/WeChatPayNotifyClient.cs

@@ -26,32 +26,9 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
 
         #endregion
 
-        public virtual ILogger Logger { get; set; }
+        public ILogger Logger { get; set; }
 
-        public virtual IOptionsSnapshot<WeChatPayOptions> OptionsSnapshotAccessor { get; set; }
-
-        #region Common Method
-
-        private void CheckNotifySign(WeChatPayNotifyResponse response, WeChatPayOptions options)
-        {
-            if (response?.Parameters?.Count == 0)
-            {
-                throw new Exception("sign check fail: Body is Empty!");
-            }
-
-            if (!response.Parameters.TryGetValue("sign", out var sign))
-            {
-                throw new Exception("sign check fail: sign is Empty!");
-            }
-
-            var cal_sign = WeChatPaySignature.SignWithKey(response.Parameters, options.Key);
-            if (cal_sign != sign)
-            {
-                throw new Exception("sign check fail: check Sign and Data Fail!");
-            }
-        }
-
-        #endregion
+        public IOptionsSnapshot<WeChatPayOptions> OptionsSnapshotAccessor { get; set; }
 
         #region IWeChatPayNotifyClient Members
 
@@ -64,7 +41,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
         {
             var options = string.IsNullOrEmpty(optionsName) ? OptionsSnapshotAccessor.Value : OptionsSnapshotAccessor.Get(optionsName);
             var body = await new StreamReader(request.Body, Encoding.UTF8).ReadToEndAsync();
-            Logger?.LogTrace(0, "Request:{body}", body);
+            Logger.Log(options.LogLevel, "Request:{body}", body);
 
             var parser = new WeChatPayXmlParser<T>();
             var rsp = parser.Parse(body);
@@ -72,7 +49,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
             {
                 var key = MD5.Compute(options.Key).ToLower();
                 var data = AES.Decrypt((rsp as WeChatPayRefundNotifyResponse).ReqInfo, key, AESCipherMode.ECB, AESPaddingMode.PKCS7);
-                Logger?.LogTrace(1, "Decrypt Content:{data}", data); // AES-256-ECB
+                Logger.Log(options.LogLevel, "Decrypt Content:{data}", data); // AES-256-ECB
                 rsp = parser.Parse(body, data);
             }
             else
@@ -83,5 +60,28 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
         }
 
         #endregion
+
+        #region Common Method
+
+        private void CheckNotifySign(WeChatPayNotifyResponse response, WeChatPayOptions options)
+        {
+            if (response?.Parameters?.Count == 0)
+            {
+                throw new Exception("sign check fail: Body is Empty!");
+            }
+
+            if (!response.Parameters.TryGetValue("sign", out var sign))
+            {
+                throw new Exception("sign check fail: sign is Empty!");
+            }
+
+            var cal_sign = WeChatPaySignature.SignWithKey(response.Parameters, options.Key);
+            if (cal_sign != sign)
+            {
+                throw new Exception("sign check fail: check Sign and Data Fail!");
+            }
+        }
+
+        #endregion
     }
 }

+ 6 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/WeChatPayOptions.cs

@@ -1,4 +1,5 @@
 using Essensoft.AspNetCore.Payment.Security;
+using Microsoft.Extensions.Logging;
 using Org.BouncyCastle.Crypto;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay
@@ -39,5 +40,10 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
                 }
             }
         }
+
+        /// <summary>
+        /// 日志等级
+        /// </summary>
+        public LogLevel LogLevel { get; set; } = LogLevel.Information;
     }
 }