Skip to main content

▶ まず402フローを見る

インタラクティブなターミナルデモ — リクエスト → 402 → Lightning支払い → 200 OK の流れをブラウザでライブ確認できます。

オプション A — 1コマンドでフルサーバーをスキャフォールド(最速)

npx create-l402-app my-api
これにより、完全な Express + l402-kit プロジェクトが作成されます: server.ts.env.exampletsconfig.json、そして Lightning 支払いを受け付ける準備が整った /premium エンドポイントが含まれます。
my-api/
  src/server.ts      ← l402 ミドルウェアを含むあなたのAPI
  .env.example       ← Blink/OpenNode 認証情報テンプレート
  package.json       ← npm install l402-kit + tsx
  tsconfig.json
  README.md
次に:
cd my-api
cp .env.example .env   # Blink APIキーを追加
npm install
npm run dev
# ⚡ l402-kit server running on http://localhost:3000
# curl http://localhost:3000/premium  →  402 Payment Required

オプション B — 既存プロジェクトに追加する

1. モードを選択する

ManagedSoberano
セットアップ時間約2分約5分
月額費用$0$0
トランザクションごとの手数料0.3%0%
必要なものLightning アドレスBlink / Alby / BTCPay アカウント
10,000 sats の処理30 sat 手数料$0 手数料
最適な用途素早く始めるボリューム / 本番環境
迷ったら? Managed から始めましょう — ノード不要、アカウント不要、Lightning アドレスだけでOKです。0% 手数料が必要になったら、コード1行で Soberano に切り替えられます。切り替え後も、支払い済みトークンはそのまま使い続けられます。 Lightning アドレスを取得する(無料、2分): dashboard.blink.sv でサインアップすると yourname@blink.sv が発行されます。または AlbyPhoenixWallet of Satoshi を使うこともできます。 Soberano セットアップ: dashboard.blink.sv でサインアップ → API Keys → キーを作成 → ウォレットページから BTC Wallet ID をコピー。.envBLINK_API_KEYBLINK_WALLET_ID を設定してください。

2. インストール

npm install l402-kit

3. APIに追加する

Lightning ノード不要 — Lightning アドレスだけで使えます。
import express from "express";
import { l402, ManagedProvider } from "l402-kit";

const app = express();
const lightning = ManagedProvider.fromAddress("you@yourdomain.com");

app.get("/premium", l402({ priceSats: 100, lightning }), (_req, res) => {
  res.json({ data: "You paid 100 sats. Here is your data." });
});

app.listen(3000);
// 0.3% fee · no node setup · works immediately

4. テストする

curl http://localhost:3000/premium
レスポンス:
{
  "error": "Payment Required",
  "price_sats": 100,
  "invoice": "lnbc1u1p...",
  "macaroon": "eyJoYXNo..."
}
任意の Lightning ウォレットでインボイスを支払い、その後:
curl http://localhost:3000/premium \
  -H "Authorization: L402 <macaroon>:<preimage>"
レスポンス:
{ "data": "You paid 100 sats. Here is your data." }
これであなたのAPIはビットコイン決済を受け付けられるようになりました。

実際の sats を使わずにテストする

インテグレーションのテストに Lightning ウォレットは必要ありません。モックプロバイダーを使いましょう — ネットワーク呼び出しなしで、有効な暗号トークンペアをローカルで生成します:
import { createHash, randomBytes } from "crypto";
import { l402 } from "l402-kit";
import type { LightningProvider, Invoice } from "l402-kit";

// Drop-in mock — generates real SHA256 hash/preimage pairs
function makeMockProvider(): LightningProvider & { preimage: string } {
  const preimage = randomBytes(32).toString("hex");
  const paymentHash = createHash("sha256").update(Buffer.from(preimage, "hex")).digest("hex");
  return {
    preimage, // use this in your test Authorization header
    async createInvoice(amountSats: number): Promise<Invoice> {
      const macaroon = Buffer.from(
        JSON.stringify({ hash: paymentHash, exp: Date.now() + 3_600_000 })
      ).toString("base64");
      return { paymentRequest: "lnbc_mock", paymentHash, macaroon, amountSats };
    },
    async checkPayment(): Promise<boolean> { return true; },
  };
}

// Usage in tests:
const mock = makeMockProvider();
app.get("/premium", l402({ priceSats: 10, lightning: mock }), handler);

// Step 1 — unauthenticated → 402
const res402 = await request(app).get("/premium");
// res402.body.macaroon  ← use this

// Step 2 — pay with mock preimage → 200
const res200 = await request(app)
  .get("/premium")
  .set("Authorization", `L402 ${res402.body.macaroon}:${mock.preimage}`);
// res200.status === 200 ✓
サンドボックスを使った実際の課金テストには、OpenNode の testMode を使用してください:
const lightning = new OpenNodeProvider(process.env.OPENNODE_KEY!, true); // testMode: 実際の sats は不要
テストの完全ガイド → テスト