custom/plugins/SwagPayPal/src/Checkout/SPBCheckout/SPBCheckoutSubscriber.php line 119

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. /*
  3.  * (c) shopware AG <info@shopware.com>
  4.  * For the full copyright and license information, please view the LICENSE
  5.  * file that was distributed with this source code.
  6.  */
  7. namespace Swag\PayPal\Checkout\SPBCheckout;
  8. use Psr\Log\LoggerInterface;
  9. use Shopware\Core\Checkout\Payment\PaymentMethodCollection;
  10. use Shopware\Core\Framework\Context;
  11. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  12. use Shopware\Core\System\SystemConfig\SystemConfigService;
  13. use Shopware\Storefront\Event\RouteRequest\HandlePaymentMethodRouteRequestEvent;
  14. use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoadedEvent;
  15. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  16. use Swag\PayPal\Checkout\ExpressCheckout\SalesChannel\ExpressPrepareCheckoutRoute;
  17. use Swag\PayPal\Checkout\Payment\Handler\AbstractPaymentHandler;
  18. use Swag\PayPal\Checkout\Payment\Handler\EcsSpbHandler;
  19. use Swag\PayPal\Checkout\Payment\PayPalPaymentHandler;
  20. use Swag\PayPal\Checkout\SPBCheckout\Service\SPBCheckoutDataServiceInterface;
  21. use Swag\PayPal\Setting\Exception\PayPalSettingsInvalidException;
  22. use Swag\PayPal\Setting\Service\SettingsValidationServiceInterface;
  23. use Swag\PayPal\Setting\Settings;
  24. use Swag\PayPal\Util\PaymentMethodUtil;
  25. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Session\Session;
  28. use Symfony\Contracts\Translation\TranslatorInterface;
  29. /**
  30.  * @deprecated tag:v5.0.0 - will be removed, unbranded APMs will be introduced in v4.0.0 as replacement
  31.  */
  32. class SPBCheckoutSubscriber implements EventSubscriberInterface
  33. {
  34.     public const PAYPAL_SMART_PAYMENT_BUTTONS_DATA_EXTENSION_ID 'payPalSpbButtonData';
  35.     private SettingsValidationServiceInterface $settingsValidationService;
  36.     private SystemConfigService $systemConfigService;
  37.     private SPBCheckoutDataServiceInterface $spbCheckoutDataService;
  38.     private PaymentMethodUtil $paymentMethodUtil;
  39.     private Session $session;
  40.     private TranslatorInterface $translator;
  41.     private LoggerInterface $logger;
  42.     public function __construct(
  43.         SettingsValidationServiceInterface $settingsValidationService,
  44.         SystemConfigService $systemConfigService,
  45.         SPBCheckoutDataServiceInterface $spbCheckoutDataService,
  46.         PaymentMethodUtil $paymentMethodUtil,
  47.         Session $session,
  48.         TranslatorInterface $translator,
  49.         LoggerInterface $logger
  50.     ) {
  51.         $this->settingsValidationService $settingsValidationService;
  52.         $this->systemConfigService $systemConfigService;
  53.         $this->spbCheckoutDataService $spbCheckoutDataService;
  54.         $this->paymentMethodUtil $paymentMethodUtil;
  55.         $this->session $session;
  56.         $this->translator $translator;
  57.         $this->logger $logger;
  58.     }
  59.     public static function getSubscribedEvents(): array
  60.     {
  61.         return [
  62.             AccountEditOrderPageLoadedEvent::class => 'onAccountOrderEditLoaded',
  63.             CheckoutConfirmPageLoadedEvent::class => 'onCheckoutConfirmLoaded',
  64.             HandlePaymentMethodRouteRequestEvent::class => 'addNecessaryRequestParameter',
  65.         ];
  66.     }
  67.     public function onAccountOrderEditLoaded(AccountEditOrderPageLoadedEvent $event): void
  68.     {
  69.         $request $event->getRequest();
  70.         if (!$this->checkSettings($event->getSalesChannelContext(), $event->getPage()->getPaymentMethods())) {
  71.             return;
  72.         }
  73.         if ($this->addSuccessMessage($request)) {
  74.             $this->logger->debug('Added success message');
  75.             return;
  76.         }
  77.         $this->logger->debug('Adding data');
  78.         $editOrderPage $event->getPage();
  79.         $buttonData $this->spbCheckoutDataService->buildCheckoutData(
  80.             $event->getSalesChannelContext(),
  81.             $editOrderPage->getOrder()->getId()
  82.         );
  83.         $currency $editOrderPage->getOrder()->getCurrency();
  84.         if ($currency === null) {
  85.             $currency $event->getSalesChannelContext()->getCurrency();
  86.         }
  87.         $buttonData->setDisabledAlternativePaymentMethods(
  88.             $this->spbCheckoutDataService->getDisabledAlternativePaymentMethods(
  89.                 $editOrderPage->getOrder()->getAmountTotal(),
  90.                 $currency->getIsoCode()
  91.             )
  92.         );
  93.         $this->changePaymentMethodDescription($editOrderPage->getPaymentMethods(), $event->getContext());
  94.         $editOrderPage->addExtension(self::PAYPAL_SMART_PAYMENT_BUTTONS_DATA_EXTENSION_ID$buttonData);
  95.         $this->logger->debug('Added data');
  96.     }
  97.     public function onCheckoutConfirmLoaded(CheckoutConfirmPageLoadedEvent $event): void
  98.     {
  99.         $request $event->getRequest();
  100.         if (!$this->checkSettings($event->getSalesChannelContext(), $event->getPage()->getPaymentMethods())) {
  101.             return;
  102.         }
  103.         $confirmPage $event->getPage();
  104.         if ($confirmPage->getCart()->getExtension(ExpressPrepareCheckoutRoute::PAYPAL_EXPRESS_CHECKOUT_CART_EXTENSION_ID) !== null) {
  105.             return;
  106.         }
  107.         if ($confirmPage->getCart()->getErrors()->blockOrder()) {
  108.             return;
  109.         }
  110.         if ($this->addSuccessMessage($request)) {
  111.             $this->logger->debug('Added success message');
  112.             return;
  113.         }
  114.         $this->logger->debug('Adding data');
  115.         $buttonData $this->spbCheckoutDataService->buildCheckoutData($event->getSalesChannelContext());
  116.         $buttonData->setDisabledAlternativePaymentMethods(
  117.             $this->spbCheckoutDataService->getDisabledAlternativePaymentMethods(
  118.                 $confirmPage->getCart()->getPrice()->getTotalPrice(),
  119.                 $event->getSalesChannelContext()->getCurrency()->getIsoCode()
  120.             )
  121.         );
  122.         $this->changePaymentMethodDescription($confirmPage->getPaymentMethods(), $event->getContext());
  123.         $confirmPage->addExtension(self::PAYPAL_SMART_PAYMENT_BUTTONS_DATA_EXTENSION_ID$buttonData);
  124.         $this->logger->debug('Added data');
  125.     }
  126.     public function addNecessaryRequestParameter(HandlePaymentMethodRouteRequestEvent $event): void
  127.     {
  128.         $this->logger->debug('Adding request parameter');
  129.         $storefrontRequest $event->getStorefrontRequest();
  130.         $storeApiRequest $event->getStoreApiRequest();
  131.         $originalRoute $storefrontRequest->attributes->get('_route');
  132.         if ($originalRoute !== 'frontend.account.edit-order.update-order') {
  133.             return;
  134.         }
  135.         $storeApiRequest->request->set(
  136.             PayPalPaymentHandler::PAYPAL_SMART_PAYMENT_BUTTONS_ID,
  137.             $storefrontRequest->request->get(PayPalPaymentHandler::PAYPAL_SMART_PAYMENT_BUTTONS_ID)
  138.         );
  139.         $storeApiRequest->request->set(
  140.             AbstractPaymentHandler::PAYPAL_PAYMENT_ORDER_ID_INPUT_NAME,
  141.             $storefrontRequest->request->get(AbstractPaymentHandler::PAYPAL_PAYMENT_ORDER_ID_INPUT_NAME)
  142.         );
  143.         $this->logger->debug('Added request parameter');
  144.     }
  145.     private function checkSettings(SalesChannelContext $salesChannelContextPaymentMethodCollection $paymentMethods): bool
  146.     {
  147.         if (!$this->paymentMethodUtil->isPaypalPaymentMethodInSalesChannel($salesChannelContext$paymentMethods)) {
  148.             return false;
  149.         }
  150.         $salesChannelId $salesChannelContext->getSalesChannelId();
  151.         try {
  152.             $this->settingsValidationService->validate($salesChannelId);
  153.         } catch (PayPalSettingsInvalidException $e) {
  154.             return false;
  155.         }
  156.         if (!$this->systemConfigService->getBool(Settings::SPB_CHECKOUT_ENABLED$salesChannelId)
  157.             || $this->systemConfigService->getString(Settings::MERCHANT_LOCATION$salesChannelId) === Settings::MERCHANT_LOCATION_GERMANY
  158.         ) {
  159.             return false;
  160.         }
  161.         return true;
  162.     }
  163.     private function addSuccessMessage(Request $request): bool
  164.     {
  165.         $requestQuery $request->query;
  166.         if ($requestQuery->has(EcsSpbHandler::PAYPAL_PAYMENT_ORDER_ID_INPUT_NAME)) {
  167.             $this->session->getFlashBag()->add('success'$this->translator->trans('paypal.smartPaymentButtons.confirmPageHint'));
  168.             return true;
  169.         }
  170.         return false;
  171.     }
  172.     private function changePaymentMethodDescription(PaymentMethodCollection $paymentMethodsContext $context): void
  173.     {
  174.         $payPalPaymentMethodId $this->paymentMethodUtil->getPayPalPaymentMethodId($context);
  175.         if ($payPalPaymentMethodId === null) {
  176.             return;
  177.         }
  178.         $paypalPaymentMethod $paymentMethods->get($payPalPaymentMethodId);
  179.         if ($paypalPaymentMethod === null) {
  180.             return;
  181.         }
  182.         $paypalPaymentMethod->addTranslated('description'$this->translator->trans('paypal.smartPaymentButtons.description'));
  183.     }
  184. }