API интеграция лендинга с партнёркой LemonAD

API интеграция лендинга с партнёркой LemonAD API интеграции с ПП

Продолжаю формировать глобальную базу интеграций с партнёрскими сетями, и на этот раз расскажу о CPA сети LemonAD.
Сайт: limonadcpa.com

Почему стоит выбрать эту партнёрку:

Плюсы:

  • Адекватные, отзывчивые менеджеры, с которыми легко работать.
  • Высокие ставки на старте – отличный стимул для новых вебмастеров.
  • Ежедневные выплаты без лишних проблем.
  • Широкая выборка гео: от Африки до СНГ – покроют практически любые нужды.

Минус:
Один из немногих неудобных моментов – работа с гарантами. Их можно согласовать только на три дня, и этот срок нужно постоянно продлевать, чтобы не упустить момент. Это может быть хлопотно и легко можно «провтыкать» эти сроки.

В целом, LemonAD – давно зарекомендовавшая себя партнёрка на рынке, с которой не стоит ожидать неприятных сюрпризов.

Настройка API для CPA сети limonadcpa.com

Теперь перейдём к настройке постбеков в Keitaro для партнёрки LemonAD.

Keitaro:

  • Шаблон: Если в Keitaro нет предустановленного шаблона для LemonAD, используйте следующие настройки:
    • Название: LemonAD.com
    • Параметры для оффера: clickid={subid}
    • Postback URL: ВАШ_Домен/postback?subid={clickid}&payout={payout}&status={status}&lead_status=lead&sale_status=sale&rejected_status=rejected,trash&currency=[ISO]&from=LemonAD.com

Партнёрская программа LemonAD:

  • Перейдите в свой профиль и откройте раздел Глобальный постбек и API.
  • В поле Глобальный постбек укажите: ВАШ_Домен/postback?subid={clickid}&payout={payout}&status={status}&lead_status=lead&sale_status=sale&rejected_status=rejected,trash&currency=[ISO]&from=LemonAD.com
  • Статусы:
    • Новые лиды: lead
    • Подтверждённые лиды: sale
    • Треш лиды: rejected
    • Отклонённые лиды: rejected
  • Нажмите «Сохранить», чтобы применить настройки.

Интеграция API на лендинге:

Вставьте в форму на лендинге макрос с clickid, чтобы обеспечить корректную работу постбеков.

                    <form action="api.php" method="post" class="form">
                        <div class="input-group tooltip-hide">
                            <input name="name" type="text" placeholder="Имя" required="">
                        </div>
                        <div class="input-group tooltip-hide">
                            <input name="phone" type="text" placeholder="Телефон" required="">
                        </div>

                        <button type="submit" class="btn btn-order">
                            ПОЛУЧИТЬ
                            <span class="flare"></span>
                        </button>

                        <input name="utm_medium" value="{utm_medium}" type="hidden">
                        <input type="hidden" name="utm_term" value="<?= @$_GET['utm_term'] ?>">
                        <input type="hidden" name="utm_campaign" value="<?= @$_GET['campaign.name'] ?>">
                        <input type='hidden' name='ip' value="{acc}">
                        <input type='hidden' name='userAgent' value="<?= $_GET[' utm_userAgent']; ?>">
                        <input type='hidden' name='utm_source' value="<?= $_GET[' utm_source']; ?>">
                        <input type='hidden' name='acc' value="<?= $_GET[' campaign.name']; ?>">
                        <input type='hidden' name='placement' value="<?= $_GET[' placement']; ?>">
                        <input type='hidden' name='adset' value="<?= $_GET[' ad.name']; ?>">
                        <input type='hidden' name='ad' value="<?= $_GET[' ad.id']; ?>">
                        <input type='hidden' name='clickid' value="{subid}">
                        <input type='hidden' name='sub4' value="<?php echo $_GET['pxl']; ?>">
                        <input type='hidden' name='sid2' value="{acc}">
                        <input type='hidden' name='sid3' value="{adset}">
                        <input type='hidden' name='utm_content' value="{buyer}">
                        <input type='hidden' name='sid5' value="{ev}">

                    </form>

💡 Пример: В форму добавляются значения для сабайди и пикселя, как показано выше.

Объяснение работы api в ПП lemonad

Файл api.php выполняет следующие функции:

  1. Функция для проверки дублирующих лидов:
    • isDuplicateLead($phone): Проверяет, существует ли уже номер телефона в файле leads.txt. Если нет, добавляет номер телефона в файл.
  2. Очистка номера телефона:
    • cleanPhoneNumber($phoneNumber): Очищает телефонный номер от всех символов, кроме цифр.
  3. Основная логика:
    • Проверяется метод запроса. Если запрос не является POST, или отсутствуют необходимые поля (имя и телефон), происходит перенаправление на страницу ошибки.
    • Если данные валидны, создаётся массив с данными лидов (включая имя, телефон, параметры UTM и Click ID), и отправляется POST-запрос на API сервера LemonAD.
  4. Логирование:
    • Функция writeToLog() записывает данные запроса и ответ от сервера в лог-файл.
  5. Обработка ответа API:
    • Если ответ от API не соответствует формату JSON, происходит перенаправление на страницу ошибки.
    • При успешном ответе пользователь перенаправляется на страницу благодарности, а в URL передаются имя, телефон и id FB пикселя.

Описание работы:

  1. Обработка и валидация данных формы:
    • При отправке формы на лендинге файл проверяет валидность данных (имя, телефон) и предотвращает отправку дублирующих лидов.
  2. Отправка данных на сервер LemonAD:
    • Данные лидов отправляются через cURL запрос на указанный API, используя токен вебмастера и ID оффера.
  3. Перенаправление пользователя:
    • В зависимости от результата запроса (успех или ошибка) пользователя перенаправляют либо на страницу ошибки, либо на страницу благодарности с параметрами в URL.
<?php

function isDuplicateLead($phone)
{
    $file = 'leads.txt';

    if (!file_exists($file)) {
        file_put_contents($file, '');
    }

    $leads = file_get_contents($file);
    $escapedPhone = preg_quote($phone, '/');
    $phonePattern = '/' . $escapedPhone . "\n/";

    if (preg_match($phonePattern, $leads)) {
        return true;
    } else {
        file_put_contents($file, $phone . "\n", FILE_APPEND);
        return false;
    }
}

function cleanPhoneNumber($phoneNumber)
{
    return preg_replace('/[^0-9]/', '', $phoneNumber);
}

$cleanedPhone = cleanPhoneNumber($_POST['phone']);

if (isDuplicateLead($cleanedPhone)) {
    header('Location: error.php');
    exit;
}

const API_URL = "https://sendmelead.com/api/v3/lead/add";
const OFFER_ID = 'ID_Оффера';
const WEBMASTER_TOKEN = 'Токен_Вебмастера';
const NAME_FIELD = 'name';
const PHONE_FIELD = 'phone';

$urlForNotPost = 'index.php';
$urlForEmptyRequiredFields = 'error.php';
$urlForNotJson = 'index.php';
$urlSuccess = 'thankyou.php';

function writeToLog(array $data, $response)
{
    $log = date("F j, Y, g:i a") . PHP_EOL .
        "----------- DATA -------------" . PHP_EOL .
        print_r($data, true) . PHP_EOL .
        "----------- RESPONSE ---------" . PHP_EOL .
        $response . PHP_EOL .
        "----------- END --------------" . PHP_EOL;

    file_put_contents('./log_' . date("j.n.Y") . '.log', $log, FILE_APPEND);
}

function getUserIP()
{
    if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
        $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
        $_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
    }
    $client = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote = $_SERVER['REMOTE_ADDR'];

    if (filter_var($client, FILTER_VALIDATE_IP)) {
        $ip = $client;
    } elseif (filter_var($forward, FILTER_VALIDATE_IP)) {
        $ip = $forward;
    } else {
        $ip = $remote;
    }

    return $ip;
}

$isCurlEnabled = function () {
    return function_exists('curl_version');
};

if (!$isCurlEnabled) {
    echo "<pre>";
    echo "pls install curl\n";
    echo "For *unix open terminal and type this:\n";
    echo 'sudo apt-get install curl && apt-get install php-curl';
    die;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (empty($_POST[NAME_FIELD]) || empty($_POST[PHONE_FIELD])) {
        header('Location: ' . $urlForEmptyRequiredFields);
        exit;
    }

    $args = array(
        'name' => $_POST[NAME_FIELD],
        'phone' => $_POST[PHONE_FIELD],
        'flow' => $_POST['flow'],
        'offerId' => OFFER_ID,
        'domain' => "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"],
        'ip' => getUserIp(),
        'utm_campaign' => key_exists('utm_campaign', $_POST) ? $_POST['utm_campaign'] : null,
        'utm_content' => key_exists('utm_content', $_POST) ? $_POST['utm_content'] : null,
        'utm_medium' => $_POST['utm_content'],
        'utm_source' => "Facebook",
        'utm_term' => key_exists('utm_term', $_POST) ? $_POST['utm_term'] : null,
        'clickid' => key_exists('clickid', $_POST) ? $_POST['clickid'] : null,
        'fbpxl' => key_exists('sub4', $_POST) ? $_POST['sub4'] : null,
    );

    $data = json_encode($args);
    $curl = curl_init();
    curl_setopt_array(
        $curl,
        array(
            CURLOPT_URL => API_URL,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $data,
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/json',
                'Content-Length: ' . strlen($data),
                'X-Token: ' . WEBMASTER_TOKEN,
            ),
        )
    );

    $result = curl_exec($curl);
    curl_close($curl);
    writeToLog($args, $result);

    $result = json_decode($result, true);

    if ($result === null) {
        header('Location: ' . $urlForEmptyRequiredFields);
        exit;
    } else {
        $parameters = [
            'fbpxl' => $args['sub4'],
            'fio' => $args['name'],
            'name' => $args['name'],
            'phone' => $args['phone']
        ];

        $urlSuccess .= '?' . http_build_query($parameters);

        header('Location: thankyou.php?name=' . $_POST['name'] . '&phone=' . $_POST['phone'] . '&pxl=' . $_POST['sub4']);
        exit;
    }
}
?>

Не забудьте заменить следующие параметры на свои:

  • const OFFER_ID = ‘ID_Оффера’;
  • const WEBMASTER_TOKEN = ‘Токен_Вебмастера’;

Так же прикрепляю архивом готовый файл api.php для партнерской сети Лимонад

Заходите в ТГ канал BoostClicks, всем удачи)

Оцените статью
BoostClicks