@kulli
web программист

Как организовать платные услуги на сайте (премиум аккаунт и др)?

Добрый день! Делаю сервис в котором будут платные услуги, как разовые, так и повышение привилегий аккаунта (премиум аккаунт).

В данный момент реализован личный кабинет пользователя, в который он может зайти и пополнить свой баланс .
Баланс хранится в отдельной табличке в бд в виде записей:
GXohSuL8R1C0w_nUQqk3ng.png

transaction_value - значение баланса (положительное или отрицательное) суммируемое, в результате чего получается текущий баланс...

Требуется сделать возможность покупать премиум аккаунт на сайте и разовые услуги, допустим :
  • премиум аккаунт на 5 дней
  • премиум аккаунт на 10 дней
  • премиум аккаунт на 30 дней

  • Поднять объявление в топ на 1 день
  • Поднять объявление в топ на 2 дня
  • .....


Разовые услуги :

Купить возможность скачать все объявления с сайта за 500 руб.
*( возможно еще скидки, акции, купоны какие реализую, но это потом)

Вот такого типа услуги хочу реализовать.

1) Первый вариант на половину уже реализован, но что то я засомневался в его адекватности...
Создаем 2 таблички :

Список типов услуг
tbl_service_list_type_id - ID
tbl_service_list_type_name - Наименование
tbl_service_list_type_desc - Описание
tbl_service_list_type_price - Цена
tbl_service_list_type_timerange - Период на который действует услуга в днях
tbl_service_list_type_add_permission_name - Разрешение из RBAC, которое добавляется при покупки данной услуги
tbl_service_list_type_status - Статус (актив или нет)

Список услуг

tbl_service_list_id - ID
tbl_service_list_user_fk - ID юзера, который купил данную услугу
tbl_service_list_type_fk - ID Типа услуги (структура описана выше)
tbl_service_list_name - Наименование (берется из типа услуги)
tbl_service_list_desc - Описание (берется из типа услуги)
tbl_service_list_price - Цена (берется из типа услуги но возможно тут сделаю скидочки в зависимости от чего то...)
tbl_service_list_date_start - Момент покупки услуги в timestamp
tbl_service_list_date_range - Период на который действует услуга в днях (берется из типа услуги)
tbl_service_list_pay_id - ID платежки (ID записи по которой списалась денежка из баланса)
tbl_service_list_permission_name Разрешение из RBAC, которое добавляется при покупки данной услуги (берется из типа услуги)
tbl_service_list_status - Статус (актив или нет)

Вот такая структура таблиц уже реализована, баланс списывается, все логируется, все считается, все ок!

1 вариант организации покупки
Юзер имеет на балансе 5000 руб.
Вывести список Список типов услуг как товары, юзер кликает по нужной ( премиум аккаунт на 10 дней, стоит она 1000 руб.) создается запись в таблице Список услуг, данные частично берутся из соответствующей записи таблицы Список типов услуг и далее генерируется запись со значением -1000 руб в таблице с платежками, соответственно баланс уменьшается и у юзера появляется активная услуга, добавляются нужные права в RBAC.
Такая схема реализована уже, но появляется проблема с отслеживанием времени действия...
Думаю отслеживать так: раз в сутки пробегать кроном по всему списку активных услуг, брать в каждой поле tbl_service_list_date_start - Момент покупки услуги в timestamp и прибавлять tbl_service_list_date_range - Период на который действует услуга в днях и сравнивать timestamp с текущим, если текущий меньше, тогда ничего не делаем, если текущий больше - значит услуга закончилась, помечаем ее как неактиваная.... Все вроде красиво и четко, НО вдруг пользователь захочет оплатить еще один прем на 10 дней через 4 для использования текущего, получается этот прем еще не кончился а он уже другой взял, деньги получается спишутся но прем наложится на другой и срок не увеличится...
Тут можно конечно проверять есть ли уже подобный прем активный, если есть то делать tbl_service_list_date_start у новго (второго активного) према таким tbl_service_list_date_start + tbl_service_list_date_range от первого према. Получается второй прем должен заработать сразу после окончания первого..

2 ой вариант с балансом
Делаем услугу стоимость услуги - према составляет 50 руб в день, юзер закидывает деньги, 1000 руб допустим, покупает услугу прем со стоимостью в 50 руб/день на 10 дней (в записи услуги в поле tbl_service_list_date_range стоит значение 10) , еще другую услугу со стоимостью 20 руб/день.
Ну их можно купить только при условии что сумма баланса вашего больше или равно tbl_service_list_date_range+tbl_service_list_price (общей стоимости услуги на весь планируемый период) и каждую ночь по крону бегает скрипт по услугам, пробегает по каждому пользователю с активными услугами, суммирует стоимость подключенных услуг и отнимает от баланса юзера, ну и в записи каждой активной услуги отнимает 1 день. Когда услуга станет с 0 днями, статус ее становится тоже 0 и она не отображается более..

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

Посоветуйте свой вариант если уже делали подобное?
  • Вопрос задан
  • 562 просмотра
Пригласить эксперта
Ответы на вопрос 2
@LiguidCool
Бррр, если честно я не стал дочитывать ...
Думаю вам следует понять одну простую истину - Премиум Юзер это такая же группа как и любая другая (например "Админы", "Модераторы" итп. Соответственно пляшите от этого же. Хранить срок действия (день истечения) можно прямо в таблице юзера, или в привязочной таблице юзер<->группы. Каким то скриптом раз в определенное время шастать по базе и удалять устаревшие записи. Например если у вас сроки действий в днях, то это достаточно делать раз в сутки.
Ответ написан
@kulli Автор вопроса
web программист
Ну типа групп и реализовано у меня уже, покупка услуг = покупка доступа к группе, услуги будут разные и с разным сроком действия, и их может быть несколько...
Хранить срок действия (день истечения) можно прямо в таблице юзера
- так не выйдет скорее всего, я же за это деньги беру и всегда должен сказать за что списались деньги в любой момент времени, если так хранить то данные затрутся... Сейчас все хранится в отдельной табличке , все связанно, каждая оплата с каждой услугой, можно всегда сказать куда делась определенная сумма со счета, когда и на что.

Наверное первый вариант более жизнеспособен...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы