<?php
namespace WellCommerce\Bundle\AppBundle\EventListener;
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequest;
use FacebookAds\Object\ServerSide\UserData;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use WellCommerce\Bundle\AppBundle\Entity\Client;
use WellCommerce\Bundle\AppBundle\Entity\Shop;
use WellCommerce\Bundle\CoreBundle\DependencyInjection\AbstractServiceSubscriber;
use WellCommerce\Bundle\OrderBundle\Event\CartAddEvent;
class FacebookConversionEventSubscriber extends AbstractServiceSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
CartAddEvent::class => 'onCartAdd',
];
}
public function onCartAdd(CartAddEvent $event)
{
}
public function onKernelController(ControllerEvent $event)
{
if (false === $event->isMasterRequest()) {
return;
}
if ($this->getSecurityHelper()->isActiveAdminFirewall()) {
return;
}
if ($this->getRequestHelper()->isGraphQLRequest()) {
return;
}
$shop = $this->getShopStorage()->getCurrentShop();
$client = $this->getSecurityHelper()->getCurrentClient();
if (true === $event->isMasterRequest() && true === $this->isConfigured($shop) && $client instanceof Client) {
$pixelId = $shop->getFacebookPixelIdentifier();
$api = $this->createApi($shop);
$events = [];
$userData = new UserData();
$userData->setEmail($client->getContactDetails()->getEmail());
$userData->setPhone($client->getContactDetails()->getPhone());
$event = (new Event())
->setEventName("PageView")
->setEventTime(time())
->setUserData($userData);
array_push($events, $event);
$request = (new EventRequest($pixelId))->setEvents($events);
try {
$response = $request->execute();
} catch (\Exception $exception) {
if ($this->getKernel()->isDebug()) {
throw $exception;
}
}
}
}
protected function createApi(Shop $shop): Api
{
$appId = !empty($shop->getFacebookConversionAppId()) ? $shop->getFacebookConversionAppId() : null;
$appSecret = !empty($shop->getFacebookConversionAppSecret()) ? $shop->getFacebookConversionAppSecret() : null;
$accessToken = $this->getAccessToken($shop);
Api::init($appId, $appSecret, $accessToken);
$api = Api::instance();
$api->setLogger(new CurlLogger());
return $api;
}
protected function isConfigured(Shop $shop): bool
{
return
true === $shop->isFacebookConversionEnabled() &&
!empty($shop->getFacebookPixelIdentifier());
}
protected function getAccessToken(Shop $shop): string
{
if (empty($shop->getFacebookConversionAccessToken())) {
$url = sprintf(
'https://graph.facebook.com/oauth/access_token?client_id=%s&client_secret=%s&grant_type=client_credentials',
$shop->getFacebookConnectAppId(),
$shop->getFacebookConnectAppSecret(),
);
$client = new Client();
$response = $client->request('GET', $url);
$result = json_decode($response->getBody()->getContents());
if (!empty($result->access_token)) {
$shop->setFacebookConversionAccessToken($result->access_token);
$this->getEntityManager()->flush();
}
}
return $shop->getFacebookConversionAccessToken();
}
}