Как реализовать начисление партнерских бонусов на баланс пользователя при регистрации по реферальной ссылке?

Реализация начисления партнёрских бонусов при регистрации по реферальной ссылке — классическая задача для реферальных и партнёрских программ. Рассмотрим полный цикл реализации.

## 1. Генерация реферальной ссылки

Каждому пользователю при регистрации или активации партнёрской программы присваивается уникальный реферальный код. Ссылка формируется по шаблону:
`https://example.com/register?ref=УНИКАЛЬНЫЙ_КОД`

Код можно генерировать как хэш от user_id или как случайную строку, сохранённую в таблице пользователей (поле `referral_code`).

## 2. Сохранение источника перехода

Когда новый пользователь переходит по реферальной ссылке, нужно сохранить `ref`-параметр. Варианты:
— **Cookie** — установить cookie с реферальным кодом на 30 дней.
— **Session** — хранить в сессии до завершения регистрации.
— **URL-параметр** — передавать через скрытое поле формы регистрации.

## 3. Обработка при регистрации

После успешной регистрации нового пользователя:
1. Извлечь реферальный код из cookie/сессии/формы.
2. Найти пользователя-реферера по этому коду в базе данных.
3. Создать запись в таблице `referrals` (кто пригласил, кого пригласил, дата, статус).
4. Начислить бонус рефереру — обновить поле `balance` или `bonus_balance` в таблице пользователей.
5. Опционально — начислить бонус и новому пользователю (приветственный бонус).

## 4. Пример SQL-схемы

sql
CREATE TABLE referrals (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
referrer_id BIGINT NOT NULL,
referred_id BIGINT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
bonus_paid BOOLEAN DEFAULT FALSE
);

## 5. Пример логики на Python (псевдокод)

python
def register_user(data, ref_code=None):
user = create_user(data)
if ref_code:
referrer = User.query.filter_by(referral_code=ref_code).first()
if referrer:
Referral.create(referrer_id=referrer.id, referred_id=user.id)
referrer.bonus_balance += REFERRAL_BONUS_AMOUNT
referrer.save()
# Опционально: приветственный бонус новому пользователю
user.bonus_balance += WELCOME_BONUS_AMOUNT
user.save()
return user

## 6. Важные нюансы

— **Защита от мошенничества**: не начисляйте бонус до подтверждения email или первого действия (покупки, пополнения).
— **Транзакционность**: операции начисления бонуса и создания записи реферала должны выполняться в одной транзакции БД.
— **Лимиты**: ограничьте количество рефералов или сумму бонусов на одного пользователя.
— **Логирование**: ведите историю всех начислений для аудита и поддержки.
— **Уведомления**: отправляйте уведомление рефереру о начислении бонуса.

## 7. Дополнительные уровни (многоуровневый реферал)

Если нужна многоуровневая система, при регистрации сохраняйте всю цепочку рефереров и начисляйте бонусы каждому уровню с убывающим процентом.

Такой подход обеспечивает надёжную, масштабируемую и защищённую от злоупотреблений реферальную систему.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.