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)); }