vendor/shopware/core/Checkout/Payment/Controller/PaymentController.php line 37

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Checkout\Payment\Controller;
  3. use Shopware\Core\Checkout\Cart\Order\OrderConverter;
  4. use Shopware\Core\Checkout\Order\OrderEntity;
  5. use Shopware\Core\Checkout\Payment\Cart\Token\TokenFactoryInterfaceV2;
  6. use Shopware\Core\Checkout\Payment\Cart\Token\TokenStruct;
  7. use Shopware\Core\Checkout\Payment\Exception\InvalidTokenException;
  8. use Shopware\Core\Checkout\Payment\PaymentService;
  9. use Shopware\Core\Framework\Context;
  10. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  13. use Shopware\Core\Framework\Log\Package;
  14. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  15. use Shopware\Core\Framework\ShopwareException;
  16. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\RedirectResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. #[Package('checkout')]
  24. class PaymentController extends AbstractController
  25. {
  26.     /**
  27.      * @internal
  28.      */
  29.     public function __construct(private readonly PaymentService $paymentService, private readonly OrderConverter $orderConverter, private readonly TokenFactoryInterfaceV2 $tokenFactoryInterfaceV2, private readonly EntityRepository $orderRepository)
  30.     {
  31.     }
  32.     #[Route(path'/payment/finalize-transaction'name'payment.finalize.transaction'methods: ['GET''POST'])]
  33.     public function finalizeTransaction(Request $request): Response
  34.     {
  35.         $paymentToken $request->get('_sw_payment_token');
  36.         if ($paymentToken === null) {
  37.             throw new MissingRequestParameterException('_sw_payment_token');
  38.         }
  39.         $salesChannelContext $this->assembleSalesChannelContext($paymentToken);
  40.         $result $this->paymentService->finalizeTransaction(
  41.             $paymentToken,
  42.             $request,
  43.             $salesChannelContext
  44.         );
  45.         $response $this->handleException($result);
  46.         if ($response !== null) {
  47.             return $response;
  48.         }
  49.         $finishUrl $result->getFinishUrl();
  50.         if ($finishUrl) {
  51.             return new RedirectResponse($finishUrl);
  52.         }
  53.         return new JsonResponse(nullResponse::HTTP_NO_CONTENT);
  54.     }
  55.     private function handleException(TokenStruct $token): ?Response
  56.     {
  57.         if ($token->getException() === null) {
  58.             return null;
  59.         }
  60.         if ($token->getErrorUrl() === null) {
  61.             return null;
  62.         }
  63.         $url $token->getErrorUrl();
  64.         $exception $token->getException();
  65.         if ($exception instanceof ShopwareException) {
  66.             return new RedirectResponse(
  67.                 $url . (parse_url($url\PHP_URL_QUERY) ? '&' '?') . 'error-code=' $exception->getErrorCode()
  68.             );
  69.         }
  70.         return new RedirectResponse($url);
  71.     }
  72.     private function assembleSalesChannelContext(string $paymentToken): SalesChannelContext
  73.     {
  74.         $context Context::createDefaultContext();
  75.         $transactionId $this->tokenFactoryInterfaceV2->parseToken($paymentToken)->getTransactionId();
  76.         if ($transactionId === null) {
  77.             throw new InvalidTokenException($paymentToken);
  78.         }
  79.         $criteria = new Criteria();
  80.         $criteria->addFilter(new EqualsFilter('transactions.id'$transactionId));
  81.         $criteria->addAssociation('transactions');
  82.         $criteria->addAssociation('orderCustomer');
  83.         /** @var OrderEntity|null $order */
  84.         $order $this->orderRepository->search($criteria$context)->first();
  85.         if ($order === null) {
  86.             throw new InvalidTokenException($paymentToken);
  87.         }
  88.         return $this->orderConverter->assembleSalesChannelContext($order$context);
  89.     }
  90. }