示例#1
0
        public ActionResult PaymentWall()
        {
            var sb       = new StringBuilder();
            var store    = Services.StoreContext.CurrentStore;
            var customer = Services.WorkContext.CurrentCustomer;
            var language = Services.WorkContext.WorkingLanguage;
            var settings = Services.Settings.LoadSetting <PayPalPlusPaymentSettings>(store.Id);
            var cart     = customer.GetCartItems(ShoppingCartType.ShoppingCart, store.Id);

            var pppMethod   = _paymentService.GetPaymentMethodBySystemName(PayPalPlusProvider.SystemName);
            var pppProvider = _paymentService.LoadPaymentMethodBySystemName(PayPalPlusProvider.SystemName, false, store.Id);

            var methods           = _paymentService.LoadActivePaymentMethods(customer, cart, store.Id, null, false);
            var session           = _httpContext.GetPayPalState(PayPalPlusProvider.SystemName);
            var redirectToConfirm = false;

            var model = new PayPalPlusCheckoutModel();

            model.ThirdPartyPaymentMethods = new List <PayPalPlusCheckoutModel.ThirdPartyPaymentMethod>();
            model.UseSandbox                  = settings.UseSandbox;
            model.LanguageCulture             = (language.LanguageCulture ?? "de_DE").Replace("-", "_");
            model.PayPalPlusPseudoMessageFlag = TempData["PayPalPlusPseudoMessageFlag"] as string;
            model.PayPalFee  = GetPaymentFee(pppProvider, cart);
            model.HasAnyFees = model.PayPalFee.HasValue();

            if (pppMethod != null)
            {
                model.FullDescription = pppMethod.GetLocalized(x => x.FullDescription, language);
            }

            if (customer.BillingAddress != null && customer.BillingAddress.Country != null)
            {
                model.BillingAddressCountryCode = customer.BillingAddress.Country.TwoLetterIsoCode;
            }

            foreach (var systemName in settings.ThirdPartyPaymentMethods)
            {
                var provider = methods.FirstOrDefault(x => x.Metadata.SystemName == systemName);
                if (provider != null)
                {
                    var methodModel = GetThirdPartyPaymentMethodModel(provider, settings, store);
                    model.ThirdPartyPaymentMethods.Add(methodModel);

                    var fee = GetPaymentFee(provider, cart);
                    if (fee.HasValue())
                    {
                        model.HasAnyFees = true;
                    }
                    if (sb.Length > 0)
                    {
                        sb.Append(", ");
                    }
                    sb.AppendFormat("['{0}','{1}']", methodModel.MethodName.Replace("'", ""), fee);
                }
            }

            model.ThirdPartyFees = sb.ToString();

            // We must create a new paypal payment each time the payment wall is rendered because otherwise patch payment can fail
            // with "Item amount must add up to specified amount subtotal (or total if amount details not specified)".
            session.PaymentId   = null;
            session.ApprovalUrl = null;

            var result = PayPalService.EnsureAccessToken(session, settings);

            if (result.Success)
            {
                var protocol  = store.SslEnabled ? "https" : "http";
                var returnUrl = Url.Action("CheckoutReturn", "PayPalPlus", new { area = Plugin.SystemName }, protocol);
                var cancelUrl = Url.Action("CheckoutCancel", "PayPalPlus", new { area = Plugin.SystemName }, protocol);

                var paymentData = PayPalService.CreatePaymentData(settings, session, cart, returnUrl, cancelUrl);

                result = PayPalService.CreatePayment(settings, session, paymentData);
                if (result == null)
                {
                    // No payment required.
                    redirectToConfirm = true;
                }
                else if (result.Success && result.Json != null)
                {
                    foreach (var link in result.Json.links)
                    {
                        if (((string)link.rel).IsCaseInsensitiveEqual("approval_url"))
                        {
                            session.PaymentId   = result.Id;
                            session.ApprovalUrl = link.href;
                            break;
                        }
                    }
                }
                else
                {
                    model.ErrorMessage = result.ErrorMessage;
                }
            }
            else
            {
                model.ErrorMessage = result.ErrorMessage;
            }

            model.ApprovalUrl = session.ApprovalUrl;

            // There have been cases where the token was lost for unexplained reasons, so it is additionally stored in the database.
            var sessionData = session.AccessToken.HasValue() && session.PaymentId.HasValue()
                ? JsonConvert.SerializeObject(session)
                : null;

            _genericAttributeService.SaveAttribute(customer, PayPalPlusProvider.SystemName + ".SessionData", sessionData, store.Id);

            if (redirectToConfirm)
            {
                return(RedirectToAction("Confirm", "Checkout", new { area = "" }));
            }

            if (session.SessionExpired)
            {
                // Customer has been redirected because the session expired.
                session.SessionExpired = false;
                NotifyInfo(T("Plugins.SmartStore.PayPal.SessionExpired"));
            }

            return(View(model));
        }
        public ActionResult PaymentWall()
        {
            var sb       = new StringBuilder();
            var store    = Services.StoreContext.CurrentStore;
            var customer = Services.WorkContext.CurrentCustomer;
            var language = Services.WorkContext.WorkingLanguage;
            var settings = Services.Settings.LoadSetting <PayPalPlusPaymentSettings>(store.Id);
            var cart     = customer.GetCartItems(ShoppingCartType.ShoppingCart, store.Id);

            var pppMethod   = _paymentService.GetPaymentMethodBySystemName(PayPalPlusProvider.SystemName);
            var pppProvider = _paymentService.LoadPaymentMethodBySystemName(PayPalPlusProvider.SystemName, false, store.Id);

            var methods = _paymentService.LoadActivePaymentMethods(customer, cart, store.Id, null, false);
            var session = _httpContext.GetPayPalSessionData();

            var model = new PayPalPlusCheckoutModel();

            model.ThirdPartyPaymentMethods = new List <PayPalPlusCheckoutModel.ThirdPartyPaymentMethod>();
            model.UseSandbox                  = settings.UseSandbox;
            model.LanguageCulture             = (language.LanguageCulture ?? "de_DE").Replace("-", "_");
            model.PayPalPlusPseudoMessageFlag = TempData["PayPalPlusPseudoMessageFlag"] as string;
            model.PayPalFee  = GetPaymentFee(pppProvider, cart);
            model.HasAnyFees = model.PayPalFee.HasValue();

            if (pppMethod != null)
            {
                model.FullDescription = pppMethod.GetLocalized(x => x.FullDescription, language.Id);
            }

            if (customer.BillingAddress != null && customer.BillingAddress.Country != null)
            {
                model.BillingAddressCountryCode = customer.BillingAddress.Country.TwoLetterIsoCode;
            }

            foreach (var systemName in settings.ThirdPartyPaymentMethods)
            {
                var provider = methods.FirstOrDefault(x => x.Metadata.SystemName == systemName);
                if (provider != null)
                {
                    var methodModel = GetThirdPartyPaymentMethodModel(provider, settings, store);
                    model.ThirdPartyPaymentMethods.Add(methodModel);

                    var fee = GetPaymentFee(provider, cart);
                    if (fee.HasValue())
                    {
                        model.HasAnyFees = true;
                    }
                    if (sb.Length > 0)
                    {
                        sb.Append(", ");
                    }
                    sb.AppendFormat("['{0}','{1}']", methodModel.MethodName.Replace("'", ""), fee);
                }
            }

            model.ThirdPartyFees = sb.ToString();

            if (session.PaymentId.IsEmpty() || session.ApprovalUrl.IsEmpty())
            {
                var result = PayPalService.EnsureAccessToken(session, settings);
                if (result.Success)
                {
                    var protocol  = (store.SslEnabled ? "https" : "http");
                    var returnUrl = Url.Action("CheckoutReturn", "PayPalPlus", new { area = Plugin.SystemName }, protocol);
                    var cancelUrl = Url.Action("CheckoutCancel", "PayPalPlus", new { area = Plugin.SystemName }, protocol);

                    result = PayPalService.CreatePayment(settings, session, cart, PayPalPlusProvider.SystemName, returnUrl, cancelUrl);
                    if (result.Success && result.Json != null)
                    {
                        foreach (var link in result.Json.links)
                        {
                            if (((string)link.rel).IsCaseInsensitiveEqual("approval_url"))
                            {
                                session.PaymentId   = result.Id;
                                session.ApprovalUrl = link.href;
                                break;
                            }
                        }
                    }
                    else
                    {
                        model.ErrorMessage = result.ErrorMessage;
                    }
                }
                else
                {
                    model.ErrorMessage = result.ErrorMessage;
                }
            }

            model.ApprovalUrl = session.ApprovalUrl;

            return(View(model));
        }