예제 #1
0
        public ActionResult PDTHandler(FormCollection form)
        {
            Dictionary <string, string> values;
            var    tx              = Services.WebHelper.QueryString <string>("tx");
            var    utcNow          = DateTime.UtcNow;
            var    orderNumberGuid = Guid.Empty;
            var    orderNumber     = string.Empty;
            var    total           = decimal.Zero;
            string response;

            var provider  = PaymentService.LoadPaymentMethodBySystemName(PayPalStandardProvider.SystemName, true);
            var processor = provider != null ? provider.Value as PayPalStandardProvider : null;

            if (processor == null)
            {
                Logger.Warn(null, T("Plugins.Payments.PayPal.NoModuleLoading", "PDTHandler"));
                return(RedirectToAction("Completed", "Checkout", new { area = "" }));
            }

            var settings = Services.Settings.LoadSetting <PayPalStandardPaymentSettings>();

            if (processor.GetPDTDetails(tx, settings, out values, out response))
            {
                values.TryGetValue("custom", out orderNumber);

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

                var order = OrderService.GetOrderByGuid(orderNumberGuid);

                if (order != null)
                {
                    try
                    {
                        total = decimal.Parse(values["mc_gross"], new CultureInfo("en-US"));
                    }
                    catch (Exception ex)
                    {
                        Logger.Error(ex, T("Plugins.Payments.PayPalStandard.FailedGetGross"));
                    }

                    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 paymentNote = T("Plugins.Payments.PayPalStandard.PaymentNote",
                                        total, mc_currency, payer_status, payment_status, pending_reason, txn_id, payment_type, payer_id, receiver_id, invoice, payment_fee);

                    OrderService.AddOrderNote(order, paymentNote);

                    // validate order total... you may get differences if settings.PassProductNamesAndTotals is true
                    if (settings.PdtValidateOrderTotal)
                    {
                        var roundedTotal      = Math.Round(total, 2);
                        var roundedOrderTotal = Math.Round(order.OrderTotal, 2);
                        var roundedDifference = Math.Abs(roundedTotal - roundedOrderTotal);

                        if (!roundedTotal.Equals(roundedOrderTotal))
                        {
                            var message = T("Plugins.Payments.PayPalStandard.UnequalTotalOrder",
                                            total, roundedOrderTotal.FormatInvariant(), order.OrderTotal, roundedDifference.FormatInvariant());

                            if (settings.PdtValidateOnlyWarn)
                            {
                                OrderService.AddOrderNote(order, message);
                            }
                            else
                            {
                                Logger.Error(message);

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

                    // mark order as paid
                    var newPaymentStatus = GetPaymentStatus(payment_status, pending_reason, total, order.OrderTotal);

                    if (newPaymentStatus == PaymentStatus.Paid)
                    {
                        // note, order can be marked as paid through IPN
                        if (order.AuthorizationTransactionId.IsEmpty())
                        {
                            order.AuthorizationTransactionId     = order.CaptureTransactionId = txn_id;
                            order.AuthorizationTransactionResult = order.CaptureTransactionResult = "Success";

                            OrderService.UpdateOrder(order);
                        }

                        if (OrderProcessingService.CanMarkOrderAsPaid(order))
                        {
                            OrderProcessingService.MarkOrderAsPaid(order);
                        }
                    }
                }

                return(RedirectToAction("Completed", "Checkout", new { area = "" }));
            }
            else
            {
                try
                {
                    values.TryGetValue("custom", out orderNumber);
                    orderNumberGuid = new Guid(orderNumber);

                    var order = OrderService.GetOrderByGuid(orderNumberGuid);
                    OrderService.AddOrderNote(order, "{0} {1}".FormatInvariant(T("Plugins.Payments.PayPalStandard.PdtFailed"), response));
                }
                catch { }

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