diff --git a/src/CommandHandler/CapturePayUPaymentRequestHandler.php b/src/CommandHandler/CapturePayUPaymentRequestHandler.php index 2d8080d..017d6f9 100644 --- a/src/CommandHandler/CapturePayUPaymentRequestHandler.php +++ b/src/CommandHandler/CapturePayUPaymentRequestHandler.php @@ -20,19 +20,21 @@ use Sylius\Component\Payment\Model\PaymentRequestInterface; use Sylius\Component\Payment\PaymentRequestTransitions; use Sylius\Component\Payment\PaymentTransitions; +use Sylius\Component\Payment\Repository\PaymentRequestRepositoryInterface; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler(bus: 'sylius.payment_request.command_bus')] -final class CapturePayUPaymentRequestHandler +final readonly class CapturePayUPaymentRequestHandler { public function __construct( - private readonly PaymentRequestProviderInterface $paymentRequestProvider, - private readonly StateMachineInterface $stateMachine, - private readonly EntityManagerInterface $entityManager, - private readonly PayUClientFactoryInterface $payUClientFactory, - private readonly OrderPayloadBuilderInterface $orderPayloadBuilder, - private readonly PayUSignatureVerifierInterface $signatureVerifier, - private readonly LoggerInterface $logger, + private PaymentRequestProviderInterface $paymentRequestProvider, + private StateMachineInterface $stateMachine, + private EntityManagerInterface $entityManager, + private PayUClientFactoryInterface $payUClientFactory, + private OrderPayloadBuilderInterface $orderPayloadBuilder, + private PayUSignatureVerifierInterface $signatureVerifier, + private LoggerInterface $logger, + private PaymentRequestRepositoryInterface $paymentRequestRepository, ) { } @@ -41,6 +43,8 @@ public function __invoke(CapturePayUPaymentRequest $command): void $paymentRequest = $this->paymentRequestProvider->provide($command); if ($paymentRequest->getAction() === PaymentRequestInterface::ACTION_STATUS) { + $this->processStatusAction($paymentRequest); + return; } @@ -60,6 +64,57 @@ public function __invoke(CapturePayUPaymentRequest $command): void $this->createPayUOrder($paymentRequest); } + private function processStatusAction(PaymentRequestInterface $paymentRequest): void + { + /** @var PaymentInterface $payment */ + $payment = $paymentRequest->getPayment(); + + $capturePaymentRequest = $this->paymentRequestRepository->findOneByActionPaymentAndMethod( + PaymentRequestInterface::ACTION_CAPTURE, + $payment, + $paymentRequest->getMethod(), + ); + + if ($capturePaymentRequest === null) { + return; + } + + $payUOrderId = $capturePaymentRequest->getResponseData()['payUOrderId'] ?? null; + + if ($payUOrderId === null) { + return; + } + + /** @var GatewayConfigInterface $gatewayConfig */ + $gatewayConfig = $paymentRequest->getMethod()->getGatewayConfig(); + $config = $gatewayConfig->getConfig(); + + $client = $this->payUClientFactory->createForGatewayConfig($config); + + try { + $statusResponse = $client->getOrderStatus((string) $payUOrderId); + } catch (PayUApiException $exception) { + $this->logger->error('PayU status check on return failed', [ + 'paymentRequestId' => $paymentRequest->getId(), + 'payUOrderId' => $payUOrderId, + 'error' => $exception->getMessage(), + ]); + + return; + } + + $status = $statusResponse->status; + + $this->logger->info('PayU status check on return', [ + 'paymentRequestId' => $paymentRequest->getId(), + 'capturePaymentRequestId' => $capturePaymentRequest->getId(), + 'payUOrderId' => $payUOrderId, + 'status' => $status, + ]); + + $this->applyStatusTransitions($capturePaymentRequest, $payment, $status); + } + private function createPayUOrder(PaymentRequestInterface $paymentRequest): void { /** @var GatewayConfigInterface $gatewayConfig */ @@ -169,6 +224,11 @@ private function processWebhook(PaymentRequestInterface $paymentRequest, array $ /** @var PaymentInterface $payment */ $payment = $paymentRequest->getPayment(); + $this->applyStatusTransitions($paymentRequest, $payment, $status); + } + + private function applyStatusTransitions(PaymentRequestInterface $paymentRequest, PaymentInterface $payment, string $status): void + { if (in_array($status, [PayUGatewayFactory::STATUS_COMPLETED, PayUGatewayFactory::STATUS_WAITING_FOR_CONFIRMATION], true)) { if ($this->stateMachine->can($paymentRequest, PaymentRequestTransitions::GRAPH, PaymentRequestTransitions::TRANSITION_COMPLETE)) { $this->stateMachine->apply($paymentRequest, PaymentRequestTransitions::GRAPH, PaymentRequestTransitions::TRANSITION_COMPLETE); diff --git a/src/Resources/config/services/command_handler.xml b/src/Resources/config/services/command_handler.xml index 60ae4f5..82f92b1 100644 --- a/src/Resources/config/services/command_handler.xml +++ b/src/Resources/config/services/command_handler.xml @@ -5,7 +5,8 @@ + class="BitBag\SyliusPayUPlugin\CommandHandler\CapturePayUPaymentRequestHandler" + > @@ -13,8 +14,9 @@ + + -