<?php
declare(strict_types=1);
namespace Abap\PaymentBundle\Handler\NotifyRequest;
use Abap\PaymentBundle\Model\PaymentInterface;
use Aspello\Payum\PayByNet\Handler\NotifyRequestHandler;
use Aspello\Payum\PayByNet\Request\AssertNotifyRequestData;
use Doctrine\Persistence\ManagerRegistry;
use Payum\Core\Payum;
use Payum\Core\Request\GetHttpRequest;
use Payum\Core\Request\Notify;
final class PayByNetNotifyRequestHandler implements NotifyRequestHandlerInterface
{
private Payum $payum;
public function __construct(
Payum $payum
) {
$this->payum = $payum;
}
public function handle(string $gatewayName, string $paymentClass = null): void
{
if (null === $paymentClass) {
throw new \InvalidArgumentException('Payment class must be provided.');
}
$reflectionClass = new \ReflectionClass($paymentClass);
if (!$reflectionClass->implementsInterface(PaymentInterface::class)) {
throw new \InvalidArgumentException("Payment class {$paymentClass} is not supported");
}
$storage = $this->payum->getStorage($paymentClass);
$gateway = $this->payum->getGateway($gatewayName);
$gateway->execute($httpRequest = new GetHttpRequest());
$gateway->execute(new AssertNotifyRequestData($httpRequest));
$result = $storage->findBy(['transactionId' => $httpRequest->request['paymentId']]);
if (empty($result) || !is_array($result)) {
throw new \InvalidArgumentException('Payment not found');
}
/** @var PaymentInterface $payment */
$payment = reset($result);
$previousStatus = $payment->getStatus();
try {
$gateway->execute(new Notify($payment));
} finally {
$newStatus = $payment->getStatus();
if ($previousStatus !== $newStatus) {
$storage->update($payment);
}
}
}
}