API интеграция оффера с ПП на движке AlterCPA

API интеграция с ПП на AlterCPA API интеграции с ПП

AlterCPA – широко известный движок на рынке партнерских программ. С AlterCPA работают большое количество ПП в таких сферах, как нутра, гемблинг, крипта и другие.

Ниже приведён небольшой список партнерских программ, использующих данный движок:

Нутра
➡️ CashFactories: cashfactories.com – партнерская программа.
Гео: преимущественно Африка и ЛатАм.
Контакты: @adu86 — Александр.
➡️ SkyLead: skylead.pro – прямой рекламодатель и производитель.
Гео: Европа и ЛатАм.
Контакты: @unstep — Андрей, @amrn77 — Артем.

➡️ OfferStore: offer.store – прямой рекламодатель (ЛатАм) с опцией реселла для регионов: Европа, Америка, Индия, Азия.
Контакты: @Igor_td — Игорь, @dmitriy_offerstore — Дмитрий.

➡️ LeadCore: leadcore.pro/#ru – прямой рекламодатель, производитель, баинг в Украине, а также партнерская программа для всего мира.
Контакты: @levidissss — Влад (овнер), @yurii_advert — Юра (менеджер).

➡️ Monolead: monolead.biz – прямой рекламодатель.
Гео: Восточная и Центральная Европа.
Контакты: @Monolead_account — Руслан.

➡️ AffRocket: my.affrocket.pro – прямой рекламодатель и CPA-сеть.
Гео: Европа/СНГ.
Контакты: @anna_rocket — Анна.

➡️ ManyMoney: manymoney.club/ru – прямой рекламодатель.
Гео: Польша.
Контакты: @antoni_manymoney — Антон, @manager_manymoney — Лиза.

➡️ Dimax: dimax-cpa.ru – прямой рекламодатель.
Гео: РФ, КЗ, РБ.
Контакт: @privetinterpol — Максим.

➡️ X-Men: x-men.pro – прямой рекламодатель.
Гео: СНГ, преимущественно Беларусь, РФ и Казахстан.
Контакты: @DmitriyTroy — Дмитрий.

➡️ ArkNet: arknet.group – прямой рекламодатель.
Гео: Европа.
Контакты: @ceo_arcadius — Андрей.

➡️ ProfitPay: my.profitpay.one – прямой рекламодатель и реселлер.
Гео: Европа.
Контакты: @PavelLushko — Павел, @digi_aleksandra.


Крипта
➡️ StocksCPA: stockscpa.com
Вертикаль: крипта.
Гео: Tier 1/2.
Контакты: @Murat_sherst.
➡️ Indonesians – рекламная сеть.
Вертикаль: крипта, форекс.
Гео: Россия.
Контакты: @vadtmnv.

➡️ LIDSLIVE: lids.live
Вертикаль: крипта, форекс, чарджбек.
Гео: весь мир.
Контакты: @fintp1 — Артем.

➡️ Traffic Culture – медиабаинг.
Вертикаль: FX/Крипта/Чарджи.
Гео: весь мир.
Контакты: @vidas03, @alex_tcult.

➡️ YAD: yadcorp.com
Вертикаль: крипта.
Гео: весь мир.
Контакты: @LeanMe, @jmn_ji.

➡️ MoneyRush – партнерская сеть.
Вертикаль: крипта.
Гео: весь мир.
Контакты: @ramteam_new (Ram team).

➡️ SharkLink: sharklink.org
Вертикаль: крипта.
Гео: весь мир.
Контакты: @SharkLink_Polina — Полина, @Sharklink_web.

Гемблинг / беттинг

➡️ EJex.club: ejex.club – партнерская сеть.
Вертикаль: гемблинг.
Гео: СНГ, Европа, ЛатАм, Азия.
Контакты: @ejex_cpa.


Адалт
➡️ StasyQ: stasyq.online – прямой рекламодатель.
Гео: весь мир.
Контакты: @stasyq_support — Stan.

➡️ AffCoff: affcoff.io – прямой рекламодатель и реселлер.
Гео: весь мир.
Контакты: @Affcoff — Stan.


Белые вертикали и инфобизнес
➡️ Edulid: edulid.com – прямой рекламодатель SP офферов.
Гео: СНГ, WW.
Контакты: @orlovee — Денис, @sanchezzkll — Александр, @lawyer13167 — Максим.

➡️ GGLead: gglead.net – прямой рекламодатель.
Гео: весь мир.
Контакты: @gglead_support — Павел.


Сегодня мы рассмотрим стандартную интеграцию нутра-офферов с партнерскими сетями на AlterCPA. Рассмотрим особенности API-интеграции и ключевые моменты настройки, позволяющие максимально эффективно использовать возможности платформы AlterCPA для работы с офферами в нишах нутра, гемблинга и крипты.

Настройка постбеков в трекере (Keitaro)

Если в вашем трекере отсутствует предустановленный шаблон для AlterCPA, воспользуйтесь следующими настройками:

Шаблон в Keitaro

  • Название: Укажите название вашей партнерской программы.
  • Параметры для оффера:
    subid={subid}
  • Postback URL: ВАШ_Домен/postback?subid={subid}&payout={cash}&status={stage}&lead_status=wait&sale_status=approve&rejected_status=cancel,trash&currency=usd&from=Название_ПП

Настройка партнерской программы на AlterCPA

Чтобы настроить постбек для партнерской программы на AlterCPA, выполните следующие шаги:

  1. Перейдите в раздел Потоки – Постбек.
  2. В поле «Глобальный постбек» укажите следующий URL: ВАШ_Домен/postback?subid={subid}&payout={cash}&status={stage}&lead_status=wait&sale_status=approve&rejected_status=cancel,trash&currency=usd&from=Название_ПП
  3. Отметьте галочками следующие статусы:
    • Ожидает
    • Принят
    • Отмена
    • Треш
  4. Нажмите кнопку «Сохранить», чтобы применить настройки.

Интеграция API на сайте

Для обеспечения корректной работы постбеков необходимо вставить в форму на лендинге макрос с subid и другими параметрами. Пример HTML-кода:

                    <form action="api.php" method="post">
                        <div class="name-input">
                            <label for="name-input">Nombre</label>
                            <input id="name-input" type="text" placeholder="Su nombre" name="name" autocomplete="name"
                                required>
                        </div>
                        <div class="phone-input">
                            <label for="phone-input">Número de teléfono móvil</label>
                            <input id="phone-input" type="tel" placeholder="Su número de teléfono móvil" name="phone"
                                autocomplete="tel" required>
                        </div>
                        <button type="submit" class="button-submit">PEDIR</button>
                        <input type="hidden" name="country" value="ГЕО">
                        <input type="hidden" name="flow" value="ПОТОК">
                        <input type="hidden" name="offer" value="ОФФЕР">
                        <input type="hidden" name="subid" value="{subid}">
                    </form>

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

Настройка API в ПП на AlterCPA

Файл api.php реализует следующие функции:

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

Разбор работы скрипта api.php

Скрипт предназначен для обработки лидов (заявок) с лендинга, выполнения проверки на дублирование, очистки номера телефона и отправки данных на удалённый API. После получения ответа от API происходит перенаправление пользователя на соответствующую страницу.

1. Проверка дублирующихся лидов

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;
    }
}
  • Назначение: Функция isDuplicateLead проверяет, был ли уже зарегистрирован данный номер телефона, чтобы исключить повторные заявки.
  • Алгоритм:
    1. Если файла leads.txt не существует, он создаётся.
    2. Функция читает содержимое файла.
    3. Создаётся регулярное выражение для поиска номера телефона (с экранированием спецсимволов).
    4. Если номер уже присутствует, функция возвращает true. В противном случае, номер дописывается в файл, и функция возвращает false.

2. Очистка номера телефона

function cleanPhoneNumber($phoneNumber)
{
    return preg_replace('/[^0-9]/', '', $phoneNumber);
}
  • Назначение: Функция cleanPhoneNumber удаляет из номера телефона все символы, кроме цифр, что помогает обеспечить корректность передаваемых данных.

3. Основной блок обработки запроса

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

if (isDuplicateLead($cleanedPhone)) {
    header('Location: error.php?name=' . urlencode($_POST['name']) . '&phone=' . urlencode($_POST['phone']));
    exit;
}
  • Проверка:
    • Сначала происходит очистка номера телефона.
    • Затем функция isDuplicateLead проверяет, зарегистрирован ли уже этот номер.
    • Если номер найден (лид дублируется), пользователь перенаправляется на страницу ошибки с передачей имени и телефона через URL.

4. Подготовка данных для отправки на API

$url = 'API_url';
$data = [
    'flow' => $_REQUEST['flow'],
    'offer' => $_REQUEST['offer'],
    'phone' => $_REQUEST['phone'],
    'name' => $_REQUEST['name'],
    'ip' => $_SERVER['REMOTE_ADDR'],
    'subid' => $_REQUEST['subid'],
    'sub1' => $_REQUEST['sub1'],
    'sub2' => $_REQUEST['sub2'],
    'sub3' => $_REQUEST['sub3'],
    'sub4' => $_REQUEST['sub4'],
    'sub5' => $_REQUEST['sub5'],
    'country' => $_REQUEST['country'],
];

$jsonData = json_encode($data);
  • Сбор данных:
    Создаётся массив с информацией о лиде: имя, номер телефона, IP-адрес и дополнительные параметры (например, subid, UTM-метки).
  • Преобразование:
    Данные конвертируются в JSON для отправки на API.

5. Отправка данных через cURL

$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($process, CURLOPT_HEADER, 0);
curl_setopt($process, CURLOPT_USERAGENT, "Mozilla/5.0");
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($process, CURLOPT_TIMEOUT, 20);
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($process, CURLOPT_POST, true);
curl_setopt($process, CURLOPT_POSTFIELDS, $jsonData);

$return = curl_exec($process);
  • Инициализация cURL:
    Устанавливаются параметры запроса:
    • Заголовок Content-Type: application/json.
    • Метод запроса — POST.
    • Данные в формате JSON передаются через CURLOPT_POSTFIELDS.
    • Заданы таймаут, отключена проверка SSL, установлен пользовательский агент.

6. Обработка ответа API и логирование

if ($return === false) {
    echo 'cURL Error: ' . curl_error($process);
} else {
    $arr = json_decode($return, true);
    if (!isset($arr['error'])) {
        header('Location: success.php?name=' . urlencode($_POST['name']) . '&phone=' . urlencode($_POST['phone']));
        exit;
    } else {
        echo $return;
    }
}
curl_close($process);

Если запрос cURL завершается с ошибкой:
Выводится сообщение с ошибкой. Если данные получены:

  • Скрипт пытается декодировать JSON-ответ.
  • Если в ответе нет поля error, считается, что операция успешна, и пользователь перенаправляется на страницу благодарности с передачей имени и телефона.
  • В противном случае выводится ответ API.

Закрытие сессии cURL:
Вызов curl_close($process) завершает работу cURL.


Полный код api.php для altercpa:

<?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?name=' . urlencode($_POST['name']) . '&phone=' . urlencode($_POST['phone']));
    exit;
}

$url = 'API_url';
$data = [
    'flow' => $_REQUEST['flow'],
    'offer' => $_REQUEST['offer'],
    'phone' => $_REQUEST['phone'],
    'name' => $_REQUEST['name'],
    'ip' => $_SERVER['REMOTE_ADDR'],
    'subid' => $_REQUEST['subid'],
    'sub1' => $_REQUEST['sub1'],
    'sub2' => $_REQUEST['sub2'],
    'sub3' => $_REQUEST['sub3'],
    'sub4' => $_REQUEST['sub4'],
    'sub5' => $_REQUEST['sub5'],
    'country' => $_REQUEST['country'],
];

$jsonData = json_encode($data);

$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($process, CURLOPT_HEADER, 0);
curl_setopt($process, CURLOPT_USERAGENT, "Mozilla/5.0");
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($process, CURLOPT_TIMEOUT, 20);
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($process, CURLOPT_POST, true);
curl_setopt($process, CURLOPT_POSTFIELDS, $jsonData);

$return = curl_exec($process);
if ($return === false) {
    echo 'cURL Error: ' . curl_error($process);
} else {
    $arr = json_decode($return, true);
    if (!isset($arr['error'])) {
        header('Location: success.php?name=' . urlencode($_POST['name']) . '&phone=' . urlencode($_POST['phone']));
        exit;
    } else {
        echo $return;
    }
}
curl_close($process);
?>

Так же прикрепляю архивом полный код файла api:

Всем удачи! Жду вас в своем ТГ канале)

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