# レシピ：Telegram ボット

> ボットのコマンド、ロール、非公開グループを販売。ユーザーごとに専用の請求書を作り、署名付き Webhook がアクセスを開きます。

ボットはお金を見ません。`/buy` でユーザーに専用の請求書リンクを送り、あなたのサーバーが `invoice.fulfilled` を受けてアクセスを開きます。有料コマンドは毎回 Perly Pay に尋ねるため、再起動しても何も失われません。Discord もロールで同じように。

> **注:** アシスタントと一緒に：このレシピは、Perly Pay プラグインの `sell-bot-access` スキルがあなたのプロジェクトで実行します。動くサンプルは、プラグインのリポジトリの `examples/telegram-bot`（MIT）です。

## 仕組み

1. **商品と価格** — 一回払いか買い切りは「永久」、期間制はパス、サブスクリプションは請求書で更新するメンバーシップに。
2. **チャットのユーザーごとに顧客** — `external_id: "tg:<user id>"`。メールはサブスクリプションのときだけ尋ねます：更新はそこに届きます。
3. **/buy** — `metadata` にチャット ID を入れた請求書を、ボタンで送ります。冪等キーのおかげで、ユーザーごとに 1 日 1 件。
4. **アクセスを開く** — `invoice.fulfilled` で `metadata` からチャット ID を取り出して応答：メッセージ、一度きりの招待、ロール。
5. **有料コマンド** — `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 }]] } });
```

## サンプルを動かす

1. **インストール** — `examples/telegram-bot` で `npm install`（Node 20.12+）。
2. **キー** — `.env.example` を `.env` にコピーし、`PERLY_PAY_SECRET_KEY` にテストキー（`sk_test_…`）を書きます。
3. **準備** — `npm run setup` があなたのキーで商品と価格を作成し、`.env` 用にその ID を表示します。
4. **起動** — README のとおり `npm start`（または `npm run dev`）。
5. **ウォレットなしで支払う** — ボットに `/buy` と送り、Pay を開いて **Simulate payment** を押します：ボットが「Payment confirmed」と言い、`/secret` が応答します。

## 落とし穴

- 全員で 1 つの支払いリンクを共有すること：誰が支払ったかわかりません。ユーザーごとに、チャット ID 付きの請求書を。
- ユーザーが「支払いました」を押した時点でアクセスを開くこと。開くのは Webhook か `entitlements.check` だけです。
- ボットのメモリにアクセス権を持つこと。再起動で消えます。Perly Pay に尋ねてください。
