Skip to main content

▶ Guarda prima il flusso 402

Demo interattiva nel terminale — osserva richiesta → 402 → pagamento Lightning → 200 OK, in diretta nel tuo browser.

Opzione A — Crea un server completo con un solo comando (il più veloce)

npx create-l402-app my-api
Questo crea un progetto Express + l402-kit completo: server.ts, .env.example, tsconfig.json, e un endpoint /premium pronto ad accettare pagamenti Lightning.
my-api/
  src/server.ts      ← la tua API con middleware l402
  .env.example       ← template credenziali Blink/OpenNode
  package.json       ← npm install l402-kit + tsx
  tsconfig.json
  README.md
Poi:
cd my-api
cp .env.example .env   # aggiungi la tua chiave API Blink
npm install
npm run dev
# ⚡ l402-kit server running on http://localhost:3000
# curl http://localhost:3000/premium  →  402 Payment Required

Opzione B — Aggiungere a un progetto esistente

1. Scegli la modalità

ManagedSoberano
Tempo di configurazione~2 min~5 min
Costo mensile$0$0
Commissione per transazione0,3%0%
Cosa ti serveUn indirizzo LightningUn account Blink / Alby / BTCPay
Elaborazione di 10.000 sats30 sat di commissione$0 di commissione
Ideale perIniziare velocementeVolumi / produzione
Non sei sicuro? Inizia con Managed — nessun nodo, nessun account, solo un indirizzo Lightning. Passa a Soberano con una riga di codice quando vuoi le commissioni allo 0%. I token già pagati continuano a funzionare dopo il cambio. Ottieni un indirizzo Lightning (gratuito, 2 min): Registrati su dashboard.blink.sv — riceverai yourname@blink.sv. Oppure usa Alby, Phoenix, o Wallet of Satoshi. Configurazione Soberano: Registrati su dashboard.blink.svAPI Keys → crea chiave → copia il tuo BTC Wallet ID dalla pagina del wallet. Imposta BLINK_API_KEY e BLINK_WALLET_ID nel tuo .env.

2. Installa

npm install l402-kit

3. Aggiungere alla tua API

Nessun nodo Lightning necessario — basta il tuo indirizzo 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. Testalo

curl http://localhost:3000/premium
Risposta:
{
  "error": "Payment Required",
  "price_sats": 100,
  "invoice": "lnbc1u1p...",
  "macaroon": "eyJoYXNo..."
}
Paga la fattura con qualsiasi wallet Lightning, poi:
curl http://localhost:3000/premium \
  -H "Authorization: L402 <macaroon>:<preimage>"
Risposta:
{ "data": "You paid 100 sats. Here is your data." }
La tua API ora accetta pagamenti in Bitcoin.

Testa senza sats reali

Non hai bisogno di un wallet Lightning per testare la tua integrazione. Usa un mock provider — genera coppie di token crittografici validi in locale, senza alcuna chiamata di rete:
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 ✓
Per test con denaro reale in sandbox, usa la modalità test di OpenNode:
const lightning = new OpenNodeProvider(process.env.OPENNODE_KEY!, true); // testMode: no real sats
Guida completa ai test → Testing