custom/plugins/RpayPayments/src/Components/Checkout/Subscriber/PaymentFailedSubscriber.php line 44

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\Checkout\Subscriber;
  10. use Exception;
  11. use Ratepay\RpayPayments\Components\Checkout\Model\Extension\OrderExtension;
  12. use Ratepay\RpayPayments\Components\Checkout\Model\RatepayOrderDataEntity;
  13. use Ratepay\RpayPayments\Components\Logging\Model\ApiRequestLogEntity;
  14. use Ratepay\RpayPayments\Components\RatepayApi\Service\Request\PaymentRequestService;
  15. use Ratepay\RpayPayments\Components\RatepayApi\Util\ResponseConverter;
  16. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  17. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  18. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  19. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. use Symfony\Component\HttpFoundation\Session\Session;
  22. class PaymentFailedSubscriber implements EventSubscriberInterface
  23. {
  24.     private EntityRepository $ratepayApiLogRepository;
  25.     public function __construct(
  26.         EntityRepository $ratepayApiLogRepository
  27.     ) {
  28.         $this->ratepayApiLogRepository $ratepayApiLogRepository;
  29.     }
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [
  33.             CheckoutFinishPageLoadedEvent::class => 'onFinishPage',
  34.         ];
  35.     }
  36.     public function onFinishPage(CheckoutFinishPageLoadedEvent $event): void
  37.     {
  38.         if (!$event->getPage()->isPaymentFailed()) {
  39.             return;
  40.         }
  41.         $order $event->getPage()->getOrder();
  42.         $ratepayData $order->getExtension(OrderExtension::EXTENSION_NAME);
  43.         if ($ratepayData instanceof RatepayOrderDataEntity && !$ratepayData->isSuccessful()) {
  44.             $transactionId $ratepayData->getTransactionId();
  45.             $criteria = new Criteria();
  46.             $criteria->addFilter(new EqualsFilter(ApiRequestLogEntity::FIELD_OPERATION'PAYMENT_REQUEST'));
  47.             $criteria->addFilter(new EqualsFilter(ApiRequestLogEntity::FIELD_ADDITIONAL_DATA '.transactionId'$transactionId));
  48.             $criteria->addFilter(new EqualsFilter(ApiRequestLogEntity::FIELD_ADDITIONAL_DATA '.orderNumber'$order->getOrderNumber()));
  49.             $criteria->setLimit(1);
  50.             $logEntry $this->ratepayApiLogRepository->search($criteria$event->getContext())->first();
  51.             if (!$logEntry instanceof ApiRequestLogEntity) {
  52.                 // log entry was not found.
  53.                 return;
  54.             }
  55.             try {
  56.                 $response ResponseConverter::getResponseObjectByXml(
  57.                     PaymentRequestService::CALL_PAYMENT_REQUEST,
  58.                     $logEntry->getResponse()
  59.                 );
  60.             } catch (Exception $exception) {
  61.                 // response can not be converted.
  62.                 return;
  63.             }
  64.             $session $event->getRequest()->getSession();
  65.             if ($session instanceof Session) {
  66.                 $message null;
  67.                 if (method_exists($response'getCustomerMessage')) {
  68.                     $message $response->getCustomerMessage();
  69.                 }
  70.                 $session->getFlashBag()->add('danger', !empty($message) ? $message $response->getResultMessage());
  71.             }
  72.         }
  73.     }
  74. }