Shoora
3/31/2019 - 5:44 PM

ProfitAds.ru - Инструкция по самостоятельной интеграции.

ProfitAds.ru - Инструкция по самостоятельной интеграции.

<?php

class Api {

    private $api_url = "";
    private $api_key;
    private $flow_hash = null;
    private $offer_id;
    private $ip;
    private $user_agent;
    private $referer = "";
    private $uri_params = "";
    private $transit_hash = null;
    private $postclick = 30;
    private $metrika_id = null;
    private $mail_id = null;
    private $google_id = null;
    private $retarg_vk_id = null;
    private $flow_hash_cookie = false;
    private $cookie_path = '/';

    function __construct($api_url, $api_key, $offer_id) {
        // адрес API
        $this->api_url = $api_url;

        // устанавливаем API HASH 
        $this->api_key = $api_key;

        $this->offer_id = $offer_id;
    }

    public function init($cookie_path='/', $flow_hash = '') {
        $this->ip = $_SERVER["REMOTE_ADDR"];
        $this->cookie_path=$cookie_path;
        $this->set_flow_hash($flow_hash);        
    }

    public function set_flow_hash($flow_hash = '') {
        if ($flow_hash == '') {
            if (isset($_COOKIE["flow_hash"]) and ( $_COOKIE["flow_hash"] != '')) {
                $this->flow_hash_cookie = true;
                $this->flow_hash = $_COOKIE["flow_hash"];
            } elseif (isset($_GET["flow_hash"]) and ( $_GET["flow_hash"] != '')) {
                $this->flow_hash = $_GET["flow_hash"];
            } elseif (isset($_POST["flow_hash"]) and ( $_POST["flow_hash"] != '')) {
                $this->flow_hash = $_POST["flow_hash"];
            } else {
                // ищем в урл последнее вхождение подстроки /xxxx/ (http://landing.domen.ru/sdSsE/?data1=1
                $url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
                $url_ar = explode('/', $url);
                $url_ar = array_reverse($url_ar);
                if(strpos($this->cookie_path, $url_ar[1])==false)
                    $this->flow_hash = $url_ar[1];
            }
        } else {
            $this->flow_hash = $flow_hash;
        }
    }

    public function get_flow_hash() {
        return $this->flow_hash;
    }

    public function get_hash() {
        return $this->transit_hash;
    }

    private function setTransitRequestParams() {
        // браузер
        $this->user_agent = $_SERVER['HTTP_USER_AGENT'];

        // определяем реферера
        if (isset($_SERVER["HTTP_REFERER"]) and ( $_SERVER["HTTP_REFERER"] != ''))
            $this->referer = $_SERVER["HTTP_REFERER"];
        else
            $this->referer = '';

        // параметры URI
        $this->uri_params = $_SERVER['REQUEST_URI'];
    }

    public function insert_transit() {
        $this->setTransitRequestParams();

        $data = array(
            'ip' => $this->ip,
            'referer' => $this->referer,
            'user_agent' => $this->user_agent,
            'uri_params' => $this->uri_params
        );

        $result = $this->request('insert_transit', $data);

        $this->setTransitInfo($result);
    }

    private function setTransitInfo($result) {
        $this->transit_hash = $result->transit_hash;

        if (isset($result->postclick))
            $this->postclick = $result->postclick;

        if (isset($result->metrika_id))
            $this->metrika_id = $result->metrika_id;

        if (isset($result->mail_id))
            $this->mail_id = $result->mail_id;

        if (isset($result->google_id))
            $this->google_id = $result->google_id;
        
        if (isset($result->retarg_vk_id))
            $this->retarg_vk_id = $result->retarg_vk_id;        

        if (isset($result->trafficback_url) and ( $result->trafficback_url != '')) {
            header("Location: " . $result->trafficback_url);
        }

        setcookie("hash", $this->transit_hash, time() + 3 * 86400, $this->cookie_path);

        if ($this->flow_hash_cookie == false)
            setcookie("flow_hash", $this->flow_hash, time() + $this->postclick * 86400, $this->cookie_path);
    }

    public function get_metrika_id() {
        if ($this->metrika_id != null)
            return $this->metrika_id;
    }

    public function get_mail_id() {
        if ($this->mail_id != null)
            return $this->mail_id;
    }

    public function get_google_id() {
        if ($this->google_id != null)
            return $this->google_id;
    }
    
    public function get_retarg_vk_id() {
        if ($this->retarg_vk_id != null)
            return $this->retarg_vk_id;
    }        

    private function getTransitHash() {
        if (isset($_COOKIE["hash"]) and ( $_COOKIE["hash"] != ''))
            return $_COOKIE["hash"];
        if (isset($_GET["hash"]) and ( $_GET["hash"] != ''))
            return $_GET["hash"];
        if (isset($_POST["hash"]) and ( $_POST["hash"] != ''))
            return $_POST["hash"];
    }

    public function insert_order($order) {
        $this->transit_hash = $this->getTransitHash();

        $data = array(
            'ip' => $this->ip,
            'transit_hash' => $this->transit_hash,
            'order' => $this->json_encode_cyr($order)
        );

        $result = $this->request('insert_request', $data);

        return 'true';
    }

    private function request($method, $data) {
        if (!$method)
            return false;

        $data['api_key'] = $this->api_key;
        $data['offer_id'] = $this->offer_id;
        $data['flow_hash'] = $this->flow_hash;
        $request_data = http_build_query($data);

        $json = json_decode($this->goCurl($method, $request_data));

        if ($json->status_code != 200) {
            die($json->status_code . ' - ' . $json->status_text);
        }

        return $json->response;
    }

    private function goCurl($url, $data) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->api_url . $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $result = curl_exec($ch);
        //echo curl_error($ch);
        curl_close($ch);
        //print_r($result);
        return $result;
    }

    function json_encode_cyr($str) {
        $arr_replace_utf = array('\u0410', '\u0430', '\u0411', '\u0431', '\u0412', '\u0432',
            '\u0413', '\u0433', '\u0414', '\u0434', '\u0415', '\u0435', '\u0401', '\u0451', '\u0416',
            '\u0436', '\u0417', '\u0437', '\u0418', '\u0438', '\u0419', '\u0439', '\u041a', '\u043a',
            '\u041b', '\u043b', '\u041c', '\u043c', '\u041d', '\u043d', '\u041e', '\u043e', '\u041f',
            '\u043f', '\u0420', '\u0440', '\u0421', '\u0441', '\u0422', '\u0442', '\u0423', '\u0443',
            '\u0424', '\u0444', '\u0425', '\u0445', '\u0426', '\u0446', '\u0427', '\u0447', '\u0428',
            '\u0448', '\u0429', '\u0449', '\u042a', '\u044a', '\u042b', '\u044b', '\u042c', '\u044c',
            '\u042d', '\u044d', '\u042e', '\u044e', '\u042f', '\u044f');
        $arr_replace_cyr = array('А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е',
            'Ё', 'ё', 'Ж', 'ж', 'З', 'з', 'И', 'и', 'Й', 'й', 'К', 'к', 'Л', 'л', 'М', 'м', 'Н', 'н', 'О', 'о',
            'П', 'п', 'Р', 'р', 'С', 'с', 'Т', 'т', 'У', 'у', 'Ф', 'ф', 'Х', 'х', 'Ц', 'ц', 'Ч', 'ч', 'Ш', 'ш',
            'Щ', 'щ', 'Ъ', 'ъ', 'Ы', 'ы', 'Ь', 'ь', 'Э', 'э', 'Ю', 'ю', 'Я', 'я');
        $str1 = json_encode($str);
        $str2 = str_replace($arr_replace_utf, $arr_replace_cyr, $str1);
        return $str2;
    }

    function normalizeTel($tele) {
        $ar_tele = array(' ', '(', ')', '+', '-', '_');
        $tele = str_replace($ar_tele, '', $tele);

        return $tele;
    }

}
--------------------------------------
Установка фиксирующего кода на лендинг
--------------------------------------

0. Перед началом интеграции получите от менеджера сети следующую информацию:

	- Ваш апи-хэш
	- ID Вашего оффера

1. В корневую папку Вашего лендинга положите файл api2.php. Код этого файла Вы можете найти по ссылке:


2. Добавьте в самое начало Вашего лендинга (файл index.php) следующий код, изменив в нем параметры на свои.

--------------------------------------
<?php 
    require_once 'api2.php'; // адрес к файлу api.2php
    
    // устанавливаем путь к API ПП, api-hash рекламодателя и ID оффера
    
	// Пример:
	// $api = new Api("http://profitads.ru/api2/", "Ваш апи-ключ", ID Вашего оффера);
    
    $api = new Api("http://profitads.ru/api2/", "f66801af9d6f556e6742cb577ffceca3", 123456);
	
    // путь для установки cookies ( '/' - если лендинг распложен на http://domen.ru, '/land/' - http://domen.ru/land/
    
	$cookie_path='/land/';
	
    if (isset($_GET['clear_cookies']) and ( $_GET['clear_cookies'] == 1)) {
        $api->clearCookies($cookie_path);
    }
    if(isset($flow_hash))
        $api->init($cookie_path, $flow_hash);
    else
        $api->init($cookie_path);
    if(!isset($form_url))
        
		// Укажите абсолютный адрес скрипта, который обрабатывает заказы с Вашего лендинга 
        // (отправляет на почту, фиксирует в БД, отправляет в CRM и т.п.
        
		$form_url='http://land.clickfat.ru/land/getform.php';
		
		// Укажите абсолютный адрес Вашего лендинга.
		
		$base_url='http://land.clickfat.ru/land/';

		// фиксируем посещение

	$api->insert_transit();
    $metrika_id = $api->get_metrika_id();
    $mail_id = $api->get_mail_id();
    $google_id = $api->get_google_id();
    $retarg_vk_id = $api->get_retarg_vk_id();
?>
--------------------------------------


3. Сразу после открывающего тега "<body>" вставьте следующий код (ничего в нем не изменяйте):


--------------------------------------
<?php if (isset($metrika_id)) : ?>
            <!-- Yandex.Metrika counter -->
            <script type="text/javascript">
                (function (d, w, c) {
                    (w[c] = w[c] || []).push(function () {
                        try {
                            w.yaCounter<?= $metrika_id; ?> = new Ya.Metrika({id:<?= $metrika_id; ?>,
                                clickmap: true,
                                trackLinks: true,
                                accurateTrackBounce: true});
                        } catch (e) {
                        }
                    });

                    var n = d.getElementsByTagName("script")[0],
                            s = d.createElement("script"),
                            f = function () {
                                n.parentNode.insertBefore(s, n);
                            };

                    s.type = "text/javascript";
                    s.async = true;
                    s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js";

                    if (w.opera == "[object Opera]") {
                        d.addEventListener("DOMContentLoaded", f, false);
                    } else {
                        f();
                    }
                })(document, window, "yandex_metrika_callbacks");
            </script>
            <noscript><div><img src="//mc.yandex.ru/watch/<?= $metrika_id; ?>" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
            <!-- /Yandex.Metrika counter -->
        <?php endif; ?>

        <?php if (isset($mail_id)) : ?>
            <!-- Rating@Mail.ru counter -->
            <script type="text/javascript">
                var _tmr = _tmr || [];
                _tmr.push({id: "<?= $mail_id; ?>", type: "pageView", start: (new Date()).getTime()});
                (function (d, w) {
                    var ts = d.createElement("script");
                    ts.type = "text/javascript";
                    ts.async = true;
                    ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";
                    var f = function () {
                        var s = d.getElementsByTagName("script")[0];
                        s.parentNode.insertBefore(ts, s);
                    };
                    if (w.opera == "[object Opera]") {
                        d.addEventListener("DOMContentLoaded", f, false);
                    } else {
                        f();
                    }
                })(document, window);
            </script><noscript><div style="position:absolute;left:-10000px;">
                <img src="//top-fwz1.mail.ru/counter?id=<?= $mail_id; ?>;js=na" style="border:0;" height="1" width="1" alt="Рейтинг@Mail.ru" />
            </div></noscript>
            <!-- //Rating@Mail.ru counter -->
        <?php endif; ?>

        <?php if (isset($google_id)) : ?>
            <!-- Google Analytics -->
            <script>
                (function (i, s, o, g, r, a, m) {
                    i['GoogleAnalyticsObject'] = r;
                    i[r] = i[r] || function () {
                        (i[r].q = i[r].q || []).push(arguments)
                    }, i[r].l = 1 * new Date();
                    a = s.createElement(o),
                            m = s.getElementsByTagName(o)[0];
                    a.async = 1;
                    a.src = g;
                    m.parentNode.insertBefore(a, m)
                })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');

                ga('create', '<?= $google_id ?>', 'auto');
                ga('send', 'pageview');

            </script>
            <!-- End Google Analytics -->
        <?php endif; ?>
            
        <?php if (isset($retarg_vk_id)) : ?>
            <script type="text/javascript">(window.Image ? (new Image()) : document.createElement('img')).src = location.protocol + '//vk.com/rtrg?r=<?= $retarg_vk_id ?>';</script>
        <?php endif; ?>	
--------------------------------------

4. Значение атрибута "action" для всех тегов "<form>" установите равным "<?=$form_url?>".

Получится примерно так:

--------------------------------------
	<form action='<?=$form_url?>' method='post'>
		<input type='text' name='name' value='' placeholder='Введите Ваше имя' required>
		<input type='text' name='phone' value='' placeholder='Введите Ваш телефон' required>
	</form>
--------------------------------------

5. Все пути к ссылкам, css- и js-файлам, а также изображениям в Вашей верстке прописываем в таком виде:

--------------------------------------
Было: 	<link type="text/css" rel="stylesheet" href="css/css.css"  />
Стало: 	<link type="text/css" rel="stylesheet" href="<?=$base_url?>css/css.css"  />

Было: 	<script src="assets/scripts/script.js"></script>
Стало: 	<script src="<?=$base_url?>assets/scripts/script.js"></script>

Было: 	<img src="assets/img/gallery/1_prev.png" alt="">
Стало: 	<img src="<?=$base_url?>assets/img/gallery/1_prev.png" alt="">
--------------------------------------