From da6f19f54f642aff419ff01cc31c0cfd9e7f96c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E4=B9=A6=E6=9E=B6?= Date: Fri, 30 Mar 2018 13:56:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AD=BE=E5=90=8D=E9=AA=8C?= =?UTF-8?q?=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ICanPay.Alipay/AlipayGateway.cs | 20 +++++++++++++----- src/ICanPay.Core/Gateways/BaseGateway.cs | 27 +++++++++++++++++++----- src/ICanPay.Core/Gateways/GatewayData.cs | 12 ++++++++--- src/ICanPay.Core/Gateways/NullGateway.cs | 24 ++++++++++----------- src/ICanPay.Unionpay/UnionpayGateway.cs | 1 + 5 files changed, 58 insertions(+), 26 deletions(-) diff --git a/src/ICanPay.Alipay/AlipayGateway.cs b/src/ICanPay.Alipay/AlipayGateway.cs index 45405fe..a1fc619 100644 --- a/src/ICanPay.Alipay/AlipayGateway.cs +++ b/src/ICanPay.Alipay/AlipayGateway.cs @@ -44,8 +44,6 @@ namespace ICanPay.Alipay public new Notify Notify => (Notify)base.Notify; - protected override bool IsWaitPay => Notify.TradeStatus == Constant.WAIT_BUYER_PAY; - protected override bool IsSuccessPay => Notify.TradeStatus == Constant.TRADE_SUCCESS; protected override string[] NotifyVerifyParameter => new string[] @@ -123,7 +121,6 @@ namespace ICanPay.Alipay TradeNo = tradeNo }); var queryResponse = NetExecute(queryRequest); - //TODO:检测签名 if (queryResponse.TradeStatus == Constant.TRADE_SUCCESS) { return true; @@ -166,11 +163,16 @@ namespace ICanPay.Alipay return false; } - private string BuildSign(GatewayData gatewayData) + protected override string BuildSign(GatewayData gatewayData) { return EncryptUtil.RSA(gatewayData.ToUrl(false), Merchant.Privatekey, Merchant.SignType); } + protected override bool CheckSign(string data, string sign) + { + return EncryptUtil.RSAVerifyData(data, sign, Merchant.AlipayPublicKey, Merchant.SignType); + } + /// /// 是否是已成功支付的支付通知 /// @@ -231,10 +233,18 @@ namespace ICanPay.Alipay GatewayData.FromJson(body); string sign = GatewayData.GetStringValue(Constant.SIGN); GatewayData.Remove(Constant.SIGN); - GatewayData.FromJson(GatewayData[0].Value.ToString()); + string data = GatewayData[0].Value.ToString(); + + if (!CheckSign(data, sign)) + { + throw new GatewayException("签名验证失败"); + } + + GatewayData.FromJson(data); GatewayData.Add(Constant.SIGN, sign); GatewayData.Add(BODY, body); + //TODO:待优化 return GatewayData.ToObject(StringCase.Snake); } diff --git a/src/ICanPay.Core/Gateways/BaseGateway.cs b/src/ICanPay.Core/Gateways/BaseGateway.cs index c19376e..38ccf9c 100644 --- a/src/ICanPay.Core/Gateways/BaseGateway.cs +++ b/src/ICanPay.Core/Gateways/BaseGateway.cs @@ -92,11 +92,6 @@ namespace ICanPay.Core /// protected internal abstract bool IsSuccessPay { get; } - /// - /// 是否等待支付 - /// - protected abstract bool IsWaitPay { get; } - /// /// 需要验证的参数名称数组,用于识别不同的网关类型。 /// 商户号(AppId)必须放第一位 @@ -130,8 +125,30 @@ namespace ICanPay.Core HttpUtil.Write(FAILURE); } + /// + /// 执行请求 + /// + /// 数据模型 + /// 返回模型 + /// 请求 + /// public abstract TResponse Execute(Request request) where TResponse : IResponse; + /// + /// 生成签名 + /// + /// 网关数据 + /// + protected abstract string BuildSign(GatewayData gatewayData); + + /// + /// 检验签名 + /// + /// 待验证数据 + /// 签名 + /// + protected abstract bool CheckSign(string data, string sign); + #endregion #endregion diff --git a/src/ICanPay.Core/Gateways/GatewayData.cs b/src/ICanPay.Core/Gateways/GatewayData.cs index 6020b01..40703e3 100644 --- a/src/ICanPay.Core/Gateways/GatewayData.cs +++ b/src/ICanPay.Core/Gateways/GatewayData.cs @@ -484,10 +484,16 @@ namespace ICanPay.Core if (!string.IsNullOrEmpty(json)) { var jObject = JObject.Parse(json); - var list = jObject.Children().OfType(); - foreach (var item in list) + foreach (var item in jObject) { - Add(item.Name, item.Value.ToString()); + if (item.Value.Type == JTokenType.Object) + { + Add(item.Key, item.Value.ToString(Newtonsoft.Json.Formatting.None)); + } + else + { + Add(item.Key, item.Value.ToString()); + } } } } diff --git a/src/ICanPay.Core/Gateways/NullGateway.cs b/src/ICanPay.Core/Gateways/NullGateway.cs index 0658a39..7720751 100644 --- a/src/ICanPay.Core/Gateways/NullGateway.cs +++ b/src/ICanPay.Core/Gateways/NullGateway.cs @@ -9,20 +9,11 @@ namespace ICanPay.Core /// public class NullGateway : BaseGateway { + public override string GatewayUrl { get; set; } - #region 属性 + protected internal override bool IsSuccessPay { get; } - public override string GatewayUrl { get; set; } = string.Empty; - - protected internal override bool IsSuccessPay => false; - - protected override bool IsWaitPay => false; - - protected internal override string[] NotifyVerifyParameter => new string[0]; - - #endregion - - #region 方法 + protected internal override string[] NotifyVerifyParameter { get; } protected internal override async Task ValidateNotifyAsync() { @@ -34,7 +25,14 @@ namespace ICanPay.Core throw new NotImplementedException(); } - #endregion + protected override string BuildSign(GatewayData gatewayData) + { + throw new NotImplementedException(); + } + protected override bool CheckSign(string data, string sign) + { + throw new NotImplementedException(); + } } } diff --git a/src/ICanPay.Unionpay/UnionpayGateway.cs b/src/ICanPay.Unionpay/UnionpayGateway.cs index a69ebe5..016336f 100644 --- a/src/ICanPay.Unionpay/UnionpayGateway.cs +++ b/src/ICanPay.Unionpay/UnionpayGateway.cs @@ -43,6 +43,7 @@ namespace ICanPay.Unionpay : base(merchant, new GatewayData(StringComparer.Ordinal)) { _merchant = merchant; + //TODO:测试同时读取是否有问题 _merchant.CertId = Util.GetCertId(merchant.CertPath, merchant.CertPwd); _merchant.CertKey = Util.GetCertKey(merchant.CertPath, merchant.CertPwd); //_merchant.EncryptCertId = Util.GetEncryptCertId();