Реферальная программа — вид сотрудничества между клиентом и провайдером, при котором клиент получает реферальную ссылку или промокод. Такой клиент считается партнёром или реферером, а новые клиенты, которые зарегистрировались по этой ссылке (промокоду), — рефералами. Партнёр получает процент от расходов своих рефералов.
По промокоду можно привязать только нового клиента, у которого нет услуг.
Результаты реферальной программы:
партнёр получает прибыль за счёт привлечённых клиентов;
провайдер получает новых клиентов и рекламу силами партнёра.
Чтобы настроить интеграцию реферальной программы с сайтом, при создании реферальной программы укажите URLсайта в настройках:
если URL сайта — это адрес BILLmanager, дополнительных действий не требуется. Платформа будет автоматически извлекать значение параметра из запроса и регистрировать переход по реферальной ссылке;
если URL — сторонний сайт, со стороны сайта выполните запрос к платформе следующего вида:
func=referralprogram.registerclick — функция, регистрирующая переход по реферальной ссылке;
&p=адрес_сайта
— URL-кодированная ссылка, по которой перешёл клиент. Специальные символы должны быть заменены на коды в соответствии с процентным кодированием. Процентное кодирование (или URL-кодирование) — способ безопасно передавать специальные символы в ссылках (URL). Например, для URL
https://site.com/?from=2
укажите &p=https%3A%2F%2Fsite.com%2F%3Ffrom%3D2. Этот адрес указан в личном кабинете реферера и предоставляется им потенциальным рефералам;
Значение параметра p должно точно соответствовать ссылке, указанной в настройках реферальной программы — поле URL сайта, иначе переход не будет зарегистрирован. Например, если программа настроена на корень домена https://example.ru/, а в параметре передаётся адрес с путём .../catalog/. Для универсальной настройки рекомендуется нормализовать адрес: оставьте только протокол и домен, удаляя путь и параметры.
out=xjson — формат ответа.
Платформа регистрирует переход и возвращает уникальный идентификатор в поле doc["cntid"]["$"] JSON-ответа. Полученный идентификатор сохраняется на стороне сайта и передаётся параметром при последующем редиректе в BILLmanager.
Пример с нормализацией
Пример HTML-страницы с интеграцией реферальной программы и кнопкой перехода в BILLmanager:
<html>
<head>
<script type="text/javascript">
function getBillCntid() {
var req = new XMLHttpRequest();
req.responseType = 'json';
req.onload = function() {
if (req.status == 200) {
var json = req.response;
var doc = json.doc;
if (doc["cntid"]) {
// Сохранение cntid в localStorage
localStorage.setItem("bill_cntid", doc["cntid"]["$"]);
}
}
}
// Формирование адреса для параметра p
var referralParam;
// Нормализация ссылки: оставляем только протокол и домен
// Это гарантирует совпадение с настройками реферальной программы,
// даже если пользователь перешёл на страницу с путём (например, /catalog/)
if (typeof URL === "function") {
var urlObj = new URL(window.location.href);
urlObj.pathname = "/"; // сбрасываем путь к корню
urlObj.search = ""; // опционально: убираем параметры запроса
referralParam = encodeURIComponent(urlObj.toString());
} else {
// Fallback для старых браузеров: используем как есть
referralParam = encodeURIComponent(window.location.href);
}
// Замените bill.example.com на адрес вашей платформы
var billUrl = "https://bill.example.com/billmgr";
// Отправка запроса
req.open("GET", billUrl + "?func=referralprogram.registerclick&p=" + referralParam + "&out=xjson", true);
req.send(null);
}
if (!localStorage.hasOwnProperty("bill_cntid")) {
getBillCntid();
}
</script>
</head>
<body>
<script type="text/javascript">
function gotoBillManager() {
// Замените bill.example.com на адрес вашей платформы
var url = "https://bill.example.com/billmgr";
// Если нашли идентификатор подключения к реферальной программе (bill_cntid) в localStorage, то добавляем параметром:
if (localStorage.getItem("bill_cntid") !== null) {
url += "?cntid=" + localStorage.getItem('bill_cntid');
}
window.location.href = url;
}
</script>
<input type="button" onclick="gotoBillManager();" value="Go to BILLmanager">
</body>
</html>
Пояснения к HTML-коду
getBillCntid() — функция отправляет запрос к платформе для регистрации перехода по реферальной ссылке;
encodeURIComponent(...) — функция кодирует нормализованный URL для безопасной передачи в запросе;
localStorage.setItem("bill_cntid", ...) — функция сохраняет полученный уникальный идентификатор перехода между сессиями;
gotoBillManager() — функция формирует URL для перехода в платформу с добавлением параметра cntid, если он был сохранён;
cntid — параметр позволяет платформе привязать будущую регистрацию или покупку к конкретному переходу по реферальной ссылке.
Таблицы БД
Таблица referralprogram содержит информацию о реферальных программах:
site — URL-адрес страницы, с которой был произведён переход.
Если у клиента в браузере не было сессии, реферал будет привязан, но запись в таблице не будет создана. Такое может быть, например, при режиме инкогнито или при использовании прокси.
Логи переходов по реферальной ссылке находятся в файле /usr/local/mgr5/var/counter.log.
Регистрация нового клиента по реферальной ссылке
Добавление нового пользователя в качестве потенциального реферера:
Запись в таблицу БД
INSERT INTO referralprogram_referer (account, project, referralprogram) VALUES('44', '2', '5')
Пояснения к записи
account — идентификатор лицевого счёта клиента, который станет реферером;
referralprogram — идентификатор реферальной программы. Например, 1.
Добавление ID реферала в referralprogram_click:
Запись в таблицу БД
SELECT * FROM referralprogram_click WHERE referer_account = 2 AND sesid = '1762745305.hvtgBc' FOR UPDATE
UPDATE referralprogram_click SET referral_account='44', referralprogram='1' WHERE referer_account='2' AND sesid='1762745305.hvtgBc'
Начисление вознаграждения
По умолчанию вознаграждения за реферальную программу начисляются по заданию в cron первого числа каждого месяца в 03:10 по времени сервера:
При начислении вознаграждения за реферальную программу BILLmanager:
Обнаруживает новое вознаграждение и выполняет запрос:
Пример запроса
Aug 1 12:00:47 [134624:19] core_module INFO Request [billmaintain][root] 'func=referralprogram.createreward&out=xml&referer_account=49&referral_expense=538&referralprogram_rule=11&reward_amount=100.00&reward_cdate=2025%2D08%2D01'
Отправляет SQL-запрос на создание записи о вознаграждении в базу данных:
referralprogram_rule — правило реферальной программы, по которому применено вознаграждение.
Если дата зачисления вознаграждения совпадает с текущей датой, создаётся платёж:
Пример запроса
Aug 1 12:00:47 [134624:20] core_module INFO Request [billmaintain][root] 'func=referralprogram.createpayment&out=xml&referer_account=49&referralprogram=9&reward_date=2025%2D08%2D01'
randomnumber — уникальный внутренний номер платежа;
status — статус платежа. Например, 1 — новый, 4 — зачислен и т.д.;
subaccount — лицевой счёт реферера, на который зачисляется вознаграждение;
subaccountamount — сумма в валюте лицевого счёта;
usedamount — израсходованная часть платежа.
Логирование
Дополнительная информация для диагностики содержится в логах файла /usr/local/mgr5/var/ billmaintain.log. Чтобы включить печать отладочной информации по формированию вознаграждений по реферальной программе в лог billmaintain.log, повысьте уровень логирования: