public IActionResult IPNHandler()
        {
            byte[] parameters;
            using (var stream = new MemoryStream())
            {
                this.Request.Body.CopyTo(stream);
                parameters = stream.ToArray();
            }
            var strRequest = Encoding.ASCII.GetString(parameters);

            var processor = _paymentPluginManager.LoadPluginBySystemName("Payments.Paytm") as PaytmPaymentProcessor;

            if (processor == null ||
                !_paymentPluginManager.IsPluginActive(processor) || !processor.PluginDescriptor.Installed)
            {
                throw new NopException("Paytm Standard module cannot be loaded");
            }

            if (processor.VerifyIpn(strRequest, out Dictionary <string, string> values))
            {
                #region values
                var mc_gross = decimal.Zero;
                try
                {
                    mc_gross = decimal.Parse(values["mc_gross"], new CultureInfo("en-US"));
                }
                catch { }

                values.TryGetValue("payer_status", out string payer_status);
                values.TryGetValue("payment_status", out string payment_status);
                values.TryGetValue("pending_reason", out string pending_reason);
                values.TryGetValue("mc_currency", out string mc_currency);
                values.TryGetValue("txn_id", out string txn_id);
                values.TryGetValue("txn_type", out string txn_type);
                values.TryGetValue("rp_invoice_id", out string rp_invoice_id);
                values.TryGetValue("payment_type", out string payment_type);
                values.TryGetValue("payer_id", out string payer_id);
                values.TryGetValue("receiver_id", out string receiver_id);
                values.TryGetValue("invoice", out string _);
                values.TryGetValue("payment_fee", out string payment_fee);

                #endregion

                var sb = new StringBuilder();
                sb.AppendLine("Paytm IPN:");
                foreach (var kvp in values)
                {
                    sb.AppendLine(kvp.Key + ": " + kvp.Value);
                }

                var newPaymentStatus = PaytmHelper.GetPaymentStatus(payment_status, pending_reason);
                sb.AppendLine("New payment status: " + newPaymentStatus);

                switch (txn_type)
                {
                case "recurring_payment_profile_created":
                    //do nothing here
                    break;

                    #region Recurring payment
                case "recurring_payment":
                {
                    var orderNumberGuid = Guid.Empty;
                    try
                    {
                        orderNumberGuid = new Guid(rp_invoice_id);
                    }
                    catch
                    {
                    }

                    var initialOrder = _orderService.GetOrderByGuid(orderNumberGuid);
                    if (initialOrder != null)
                    {
                        var recurringPayments = _orderService.SearchRecurringPayments(initialOrderId: initialOrder.Id);
                        foreach (var rp in recurringPayments)
                        {
                            switch (newPaymentStatus)
                            {
                            case PaymentStatus.Authorized:
                            case PaymentStatus.Paid:
                            {
                                var recurringPaymentHistory = _orderService.GetRecurringPaymentHistory(rp);
                                if (!recurringPaymentHistory.Any())
                                {
                                    _orderService.InsertRecurringPaymentHistory(new RecurringPaymentHistory
                                            {
                                                RecurringPaymentId = rp.Id,
                                                OrderId            = initialOrder.Id,
                                                CreatedOnUtc       = DateTime.UtcNow
                                            });
                                }
                                else
                                {
                                    //next payments
                                    var processPaymentResult = new ProcessPaymentResult
                                    {
                                        NewPaymentStatus = newPaymentStatus
                                    };
                                    if (newPaymentStatus == PaymentStatus.Authorized)
                                    {
                                        processPaymentResult.AuthorizationTransactionId = txn_id;
                                    }
                                    else
                                    {
                                        processPaymentResult.CaptureTransactionId = txn_id;
                                    }

                                    _orderProcessingService.ProcessNextRecurringPayment(rp, processPaymentResult);
                                }
                            }
                            break;

                            case PaymentStatus.Voided:
                                //failed payment
                                var failedPaymentResult = new ProcessPaymentResult
                                {
                                    Errors = new[] { $"Paytm IPN. Recurring payment is {payment_status} ." },
                                    RecurringPaymentFailed = true
                                };
                                _orderProcessingService.ProcessNextRecurringPayment(rp, failedPaymentResult);
                                break;
                            }
                        }

                        //this.OrderService.InsertOrderNote(newOrder.OrderId, sb.ToString(), DateTime.UtcNow);
                        _logger.Information("Paytm IPN. Recurring info", new NopException(sb.ToString()));
                    }
                    else
                    {
                        _logger.Error("Paytm IPN. Order is not found", new NopException(sb.ToString()));
                    }
                }
                break;

                case "recurring_payment_failed":
                    if (Guid.TryParse(rp_invoice_id, out Guid orderGuid))
                    {
                        var initialOrder = _orderService.GetOrderByGuid(orderGuid);
                        if (initialOrder != null)
                        {
                            var recurringPayment = _orderService.SearchRecurringPayments(initialOrderId: initialOrder.Id).FirstOrDefault();
                            //failed payment
                            if (recurringPayment != null)
                            {
                                _orderProcessingService.ProcessNextRecurringPayment(recurringPayment, new ProcessPaymentResult {
                                    Errors = new[] { txn_type }, RecurringPaymentFailed = true
                                });
                            }
                        }
                    }
                    break;

                    #endregion
                default:
                    #region Standard payment
                {
                    values.TryGetValue("custom", out string orderNumber);
                    var orderNumberGuid = Guid.Empty;
                    try
                    {
                        orderNumberGuid = new Guid(orderNumber);
                    }
                    catch
                    {
                    }

                    var order = _orderService.GetOrderByGuid(orderNumberGuid);
                    if (order != null)
                    {
                        //order note
                        //order.OrderNotes.Add(new OrderNote
                        //{
                        //    Note = sb.ToString(),
                        //    DisplayToCustomer = false,
                        //    CreatedOnUtc = DateTime.UtcNow
                        //});
                        //_orderService.UpdateOrder(order);

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

                        switch (newPaymentStatus)
                        {
                        case PaymentStatus.Pending:
                        {
                        }
                        break;

                        case PaymentStatus.Authorized:
                        {
                            //validate order total
                            if (Math.Round(mc_gross, 2).Equals(Math.Round(order.OrderTotal, 2)))
                            {
                                //valid
                                if (_orderProcessingService.CanMarkOrderAsAuthorized(order))
                                {
                                    _orderProcessingService.MarkAsAuthorized(order);
                                }
                            }
                            else
                            {
                                //not valid
                                var errorStr =
                                    $"Paytm IPN. Returned order total {mc_gross} doesn't equal order total {order.OrderTotal}. Order# {order.Id}.";
                                //log
                                _logger.Error(errorStr);
                                //order note
                                //order.OrderNotes.Add(new OrderNote
                                //{
                                //    Note = errorStr,
                                //    DisplayToCustomer = false,
                                //    CreatedOnUtc = DateTime.UtcNow
                                //});
                                //_orderService.UpdateOrder(order);
                                _orderService.InsertOrderNote(new OrderNote
                                        {
                                            OrderId           = order.Id,
                                            Note              = sb.ToString(),
                                            DisplayToCustomer = false,
                                            CreatedOnUtc      = DateTime.UtcNow
                                        });
                            }
                        }
                        break;

                        case PaymentStatus.Paid:
                        {
                            //validate order total
                            if (Math.Round(mc_gross, 2).Equals(Math.Round(order.OrderTotal, 2)))
                            {
                                //valid
                                if (_orderProcessingService.CanMarkOrderAsPaid(order))
                                {
                                    order.AuthorizationTransactionId = txn_id;
                                    _orderService.UpdateOrder(order);

                                    _orderProcessingService.MarkOrderAsPaid(order);
                                }
                            }
                            else
                            {
                                //not valid
                                var errorStr =
                                    $"Paytm IPN. Returned order total {mc_gross} doesn't equal order total {order.OrderTotal}. Order# {order.Id}.";
                                //log
                                _logger.Error(errorStr);
                                //order note
                                //order.OrderNotes.Add(new OrderNote
                                //{
                                //    Note = errorStr,
                                //    DisplayToCustomer = false,
                                //    CreatedOnUtc = DateTime.UtcNow
                                //});
                                //_orderService.UpdateOrder(order);
                                _orderService.InsertOrderNote(new OrderNote
                                        {
                                            OrderId           = order.Id,
                                            Note              = sb.ToString(),
                                            DisplayToCustomer = false,
                                            CreatedOnUtc      = DateTime.UtcNow
                                        });
                            }
                        }
                        break;

                        case PaymentStatus.Refunded:
                        {
                            var totalToRefund = Math.Abs(mc_gross);
                            if (totalToRefund > 0 && Math.Round(totalToRefund, 2).Equals(Math.Round(order.OrderTotal, 2)))
                            {
                                //refund
                                if (_orderProcessingService.CanRefundOffline(order))
                                {
                                    _orderProcessingService.RefundOffline(order);
                                }
                            }
                            else
                            {
                                //partial refund
                                if (_orderProcessingService.CanPartiallyRefundOffline(order, totalToRefund))
                                {
                                    _orderProcessingService.PartiallyRefundOffline(order, totalToRefund);
                                }
                            }
                        }
                        break;

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

                        default:
                            break;
                        }
                    }
                    else
                    {
                        _logger.Error("Paytm IPN. Order is not found", new NopException(sb.ToString()));
                    }
                }
                    #endregion
                    break;
                }
            }
            else
            {
                _logger.Error("Paytm IPN failed.", new NopException(strRequest));
            }

            //nothing should be rendered to visitor
            return(Content(""));
        }
Exemple #2
0
        public async Task <IActionResult> IPNHandler()
        {
            await using var stream = new MemoryStream();
            await Request.Body.CopyToAsync(stream);

            var strRequest = Encoding.ASCII.GetString(stream.ToArray());

            if (await _paymentPluginManager.LoadPluginBySystemNameAsync("Payments.Paytm") is not PaytmPaymentProcessor processor || !_paymentPluginManager.IsPluginActive(processor))
            {
                throw new NopException("Paytm module cannot be loaded");
            }

            var(result, values) = await processor.VerifyIpnAsync(strRequest);

            if (!result)
            {
                await _logger.ErrorAsync("Paytm IPN failed.", new NopException(strRequest));

                //nothing should be rendered to visitor
                return(Ok());
            }

            var mcGross = decimal.Zero;

            try
            {
                mcGross = decimal.Parse(values["mc_gross"], new CultureInfo("en-US"));
            }
            catch
            {
                // ignored
            }

            values.TryGetValue("payment_status", out var paymentStatus);
            values.TryGetValue("pending_reason", out var pendingReason);
            values.TryGetValue("txn_id", out var txnId);
            values.TryGetValue("txn_type", out var txnType);
            values.TryGetValue("rp_invoice_id", out var rpInvoiceId);

            var sb = new StringBuilder();

            sb.AppendLine("Paytm IPN:");
            foreach (var kvp in values)
            {
                sb.AppendLine(kvp.Key + ": " + kvp.Value);
            }

            var newPaymentStatus = PaytmHelper.GetPaymentStatus(paymentStatus, pendingReason);

            sb.AppendLine("New payment status: " + newPaymentStatus);

            var ipnInfo = sb.ToString();

            switch (txnType)
            {
            case "recurring_payment":
                await ProcessRecurringPaymentAsync(rpInvoiceId, newPaymentStatus, txnId, ipnInfo);

                break;

            case "recurring_payment_failed":
                if (Guid.TryParse(rpInvoiceId, out var orderGuid))
                {
                    var order = await _orderService.GetOrderByGuidAsync(orderGuid);

                    if (order != null)
                    {
                        var recurringPayment = (await _orderService.SearchRecurringPaymentsAsync(initialOrderId: order.Id))
                                               .FirstOrDefault();
                        //failed payment
                        if (recurringPayment != null)
                        {
                            await _orderProcessingService.ProcessNextRecurringPaymentAsync(recurringPayment,
                                                                                           new ProcessPaymentResult
                            {
                                Errors = new[] { txnType },
                                RecurringPaymentFailed = true
                            });
                        }
                    }
                }

                break;

            default:
                values.TryGetValue("custom", out var orderNumber);
                await ProcessPaymentAsync(orderNumber, ipnInfo, newPaymentStatus, mcGross, txnId);

                break;
            }

            //nothing should be rendered to visitor
            return(Ok());
        }
        public ActionResult Return()
        {
            var processor = _paymentPluginManager.LoadPluginBySystemName("Payments.Paytm") as PaytmPaymentProcessor;

            if (processor == null ||
                !_paymentPluginManager.IsPluginActive(processor) || !processor.PluginDescriptor.Installed)
            {
                throw new NopException("Paytm module cannot be loaded");
            }


            var    myUtility = new PaytmHelper();
            string orderId, amount, authDesc, resCode;
            bool   checkSumMatch = false;

            //Assign following values to send it to verifychecksum function.
            if (String.IsNullOrWhiteSpace(_paytmPaymentSettings.MerchantKey))
            {
                throw new NopException("Paytm key is not set");
            }

            string workingKey    = _paytmPaymentSettings.MerchantKey;
            string paytmChecksum = null;

            Dictionary <string, string> parameters = new Dictionary <string, string>();

            if (Request.Form.Keys.Count > 0)
            {
                foreach (string key in Request.Form.Keys)
                {
                    if (Request.Form[key].Contains("|"))
                    {
                        parameters.Add(key.Trim(), "");
                    }
                    else
                    {
                        parameters.Add(key.Trim(), Request.Form[key]);
                    }
                }

                if (parameters.ContainsKey("CHECKSUMHASH"))
                {
                    paytmChecksum = parameters["CHECKSUMHASH"];
                    parameters.Remove("CHECKSUMHASH");
                }
                if (!string.IsNullOrEmpty(paytmChecksum) && paytm.CheckSum.verifyCheckSum(workingKey, parameters, paytmChecksum))
                {
                    checkSumMatch = true;
                }
            }

            orderId  = parameters["ORDERID"];
            amount   = parameters["TXNAMOUNT"];
            resCode  = parameters["RESPCODE"];
            authDesc = parameters["STATUS"];

            var order = _orderService.GetOrderById(Convert.ToInt32(orderId));

            if (checkSumMatch == true)
            {
                if (resCode == "01" && authDesc == "TXN_SUCCESS")
                {
                    if (TxnStatus(orderId, order.OrderTotal.ToString("0.00")))
                    {
                        if (_orderProcessingService.CanMarkOrderAsPaid(order))
                        {
                            _orderProcessingService.MarkOrderAsPaid(order);
                        }
                        return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
                    }
                    else
                    {
                        return(Content("Amount Mismatch"));
                    }
                }
                else if (authDesc == "TXN_FAILURE")
                {
                    _orderProcessingService.CancelOrder(order, false);
                    order.OrderStatus = OrderStatus.Cancelled;
                    _orderService.UpdateOrder(order);
                    return(RedirectToRoute("OrderDetails", new { orderId = order.Id }));
                }
                else
                {
                    return(Content("Security Error. Illegal access detected"));
                }
            }
            else if (string.IsNullOrEmpty(paytmChecksum))
            {
                return(Content("Please Contact Customer Care"));
            }
            else
            {
                return(Content("Security Error. Illegal access detected, Checksum failed"));
            }
        }
        public IActionResult PDTHandler()
        {
            var tx = _webHelper.QueryString <string>("tx");

            var processor = _paymentPluginManager.LoadPluginBySystemName("Payments.Paytm") as PaytmPaymentProcessor;

            if (processor == null ||
                !_paymentPluginManager.IsPluginActive(processor) || !processor.PluginDescriptor.Installed)
            {
                throw new NopException("Paytm Standard module cannot be loaded");
            }

            if (processor.GetPdtDetails(tx, out Dictionary <string, string> values, out string response))
            {
                values.TryGetValue("custom", out string orderNumber);
                var orderNumberGuid = Guid.Empty;
                try
                {
                    orderNumberGuid = new Guid(orderNumber);
                }
                catch { }
                var order = _orderService.GetOrderByGuid(orderNumberGuid);
                if (order != null)
                {
                    var mc_gross = decimal.Zero;
                    try
                    {
                        mc_gross = decimal.Parse(values["mc_gross"], new CultureInfo("en-US"));
                    }
                    catch (Exception exc)
                    {
                        _logger.Error("Paytm PDT. Error getting mc_gross", exc);
                    }

                    values.TryGetValue("payer_status", out string payer_status);
                    values.TryGetValue("payment_status", out string payment_status);
                    values.TryGetValue("pending_reason", out string pending_reason);
                    values.TryGetValue("mc_currency", out string mc_currency);
                    values.TryGetValue("txn_id", out string txn_id);
                    values.TryGetValue("payment_type", out string payment_type);
                    values.TryGetValue("payer_id", out string payer_id);
                    values.TryGetValue("receiver_id", out string receiver_id);
                    values.TryGetValue("invoice", out string invoice);
                    values.TryGetValue("payment_fee", out string payment_fee);

                    var sb = new StringBuilder();
                    sb.AppendLine("Paytm PDT:");
                    sb.AppendLine("mc_gross: " + mc_gross);
                    sb.AppendLine("Payer status: " + payer_status);
                    sb.AppendLine("Payment status: " + payment_status);
                    sb.AppendLine("Pending reason: " + string.Empty);
                    sb.AppendLine("mc_currency: " + mc_currency);
                    sb.AppendLine("txn_id: " + txn_id);
                    sb.AppendLine("payment_type: " + payment_type);
                    sb.AppendLine("payer_id: " + payer_id);
                    sb.AppendLine("receiver_id: " + receiver_id);
                    sb.AppendLine("invoice: " + invoice);
                    sb.AppendLine("payment_fee: " + payment_fee);

                    var newPaymentStatus = PaytmHelper.GetPaymentStatus(payment_status, string.Empty);
                    sb.AppendLine("New payment status: " + newPaymentStatus);

                    //order note

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

                    //order.OrderNotes.Add(new OrderNote
                    //{
                    //    Note = sb.ToString(),
                    //    DisplayToCustomer = false,
                    //    CreatedOnUtc = DateTime.UtcNow
                    //});

                    //_orderService.UpdateOrder(order);

                    //validate order total
                    var orderTotalSentToPaytm = _genericAttributeService.GetAttribute <decimal?>(order, PaytmHelper.OrderTotalSentToPaytm);
                    if (orderTotalSentToPaytm.HasValue && mc_gross != orderTotalSentToPaytm.Value)
                    {
                        var errorStr =
                            $"Paytm PDT. Returned order total {mc_gross} doesn't equal order total {order.OrderTotal}. Order# {order.Id}.";
                        //log
                        _logger.Error(errorStr);
                        //order note
                        //order.OrderNotes.Add(new OrderNote
                        //{
                        //    Note = errorStr,
                        //    DisplayToCustomer = false,
                        //    CreatedOnUtc = DateTime.UtcNow
                        //});
                        //_orderService.UpdateOrder(order);

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

                        return(RedirectToAction("Index", "Home", new { area = "" }));
                    }
                    //clear attribute
                    if (orderTotalSentToPaytm.HasValue)
                    {
                        _genericAttributeService.SaveAttribute <decimal?>(order, PaytmHelper.OrderTotalSentToPaytm, null);
                    }

                    //mark order as paid
                    if (newPaymentStatus == PaymentStatus.Paid)
                    {
                        if (_orderProcessingService.CanMarkOrderAsPaid(order))
                        {
                            order.AuthorizationTransactionId = txn_id;
                            _orderService.UpdateOrder(order);

                            _orderProcessingService.MarkOrderAsPaid(order);
                        }
                    }
                }

                return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
            }
            else
            {
                var orderNumber = string.Empty;
                values.TryGetValue("custom", out orderNumber);
                var orderNumberGuid = Guid.Empty;
                try
                {
                    orderNumberGuid = new Guid(orderNumber);
                }
                catch { }
                var order = _orderService.GetOrderByGuid(orderNumberGuid);
                if (order != null)
                {
                    //order note
                    //order.OrderNotes.Add(new OrderNote
                    //{
                    //    Note = "Paytm PDT failed. " + response,
                    //    DisplayToCustomer = false,
                    //    CreatedOnUtc = DateTime.UtcNow
                    //});
                    //_orderService.UpdateOrder(order);

                    _orderService.InsertOrderNote(new OrderNote
                    {
                        OrderId           = order.Id,
                        Note              = "Paytm PDT failed. " + response,
                        DisplayToCustomer = false,
                        CreatedOnUtc      = DateTime.UtcNow
                    });
                }
                return(RedirectToAction("Index", "Home", new { area = "" }));
            }
        }
Exemple #5
0
        public ActionResult ReturnOLD(FormCollection form)
        {
            var processor = _paymentService.LoadPaymentMethodBySystemName("Payments.Paytm") as PaytmPaymentProcessor;

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


            var    myUtility = new PaytmHelper();
            string orderId, Amount, AuthDesc, ResCode;
            bool   checkSumMatch = false;

            //Assign following values to send it to verifychecksum function.
            if (String.IsNullOrWhiteSpace(_PaytmPaymentSettings.MerchantKey))
            {
                throw new NopException("Paytm key is not set");
            }

            string workingKey = _PaytmPaymentSettings.MerchantKey;


            Dictionary <string, string> parameters = new Dictionary <string, string>();

            if (Request.Form.AllKeys.Length > 0)
            {
                string paytmChecksum = "";
                foreach (string key in Request.Form.Keys)
                {
                    parameters.Add(key.Trim(), Request.Form[key].Trim());
                }

                if (parameters.ContainsKey("CHECKSUMHASH"))
                {
                    paytmChecksum = parameters["CHECKSUMHASH"];
                    parameters.Remove("CHECKSUMHASH");
                }

                if (CheckSum.verifyCheckSum(workingKey, parameters, paytmChecksum))
                {
                    checkSumMatch = true;
                }
            }

            orderId  = parameters["ORDERID"];
            Amount   = parameters["TXNAMOUNT"];
            ResCode  = parameters["RESPCODE"];
            AuthDesc = parameters["STATUS"];

            if (checkSumMatch == true)
            {
                if (ResCode == "01" && AuthDesc == "TXN_SUCCESS")
                {
                    var order = _orderService.GetOrderById(Convert.ToInt32(orderId));
                    if (_orderProcessingService.CanMarkOrderAsPaid(order))
                    {
                        _orderProcessingService.MarkOrderAsPaid(order);
                    }
                    return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
                }
                else if (AuthDesc == "TXN_FAILURE")
                {
                    return(RedirectToRoute("ShoppingCart"));
                }
                else
                {
                    return(Content("Security Error. Illegal access detected"));
                }
            }
            else
            {
                return(Content("Security Error. Illegal access detected, Checksum failed"));
            }
        }
Exemple #6
0
        public ActionResult Return(FormCollection form)
        {
            var processor = _paymentService.LoadPaymentMethodBySystemName("Payments.Paytm") as PaytmPaymentProcessor;

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


            var    myUtility = new PaytmHelper();
            string orderId, Amount, AuthDesc, ResCode;
            bool   checkSumMatch = false;

            //Assign following values to send it to verifychecksum function.
            if (String.IsNullOrWhiteSpace(_PaytmPaymentSettings.MerchantKey))
            {
                throw new NopException("Paytm key is not set");
            }

            string workingKey = _PaytmPaymentSettings.MerchantKey;


            Dictionary <string, string> parameters = new Dictionary <string, string>();

            if (Request.Form.AllKeys.Length > 0)
            {
                string paytmChecksum = "";
                foreach (string key in Request.Form.Keys)
                {
                    parameters.Add(key.Trim(), Request.Form[key].Trim());
                }

                if (parameters.ContainsKey("CHECKSUMHASH"))
                {
                    paytmChecksum = parameters["CHECKSUMHASH"];
                    parameters.Remove("CHECKSUMHASH");
                }

                if (CheckSum.verifyCheckSum(workingKey, parameters, paytmChecksum))
                {
                    checkSumMatch = true;
                }
            }

            orderId  = parameters["ORDERID"];
            Amount   = parameters["TXNAMOUNT"];
            ResCode  = parameters["RESPCODE"];
            AuthDesc = parameters["STATUS"];

            if (checkSumMatch == true)
            {
                var order = _orderService.GetOrderById(Convert.ToInt32(orderId));
                if (ResCode == "01" && AuthDesc == "TXN_SUCCESS")
                {
                    if (_orderProcessingService.CanMarkOrderAsPaid(order))
                    {
                        _orderProcessingService.MarkOrderAsPaid(order);
                    }
                    return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
                }
                else if (AuthDesc == "TXN_FAILURE")
                {
                    var p = new PayModel();
                    p.RespMsg = parameters["RESPMSG"].ToString();
                    return(View("~/Plugins/Payments.Paytm/Views/PaymentPaytm/Pay.cshtml", p));
                    //Response.Write("<script> $(document).ready(function(){  $(\"#submitButton\").on(\"click\",function() {alert('"+parameters["RESPMSG"].ToString()+"');});});<script>");
                    //alert('@TempData["alertMessage"]');
                    //return  Response.Write(parameters["RESPMSG"].ToString() + "< /br>" + "<a href=\"/Home/Index\">Click here to continue..</a>");
                    //return red
                    //return RedirectToRoute("ShoppingCart");
                    //return Content(parameters["RESPMSG"].ToString() + " < /br>" + "Html.ActionLink(\"Click here to continue..\",\"Index\", \"Home\")");
                    //return RedirectToAction("Index", "Home", new { area = "" });
                }
                else
                {
                    return(Content("Security Error. Illegal access detected"));
                }
            }
            else
            {
                return(Content("Security Error. Illegal access detected, Checksum failed"));
            }
        }
        public ActionResult Return(FormCollection form)
        {
            var processor = _paymentService.LoadPaymentMethodBySystemName("Payments.Paytm") as PaytmPaymentProcessor;
            if (processor == null ||
                !processor.IsPaymentMethodActive(_paymentSettings) || !processor.PluginDescriptor.Installed)
                throw new NopException("Paytm module cannot be loaded");


            var myUtility = new PaytmHelper();
			string orderId,  Amount, AuthDesc, ResCode;
			bool checkSumMatch = false;
            //Assign following values to send it to verifychecksum function.
			if (String.IsNullOrWhiteSpace(_PaytmPaymentSettings.MerchantKey))
                throw new NopException("Paytm key is not set");

			string workingKey = _PaytmPaymentSettings.MerchantKey;
        

			Dictionary<string, string> parameters = new Dictionary<string, string>();
			if (Request.Form.AllKeys.Length > 0)
			{

				string paytmChecksum="";
				foreach (string key in Request.Form.Keys){
					parameters.Add(key.Trim(), Request.Form[key].Trim());
				}

				if(parameters.ContainsKey("CHECKSUMHASH")){
					paytmChecksum = parameters["CHECKSUMHASH"];
					parameters.Remove("CHECKSUMHASH");
				}

				if (CheckSum.verifyCheckSum(workingKey, parameters, paytmChecksum))	{
					checkSumMatch = true;

				}

			}

			orderId = parameters["ORDERID"];
			Amount = parameters["TXNAMOUNT"];
			ResCode = parameters["RESPCODE"];
			AuthDesc = parameters["STATUS"];

            if (checkSumMatch == true)
            {
                var order = _orderService.GetOrderById(Convert.ToInt32(orderId));
                if (ResCode == "01" && AuthDesc == "TXN_SUCCESS")
                {
                    if (_orderProcessingService.CanMarkOrderAsPaid(order))
                    {
                        _orderProcessingService.MarkOrderAsPaid(order);
                    }
                    return RedirectToRoute("CheckoutCompleted", new { orderId = order.Id });
                }
                else if (AuthDesc == "TXN_FAILURE")
                {
                    var p = new PayModel();
                    p.RespMsg = parameters["RESPMSG"].ToString();
                    return View("~/Plugins/Payments.Paytm/Views/PaymentPaytm/Pay.cshtml", p);
                    //Response.Write("<script> $(document).ready(function(){  $(\"#submitButton\").on(\"click\",function() {alert('"+parameters["RESPMSG"].ToString()+"');});});<script>");
                    //alert('@TempData["alertMessage"]');
                    //return  Response.Write(parameters["RESPMSG"].ToString() + "< /br>" + "<a href=\"/Home/Index\">Click here to continue..</a>");
                    //return red
                    //return RedirectToRoute("ShoppingCart");
                    //return Content(parameters["RESPMSG"].ToString() + " < /br>" + "Html.ActionLink(\"Click here to continue..\",\"Index\", \"Home\")");
                    //return RedirectToAction("Index", "Home", new { area = "" });
                }
                else
                {
                    return Content("Security Error. Illegal access detected");
                }
            }
            else
            {
                return Content("Security Error. Illegal access detected, Checksum failed");
            }
        }
        public ActionResult ReturnOLD(FormCollection form)
        {
            var processor = _paymentService.LoadPaymentMethodBySystemName("Payments.Paytm") as PaytmPaymentProcessor;
            if (processor == null ||
                !processor.IsPaymentMethodActive(_paymentSettings) || !processor.PluginDescriptor.Installed)
                throw new NopException("Paytm module cannot be loaded");


            var myUtility = new PaytmHelper();
			string orderId,  Amount, AuthDesc, ResCode;
			bool checkSumMatch = false;
			//Assign following values to send it to verifychecksum function.
			if (String.IsNullOrWhiteSpace(_PaytmPaymentSettings.MerchantKey))
				throw new NopException("Paytm key is not set");

			string workingKey = _PaytmPaymentSettings.MerchantKey;


			Dictionary<string, string> parameters = new Dictionary<string, string>();
			if (Request.Form.AllKeys.Length > 0)
			{

				string paytmChecksum="";
				foreach (string key in Request.Form.Keys){
					parameters.Add(key.Trim(), Request.Form[key].Trim());
				}

				if(parameters.ContainsKey("CHECKSUMHASH")){
					paytmChecksum = parameters["CHECKSUMHASH"];
					parameters.Remove("CHECKSUMHASH");
				}

				if (CheckSum.verifyCheckSum(workingKey, parameters, paytmChecksum))	{
					checkSumMatch = true;

				}

			}

			orderId = parameters["ORDERID"];
			Amount = parameters["TXNAMOUNT"];
			ResCode = parameters["RESPCODE"];
			AuthDesc = parameters["STATUS"];

            if (checkSumMatch == true)
            {
                if (ResCode == "01" && AuthDesc == "TXN_SUCCESS")
                {
                    var order = _orderService.GetOrderById(Convert.ToInt32(orderId));
                    if (_orderProcessingService.CanMarkOrderAsPaid(order))
                    {
                        _orderProcessingService.MarkOrderAsPaid(order);
                    }
                    return RedirectToRoute("CheckoutCompleted", new { orderId = order.Id });
                }
                else if (AuthDesc == "TXN_FAILURE")
                {
                    return RedirectToRoute("ShoppingCart");
                }
                else
                {
                    return Content("Security Error. Illegal access detected");
                }
            }
            else
            {
                return Content("Security Error. Illegal access detected, Checksum failed");
            }
        }
Exemple #9
0
        public async Task <IActionResult> PDTHandler()
        {
            var tx = _webHelper.QueryString <string>("tx");

            if (await _paymentPluginManager.LoadPluginBySystemNameAsync("Payments.Paytm") is not PaytmPaymentProcessor processor || !_paymentPluginManager.IsPluginActive(processor))
            {
                throw new NopException("Paytm module cannot be loaded");
            }

            var(result, values, response) = await processor.GetPdtDetailsAsync(tx);

            if (result)
            {
                values.TryGetValue("custom", out var orderNumber);
                var orderNumberGuid = Guid.Empty;
                try
                {
                    orderNumberGuid = new Guid(orderNumber);
                }
                catch
                {
                    // ignored
                }

                var order = await _orderService.GetOrderByGuidAsync(orderNumberGuid);

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

                var mcGross = decimal.Zero;

                try
                {
                    mcGross = decimal.Parse(values["mc_gross"], new CultureInfo("en-US"));
                }
                catch (Exception exc)
                {
                    await _logger.ErrorAsync("Paytm PDT. Error getting mc_gross", exc);
                }

                values.TryGetValue("payer_status", out var payerStatus);
                values.TryGetValue("payment_status", out var paymentStatus);
                values.TryGetValue("pending_reason", out var pendingReason);
                values.TryGetValue("mc_currency", out var mcCurrency);
                values.TryGetValue("txn_id", out var txnId);
                values.TryGetValue("payment_type", out var paymentType);
                values.TryGetValue("payer_id", out var payerId);
                values.TryGetValue("receiver_id", out var receiverId);
                values.TryGetValue("invoice", out var invoice);
                values.TryGetValue("mc_fee", out var mcFee);

                var sb = new StringBuilder();
                sb.AppendLine("Paytm PDT:");
                sb.AppendLine("mc_gross: " + mcGross);
                sb.AppendLine("Payer status: " + payerStatus);
                sb.AppendLine("Payment status: " + paymentStatus);
                sb.AppendLine("Pending reason: " + pendingReason);
                sb.AppendLine("mc_currency: " + mcCurrency);
                sb.AppendLine("txn_id: " + txnId);
                sb.AppendLine("payment_type: " + paymentType);
                sb.AppendLine("payer_id: " + payerId);
                sb.AppendLine("receiver_id: " + receiverId);
                sb.AppendLine("invoice: " + invoice);
                sb.AppendLine("mc_fee: " + mcFee);

                var newPaymentStatus = PaytmHelper.GetPaymentStatus(paymentStatus, string.Empty);
                sb.AppendLine("New payment status: " + newPaymentStatus);

                //order note
                await _orderService.InsertOrderNoteAsync(new OrderNote
                {
                    OrderId           = order.Id,
                    Note              = sb.ToString(),
                    DisplayToCustomer = false,
                    CreatedOnUtc      = DateTime.UtcNow
                });

                //validate order total
                var orderTotalSentToPaytm = await _genericAttributeService.GetAttributeAsync <decimal?>(order, PaytmHelper.OrderTotalSentToPaytm);

                if (orderTotalSentToPaytm.HasValue && mcGross != orderTotalSentToPaytm.Value)
                {
                    var errorStr = $"Paytm PDT. Returned order total {mcGross} doesn't equal order total {order.OrderTotal}. Order# {order.Id}.";
                    //log
                    await _logger.ErrorAsync(errorStr);

                    //order note
                    await _orderService.InsertOrderNoteAsync(new OrderNote
                    {
                        OrderId           = order.Id,
                        Note              = errorStr,
                        DisplayToCustomer = false,
                        CreatedOnUtc      = DateTime.UtcNow
                    });

                    return(RedirectToAction("Index", "Home", new { area = string.Empty }));
                }

                //clear attribute
                if (orderTotalSentToPaytm.HasValue)
                {
                    await _genericAttributeService.SaveAttributeAsync <decimal?>(order, PaytmHelper.OrderTotalSentToPaytm, null);
                }

                if (newPaymentStatus != PaymentStatus.Paid)
                {
                    return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
                }

                if (!_orderProcessingService.CanMarkOrderAsPaid(order))
                {
                    return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
                }

                //mark order as paid
                order.AuthorizationTransactionId = txnId;
                await _orderService.UpdateOrderAsync(order);

                await _orderProcessingService.MarkOrderAsPaidAsync(order);

                return(RedirectToRoute("CheckoutCompleted", new { orderId = order.Id }));
            }
            else
            {
                if (!values.TryGetValue("custom", out var orderNumber))
                {
                    orderNumber = _webHelper.QueryString <string>("cm");
                }

                var orderNumberGuid = Guid.Empty;

                try
                {
                    orderNumberGuid = new Guid(orderNumber);
                }
                catch
                {
                    // ignored
                }

                var order = await _orderService.GetOrderByGuidAsync(orderNumberGuid);

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

                //order note
                await _orderService.InsertOrderNoteAsync(new OrderNote
                {
                    OrderId           = order.Id,
                    Note              = "Paytm PDT failed. " + response,
                    DisplayToCustomer = false,
                    CreatedOnUtc      = DateTime.UtcNow
                });

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