Как реализовать начисление партнерских бонусов на баланс пользователя при регистрации по реферальной ссылке?
Реализация начисления партнёрских бонусов при регистрации по реферальной ссылке — классическая задача для реферальных и партнёрских программ. Рассмотрим полный цикл реализации.
## 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. Дополнительные уровни (многоуровневый реферал)
Если нужна многоуровневая система, при регистрации сохраняйте всю цепочку рефереров и начисляйте бонусы каждому уровню с убывающим процентом.
Такой подход обеспечивает надёжную, масштабируемую и защищённую от злоупотреблений реферальную систему.
