protected string ParseMessageToNote(IpayDoubleEightResponseModel model)
        {
            if (model == null)
            {
                return(string.Empty);
            }

            var note = new StringBuilder();

            note.AppendLine("iPay88 Result:");
            note.AppendLine($"MerchantCode:{model.MerchantCode}");
            note.AppendLine($"PaymentId:{model.PaymentId}");
            note.AppendLine($"Remark:{model.Remark}");
            note.AppendLine($"TransId:{model.TransId}");
            note.AppendLine($"AuthCode:{model.AuthCode}");
            note.AppendLine($"Status:{model.Status}");
            note.AppendLine($"ErrDesc:{model.ErrDesc}");
            note.AppendLine($"Signature:{model.Signature}");
            note.AppendLine($"CCName:{model.CCName}");
            note.AppendLine($"CCNo:{model.CCNo}");
            note.AppendLine($"S_bankname:{model.S_bankname}");
            note.AppendLine($"S_country:{model.S_country}");

            return(note.ToString());
        }
        public virtual IActionResult PaidCallback(IpayDoubleEightResponseModel model)
        {
            if (string.IsNullOrEmpty(model.RefNo))
            {
                return(RedirectToRoute("HomePage"));
            }

            var orderNumber = model.RefNo;

            if (model.RefNo.Contains("_"))
            {
                orderNumber = orderNumber.Substring(0, model.RefNo.IndexOf('_'));
            }

            var order = _orderService.GetOrderByCustomOrderNumber(orderNumber);

            if (order == null)
            {
                return(RedirectToRoute("HomePage"));
            }

            _orderService.InsertOrderNote(new OrderNote
            {
                OrderId           = order.Id,
                Note              = ParseMessageToNote(model),
                DisplayToCustomer = false,
                CreatedOnUtc      = DateTime.UtcNow
            });

            //check total
            var orderTotalSentTo =
                _genericAttributeService.GetAttribute <decimal?>(order, IpayDoubleEightHelper.OrderTotalSentToIpayDoubleEight);

            if (orderTotalSentTo.HasValue && model.Amount != orderTotalSentTo.Value)
            {
                var errorStr =
                    $"iPay88. Returned order total {model.Amount} doesn't equal order total {order.OrderTotal}." +
                    $"Order #{order.CustomOrderNumber}.";
                //log
                _logger.Error(errorStr);
                //order note
                _orderService.InsertOrderNote(new OrderNote
                {
                    OrderId           = order.Id,
                    Note              = errorStr,
                    DisplayToCustomer = false,
                    CreatedOnUtc      = DateTime.UtcNow
                });

                return(RedirectToRoute("HomePage"));
            }

            //clear attribute
            if (orderTotalSentTo.HasValue)
            {
                _genericAttributeService.SaveAttribute <decimal?>(order, IpayDoubleEightHelper.OrderTotalSentToIpayDoubleEight, null);
            }

            if (model.Status == "1" && _orderProcessingService.CanMarkOrderAsPaid(order))
            {
                order.AuthorizationTransactionId     = model.TransId;
                order.AuthorizationTransactionCode   = model.AuthCode;
                order.AuthorizationTransactionResult = model.Status;

                _orderService.UpdateOrder(order);

                _orderProcessingService.MarkOrderAsPaid(order);

                return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
            }
            else
            {
                _orderService.InsertOrderNote(new OrderNote
                {
                    OrderId           = order.Id,
                    Note              = model.ErrDesc,
                    DisplayToCustomer = false,
                    CreatedOnUtc      = DateTime.UtcNow
                });

                return(RedirectToRoute("OrderDetails", new { orderId = order.Id }));
            }
        }