public IActionResult Success()
        {
            var   orderId          = _webHelper.QueryString <string>("x_reference");
            var   oxipayStatus     = _webHelper.QueryString <string>("x_result");
            var   oxipayOrderId    = _webHelper.QueryString <string>("x_gateway_reference");
            var   newPaymentStatus = OxipayHelper.GetPaymentStatus(oxipayStatus, null);
            Order order            = null;

            if (Guid.TryParse(orderId, out Guid orderGuid))
            {
                order = _orderService.GetOrderByGuid(orderGuid);
            }
            if (order != null)
            {
                order.OrderNotes.Add(new OrderNote
                {
                    Note = "Oxipay order ID: " + oxipayOrderId,
                    DisplayToCustomer = false,
                    CreatedOnUtc      = DateTime.UtcNow
                });
                _orderService.UpdateOrder(order);
            }
            switch (newPaymentStatus)
            {
            case PaymentStatus.Pending:
            {}
            break;

            case PaymentStatus.Paid:
            {
                //valid
                if (_orderProcessingService.CanMarkOrderAsPaid(order))
                {
                    _orderProcessingService.MarkOrderAsPaid(order);
                }
                break;
            }

            case PaymentStatus.Voided:
            {
                if (_orderProcessingService.CanVoidOffline(order))
                {
                    _orderProcessingService.VoidOffline(order);
                }
            }
            break;

            default:
                break;
            }
            if (order == null)
            {
                return(RedirectToAction("Index", "Home", new { area = string.Empty }));
            }

            return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
        }
        public IActionResult Callback()
        {
            byte[] parameters;
            using (var stream = new MemoryStream())
            {
                this.Request.Body.CopyTo(stream);
                parameters = stream.ToArray();
            }
            var strRequest = Encoding.ASCII.GetString(parameters);

            var processor = _paymentService.LoadPaymentMethodBySystemName("Payments.Oxipay") as OxipayPaymentProcessor;

            if (processor == null ||
                !_paymentService.IsPaymentMethodActive(processor) || !processor.PluginDescriptor.Installed)
            {
                throw new NopException("Oxipay module cannot be loaded");
            }

            if (processor.OxipayCallback(strRequest, out Dictionary <string, string> values))
            {
                values.TryGetValue("x_result", out string x_result);
                values.TryGetValue("x_gateway_reference", out string x_gateway_reference);
                values.TryGetValue("x_account_id", out string x_account_id);
                values.TryGetValue("x_reference", out string x_reference);
                values.TryGetValue("x_amount", out string x_amount);

                var   newPaymentStatus = OxipayHelper.GetPaymentStatus(x_result, null);
                Order order            = null;

                if (Guid.TryParse(x_reference, out Guid orderGuid))
                {
                    order = _orderService.GetOrderByGuid(orderGuid);
                }
                switch (newPaymentStatus)
                {
                case PaymentStatus.Pending:
                {}
                break;

                case PaymentStatus.Paid:
                {
                    if (order != null)
                    {
                        order.OrderNotes.Add(new OrderNote
                            {
                                Note = x_gateway_reference,
                                DisplayToCustomer = false,
                                CreatedOnUtc      = DateTime.UtcNow
                            });
                        _orderService.UpdateOrder(order);
                    }
                    break;
                }

                case PaymentStatus.Voided:
                { }
                break;

                default:
                    break;
                }
            }
            //nothing should be rendered to visitor
            return(Content(""));
        }