Чтобы привлечь пользователей, сервисы иногда используют партнерские программы. Эта идея проста: попросите подписавшихся пользователей пригласить своих друзей присоединиться к системе и начать использовать ваш сервис. Для каждого пользователя есть несколько бонусов, которые приносят вам новых пользователей (пополнение счета, повышение функциональности, продление и т. Д.).
Вот наш технический опыт того, как мы реализовали эти функции в нашем сервисе :
логика
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: ...
Вывод
Внедрение такой простой системы заняло много времени, но она прекрасно работает и решает все необходимые задачи. Кроме того, его достаточно легко расширить и внедрить новые функции, как в нашем проекте.