src/Listener/Logger/PaymentWebhookRequestAndResponseLogEventListener.php line 49

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Listener\Logger;
  4. use App\Payment\PaymentFactory;
  5. use App\Payment\Provider\HyperPay\HyperPayClient;
  6. use App\Service\Payment\PaymentProviderService;
  7. use Psr\Log\LoggerInterface;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpKernel\Event\TerminateEvent;
  10. class PaymentWebhookRequestAndResponseLogEventListener
  11. {
  12.     const ROUTES = [
  13.       '/webhook/payment/status'
  14.     ];
  15.     const HTTP_ERROR_CODES_REGEX '/(^5\\d{2}$)|(^4\\d{2}$)/';
  16.     /**
  17.      * @var LoggerInterface
  18.      */
  19.     private $logger;
  20.     /**
  21.      * @var PaymentFactory
  22.      */
  23.     private $paymentFactory;
  24.     /**
  25.      * @var PaymentProviderService
  26.      */
  27.     private $paymentProviderService;
  28.     public function __construct(
  29.        LoggerInterface $logger,
  30.        PaymentFactory $paymentFactory,
  31.        PaymentProviderService $paymentProviderService
  32.     )
  33.     {
  34.         $this->logger $logger;
  35.         $this->paymentFactory $paymentFactory;
  36.         $this->paymentProviderService $paymentProviderService;
  37.     }
  38.     public function onKernelTerminate(TerminateEvent $event)
  39.     {
  40.         $request $event->getRequest();
  41.         $response $event->getResponse();
  42.         if ($this->checkIfRouteMatchesConfig($request->getRequestUri())) {
  43.             if (preg_match(self::HTTP_ERROR_CODES_REGEX, (string)$response->getStatusCode())) {
  44.                 $this->logger->error('data', [
  45.                     'route' => $request->getMethod() . ' ' $request->getRequestUri(),
  46.                     'status' => $response->getStatusCode(),
  47.                     'request_body' => $request->request->all(),
  48.                     'request_body_decoded' => $this->decodeRequestBody($request),
  49.                     'response' => json_decode($response->getContent(), true),
  50.                     'headers' => $request->headers->all(),
  51.                     'raw_request' => $request->getContent(),
  52.                     'raw_response' => $response->getContent()
  53.                 ]);
  54.             } else {
  55.                 $this->logger->info('data', [
  56.                     'route' => $request->getMethod() . ' ' $request->getRequestUri(),
  57.                     'status' => $response->getStatusCode(),
  58.                     'request_body' => $request->request->all(),
  59.                     'request_body_decoded' => $this->decodeRequestBody($request),
  60.                     'response' => json_decode($response->getContent(), true),
  61.                     'headers' => $request->headers->all(),
  62.                     'raw_request' => $request->getContent(),
  63.                     'raw_response' => $response->getContent()
  64.                 ]);
  65.             }
  66.         }
  67.     }
  68.     private function checkIfRouteMatchesConfig(string $originRoute): bool
  69.     {
  70.         foreach (self::ROUTES as $route) {
  71.             if (strpos($originRoute$route) !== false) {
  72.                 return true;
  73.             }
  74.         }
  75.         return false;
  76.     }
  77.     private function decodeRequestBody(Request $request): string
  78.     {
  79.         $decodedRequestBody '{}';
  80.         switch (true) {
  81.             case (strpos($request->getRequestUri(), 'hyperpay') !== false):
  82.                 /**
  83.                  * @var HyperPayClient $client
  84.                  */
  85.                 $client $this->paymentFactory->get(
  86.                     $this->paymentProviderService->getPaymentProviderServiceIdentifier('hyperpay')
  87.                 );
  88.                 $decodedRequestBody json_encode($client->encodeRequest($request));
  89.                 break;
  90.         }
  91.         return $decodedRequestBody;
  92.     }
  93. }