src/Services/FacebookApiConversion.php line 51

Open in your IDE?
  1. <?php
  2. namespace App\Services;
  3. use App\Entity\Category;
  4. use App\Entity\CompareProduct;
  5. use App\Entity\Language;
  6. use App\Entity\Order;
  7. use App\Entity\OrderProduct;
  8. use Doctrine\ORM\EntityManager;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Doctrine\ORM\EntityRepository;
  11. use phpDocumentor\Reflection\Types\Self_;
  12. use Symfony\Component\DependencyInjection\ContainerInterface;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  16. use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
  17. use Symfony\Component\HttpFoundation\Session\Session;
  18. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  19. use FacebookAds\Api;
  20. use FacebookAds\Logger\CurlLogger;
  21. use FacebookAds\Object\ServerSide\ActionSource;
  22. use FacebookAds\Object\ServerSide\Content;
  23. use FacebookAds\Object\ServerSide\CustomData;
  24. use FacebookAds\Object\ServerSide\DeliveryCategory;
  25. use FacebookAds\Object\ServerSide\Event;
  26. use FacebookAds\Object\ServerSide\EventRequest;
  27. use FacebookAds\Object\ServerSide\UserData;
  28. class FacebookApiConversion
  29. {
  30.     //const PIXEL_ID = '1672124773108240';
  31.     const FB_PURCHASE_EVENT 'Purchase';
  32.     /** @var Session Session */
  33.     protected $session;
  34.     protected $em;
  35.     protected $request;
  36.     protected $container;
  37.     /**
  38.      * CompareManager constructor.
  39.      * @param EntityManager $em
  40.      * @param RequestStack $requestStack
  41.      * @param Session $session
  42.      */
  43.     public function __construct(EntityManagerInterface $emRequestStack $requestStackSessionInterface $sessionContainerInterface $container) {
  44.         $this->session $session;
  45.         $this->em $em;
  46.         $this->request $requestStack->getMasterRequest();
  47.         $this->container $container;
  48.     }
  49.     public function curPageURL() {
  50.         if (!isset($_SERVER["HTTPS"])) {
  51.             return;
  52.         }
  53.         if (!isset($_SERVER["REQUEST_URI"])) {
  54.             return;
  55.         }
  56.         if (!isset($_SERVER["HTTP_HOST"])) {
  57.             return;
  58.         }
  59.         if (!isset($_SERVER["SERVER_PORT"])) {
  60.             return;
  61.         }
  62.         $pageURL 'http';
  63.         if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
  64.         $pageURL .= "://";
  65.         if ($_SERVER["SERVER_PORT"] != "80") {
  66.             $pageURL .= $_SERVER["HTTP_HOST"]."".$_SERVER["REQUEST_URI"];
  67.         } else {
  68.             $pageURL .= $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
  69.         }
  70.         return $pageURL;
  71.     }
  72.     public function createFbEvent($eventNameOrder $order null) {
  73.         $language 'pl';
  74.         if ($this->request->getLocale()) {
  75.             $language strtolower($this->request->getLocale());
  76.         }
  77.         $languageEntity $this->em->getRepository(Language::class)->findOneBy(['locale'=>$language'deletedBy'=>null]);
  78.         if (!$languageEntity) {
  79.             return;
  80.         }
  81.         $access_token $languageEntity->getFbToken();
  82.         $pixel $languageEntity->getFbPixel();
  83.         if (!$access_token) {
  84.             return;
  85.         }
  86.         if (!$pixel) {
  87.             return;
  88.         }
  89.         $url $this->curPageURL();
  90.         $clickId null;
  91.         if ($this->request->query->get('fbclid')) {
  92.             $clickId $this->request->query->get('fbclid');
  93.         }
  94.         $cookies $this->request->cookies->all();
  95.         if ($clickId === null) {
  96.             if ($cookies && isset($cookies['_fbc'])) {
  97.                 $clickId $cookies['_fbc'];
  98.             }
  99.         }
  100.         $fbp null;
  101.         if ($cookies && isset($cookies['_fbp'])) {
  102.             $fbp $cookies['_fbp'];
  103.         }
  104.         $api Api::init(nullnull$access_token);
  105.         $api->setLogger(new CurlLogger());
  106.         $user_data = (new UserData())
  107.             // It is recommended to send Client IP and User Agent for Conversions API Events.
  108.             ->setClientIpAddress($_SERVER['REMOTE_ADDR'])
  109.             ->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
  110.         if ($clickId) {
  111.             $user_data->setFbc($clickId);
  112.         }
  113.         if ($fbp) {
  114.             $user_data->setFbp($fbp);
  115.         }
  116.         if ($this->request->getLocale() != 'pl') {
  117.             $custom_data = new CustomData();
  118.             if ($eventName == 'AddToCart' && $this->request->get('product_id')) {
  119.                 $custom_data->setContentIds([$this->request->get('product_id')]);
  120.                 $custom_data->setContentType('product');
  121.             }
  122.             if ($eventName == 'ViewContent' && $this->request->attributes->get('id')) {
  123.                 $custom_data->setContentIds([$this->request->get('id')]);
  124.                 $custom_data->setContentType('product');
  125.             }
  126.         }
  127.         if ($order) {
  128.             $user_data = (new UserData())
  129.                 ->setEmails(array($order->getEmail()))
  130.                 ->setPhones(array($order->getPhone()))
  131.                 ->setCountryCode(strtoupper($languageEntity->getLocale()))
  132.                 ->setClientIpAddress($_SERVER['REMOTE_ADDR'])
  133.                 ->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
  134.             if ($clickId) {
  135.                 $user_data->setFbc($clickId);
  136.             }
  137.             if ($fbp) {
  138.                 $user_data->setFbp($fbp);
  139.             }
  140.             $contents = [];
  141.             /** @var $orderProduct OrderProduct */
  142.             foreach ($order->getProducts() as $orderProduct) {
  143.                 $productId $orderProduct->getSubProduct() ? $orderProduct->getSubProduct()->getProduct()->getId() : $orderProduct->getProduct()->getId();
  144.                 $contentElement = (new Content())
  145.                     ->setProductId($productId)
  146.                     ->setQuantity($orderProduct->getQuantity())
  147.                     ->setItemPrice($orderProduct->getGrossPrice())
  148.                     ->setDeliveryCategory(DeliveryCategory::HOME_DELIVERY);
  149.                 $contents[] = $contentElement;
  150.             }
  151.             $custom_data = (new CustomData())
  152.                 ->setContents($contents)
  153.                 ->setCurrency($languageEntity->getCurrency()->getIsoCode())
  154.                 ->setOrderId($order->getId())
  155.                 ->setValue($order->getTotalCostBrutto());
  156.         }
  157.         $event = (new Event())
  158.             ->setEventName($eventName)
  159.             ->setEventTime(time())
  160.             ->setEventSourceUrl($url)
  161.             ->setUserData($user_data)
  162.             ->setCustomData($custom_data)
  163.             ->setActionSource(ActionSource::WEBSITE);
  164.         $events = array();
  165.         array_push($events$event);
  166.         $request = (new EventRequest($pixel))
  167.             ->setEvents($events);
  168.         try {
  169.             $response $request->execute();
  170.             return $response;
  171.         } catch (\Exception $e) {
  172.             //
  173.         }
  174.     }
  175. }