Болячка Stripe. Как настроить Webhook в SaleBot о продлении подписки на клуб.
Кто еще не сталкивался, у платежной системы Stripe есть очень дурацкое отличие от других — она присылает webhook только при первой оплате, при продлении подписки нет. В документации SaleBot есть инструкция как быть в такой ситуации, но на практике она очен не удобная. Необходимо делать исходящий запрос в ответе которого ты получаешь только статус подписки.
Недавно столкнулся с таким кейсом — у подписчика во время списания не было денег на привязанной карте и все попытки, запланированные мной, на проверку статуса показывали activ
, тк подписка не будет отменена пока не израсходуются все попытки списания. В итоге по логике исходящих запросов в боте и осталось значение activ
и он продлил подписку. Это конечно единичные случаи, но очень не удобные...
Я нашел способ, замороченный, но способ 😁 Напишу здесь поверхностно принцип, а подробности рассказал в видеоуроке у себя в канале.
1️⃣ Создаем группу и добавляем в нее бота на правах админа. Нам нужен platform_id группы
2️⃣ Далее нам нужно настроить вебхук в самом Stripe.
https://chatter.salebot.pro/api/<api_key>/tg_callback?message=<text>&user_id=<platform_id>&group_id=<бот>
Где:
<api_key>
— API токен проекта в SaleBot;
message
— текст колбека;
user_id
— id группы;
group_id
— логин бота (без @)
Метод выбираем — invoice.payment_succeeded
🎯 На какие события реагирует invoice.payment_succeeded:
Когда оплата прошла успешно, то есть:
• 💳 Клиент оплатил подписку (sub), и плата была списана.
• 🔁 Сработал рекуррентный платёж (например, автообновление подписки), и он прошёл успешно.
• 🧾 Клиент оплатил счёт, выставленный вручную.
• 💰 Платёж прошёл через пробный период и был списан.
• 👻 Если был инвойс с попыткой повторного списания после fail’а — и он удался.
3️⃣ После первой оплаты нам нужно добавить в metadata
параметр tg_id
это делается через API-запрос
URL запроса: https://api.stripe.com/v1/subscriptions/#{stripe_subscription_id}
-> ваша_переменная
в нее сохранится ответ от Stripe
{ "Authorization": "Bearer sk_live_***ваш секретный ключ***", "Content-Type": "application/x-www-form-urlencoded" }
"metadata[tg_id]=#{platform_id}"
4️⃣ Ловим колбек в группе и обрабатываем его.
Теперь когда нам будет прилетать callback об оплате или продлении в группу в переменной data
будет сохраняться вся нужная для нас инфа, осталось только ее обработать.
- Достаем tg_id чтобы понимать кому кидать callback
tg_id = data['object']['metadata']['tg_id']
- На id, который достали, кидаем колбек, желательно через api-запрос, чтобы мы в нем еще передали весь словарь
data
и уже работали с ним в сущности клиента - Ловим колбек у клиента и начинаем доставать параметр
billing_reason
, именно в нем хранится информация о виде транзакции.
событие = data['object']['billing_reason']
В результате может быть несколько вариантов значений
Результат обрабатываю вот так 👇🏻
text_edit = if(событие == 'subscription_create', 'первая оплата по подписке', if(событие == 'subscription_cycle', 'продление подписки', if(событие == 'subscription_update', 'обновление подписки', if(событие == 'manual', 'тестовый прогон', ''))))
И дальше стрелкой отправляю в блок продления с переменной для сравнения событие == 'subscription_cycle'
У меня есть тг-канал "Инструменты техспеца | by Серёга", в нем много полезного найдешь, можешь подписаться