Тех. спецам
March 27

Болячка Stripe. Как настроить Webhook в SaleBot о продлении подписки на клуб.

Кто еще не сталкивался, у платежной системы Stripe есть очень дурацкое отличие от других — она присылает webhook только при первой оплате, при продлении подписки нет. В документации SaleBot есть инструкция как быть в такой ситуации, но на практике она очен не удобная. Необходимо делать исходящий запрос в ответе которого ты получаешь только статус подписки.

Недавно столкнулся с таким кейсом — у подписчика во время списания не было денег на привязанной карте и все попытки, запланированные мной, на проверку статуса показывали activ , тк подписка не будет отменена пока не израсходуются все попытки списания. В итоге по логике исходящих запросов в боте и осталось значение activ и он продлил подписку. Это конечно единичные случаи, но очень не удобные...

Я нашел способ, замороченный, но способ 😁 Напишу здесь поверхностно принцип, а подробности рассказал в видеоуроке у себя в канале.

И так...

1️⃣ Создаем группу и добавляем в нее бота на правах админа. Нам нужен platform_id группы


2️⃣ Далее нам нужно настроить вебхук в самом Stripe.


URL будет такой 👇🏻

 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-запрос

Тип запроса: POST-data

URL запроса: https://api.stripe.com/v1/subscriptions/#{stripe_subscription_id}

Сохраняемые значения:

-> ваша_переменная в нее сохранится ответ от Stripe

Заголовок запроса:

{
    "Authorization": "Bearer sk_live_***ваш секретный ключ***", 
    "Content-Type": "application/x-www-form-urlencoded"
}

JSON параметры:

"metadata[tg_id]=#{platform_id}"

4️⃣ Ловим колбек в группе и обрабатываем его.

Теперь когда нам будет прилетать callback об оплате или продлении в группу в переменной data будет сохраняться вся нужная для нас инфа, осталось только ее обработать.

  1. Достаем tg_id чтобы понимать кому кидать callback
    tg_id = data['object']['metadata']['tg_id']
  2. На id, который достали, кидаем колбек, желательно через api-запрос, чтобы мы в нем еще передали весь словарь data и уже работали с ним в сущности клиента
  3. Ловим колбек у клиента и начинаем доставать параметр billing_reason, именно в нем хранится информация о виде транзакции.

Достаем вот так 👇🏻

событие = data['object']['billing_reason']

В результате может быть несколько вариантов значений

Результат обрабатываю вот так 👇🏻

text_edit = if(событие == 'subscription_create', 'первая оплата по подписке', if(событие == 'subscription_cycle', 'продление подписки', if(событие == 'subscription_update', 'обновление подписки', if(событие == 'manual', 'тестовый прогон', ''))))

И дальше стрелкой отправляю в блок продления с переменной для сравнения событие == 'subscription_cycle'

У меня есть тг-канал "Инструменты техспеца | by Серёга", в нем много полезного найдешь, можешь подписаться