custom/plugins/RpayPayments/src/Components/CreditworthinessPreCheck/Subscriber/AccountSubscriber.php line 59

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * Copyright (c) Ratepay GmbH
  5.  *
  6.  * For the full copyright and license information, please view the LICENSE
  7.  * file that was distributed with this source code.
  8.  */
  9. namespace Ratepay\RpayPayments\Components\CreditworthinessPreCheck\Subscriber;
  10. use RatePAY\Model\Response\PaymentQuery;
  11. use Ratepay\RpayPayments\Components\Account\Event\PaymentUpdateRequestBagValidatedEvent;
  12. use Ratepay\RpayPayments\Components\CreditworthinessPreCheck\Dto\PaymentQueryData;
  13. use Ratepay\RpayPayments\Components\CreditworthinessPreCheck\Service\Request\PaymentQueryService;
  14. use Ratepay\RpayPayments\Components\PaymentHandler\AbstractPaymentHandler;
  15. use Ratepay\RpayPayments\Components\PluginConfig\Service\ConfigService;
  16. use Ratepay\RpayPayments\Components\RedirectException\Exception\ForwardException;
  17. use Ratepay\RpayPayments\Exception\RatepayException;
  18. use Shopware\Core\Checkout\Cart\Order\OrderConverter;
  19. use Shopware\Core\Checkout\Order\OrderEntity;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. use Symfony\Contracts\Translation\TranslatorInterface;
  22. class AccountSubscriber implements EventSubscriberInterface
  23. {
  24.     private PaymentQueryService $paymentQueryService;
  25.     private OrderConverter $orderConverter;
  26.     private TranslatorInterface $translator;
  27.     private ConfigService $configService;
  28.     public function __construct(
  29.         TranslatorInterface $translator,
  30.         PaymentQueryService $paymentQueryService,
  31.         OrderConverter $orderConverter,
  32.         ConfigService $configService
  33.     ) {
  34.         $this->translator $translator;
  35.         $this->paymentQueryService $paymentQueryService;
  36.         $this->orderConverter $orderConverter;
  37.         $this->configService $configService;
  38.     }
  39.     public static function getSubscribedEvents(): array
  40.     {
  41.         return [
  42.             PaymentUpdateRequestBagValidatedEvent::class => 'onRequestDataValidated',
  43.         ];
  44.     }
  45.     /**
  46.      * @throws ForwardException
  47.      */
  48.     public function onRequestDataValidated(PaymentUpdateRequestBagValidatedEvent $event): void
  49.     {
  50.         try {
  51.             $paymentQuery $this->paymentQueryService->doRequest(new PaymentQueryData(
  52.                 $event->getSalesChannelContext(),
  53.                 $this->orderConverter->convertToCart($event->getOrderEntity(), $event->getContext()),
  54.                 $event->getRequestDataBag(),
  55.                 $event->getRequestDataBag()->get('ratepay')->get('transactionId'),
  56.                 $this->configService->isSendDiscountsAsCartItem(),
  57.                 $this->configService->isSendShippingCostsAsCartItem()
  58.             ));
  59.             $response $paymentQuery->getResponse();
  60.             if ($response instanceof PaymentQuery && $response->getStatusCode() === 'OK') {
  61.                 if (!in_array($event->getPaymentHandler()::getRatepayPaymentMethodName(), $response->getAdmittedPaymentMethods(), true)) {
  62.                     throw $this->createException(
  63.                         $event->getOrderEntity(),
  64.                         $this->translator->trans('error.' AbstractPaymentHandler::ERROR_SNIPPET_VIOLATION_PREFIX CheckoutValidationSubscriber::CODE_METHOD_NOT_AVAILABLE)
  65.                     );
  66.                 }
  67.             } else {
  68.                 throw $this->createException(
  69.                     $event->getOrderEntity(),
  70.                     (string) $response->getReasonMessage()
  71.                 );
  72.             }
  73.         } catch (RatepayException $ratepayException) {
  74.             throw $this->createException(
  75.                 $event->getOrderEntity(),
  76.                 $ratepayException->getMessage()
  77.             );
  78.         }
  79.     }
  80.     private function createException(OrderEntity $orderEntity, ?string $message): ForwardException
  81.     {
  82.         return (new ForwardException(
  83.             'frontend.account.edit-order.page',
  84.             [
  85.                 'orderId' => $orderEntity->getId(),
  86.             ],
  87.             [
  88.                 'ratepay-errors' => [$message],
  89.             ]
  90.         )
  91.         )->setCustomerMessage($message);
  92.     }
  93. }