From 99e72238bc683784cf5a8b6a21f438fdef8e2f16 Mon Sep 17 00:00:00 2001 From: TeddyBear Date: Tue, 1 Sep 2020 23:44:20 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9ReceivedAsync=20=E4=BB=A5?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?FlagXml=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PaySharp.Core/Gateways/BaseGateway.cs | 17 +- src/PaySharp.Core/Notify/Notify.cs | 189 +++++++++++++----- .../Notify/ValidateEventResult.cs | 36 ++++ src/PaySharp.Qpay/QpayGateway.cs | 14 +- src/PaySharp.Wechatpay/WechatpayGateway.cs | 14 +- 5 files changed, 214 insertions(+), 56 deletions(-) create mode 100644 src/PaySharp.Core/Notify/ValidateEventResult.cs diff --git a/src/PaySharp.Core/Gateways/BaseGateway.cs b/src/PaySharp.Core/Gateways/BaseGateway.cs index 2df9651..84c4d0e 100644 --- a/src/PaySharp.Core/Gateways/BaseGateway.cs +++ b/src/PaySharp.Core/Gateways/BaseGateway.cs @@ -87,7 +87,7 @@ protected BaseGateway(IMerchant merchant) /// protected internal virtual void WriteSuccessFlag() { - HttpUtil.Write("success"); + HttpUtil.Write(GetSuccessFlag()); } /// @@ -95,9 +95,22 @@ protected internal virtual void WriteSuccessFlag() /// protected internal virtual void WriteFailureFlag() { - HttpUtil.Write("failure"); + HttpUtil.Write(GetFailureFlag()); + } /// + /// 当接收到支付网关通知并验证无误时按照支付网关要求格式输出表示成功接收到网关通知的字符串 + /// + protected internal virtual string GetSuccessFlag() + { + return "success"; } + /// + /// 当接收到支付网关通知并验证有误时按照支付网关要求格式输出表示失败接收到网关通知的字符串 + /// + protected internal virtual string GetFailureFlag() + { + return "failure"; + } /// /// 执行请求 /// diff --git a/src/PaySharp.Core/Notify/Notify.cs b/src/PaySharp.Core/Notify/Notify.cs index c9956a9..919dd25 100644 --- a/src/PaySharp.Core/Notify/Notify.cs +++ b/src/PaySharp.Core/Notify/Notify.cs @@ -70,61 +70,76 @@ public Notify(IGateways gateways) private void OnUnknownGateway(UnknownGatewayEventArgs e) => UnknownGateway?.Invoke(this, e); - /// - /// 接收并验证网关的支付通知 - /// - public async Task ReceivedAsync() + + + private async Task GetNotifyEventArgs(BaseGateway gateway) { - var gateway = await NotifyProcess.GetGatewayAsync(_gateways); if (gateway is NullGateway) { - OnUnknownGateway(new UnknownGatewayEventArgs(gateway)); - return; + return new UnknownGatewayEventArgs(gateway); } - try + if (!await gateway.ValidateNotifyAsync()) { - if (!await gateway.ValidateNotifyAsync()) - { - OnUnknownNotify(new UnKnownNotifyEventArgs(gateway) - { - Message = "签名验证失败" - }); - gateway.WriteFailureFlag(); - return; - } + return new UnKnownNotifyEventArgs(gateway) { Message = "签名验证失败" }; + } - if (HttpUtil.RequestType == "GET") - { - OnPaySucceed(new PaySucceedEventArgs(gateway)); - return; - } + if (HttpUtil.RequestType == "GET") + { + return new PaySucceedEventArgs(gateway); + } - var result = false; - if (gateway.IsPaySuccess) - { - result = OnPaySucceed(new PaySucceedEventArgs(gateway)); - } - else if (gateway.IsRefundSuccess) - { - result = OnRefundSucceed(new RefundSucceedEventArgs(gateway)); - } - else if (gateway.IsCancelSuccess) - { - result = OnCancelSucceed(new CancelSucceedEventArgs(gateway)); - } - else - { - result = OnUnknownNotify(new UnKnownNotifyEventArgs(gateway)); - } + if (gateway.IsPaySuccess) + { + return new PaySucceedEventArgs(gateway); + } - if (result) - { - gateway.WriteSuccessFlag(); - } - else + if (gateway.IsRefundSuccess) + { + return new RefundSucceedEventArgs(gateway); + } + + if (gateway.IsCancelSuccess) + { + return new CancelSucceedEventArgs(gateway); + } + + return new UnKnownNotifyEventArgs(gateway); + + + } + private async Task ValidateNotifyEventAsync(BaseGateway gateway) + { + var success = false; + try + { + var eventArgs = await GetNotifyEventArgs(gateway); + switch (eventArgs) { - gateway.WriteFailureFlag(); + case UnknownGatewayEventArgs unknownGatewayEventArgs: + OnUnknownGateway(unknownGatewayEventArgs); + break; + case UnKnownNotifyEventArgs unKnownNotifyEventArgs: + OnUnknownNotify(unKnownNotifyEventArgs); + break; + case PaySucceedEventArgs args: + { + OnPaySucceed(args); + success = true; + } + break; + case RefundSucceedEventArgs refundSucceedEventArgs: + { + OnRefundSucceed(refundSucceedEventArgs); + success = true; + } + break; + case CancelSucceedEventArgs cancelSucceedEventArgs: + { + OnCancelSucceed(cancelSucceedEventArgs); + success = true; + } + break; } } catch (GatewayException ex) @@ -133,8 +148,90 @@ public async Task ReceivedAsync() { Message = ex.Message }); - gateway.WriteFailureFlag(); + } + + + return new ValidateEventResult(gateway,success); + } + + + /// + /// 接收并验证网关的支付通知 + /// + public async Task ReceivedAsync(bool writeFlag = false) + { + var gateway = await NotifyProcess.GetGatewayAsync(_gateways); + var validateEventResult = await ValidateNotifyEventAsync(gateway); + + if (writeFlag) + { + validateEventResult.WriteFlagXml(); + } + + return validateEventResult; + + + // var gateway = await NotifyProcess.GetGatewayAsync(_gateways); + // if (gateway is NullGateway) + // { + // OnUnknownGateway(new UnknownGatewayEventArgs(gateway)); + // return; + // } + // + // try + // { + // if (!await gateway.ValidateNotifyAsync()) + // { + // OnUnknownNotify(new UnKnownNotifyEventArgs(gateway) + // { + // Message = "签名验证失败" + // }); + // gateway.WriteFailureFlag(); + // return; + // } + // + // if (HttpUtil.RequestType == "GET") + // { + // OnPaySucceed(new PaySucceedEventArgs(gateway)); + // return; + // } + // + // var result = false; + // if (gateway.IsPaySuccess) + // { + // result = OnPaySucceed(new PaySucceedEventArgs(gateway)); + // } + // else if (gateway.IsRefundSuccess) + // { + // result = OnRefundSucceed(new RefundSucceedEventArgs(gateway)); + // } + // else if (gateway.IsCancelSuccess) + // { + // result = OnCancelSucceed(new CancelSucceedEventArgs(gateway)); + // } + // else + // { + // result = OnUnknownNotify(new UnKnownNotifyEventArgs(gateway)); + // } + // + // if (result) + // { + // gateway.WriteSuccessFlag(); + // } + // else + // { + // gateway.WriteFailureFlag(); + // } + // } + // catch (GatewayException ex) + // { + // OnUnknownNotify(new UnKnownNotifyEventArgs(gateway) + // { + // Message = ex.Message + // }); + // gateway.WriteFailureFlag(); + // } } #endregion diff --git a/src/PaySharp.Core/Notify/ValidateEventResult.cs b/src/PaySharp.Core/Notify/ValidateEventResult.cs new file mode 100644 index 0000000..e462a65 --- /dev/null +++ b/src/PaySharp.Core/Notify/ValidateEventResult.cs @@ -0,0 +1,36 @@ +namespace PaySharp.Core +{ + public class ValidateEventResult + { + private BaseGateway Gateway { get; } + public bool Success { get; } + public ValidateEventResult(BaseGateway gateway,bool success) + { + Gateway = gateway; + Success = success; + } + + #region Overrides of Object + + /// 返回表示当前对象的字符串。 + /// 表示当前对象的字符串。 + public string GetFlagXml() + { + return Success ? Gateway.GetSuccessFlag() : Gateway.GetFailureFlag(); + } + + #endregion + + public void WriteFlagXml() + { + if (Success) + { + Gateway.WriteSuccessFlag(); + } + else + { + Gateway.WriteFailureFlag(); + } + } + } +} diff --git a/src/PaySharp.Qpay/QpayGateway.cs b/src/PaySharp.Qpay/QpayGateway.cs index f179a07..502c9ab 100644 --- a/src/PaySharp.Qpay/QpayGateway.cs +++ b/src/PaySharp.Qpay/QpayGateway.cs @@ -84,18 +84,24 @@ protected override async Task ValidateNotifyAsync() return true; } - protected override void WriteSuccessFlag() + /// + /// 当接收到支付网关通知并验证无误时按照支付网关要求格式输出表示成功接收到网关通知的字符串 + /// + protected override string GetSuccessFlag() { GatewayData.Clear(); GatewayData.Add("return_code", "SUCCESS"); - HttpUtil.Write(GatewayData.ToXml()); + return GatewayData.ToXml(); } - protected override void WriteFailureFlag() + /// + /// 当接收到支付网关通知并验证有误时按照支付网关要求格式输出表示失败接收到网关通知的字符串 + /// + protected override string GetFailureFlag() { GatewayData.Clear(); GatewayData.Add("return_code", "FAIL"); - HttpUtil.Write(GatewayData.ToXml()); + return GatewayData.ToXml(); } public override TResponse Execute(Request request) diff --git a/src/PaySharp.Wechatpay/WechatpayGateway.cs b/src/PaySharp.Wechatpay/WechatpayGateway.cs index 8c9c98f..fd5797a 100644 --- a/src/PaySharp.Wechatpay/WechatpayGateway.cs +++ b/src/PaySharp.Wechatpay/WechatpayGateway.cs @@ -111,19 +111,25 @@ protected override async Task ValidateNotifyAsync() return true; } - protected override void WriteSuccessFlag() + /// + /// 当接收到支付网关通知并验证无误时按照支付网关要求格式输出表示成功接收到网关通知的字符串 + /// + protected override string GetSuccessFlag() { GatewayData.Clear(); GatewayData.Add("return_code", "SUCCESS"); GatewayData.Add("return_msg", "OK"); - HttpUtil.Write(GatewayData.ToXml()); + return GatewayData.ToXml(); } - protected override void WriteFailureFlag() + /// + /// 当接收到支付网关通知并验证有误时按照支付网关要求格式输出表示失败接收到网关通知的字符串 + /// + protected override string GetFailureFlag() { GatewayData.Clear(); GatewayData.Add("return_code", "FAIL"); - HttpUtil.Write(GatewayData.ToXml()); + return GatewayData.ToXml(); } public override TResponse Execute(Request request) From 6f01a7e6d654b55948bdcc6dbdfea385c546442c Mon Sep 17 00:00:00 2001 From: TeddyBear Date: Tue, 1 Sep 2020 23:49:56 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PaySharp.Core/Notify/Notify.cs | 16 ++++++++-------- ...ValidateEventResult.cs => SendEventResult.cs} | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) rename src/PaySharp.Core/Notify/{ValidateEventResult.cs => SendEventResult.cs} (88%) diff --git a/src/PaySharp.Core/Notify/Notify.cs b/src/PaySharp.Core/Notify/Notify.cs index 919dd25..3d224dc 100644 --- a/src/PaySharp.Core/Notify/Notify.cs +++ b/src/PaySharp.Core/Notify/Notify.cs @@ -72,7 +72,7 @@ public Notify(IGateways gateways) - private async Task GetNotifyEventArgs(BaseGateway gateway) + private async Task GetNotifyEvent(BaseGateway gateway) { if (gateway is NullGateway) { @@ -108,12 +108,12 @@ private async Task GetNotifyEventArgs(BaseGateway gateway) } - private async Task ValidateNotifyEventAsync(BaseGateway gateway) + private async Task SendNotifyEventAsync(BaseGateway gateway) { var success = false; try { - var eventArgs = await GetNotifyEventArgs(gateway); + var eventArgs = await GetNotifyEvent(gateway); switch (eventArgs) { case UnknownGatewayEventArgs unknownGatewayEventArgs: @@ -152,24 +152,24 @@ private async Task ValidateNotifyEventAsync(BaseGateway gat } - return new ValidateEventResult(gateway,success); + return new SendEventResult(gateway,success); } /// /// 接收并验证网关的支付通知 /// - public async Task ReceivedAsync(bool writeFlag = false) + public async Task ReceivedAsync(bool writeFlag = false) { var gateway = await NotifyProcess.GetGatewayAsync(_gateways); - var validateEventResult = await ValidateNotifyEventAsync(gateway); + var sendEventResult = await SendNotifyEventAsync(gateway); if (writeFlag) { - validateEventResult.WriteFlagXml(); + sendEventResult.WriteFlagXml(); } - return validateEventResult; + return sendEventResult; // var gateway = await NotifyProcess.GetGatewayAsync(_gateways); diff --git a/src/PaySharp.Core/Notify/ValidateEventResult.cs b/src/PaySharp.Core/Notify/SendEventResult.cs similarity index 88% rename from src/PaySharp.Core/Notify/ValidateEventResult.cs rename to src/PaySharp.Core/Notify/SendEventResult.cs index e462a65..3224b28 100644 --- a/src/PaySharp.Core/Notify/ValidateEventResult.cs +++ b/src/PaySharp.Core/Notify/SendEventResult.cs @@ -1,10 +1,10 @@ namespace PaySharp.Core { - public class ValidateEventResult + public class SendEventResult { private BaseGateway Gateway { get; } public bool Success { get; } - public ValidateEventResult(BaseGateway gateway,bool success) + public SendEventResult(BaseGateway gateway,bool success) { Gateway = gateway; Success = success; From 3f15b20f0cec65e8077986e2d09179f8b9584fad Mon Sep 17 00:00:00 2001 From: TeddyBear Date: Tue, 1 Sep 2020 23:51:03 +0800 Subject: [PATCH 3/5] break; --- src/PaySharp.Core/Notify/Notify.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/PaySharp.Core/Notify/Notify.cs b/src/PaySharp.Core/Notify/Notify.cs index 3d224dc..63051c2 100644 --- a/src/PaySharp.Core/Notify/Notify.cs +++ b/src/PaySharp.Core/Notify/Notify.cs @@ -126,20 +126,23 @@ private async Task SendNotifyEventAsync(BaseGateway gateway) { OnPaySucceed(args); success = true; + break; } - break; + case RefundSucceedEventArgs refundSucceedEventArgs: { OnRefundSucceed(refundSucceedEventArgs); success = true; + break; } - break; + case CancelSucceedEventArgs cancelSucceedEventArgs: { OnCancelSucceed(cancelSucceedEventArgs); success = true; + break; } - break; + } } catch (GatewayException ex) @@ -152,7 +155,7 @@ private async Task SendNotifyEventAsync(BaseGateway gateway) } - return new SendEventResult(gateway,success); + return new SendEventResult(gateway, success); } From 1c3eea4e09acfc4c07c593dee2945e347d63983c Mon Sep 17 00:00:00 2001 From: TeddyBear Date: Wed, 2 Sep 2020 00:03:50 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9ReceivedAsync=E9=87=8D?= =?UTF-8?q?=E8=BD=BD=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PaySharp.Core/Notify/Notify.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/PaySharp.Core/Notify/Notify.cs b/src/PaySharp.Core/Notify/Notify.cs index 63051c2..0bddc31 100644 --- a/src/PaySharp.Core/Notify/Notify.cs +++ b/src/PaySharp.Core/Notify/Notify.cs @@ -158,11 +158,7 @@ private async Task SendNotifyEventAsync(BaseGateway gateway) return new SendEventResult(gateway, success); } - - /// - /// 接收并验证网关的支付通知 - /// - public async Task ReceivedAsync(bool writeFlag = false) + public async Task ReceivedAsync(bool writeFlag) { var gateway = await NotifyProcess.GetGatewayAsync(_gateways); var sendEventResult = await SendNotifyEventAsync(gateway); @@ -173,8 +169,15 @@ public async Task ReceivedAsync(bool writeFlag = false) } return sendEventResult; + } - + /// + /// 接收并验证网关的支付通知 + /// + public Task ReceivedAsync() + { + return ReceivedAsync(true); + // var gateway = await NotifyProcess.GetGatewayAsync(_gateways); // if (gateway is NullGateway) // { From f4d2f13a9cc55582082beb4af80064b22785cb5c Mon Sep 17 00:00:00 2001 From: TeddyBear Date: Wed, 2 Sep 2020 00:07:41 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PaySharp.Core/Notify/SendEventResult.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/PaySharp.Core/Notify/SendEventResult.cs b/src/PaySharp.Core/Notify/SendEventResult.cs index 3224b28..5fb0f27 100644 --- a/src/PaySharp.Core/Notify/SendEventResult.cs +++ b/src/PaySharp.Core/Notify/SendEventResult.cs @@ -11,16 +11,19 @@ public SendEventResult(BaseGateway gateway,bool success) } #region Overrides of Object - - /// 返回表示当前对象的字符串。 - /// 表示当前对象的字符串。 + /// + /// 获取当前处理结果的XML + /// + /// public string GetFlagXml() { return Success ? Gateway.GetSuccessFlag() : Gateway.GetFailureFlag(); } #endregion - + /// + /// 立即响应处理结果的XML,并结束请求 + /// public void WriteFlagXml() { if (Success)