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 Телеграма по работе с звёздами.
🔗 GitHub: Vlad-Loop/n8n-nodes-telegram-stars
📦 NPM: n8n-nodes-telegram-stars
Она не идеальна, местами может быть сыровата (это v1 всё таки), но она закрывает главную боль – монетизация ботов без кода (почти).
Что умеет эта штука?
• Send Invoice: Генерирует счет на оплату. Указываем цену, валюту (XTR), описание и юзер получает красивую плашку "Заплати мне за столько звёзд".
• Answer Pre-Checkout Query: Самая важная часть. Перед тем как списать деньги, Телеграм стучится к боту: "Эй, всё норм? Деньги брать?". Если вы не ответите за 10 секунд – платеж отменится. Нода позволяет дать ответ, либо отказ.
• Refund Star Payment: Если вы честный человек (или просто накосячили), деньги можно вернуть одной кнопкой. Рефанды – это база для роста лояльности.
• Get Transactions: Посмотреть историю транзакций и баланс бота. Полезно для админки.
• Get Bot Balance: Ну, тут понятно. Чтобы греть душу цифрами.
Как это работает "под капотом"? (Разбор воркфлоу)
Давайте уйдем от теории к практике. Я собрал тестовый сценарий (вот тут можно найти ссылку на него), который делает полный цикл покупки.В n8n всё крутится вокруг логики. Вот как выглядит типичный флоу оплаты "Звездами":
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 – и деньги возвращаются юзеру. Мгновенно.
Почему не просто 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. Какой самый странный процесс вы пытались монетизировать в боте? Расскажите в комментах, оценим или восхитимся.



























