# Tarif: Telegram botu

> Bot komutlarını, bir rolü ya da özel bir grubu sat. Her kullanıcı kendi faturasını alır; imzalı bir webhook erişimi açar.

Bot parayı görmez. `/buy` komutunda kullanıcıya kendi fatura bağlantısını gönderir; sunucun `invoice.fulfilled`'ı duyar ve erişimi açar. Her ücretli komut Perly Pay'e sorar, bu yüzden yeniden başlatmadan sonra hiçbir şey kaybolmaz. Discord'da da aynı, rol üzerinden.

> **Not:** Asistanla: bu tarifi projende Perly Pay eklentisinin `sell-bot-access` skill'i uygular. Çalıştırılabilir örnek, eklenti deposundaki `examples/telegram-bot` (MIT).

## Nasıl çalışır

1. **Ürün ve fiyat** — Tek seferlik ya da ömür boyu — "sonsuza dek" için, süreli — geçiş kartları için, abonelik — faturayla yenilenen üyelik için.
2. **Her sohbet kullanıcısına bir müşteri** — `external_id: "tg:<user id>"`. E-postayı yalnızca abonelikler için sor: yenilemeler oraya gider.
3. **/buy** — `metadata` içinde sohbet kimliğiyle bir fatura, butonla gönderilir. Idempotency anahtarı sayesinde kullanıcı başına günde bir fatura.
4. **Erişimi aç** — `invoice.fulfilled` geldiğinde sohbet kimliğini `metadata`'dan al ve yanıtla: mesaj, tek kullanımlık davet, rol.
5. **Ücretli komutlar** — `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 }]] } });
```

## Örneği çalıştır

1. **Kur** — `examples/telegram-bot` içinde `npm install` (Node 20.12+).
2. **Anahtar** — `.env.example` dosyasını `.env` olarak kopyala ve test anahtarını (`sk_test_…`) `PERLY_PAY_SECRET_KEY` içine yaz.
3. **Hazırla** — `npm run setup` senin anahtarınla bir ürün ve fiyat oluşturur ve `.env` için kimliklerini yazdırır.
4. **Çalıştır** — README'sinde dediği gibi `npm start` (ya da `npm run dev`).
5. **Cüzdansız öde** — Bota `/buy` yaz, Pay'i aç ve **Simulate payment**'a bas: bot "Payment confirmed" der ve `/secret` yanıt verir.

## Tuzaklar

- Herkes için tek bir ortak ödeme bağlantısı: kimin ödediği görünmez. Her kullanıcıya, sohbet kimliğiyle bir fatura.
- Kullanıcı "Ödedim"e bastığında erişim açmak. Erişimi yalnızca webhook ya da `entitlements.check` açar.
- Erişimi botun belleğinde tutmak. Yeniden başlatınca kaybolur; Perly Pay'e sor.
