custom/plugins/PayonePayment/src/EventListener/CheckoutConfirmKlarnaPaymentEventListener.php line 45

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace PayonePayment\EventListener;
  4. use PayonePayment\Components\KlarnaSessionService\KlarnaSessionServiceInterface;
  5. use PayonePayment\PaymentHandler\AbstractKlarnaPaymentHandler;
  6. use PayonePayment\Payone\Client\Exception\PayoneRequestException;
  7. use PayonePayment\Storefront\Struct\CheckoutCartPaymentData;
  8. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  9. use Shopware\Storefront\Event\RouteRequest\HandlePaymentMethodRouteRequestEvent;
  10. use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoadedEvent;
  11. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\Session\Session;
  14. use Symfony\Contracts\Translation\TranslatorInterface;
  15. class CheckoutConfirmKlarnaPaymentEventListener implements EventSubscriberInterface
  16. {
  17.     private TranslatorInterface $translator;
  18.     private KlarnaSessionServiceInterface $klarnaSessionService;
  19.     public function __construct(
  20.         TranslatorInterface $translator,
  21.         KlarnaSessionServiceInterface $klarnaSessionService
  22.     ) {
  23.         $this->translator $translator;
  24.         $this->klarnaSessionService $klarnaSessionService;
  25.     }
  26.     public static function getSubscribedEvents(): array
  27.     {
  28.         return [
  29.             CheckoutConfirmPageLoadedEvent::class => ['initiateSession', -20],
  30.             AccountEditOrderPageLoadedEvent::class => ['initiateSession', -20],
  31.             HandlePaymentMethodRouteRequestEvent::class => 'onHandlePaymentMethodRouteRequest',
  32.         ];
  33.     }
  34.     /**
  35.      * @param AccountEditOrderPageLoadedEvent|CheckoutConfirmPageLoadedEvent $event
  36.      */
  37.     public function initiateSession($event): void
  38.     {
  39.         $currentPaymentMethod $event->getSalesChannelContext()->getPaymentMethod();
  40.         if (!$this->isKlarnaPaymentMethod($currentPaymentMethod)) {
  41.             return;
  42.         }
  43.         $order $event instanceof AccountEditOrderPageLoadedEvent $event->getPage()->getOrder() : null;
  44.         try {
  45.             $sessionStruct $this->klarnaSessionService->createKlarnaSession(
  46.                 $event->getSalesChannelContext(),
  47.                 $order $order->getId() : null
  48.             );
  49.             $currentExtension $event->getPage()->getExtension(CheckoutCartPaymentData::EXTENSION_NAME);
  50.             if (!$currentExtension) {
  51.                 throw new PayoneRequestException('Extension not available: ' CheckoutCartPaymentData::EXTENSION_NAME);
  52.             }
  53.             $currentExtension->assign([
  54.                 'klarnaSessionStruct' => $sessionStruct,
  55.                 CheckoutCartPaymentData::DATA_WORK_ORDER_ID => $sessionStruct->getWorkorderId(),
  56.                 CheckoutCartPaymentData::DATA_CART_HASH => $sessionStruct->getCartHash(),
  57.             ]);
  58.         } catch (PayoneRequestException $e) {
  59.             $session $event->getRequest()->getSession();
  60.             if ($session instanceof Session) {
  61.                 $session->getFlashBag()->add(
  62.                     'danger',
  63.                     $this->translator->trans('PayonePayment.errorMessages.canNotInitKlarna')
  64.                 );
  65.             }
  66.         }
  67.     }
  68.     public function onHandlePaymentMethodRouteRequest(HandlePaymentMethodRouteRequestEvent $event): void
  69.     {
  70.         if (!$this->isKlarnaPaymentMethod($event->getSalesChannelContext()->getPaymentMethod())) {
  71.             return;
  72.         }
  73.         // when user is changing the payment method, no custom params will be sent to the payment handler.
  74.         // so we need to transfer the parameters, which are required for the payment handler from the storefront-request to the api-request in the background.
  75.         $paramsToTransfer = ['workorder''carthash''payoneKlarnaAuthorizationToken'];
  76.         foreach ($paramsToTransfer as $key) {
  77.             if ($event->getStorefrontRequest()->request->has($key)) {
  78.                 $event->getStoreApiRequest()->request->set($key$event->getStorefrontRequest()->request->get($key));
  79.             }
  80.         }
  81.     }
  82.     private function isKlarnaPaymentMethod(PaymentMethodEntity $currentPaymentMethod): bool
  83.     {
  84.         return is_subclass_of($currentPaymentMethod->getHandlerIdentifier(), AbstractKlarnaPaymentHandler::class);
  85.     }
  86. }