Чтобы привлечь пользователей, сервисы иногда используют партнерские программы. Эта идея проста: попросите подписавшихся пользователей пригласить своих друзей присоединиться к системе и начать использовать ваш сервис. Для каждого пользователя есть несколько бонусов, которые приносят вам новых пользователей (пополнение счета, повышение функциональности, продление и т. Д.).
Вот наш технический опыт того, как мы реализовали эти функции в нашем сервисе :
логика
1) Пользователь зарегистрирован в нашем сервисе и ему присвоен случайный реферальный код. Этот код вставляется в ссылку для приглашения, например » http://example.com «.
2) Пользователь A отправляет ссылку пользователю B (отправляет личное сообщение, делится в социальных сетях и т. Д.)
3) Когда пользователь B заходит на сайт по ссылке, этот код запоминается в браузере локального хранилища. Теперь, даже если пользователь B закроет вкладку и перейдет к нашему сервису по ссылке « http://example.com », мы все равно узнаем, кто его пригласил.
4) При регистрации этот код отправляется на сервер. В соответствии с этим, пользователь A находится в базе данных, а новый объект создается в отдельной таблице «Affiliate».
5) Пользователь А получает некоторый бонус.
Техническая часть
В качестве бэкенда в нашем проекте BitCalm мы использовали Django. С помощью этой структуры очень легко реализовать то, что нам нужно.
Создание поля с реферальным кодом в User
class User(AbstractUser):
...
affiliate_code = models.CharField(_('Affiliate code'), max_length=16,
unique=False,
default=generate_key)
...
Когда вы создаете нового пользователя, это поле заполняется кодом, сгенерированным функцией generate_key.
Записать реферальный код в Local Storage
В сценарии на первой странице мы проверяем, нужен ли нам ключ в URL-адресе. Если он существует, то запишите его в локальное хранилище.
(function () {
var getParameterByName = function (name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? null : decodeURIComponent(results[1].replace(/\+/g, " "));
},
affiliateCode = getParameterByName('ref');
if (!('affiliateCode' in localStorage)) {
if (affiliateCode && affiliateCode.length) {
localStorage['affiliateCode'] = affiliateCode;
} else {
localStorage['affiliateCode'] = null;
}
}
})();
Отправка кода данных при регистрации
Когда пользователь регистрируется, кроме логина и пароля мы также отправляем данные о реферальном коде на сервер.
Auth.signup({
name: $scope.user.name || '',
login: $scope.user.login,
password: $scope.user.password,
affiliateCode: localStorage.affiliateCode ? localStorage.affiliateCode : ''
})
Узнайте больше о том, как работает наша система авторизации, в нашем блоге.
Обработка данных на сервере
Для удобной работы с механизмом партнерских программ мы создали модель Affiliate:
class Affiliate(models.Model):
date = models.DateTimeField(default=timezone.now)
owner = models.ForeignKey(User, related_name='owned_affiliates')
member = models.ForeignKey(User, related_name='participating_affiliates')
Эта модель связывает двух пользователей и добавляет дату создания. Поле владельца представляет собой ссылку на пользователя, чтобы пригласить друга, и размещается у текущего пользователя, который был зарегистрирован по этой ссылке.
Когда вы регистрируете нового пользователя с непустым полем affiliateCode, мы проверяем базу данных для пользователя, которому принадлежит код:
def signup(request):
data = json.loads(request.body)
...
try:
affiliate_code = data['affiliateCode']
owner = User.objects.get(affiliate_code__iexact=affiliate_code)
Affiliate.objects.create(owner=owner, member=user)
except (KeyError, User.DoesNotExist) as e:
pass
Теперь мы можем получить информацию обо всех приглашенных пользователях конкретного пользователя, обратившись к полю Owned_affiliates.
Благодаря Participating_affiliates мы можем понять, кто пригласил именно этого пользователя.
Для расчета какого-либо бонуса или других действий мы можем использовать приемник для модели Affiliate:
@receiver(post_save, sender=Affiliate)
def client_receiver(sender, instance, created, **kwargs):
if created:
...
Вывод
Внедрение такой простой системы заняло много времени, но она прекрасно работает и решает все необходимые задачи. Кроме того, его достаточно легко расширить и внедрить новые функции, как в нашем проекте.