Telegram bot that accepts payments
A prompt for Cursor / Claude Code. A ready-to-use Telegram bot on Node.js (grammY)
with a /buy command — the bot hands out a payment link, Tegro.Money sends a webhook,
and the bot tells the user the payment went through.
Prompt
Build a Telegram bot on Node.js + TypeScript + grammY + Fastify.
Structure:
- bot.ts — the grammY bot: /start, /buy commands.
- server.ts — Fastify, two routes: POST /tegro-notify (the webhook from Tegro) and /health.
- index.ts — starts bot.start() + server.listen().
/buy logic:
1. Ask the user what they want to buy (for the demo — a fixed product "Channel access for 500 ₽").
2. Create an order in Tegro.Money:
POST https://tegro.money/api/createOrder/
Body: {
shop_id: process.env.TEGRO_SHOP_ID,
nonce: crypto.randomUUID(),
currency: "RUB",
amount: 500,
order_id: crypto.randomUUID(),
description: "Channel access",
notify_url: process.env.BASE_URL + "/tegro-notify"
}
Header: Authorization: Bearer <HMAC-SHA256(body, TEGRO_API_KEY) hex>
IMPORTANT: the signature is computed over the SAME JSON body you send (after JSON.stringify).
3. Take data.url from the response — send the user an Inline Keyboard "Pay" button with that link.
4. Store a {tegroOrderHash → telegramUserId} mapping in a Map (or Redis/SQLite, if the project has one).
/tegro-notify webhook logic:
1. Tegro sends a form-urlencoded POST.
2. Verify the signature per the docs at https://tegro.money/docs/en/payments/notify/
3. If order_id is found in our Map and status=1 (paid) — send the user a Telegram message
"Payment received! Adding you to the channel..." and an invite link to the private channel.
4. Return "OK" with status 200.
Extras:
- ENV: TELEGRAM_BOT_TOKEN, TEGRO_SHOP_ID, TEGRO_API_KEY, BASE_URL, CHANNEL_INVITE_LINK
- package.json scripts: dev (tsx watch), start (node dist), build (tsc)
- README.md with the list of ENV vars and instructions:
* /buy from the user -> a Tegro link
* After payment — the user gets a channel invite
* For local development BASE_URL = ngrok URL
Don't use node-telegram-bot-api — it's outdated. Use grammY.
After it's generated
- Create a bot via @BotFather — get your
TELEGRAM_BOT_TOKEN. - Register a shop in your merchant cabinet — grab
TEGRO_SHOP_ID+TEGRO_API_KEY. - Run ngrok to test the webhook (
ngrok http 3000). - Set
notify_url = https://<ngrok>/tegro-notifyin the shop settings. - Enable the shop's test mode — try it out with no real charges.