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..0bddc31 100644 --- a/src/PaySharp.Core/Notify/Notify.cs +++ b/src/PaySharp.Core/Notify/Notify.cs @@ -70,61 +70,79 @@ public Notify(IGateways gateways) private void OnUnknownGateway(UnknownGatewayEventArgs e) => UnknownGateway?.Invoke(this, e); - /// - /// 接收并验证网关的支付通知 - /// - public async Task ReceivedAsync() + + + private async Task GetNotifyEvent(BaseGateway gateway) { - var gateway = await NotifyProcess.GetGatewayAsync(_gateways); if (gateway is NullGateway) { - OnUnknownGateway(new UnknownGatewayEventArgs(gateway)); - return; + return new UnknownGatewayEventArgs(gateway); + } + + if (!await gateway.ValidateNotifyAsync()) + { + return new UnKnownNotifyEventArgs(gateway) { Message = "签名验证失败" }; + } + + if (HttpUtil.RequestType == "GET") + { + return new PaySucceedEventArgs(gateway); + } + + if (gateway.IsPaySuccess) + { + return new PaySucceedEventArgs(gateway); } + if (gateway.IsRefundSuccess) + { + return new RefundSucceedEventArgs(gateway); + } + + if (gateway.IsCancelSuccess) + { + return new CancelSucceedEventArgs(gateway); + } + + return new UnKnownNotifyEventArgs(gateway); + + + } + private async Task SendNotifyEventAsync(BaseGateway gateway) + { + var success = false; try { - if (!await gateway.ValidateNotifyAsync()) + var eventArgs = await GetNotifyEvent(gateway); + switch (eventArgs) { - OnUnknownNotify(new UnKnownNotifyEventArgs(gateway) + case UnknownGatewayEventArgs unknownGatewayEventArgs: + OnUnknownGateway(unknownGatewayEventArgs); + break; + case UnKnownNotifyEventArgs unKnownNotifyEventArgs: + OnUnknownNotify(unKnownNotifyEventArgs); + break; + case PaySucceedEventArgs args: { - Message = "签名验证失败" - }); - gateway.WriteFailureFlag(); - return; - } + OnPaySucceed(args); + success = true; + break; + } - if (HttpUtil.RequestType == "GET") - { - OnPaySucceed(new PaySucceedEventArgs(gateway)); - return; - } + case RefundSucceedEventArgs refundSucceedEventArgs: + { + OnRefundSucceed(refundSucceedEventArgs); + success = true; + break; + } - 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)); - } + case CancelSucceedEventArgs cancelSucceedEventArgs: + { + OnCancelSucceed(cancelSucceedEventArgs); + success = true; + break; + } - if (result) - { - gateway.WriteSuccessFlag(); - } - else - { - gateway.WriteFailureFlag(); } } catch (GatewayException ex) @@ -133,8 +151,93 @@ public async Task ReceivedAsync() { Message = ex.Message }); - gateway.WriteFailureFlag(); + } + + + return new SendEventResult(gateway, success); + } + + public async Task ReceivedAsync(bool writeFlag) + { + var gateway = await NotifyProcess.GetGatewayAsync(_gateways); + var sendEventResult = await SendNotifyEventAsync(gateway); + + if (writeFlag) + { + sendEventResult.WriteFlagXml(); + } + + return sendEventResult; + } + + /// + /// 接收并验证网关的支付通知 + /// + public Task ReceivedAsync() + { + return ReceivedAsync(true); + + // 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/SendEventResult.cs b/src/PaySharp.Core/Notify/SendEventResult.cs new file mode 100644 index 0000000..5fb0f27 --- /dev/null +++ b/src/PaySharp.Core/Notify/SendEventResult.cs @@ -0,0 +1,39 @@ +namespace PaySharp.Core +{ + public class SendEventResult + { + private BaseGateway Gateway { get; } + public bool Success { get; } + public SendEventResult(BaseGateway gateway,bool success) + { + Gateway = gateway; + Success = success; + } + + #region Overrides of Object + /// + /// 获取当前处理结果的XML + /// + /// + public string GetFlagXml() + { + return Success ? Gateway.GetSuccessFlag() : Gateway.GetFailureFlag(); + } + + #endregion + /// + /// 立即响应处理结果的XML,并结束请求 + /// + 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)