# Ricetta: bot Telegram

> Vendi i comandi di un bot, un ruolo o un gruppo privato. Ogni utente riceve la sua fattura; un webhook firmato apre l’accesso.

Il bot non vede mai denaro. Con `/buy` manda all’utente il suo link a una fattura; il tuo server riceve `invoice.fulfilled` e apre l’accesso. Ogni comando a pagamento chiede a Perly Pay, quindi niente si perde al riavvio. Discord funziona allo stesso modo, con un ruolo.

> **Nota:** Con un assistente: la skill `sell-bot-access` del plugin Perly Pay realizza questa ricetta nel tuo progetto. L’esempio eseguibile è `examples/telegram-bot` (MIT) nel repository del plugin.

## Come funziona

1. **Prodotto e prezzo** — Una tantum o a vita per «per sempre», a durata per i pass, abbonamento per le membership rinnovate a fattura.
2. **Un cliente per utente della chat** — `external_id: "tg:<user id>"`. Chiedi l’email solo per gli abbonamenti: lì vanno i rinnovi.
3. **/buy** — Una fattura con l’id della chat in `metadata`, inviata con un pulsante. Una fattura per utente al giorno, grazie a una chiave di idempotenza.
4. **Apri l’accesso** — Con `invoice.fulfilled`, prendi l’id della chat da `metadata` e rispondi: un messaggio, un invito monouso, un ruolo.
5. **Comandi a pagamento** — `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 }]] } });
```

## Esegui l’esempio

1. **Installa** — `npm install` in `examples/telegram-bot` (Node 20.12+).
2. **Chiave** — Copia `.env.example` in `.env` e metti una chiave di test (`sk_test_…`) in `PERLY_PAY_SECRET_KEY`.
3. **Prepara** — `npm run setup` crea il prodotto e il prezzo con la tua chiave e stampa i loro id per `.env`.
4. **Avvia** — `npm start` (o `npm run dev`), come dice il suo README.
5. **Paga senza wallet** — Scrivi `/buy` al bot, apri Pay e premi **Simulate payment**: il bot dice «Payment confirmed» e `/secret` risponde.

## Errori comuni

- Lo stesso link di pagamento per tutti: non si vede chi ha pagato. Una fattura per utente, con l’id della chat.
- Dare l’accesso quando l’utente preme «Ho pagato». Lo apre solo il webhook o `entitlements.check`.
- L’accesso nella memoria del bot. Si perde al riavvio; chiedi a Perly Pay.
