src/WellCommerce/Bundle/AppBundle/EventListener/FacebookConversionEventSubscriber.php line 33

Open in your IDE?
  1. <?php
  2. namespace WellCommerce\Bundle\AppBundle\EventListener;
  3. use FacebookAds\Api;
  4. use FacebookAds\Logger\CurlLogger;
  5. use FacebookAds\Object\ServerSide\Event;
  6. use FacebookAds\Object\ServerSide\EventRequest;
  7. use FacebookAds\Object\ServerSide\UserData;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use WellCommerce\Bundle\AppBundle\Entity\Client;
  12. use WellCommerce\Bundle\AppBundle\Entity\Shop;
  13. use WellCommerce\Bundle\CoreBundle\DependencyInjection\AbstractServiceSubscriber;
  14. use WellCommerce\Bundle\OrderBundle\Event\CartAddEvent;
  15. class FacebookConversionEventSubscriber extends AbstractServiceSubscriber implements EventSubscriberInterface
  16. {
  17.     public static function getSubscribedEvents()
  18.     {
  19.         return [
  20.             KernelEvents::CONTROLLER => 'onKernelController',
  21.             CartAddEvent::class      => 'onCartAdd',
  22.         ];
  23.     }
  24.     public function onCartAdd(CartAddEvent $event)
  25.     {
  26.     }
  27.     public function onKernelController(ControllerEvent $event)
  28.     {
  29.         if (false === $event->isMasterRequest()) {
  30.             return;
  31.         }
  32.         if ($this->getSecurityHelper()->isActiveAdminFirewall()) {
  33.             return;
  34.         }
  35.         if ($this->getRequestHelper()->isGraphQLRequest()) {
  36.             return;
  37.         }
  38.         $shop   $this->getShopStorage()->getCurrentShop();
  39.         $client $this->getSecurityHelper()->getCurrentClient();
  40.         if (true === $event->isMasterRequest() && true === $this->isConfigured($shop) && $client instanceof Client) {
  41.             $pixelId $shop->getFacebookPixelIdentifier();
  42.             $api     $this->createApi($shop);
  43.             $events  = [];
  44.             $userData = new UserData();
  45.             $userData->setEmail($client->getContactDetails()->getEmail());
  46.             $userData->setPhone($client->getContactDetails()->getPhone());
  47.             $event = (new Event())
  48.                 ->setEventName("PageView")
  49.                 ->setEventTime(time())
  50.                 ->setUserData($userData);
  51.             array_push($events$event);
  52.             $request = (new EventRequest($pixelId))->setEvents($events);
  53.             try {
  54.                 $response $request->execute();
  55.             } catch (\Exception $exception) {
  56.                 if ($this->getKernel()->isDebug()) {
  57.                     throw $exception;
  58.                 }
  59.             }
  60.         }
  61.     }
  62.     protected function createApi(Shop $shop): Api
  63.     {
  64.         $appId       = !empty($shop->getFacebookConversionAppId()) ? $shop->getFacebookConversionAppId() : null;
  65.         $appSecret   = !empty($shop->getFacebookConversionAppSecret()) ? $shop->getFacebookConversionAppSecret() : null;
  66.         $accessToken $this->getAccessToken($shop);
  67.         Api::init($appId$appSecret$accessToken);
  68.         $api Api::instance();
  69.         $api->setLogger(new CurlLogger());
  70.         return $api;
  71.     }
  72.     protected function isConfigured(Shop $shop): bool
  73.     {
  74.         return
  75.             true === $shop->isFacebookConversionEnabled() &&
  76.             !empty($shop->getFacebookPixelIdentifier());
  77.     }
  78.     protected function getAccessToken(Shop $shop): string
  79.     {
  80.         if (empty($shop->getFacebookConversionAccessToken())) {
  81.             $url sprintf(
  82.                 'https://graph.facebook.com/oauth/access_token?client_id=%s&client_secret=%s&grant_type=client_credentials',
  83.                 $shop->getFacebookConnectAppId(),
  84.                 $shop->getFacebookConnectAppSecret(),
  85.             );
  86.             $client   = new Client();
  87.             $response $client->request('GET'$url);
  88.             $result   json_decode($response->getBody()->getContents());
  89.             if (!empty($result->access_token)) {
  90.                 $shop->setFacebookConversionAccessToken($result->access_token);
  91.                 $this->getEntityManager()->flush();
  92.             }
  93.         }
  94.         return $shop->getFacebookConversionAccessToken();
  95.     }
  96. }