# Rezept: Telegram-Bot

> Verkaufen Sie Bot-Befehle, eine Rolle oder eine private Gruppe. Jeder Nutzer erhält eine eigene Rechnung; ein signierter Webhook schaltet den Zugang frei.

Der Bot sieht nie Geld. Bei `/buy` schickt er dem Nutzer seinen eigenen Rechnungslink; Ihr Server hört `invoice.fulfilled` und schaltet den Zugang frei. Jeder bezahlte Befehl fragt Perly Pay, sodass nach einem Neustart nichts verloren geht. Discord funktioniert genauso, mit einer Rolle.

> **Hinweis:** Mit einem Assistenten: Dieses Rezept setzt der Skill `sell-bot-access` des Perly-Pay-Plugins in Ihrem Projekt um. Ein lauffähiges Beispiel ist `examples/telegram-bot` (MIT) im Repository des Plugins.

## So funktioniert es

1. **Produkt und Preis** — Einmalig oder lebenslang für „für immer“, Laufzeit für Pässe, Abo für eine Mitgliedschaft mit Verlängerung per Rechnung.
2. **Ein Kunde pro Chat-Nutzer** — `external_id: "tg:<user id>"`. Fragen Sie nur bei Abos nach einer E-Mail: Dorthin gehen die Verlängerungen.
3. **/buy** — Eine Rechnung mit der Chat-ID in `metadata`, per Button gesendet. Eine Rechnung pro Nutzer und Tag – dank eines Idempotenzschlüssels.
4. **Zugang freischalten** — Bei `invoice.fulfilled` die Chat-ID aus `metadata` lesen und antworten: eine Nachricht, eine Einmal-Einladung, eine Rolle.
5. **Bezahlte Befehle** — `entitlements.check({ customer_external_id: "tg:<id>", product })`.

**/buy**

```js
const invoice = await pay.invoices.create(
  { line_items: [{ price: PRICE }], customer: customer.id, metadata: { chat_id: String(chatId) } },
  { idempotencyKey: `buy-${userId}-${today}` },
);
await tg("sendMessage", { chat_id: chatId, text: "Pay:", reply_markup: { inline_keyboard: [[{ text: "Pay", url: invoice.url }]] } });
```

## Beispiel starten

1. **Installieren** — `npm install` in `examples/telegram-bot` (Node 20.12+).
2. **Schlüssel** — Kopieren Sie `.env.example` nach `.env` und tragen Sie einen Testschlüssel (`sk_test_…`) in `PERLY_PAY_SECRET_KEY` ein.
3. **Vorbereiten** — `npm run setup` legt mit Ihrem Schlüssel Produkt und Preis an und gibt ihre IDs für `.env` aus.
4. **Starten** — `npm start` (oder `npm run dev`), wie seine README sagt.
5. **Ohne Wallet bezahlen** — Schreiben Sie dem Bot `/buy`, öffnen Sie Pay und klicken Sie auf **Simulate payment**: Der Bot sagt „Payment confirmed“, und `/secret` antwortet.

## Fallstricke

- Ein gemeinsamer Zahlungslink für alle: Man sieht nicht, wer bezahlt hat. Eine Rechnung pro Person, mit der Chat-ID.
- Zugang freischalten, wenn der Nutzer auf „Ich habe bezahlt“ tippt. Freischalten darf nur der Webhook oder `entitlements.check`.
- Zugang im Speicher des Bots. Nach einem Neustart ist er weg; fragen Sie Perly Pay.
