Урок 9.5.1 - Платная подписка на канал
Краткое описание механики и функций
- Пользователь переходит в бота
- Бот предлагает оплатить подписку на месяц (или другой период)
- После оплаты присылает ссылку на канал
- При истечении срока подписки удаляет пользователя из канала
- Нужно, чтобы бот определял дату, когда нужно удалить человека из чата, прибавлял к этой дате месяц в случае оплаты
- Нужно сделать напоминания, в моем случае за 3 дня, 1 день, 12 часов, 1 час
бана (удаления) пользователя tg_ban_chat_member(#{kanal_id}, #{platform_id})
разбанивания (добавления) пользователя tg_unban_chat_member(#{kanal_id}, #{platform_id})
С этого момента предлагаю вам сделать бота самостоятельно ;)
- Создаем бота в Ботфазере
- Создаем закрытый канал, если нет
- Добавляем бота админом в ботфазере
- Создаем проект в сейлботе, добавляем в него бота
- Прикручиваем платежную систему
Я буду показывать на примере Юмани. Когда вы будете делать для себя или для заказчика бота надо будет адаптировать под вашу платежную систему по инструкциям Сейлбота.
- Стартовый блок (их 2, позже будет ясно почему)
- Два серых блока Несостояние для обновления ссылки оплаты
- Блок "Оплата 2", в который попадают после оплаты
- Блок "Продление", куда попадают пользователи, которые уже есть в платном канале и они продлевают подписку.
Блок "Добавление", для пользователей, которые вступают впервые или для тех, кто не продлял подписку. - 5 блоков с напоминианием за 3 дня, 1 день, 12 часов, час до удаления из канала. И пятое - блок с удалением из канала.
- Внизу два блока для статистики.
На старте бот предлагает оплатить подписку. Поэтому там есть кнопка с ссылкой на оплату. А чтобы была ссылка на оплату, в калькуляторе пишем:
payment_sum = #{payment_sum_const}
Когда мы задаем значение пременной payment_sum, автоматически создается ссылка на оплату в переменной yandex_money_pay_url. Всё это есть в инструкции сейлбота:
https://docs.salebot.pro/integracii/platezhnye-sistemy/priem-platezhei-cherez-yandeks.dengi
Что за переменная #{payment_sum_const} ?
В эту переменную в константах проекта я сохранил стоимость подписки.
Стоимость прописывается в нескольких блоках. И если мы ее будем менять, то можно один раз поменять в константах. А если числом везде прописывать, то при изменении цены, придется проверять все блоки. Через константы удобнее.
В стартовом блоке дополнительно есть кнопка на обновление ссылки.
Ссылка на оплату не вечная и действует определенное время. Поэтому если человек будет медлить, то она может не сработать. И ее надо обновить. Чтобы обновить, надо задать переменной payment_sum значение 0, и yandex_money_pay_url = "".
Все это есть в инструкциях Сейлбота по ссылке выше.
Во втором блоке возвращаем переменной предыдущее значение: payment_sum = #{payment_sum_const}
Блок Оплата (на скрине "Оплата 2")
Сюда попадают пользователи оплатившие подписку. Бот выдает ссылку на канал.
Чтобы минимизировать риск того, что человек скопирует ссылку другу, можно сделать, чтобы ссылка работала 1 раз (1 клик). Инструкция тут https://docs.salebot.pro/kak-sdelat/vremenno-dostupnyi-kontent
Если человек первый раз оплачивает, то он без проблем переходит по ссылке. Но если человек уже подписывался, потом не платил, значит он забанен в канале, и он не сможет снова подписаться по ссылке. Поэтому в калькуляторе пишем функцию разбанивания:
sss = tg_unban_chat_member(#{kanal_id}, #{platform_id})
Вместо sss может быть написано что угодно.
В kanal_id у меня сохранен id канала в константах.
Чтобы узнать id своего канала, нужно переслать любое сообщение из канала боту https://t.me/FIND_MY_ID_BOT
Пока коснулись бана и разбана, перейдем сразу в блок, где происходит бан пользователя в канале за неуплату. На моей схеме это "Напоминание 5".
Там просто в калькуляторе пишем:
sss = tg_ban_chat_member(#{kanal_id}, #{platform_id})
На всякий случай сохраним дату, когда человек оплатил, вдруг пригодится:
last_payment_date = #{current_date}
Далее нужно определить дату следующей оплаты. Если человек оплачивает, то есть два случая:
- Он платит впервые или после бана.
Тогда следующая оплата будет равна Сегодня + Месяц - Если он продлевает подписку, то мы не можем операться на Сегодня. А надо операться на дату последней оплаты.
Поэтому далее есть разветвление на 1 и 2 тип пользователей. Если человек находится в канале и платит, значит он Продлевает. Если он не в канале и платит, значит мы его Добавляем.
Значит надо определить, является он подписчиком или нет. Делаем также, как и в предыдущем уроке:
resultmem = tg_get_chat_member('#{kanal_id}', '#{platform_id}')
member_status = get(resultmem, 'result|status')
А затем в переходах ставим условие в переменную для сравнения:
Переход в Добавление: member_status != "member" and member_status != "administrator" and member_status != "creator"
Переход в Продление: member_status == "member" or member_status == "administrator" or member_status == "creator"
Тут скидваем человеку ссылку на канал. Можно подстраховаться и сделать одноразовую ссылку, об этом писал выше.
И нужно определить дату следующей оплаты:
next_payment_date = addMonth('#{last_payment_date}', 1)
Кстати, в сообщении можно написать пользователю, когда следующая оплата.
Тут ссылку на канал уже можно не кидать. Он уже есть в канале.
Тут по другому считаем дату следующей оплаты. Выше писал, что можно отталкиваться от даты последней оплаты last_payment_date, но удобнее от next_payment_date:
next_payment_date = addMonth('#{next_payment_date}', 1)
Чтобы напомнить человеку об оплате за 3 дня, нужно из next_payment_date вычесть 3. Так и пишем в дате (скрин):
Чтобы напомнить за 1 день, можно написать next_payment_date - 1, либо просто поставить "через 2 дня".
У меня стоит отправка в 12:00. Можно сделать так. Либо можно четко давать человеку доступ на 1 месяц с точностью до времени оплаты. Тогда надо будет сохранять время оплаты и его ставить в "время" в переходе.
И обязательно ставим галочку "Отменить, если покинул блок". Если человек оплатит, то он перейдет в блок "Оплата". И переход в следующее напоминание отменится. Если забудете поставить, то напоминание будет приходить вне зависимости от оплаты. Будет грустно оплатить и получить напомининие, а потом бан :)
Чтобы убедиться, верно ли настроили, не обязательно ждать месяц. Можете перейти в блок оплата. А затем зайти в раздел Клиенты, зайти в себя и посмотреть "Запланированные сообщения". Там будет видно когда и какое сообщение вам должно придти.
Тут также, как и в стартовом блоке задаем переменную payment_sum, чтобы сформировалась ссылка. И даем эту ссылку на оплату пользователю. Также делаем переход в блоки с обновлением ссылки.
Возможно, она не пригодится. Но лучше сделать сразу на всякий случай, заработать благодарность от заказчика, а потом, возможно допродать услугие о которых рассказал в видео.
Самый простой вариант, сохранить оплаты в массив. Для этого в блоке Оплаты пишем в калькуляторе:
payment_history = append(payment_history, '#{last_payment_date}')
Что за такая функция написано здесь https://docs.salebot.pro/peremennye-1/rabota-s-massivami-i-slovaryami
Сначала Сейлботу нужно объяснить, что payment_history - это массив. То есть написать payment_history = []
Это можно сделать в стартовом блоке. Но если человек через него пройдет снова, то вся история обнулится. Поэтому:
- Делаем еще один стартовый блок "Старт 0". В калькуляторе пишем payment_history = [].
- Ставим галочку "Отвечать 1 раз"
- Ставим приоритет выше, чем в блоке "Старт"
Второй стартовы блок "Старт 0" нужен только для этого. Поэтому, если вы не планируете сохранять историю оплат, то в нем нет смысла.
Полезные функции, повышение чека за бота, и повышение ценности себя, как специалиста
В бота можно добавить полезные функции. Например статистику, уведомления. Представьте, что вы делали бы это для себя. Какие функции и какую информацию вы бы хотели иметь?
Об этом рассказал и показал в подробной видео инструкции.
Для ленивых файл с ботом для восстановления
Платная подписка на канал 1-2023-07-23.json
Задание
Сделайте бота и скиньте на проверку. Установите минимальную стоимость в 2 рубля. В сообщении выведите дату следующей оплаты. Для теста можно сделать подписку на 5 минут, чтобы протестировать удаление из канала.