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

  1. Create a bot via @BotFather — get your TELEGRAM_BOT_TOKEN.
  2. Register a shop in your merchant cabinet — grab TEGRO_SHOP_ID + TEGRO_API_KEY.
  3. Run ngrok to test the webhook (ngrok http 3000).
  4. Set notify_url = https://<ngrok>/tegro-notify in the shop settings.
  5. Enable the shop's test mode — try it out with no real charges.

Related