From 1e0c28e02c66ca363bdf13e9daa6be368d95f071 Mon Sep 17 00:00:00 2001 From: dongfo Date: Fri, 22 Feb 2019 21:34:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=88=97=E8=A1=A8=E6=A0=BC=E5=BC=8F=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PaySharp.Wechatpay/ConvertUtil.cs | 120 ++++++++++++++++-- .../Response/QueryResponse.cs | 3 +- .../Response/RefundQueryResponse.cs | 3 +- .../Response/RefundResponse.cs | 3 +- src/PaySharp.Wechatpay/WechatpayGateway.cs | 3 +- 5 files changed, 116 insertions(+), 16 deletions(-) diff --git a/src/PaySharp.Wechatpay/ConvertUtil.cs b/src/PaySharp.Wechatpay/ConvertUtil.cs index 654d83a..c3a4c2f 100644 --- a/src/PaySharp.Wechatpay/ConvertUtil.cs +++ b/src/PaySharp.Wechatpay/ConvertUtil.cs @@ -2,12 +2,23 @@ using PaySharp.Core.Utils; using System; using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; namespace PaySharp.Wechatpay { internal static class ConvertUtil { - public static List ToList(GatewayData gatewayData, int index) + /// + /// 递归获取微信返回值列表 + /// + /// + /// + /// + /// + /// + public static List ToList(GatewayData gatewayData, int index) where T:new() where TChildren:new() { var flag = true; var list = new List(); @@ -15,7 +26,8 @@ public static List ToList(GatewayData gatewayData, int index) while (flag) { var type = typeof(T); - var obj = Activator.CreateInstance(type); + //var obj = Activator.CreateInstance(type); + var obj = new T(); var properties = type.GetProperties(); var isFirstProperty = true; @@ -28,16 +40,7 @@ public static List ToList(GatewayData gatewayData, int index) continue; } - string key; - var renameAttribute = item.GetCustomAttributes(typeof(ReNameAttribute), true); - if (renameAttribute.Length > 0) - { - key = ((ReNameAttribute)renameAttribute[0]).Name; - } - else - { - key = item.Name.ToSnakeCase(); - } + string key = GetRealName(item); if (index > -1) { key += $"_{index}"; @@ -70,5 +73,98 @@ public static List ToList(GatewayData gatewayData, int index) return list; } + /// + /// 获取字段json中的名字 + /// + /// + /// + private static string GetRealName(System.Reflection.PropertyInfo item) + { + string key; + var renameAttribute = item.GetCustomAttributes(typeof(ReNameAttribute), true); + if (renameAttribute.Length > 0) + { + key = ((ReNameAttribute)renameAttribute[0]).Name; + } + else + { + key = item.Name.ToSnakeCase(); + } + + return key; + } + /// + /// 将微信返回值特殊格式转化为列表 + /// + /// + /// + /// + public static List ToList(GatewayData gatewayData) where T : new() + { + var list = new List(); + var properties = typeof(T).GetProperties(); + var keyfirst = properties[0]; + var count = gatewayData.Keys.Where(p => Regex.IsMatch(p, $@"{GetRealName(keyfirst)}_\d")).Count(); + + for (var i = 0; i < count; i++) + { + var item = new T(); + foreach(var field in properties) + { + string keyname = $"{GetRealName(field)}_{i}"; + field.SetValue(item, gatewayData.GetStringValue(keyname)); + } + list.Add(item); + } + return list; + } + /// + /// 将微信返回值特殊格式转化为列表(二级) + /// + /// + /// + /// + /// + public static List ToList(GatewayData gatewayData) where T : new() where TChildren : new() + { + var list = new List(); + var properties = typeof(T).GetProperties(); + var keyfirst = properties[0]; + var count = gatewayData.Keys.Where(p => Regex.IsMatch(p, $@"{GetRealName(keyfirst)}_\d")).Count(); + + for (var i = 0; i < count; i++) + { + var item = new T(); + foreach (var field in properties) + { + if (field.PropertyType == typeof(List)) + { + var sublist = new List(); + var subProperties = typeof(TChildren).GetProperties(); + var subFirstkey = subProperties[0]; + var SubFirstName = GetRealName(subFirstkey); + var subCount = gatewayData.Keys.Where(p => Regex.IsMatch(p, $@"{SubFirstName}_{i}_\d")).Count(); + for(var j = 0; j < subCount; j++) + { + var subItem = new TChildren(); + foreach (var subfield in subProperties) + { + string keyname = $"{GetRealName(subfield)}_{i}_{j}"; + subfield.SetValue(subItem, gatewayData.GetStringValue(keyname)); + } + sublist.Add(subItem); + } + field.SetValue(item, sublist); + } + else + { + string keyname = $"{GetRealName(field)}_{i}"; + field.SetValue(item, gatewayData.GetStringValue(keyname)); + } + } + list.Add(item); + } + return list; + } } } \ No newline at end of file diff --git a/src/PaySharp.Wechatpay/Response/QueryResponse.cs b/src/PaySharp.Wechatpay/Response/QueryResponse.cs index f7e99d1..6910a75 100644 --- a/src/PaySharp.Wechatpay/Response/QueryResponse.cs +++ b/src/PaySharp.Wechatpay/Response/QueryResponse.cs @@ -123,7 +123,8 @@ public class QueryResponse : BaseResponse internal override void Execute(Merchant merchant, Request request) { - Coupons = ConvertUtil.ToList(GatewayData, -1); + //Coupons = ConvertUtil.ToList(GatewayData, -1); + Coupons = ConvertUtil.ToList(GatewayData); } public class CouponResponse diff --git a/src/PaySharp.Wechatpay/Response/RefundQueryResponse.cs b/src/PaySharp.Wechatpay/Response/RefundQueryResponse.cs index 5b7cb5e..197f3e3 100644 --- a/src/PaySharp.Wechatpay/Response/RefundQueryResponse.cs +++ b/src/PaySharp.Wechatpay/Response/RefundQueryResponse.cs @@ -64,7 +64,8 @@ public class RefundQueryResponse : BaseResponse internal override void Execute(Merchant merchant, Request request) { - Refunds = ConvertUtil.ToList(GatewayData, -1); + //Refunds = ConvertUtil.ToList(GatewayData, -1); + Refunds = ConvertUtil.ToList(GatewayData); } public class RefundResponse diff --git a/src/PaySharp.Wechatpay/Response/RefundResponse.cs b/src/PaySharp.Wechatpay/Response/RefundResponse.cs index 54259c3..06aee15 100644 --- a/src/PaySharp.Wechatpay/Response/RefundResponse.cs +++ b/src/PaySharp.Wechatpay/Response/RefundResponse.cs @@ -99,7 +99,8 @@ public class RefundResponse : BaseResponse internal override void Execute(Merchant merchant, Request request) { - RefundCoupons = ConvertUtil.ToList(GatewayData, -1); + //RefundCoupons = ConvertUtil.ToList(GatewayData, -1); + RefundCoupons = ConvertUtil.ToList(GatewayData); } public class RefundCouponResponse diff --git a/src/PaySharp.Wechatpay/WechatpayGateway.cs b/src/PaySharp.Wechatpay/WechatpayGateway.cs index 90365fc..ef5418d 100644 --- a/src/PaySharp.Wechatpay/WechatpayGateway.cs +++ b/src/PaySharp.Wechatpay/WechatpayGateway.cs @@ -85,7 +85,8 @@ protected override async Task ValidateNotifyAsync() if (string.IsNullOrEmpty(NotifyResponse.ReqInfo)) { - NotifyResponse.Coupons = ConvertUtil.ToList(GatewayData, -1); + //NotifyResponse.Coupons = ConvertUtil.ToList(GatewayData, -1); + NotifyResponse.Coupons = ConvertUtil.ToList(GatewayData); if (NotifyResponse.Sign != SubmitProcess.BuildSign(GatewayData, _merchant.Key)) { throw new GatewayException("签名不一致"); From 280496d238e158c351d05bcfb66226522c3c3f9d Mon Sep 17 00:00:00 2001 From: dongfo Date: Mon, 4 Mar 2019 11:26:14 +0800 Subject: [PATCH 2/3] =?UTF-8?q?1.=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4=202.?= =?UTF-8?q?=E6=96=B0=E5=A2=9EFastActivator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PaySharp.Core/FastActivator.cs | 32 +++++++++++++++++++++++++++ src/PaySharp.Wechatpay/ConvertUtil.cs | 12 ++++------ 2 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 src/PaySharp.Core/FastActivator.cs diff --git a/src/PaySharp.Core/FastActivator.cs b/src/PaySharp.Core/FastActivator.cs new file mode 100644 index 0000000..e4ab82c --- /dev/null +++ b/src/PaySharp.Core/FastActivator.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Reflection; +using System.Linq.Expressions; + +namespace PaySharp.Core +{ + public static class FastActivator + { + public static Func Generate() + { + ConstructorInfo constructorInfo = typeof(TResult).GetConstructor(new Type[] { typeof(T), }); +#if DEBUG + ParameterInfo[] parameters = constructorInfo.GetParameters(); + ParameterExpression parameterExpression = Expression.Parameter(typeof(T), parameters[0].Name); +#else + ParameterExpression parameterExpression = Expression.Parameter(typeof(T)); +#endif + Expression> expression = Expression.Lambda>( + Expression.New( + constructorInfo, + parameterExpression), + parameterExpression); + Func functor = expression.Compile(); + return functor; + } + + } +} diff --git a/src/PaySharp.Wechatpay/ConvertUtil.cs b/src/PaySharp.Wechatpay/ConvertUtil.cs index c3a4c2f..8141027 100644 --- a/src/PaySharp.Wechatpay/ConvertUtil.cs +++ b/src/PaySharp.Wechatpay/ConvertUtil.cs @@ -10,14 +10,7 @@ namespace PaySharp.Wechatpay { internal static class ConvertUtil { - /// - /// 递归获取微信返回值列表 - /// - /// - /// - /// - /// - /// + public static List ToList(GatewayData gatewayData, int index) where T:new() where TChildren:new() { var flag = true; @@ -73,6 +66,7 @@ public static List ToList(GatewayData gatewayData, int index) w return list; } + /// /// 获取字段json中的名字 /// @@ -93,6 +87,7 @@ private static string GetRealName(System.Reflection.PropertyInfo item) return key; } + /// /// 将微信返回值特殊格式转化为列表 /// @@ -118,6 +113,7 @@ private static string GetRealName(System.Reflection.PropertyInfo item) } return list; } + /// /// 将微信返回值特殊格式转化为列表(二级) /// From 8ea522c9d40fe2bc891312fa5bcb67362e2a0978 Mon Sep 17 00:00:00 2001 From: dongfo Date: Fri, 22 Mar 2019 08:52:19 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PaySharp.Wechatpay/ConvertUtil.cs | 1 - src/PaySharp.Wechatpay/Response/QueryResponse.cs | 1 - src/PaySharp.Wechatpay/Response/RefundQueryResponse.cs | 1 - src/PaySharp.Wechatpay/Response/RefundResponse.cs | 1 - src/PaySharp.Wechatpay/WechatpayGateway.cs | 1 - 5 files changed, 5 deletions(-) diff --git a/src/PaySharp.Wechatpay/ConvertUtil.cs b/src/PaySharp.Wechatpay/ConvertUtil.cs index 8141027..dfe1b37 100644 --- a/src/PaySharp.Wechatpay/ConvertUtil.cs +++ b/src/PaySharp.Wechatpay/ConvertUtil.cs @@ -19,7 +19,6 @@ public static List ToList(GatewayData gatewayData, int index) w while (flag) { var type = typeof(T); - //var obj = Activator.CreateInstance(type); var obj = new T(); var properties = type.GetProperties(); var isFirstProperty = true; diff --git a/src/PaySharp.Wechatpay/Response/QueryResponse.cs b/src/PaySharp.Wechatpay/Response/QueryResponse.cs index 6910a75..629780b 100644 --- a/src/PaySharp.Wechatpay/Response/QueryResponse.cs +++ b/src/PaySharp.Wechatpay/Response/QueryResponse.cs @@ -123,7 +123,6 @@ public class QueryResponse : BaseResponse internal override void Execute(Merchant merchant, Request request) { - //Coupons = ConvertUtil.ToList(GatewayData, -1); Coupons = ConvertUtil.ToList(GatewayData); } diff --git a/src/PaySharp.Wechatpay/Response/RefundQueryResponse.cs b/src/PaySharp.Wechatpay/Response/RefundQueryResponse.cs index 197f3e3..6f9db5f 100644 --- a/src/PaySharp.Wechatpay/Response/RefundQueryResponse.cs +++ b/src/PaySharp.Wechatpay/Response/RefundQueryResponse.cs @@ -64,7 +64,6 @@ public class RefundQueryResponse : BaseResponse internal override void Execute(Merchant merchant, Request request) { - //Refunds = ConvertUtil.ToList(GatewayData, -1); Refunds = ConvertUtil.ToList(GatewayData); } diff --git a/src/PaySharp.Wechatpay/Response/RefundResponse.cs b/src/PaySharp.Wechatpay/Response/RefundResponse.cs index 06aee15..85b192d 100644 --- a/src/PaySharp.Wechatpay/Response/RefundResponse.cs +++ b/src/PaySharp.Wechatpay/Response/RefundResponse.cs @@ -99,7 +99,6 @@ public class RefundResponse : BaseResponse internal override void Execute(Merchant merchant, Request request) { - //RefundCoupons = ConvertUtil.ToList(GatewayData, -1); RefundCoupons = ConvertUtil.ToList(GatewayData); } diff --git a/src/PaySharp.Wechatpay/WechatpayGateway.cs b/src/PaySharp.Wechatpay/WechatpayGateway.cs index ef5418d..b4ecd3d 100644 --- a/src/PaySharp.Wechatpay/WechatpayGateway.cs +++ b/src/PaySharp.Wechatpay/WechatpayGateway.cs @@ -85,7 +85,6 @@ protected override async Task ValidateNotifyAsync() if (string.IsNullOrEmpty(NotifyResponse.ReqInfo)) { - //NotifyResponse.Coupons = ConvertUtil.ToList(GatewayData, -1); NotifyResponse.Coupons = ConvertUtil.ToList(GatewayData); if (NotifyResponse.Sign != SubmitProcess.BuildSign(GatewayData, _merchant.Key)) {