# Recette : bot Telegram

> Vendez des commandes de bot, un rôle ou un groupe privé. Chaque utilisateur reçoit sa propre facture ; un webhook signé débloque l’accès.

Le bot ne voit jamais l’argent. Sur `/buy`, il envoie à l’utilisateur son propre lien de facture ; votre serveur reçoit `invoice.fulfilled` et débloque. Chaque commande payante interroge Perly Pay : un redémarrage ne perd rien. Discord marche de la même façon, avec un rôle.

> **Note:** Avec un assistant : le skill `sell-bot-access` du plugin Perly Pay réalise cette recette dans votre projet. L’exemple exécutable est `examples/telegram-bot` (MIT) dans le dépôt du plugin.

## Comment ça marche

1. **Un produit et un prix** — Unique ou à vie pour « pour toujours », durée fixe pour les pass, abonnement pour les adhésions renouvelées par facture.
2. **Un client par utilisateur du chat** — `external_id: "tg:<user id>"`. Ne demandez un e-mail que pour les abonnements : les renouvellements y partent.
3. **/buy** — Une facture avec l’id du chat dans `metadata`, envoyée sous forme de bouton. Une facture par utilisateur et par jour, grâce à la clé d’idempotence.
4. **Débloquez** — Sur `invoice.fulfilled`, lisez l’id du chat dans `metadata` et répondez : un message, un lien d’invitation à usage unique, un rôle.
5. **Commandes payantes** — `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 }]] } });
```

## Lancez l’exemple

1. **Installez** — `npm install` dans `examples/telegram-bot` (Node 20.12+).
2. **Clé** — Copiez `.env.example` vers `.env` et mettez une clé de test (`sk_test_…`) dans `PERLY_PAY_SECRET_KEY`.
3. **Préparez** — `npm run setup` crée le produit et le prix avec votre clé et affiche leurs ids pour `.env`.
4. **Lancez** — `npm start` (ou `npm run dev`), comme l’indique son README.
5. **Payez sans portefeuille** — Envoyez `/buy` au bot, ouvrez Pay et touchez **Simulate payment** : le bot répond « Payment confirmed » et `/secret` répond.

## Pièges

- Un seul lien de paiement partagé pour tous : impossible de savoir qui a payé. Une facture par utilisateur, avec l’id du chat.
- Débloquer quand l’utilisateur touche « J’ai payé ». Seuls le webhook ou `entitlements.check` débloquent.
- L’accès gardé dans la mémoire du bot. Il disparaît au redémarrage ; interrogez Perly Pay.
