Telegram Stars и n8n: Как я накодил платежную систему через Cursor за вечер (и выложил в Open Source)

Telegram Stars и n8n: Как я накодил платежную систему через Cursor за вечер (и выложил в Open Source)

Где-то 2 года назад, команда Telegram выкатили Telegram Stars. "Звездочки", которыми можно оплачивать цифровые товары. На момент написания этой статьи, за окном конец 2025 и меня посещает мысль: окей, у меня есть парочка ботов на n8n, в целом, я не против, чтобы они приносили деньги. Где тут кнопка "Принять бабло?"

Спойлер: её нет.

Команда n8n делает хороший продукт, но они не всегда успевают за скоростью релизов телеграма (это моя гипотеза, как на самом деле – не знаю). Штатная нода умеет отправлять сообщения, кнопки, картинки, но как только дело доходит до sendInvoice или обработки preCheckoutQuery… всё, приехали. Либо пиши HTTP Request с кучей параметров и изучай документацию API, либо… страдай. Ну и ещё приходится в таком кейсе палить свой токен бота.

Был ещё один путь. Решил закрыть гештальт, сделать свой первый Open Source вклад и заодно протестировать подход Vibe кодинг.

Vibe Coding? Чего?

Кратко про вайб-кодинг: это когда ты не пишешь код символ за символом, а "вайбишь" с ИИ-ассистентом (в моем случае – Cursor), объясняя ему, что ты хочешь получить на выходе. Ты архитектор, AI строитель.

Я не хотел тратить неделю на изучение архитектуры и возможности нод n8n, разбираться в их UI-компонентах, правилах и типах данных. Я хотел результат: ноду, которую можно перетащить в редактор и начать чарджить юзеров.

Пройдусь буквально по верхам, что именно мне помогло:

  • MCP Content7 (документация по n8n) + дока по стилю UI от авторов n8n
  • Пример реализации custom ноды от другого автора

Возможно, дочитав до этого момента, вы можете задаться вопросом. "Постой, ты хочешь сказать, что навайбкодил то, что связанно с деньгами/платежами. Автор вообще в своём уме? Какой нафиг доверие всему этому?!"

И… отчасти вы правы. Я хоть и большую часть своей карьеры был (и чуть-чуть продолжаю им быть) как QA, знаю там про тестирование и качество, но никогда и нигде не утверждал и не буду утверждать, что тут всё работает как часы. Я тестировал получившийся код, и этот же код использую в своих проектах. Также в каждой ноде есть дисклеймер о том, что могут быть ошибки и что используйте на свой страх и риск.

В любом случае, я предоставлю вам "базу", всё под лицензией MIT, поэтому если уж хотите энтерпрайз – всё в ваших руках.

Что получилось: n8n-nodes-telegram-stars

Я собрал кастомную ноду, которая оборачивает основные методы Payments API Телеграма по работе с звёздами.

Она не идеальна, местами может быть сыровата (это v1 всё таки), но она закрывает главную боль – монетизация ботов без кода (почти).

Что умеет эта штука?

• Send Invoice: Генерирует счет на оплату. Указываем цену, валюту (XTR), описание и юзер получает красивую плашку "Заплати мне за столько звёзд".

• Answer Pre-Checkout Query: Самая важная часть. Перед тем как списать деньги, Телеграм стучится к боту: "Эй, всё норм? Деньги брать?". Если вы не ответите за 10 секунд – платеж отменится. Нода позволяет дать ответ, либо отказ.

• Refund Star Payment: Если вы честный человек (или просто накосячили), деньги можно вернуть одной кнопкой. Рефанды – это база для роста лояльности.

• Get Transactions: Посмотреть историю транзакций и баланс бота. Полезно для админки.

• Get Bot Balance: Ну, тут понятно. Чтобы греть душу цифрами.

Как это работает "под капотом"? (Разбор воркфлоу)

Давайте уйдем от теории к практике. Я собрал тестовый сценарий (вот тут можно найти ссылку на него), который делает полный цикл покупки. В n8n всё крутится вокруг логики. Вот как выглядит типичный флоу оплаты "Звездами":

Telegram Stars и n8n: Как я накодил платежную систему через Cursor за вечер (и выложил в Open Source)

1. Триггер и Роутинг

У нас есть стандартный Telegram Trigger. Он ловит всё. Дальше стоит Switch (или Router), который смотрит, что прилетело. В моем примере я разделил логику на:

/donate – хочу купить.

/refund – верните деньги (тест механики).

/bot_balance – чекнуть баланс.

И самое важное: системные события оплаты.

2. Выставление счета (Invoice)

Юзер пишет /donate. Мы дергаем мою кастомную ноду с методом sendInvoice.Price Amount: 10 звезд.

Payload: Уникальный ID заказа (я туда зашил message_id, но по-хорошему там должен быть ваш internal order ID). Юзер видит кнопку "Pay 10 Stars". Нажимает.

3. Pre-Checkout

Как только юзер нажал "Оплатить", Телеграм шлет апдейт типа pre_checkout_query. Здесь многие спотыкаются на HTTP-запросах. В моем воркфлоу стоит фильтр: если пришел pre_checkout_query — отправляем его в ноду с методом answerPreCheckoutQuery. Всё. Телеграм получил "ОК" и списал звезды у юзера.

Небольшой поучительный кейс. Когда это может быть полезно: например юзер около 5-ти месяцев назад, в вашем боте решил купить какую-либо услугу, у вас тогда это стоило 10 звёзд. Время идёт, инфляция съедает даже звёзды, цены растут. Теперь ваша услуга стоит 20 звёзд. Но у пользователя есть сообщение, кнопка, где цена 10. Он нажимает и если у вас нет никакого фильтра на этапе Pre-Checkout – он заплатит 10 звезд и получит услугу. Я например поставил у себя в ботах сверку даты, что если с момента создания сообщения с кнопкой оплаты и фактического получения события о проверке оплаты прошло больше 10 минут – не принимаю оплату и отправляю новое сообщение с кнопкой оплаты, где потенциально может быть новая цена.

4. Успешная оплата и… Возврат?

После списания прилетает successful_payment. Тут мы радуемся, записываем charge_id в базу (или в Google Sheets, максимально не советую, но знаю, что в комьюнити n8n есть и такие любители подобного) и выдаем юзеру его цифровой товар.А если нужно вернуть? Я добавил логику: берем charge_id из успешной оплаты, скармливаем ноде с методом refundStarPayment – и деньги возвращаются юзеру. Мгновенно.

Самоирония. У меня всё плохо с английским, поэтому у меня refaund, а не refund. Стыдно. В своём боте этот момент поправил.
Самоирония. У меня всё плохо с английским, поэтому у меня refaund, а не refund. Стыдно. В своём боте этот момент поправил.

Почему не просто HTTP Request?

Можно же через обычный HTTP Request ноду дергать API Телеграма. Можно. Но:

  • Вам нужно каждый раз гуглить структуру JSON-пейлоада. Ну либо держать в блокноте или как пример.
  • Вам нужно помнить названия эндпоинтов.
  • Это выглядит грязно в редакторе.
  • Ваш токен в 90% случаев будет торчать "наружу". Поделится с другом или коллегой примером вашего воркфлоу, ну мягко говоря не получится.

Кастомная нода дает вам красивый UI с полями. Вы выбираете "Refund", вставляете ID, и всё работает. Это экономит когнитивное топливо. А мы тут за автоматизацию, чтобы меньше думать о рутине.

Как установить?

Если у вас self-hosted n8n (а мы же тут все серьёзные ребята и топим за local-first, да?), то идем в: Settings → Community Nodes → Install → вбиваем n8n-nodes-telegram-stars.

Если у вас Cloud-версия… ну, напишите в саппорт n8n, чтобы они разрешили кастомные ноды, или поднимайте свой инстанс. Docker-контейнер поднимается за 5 минут, не ленитесь. Вот тут писал гайд, как это сделать.

Про то, как дебажить и создать связь напрямую с инстансом n8n на устройстве – всё есть на страничке гитхаб.

Выводы и философия

Этот кейс для меня не только про "прикрутить платежку". Это про то, как меняется разработка. Раньше создание такой ноды заняло бы у меня несколько выходных с чтением доков по TypeScript и архитектуре n8n. С Cursor я сделал основной функционал за вечер.

А ещё, для меня наступает удивительное время, когда барьер между "Идея" и "Готовый инструмент" стирается. Если вам чего-то не хватает в вашем инструменте автоматизации – не ждите вендора. Возьмите AI, возьмите бойлерплейт и сделайте сами.

Ну и качайте ноду, пробуйте. Если найдете баги (а они там есть, я уверен) – велкам в Issues на гитхабе или пишите пулл-реквесты. Open Source в моём понимании, всё же больше уходит в коллективный разум.

P.S. Какой самый странный процесс вы пытались монетизировать в боте? Расскажите в комментах, оценим или восхитимся.

2
Начать дискуссию