跳至主要內容
入門

WebLN 協議

了解 WebLN 標準,如何在網頁應用中整合閃電網路支付功能。

10 分鐘

什麼是 WebLN?

WebLN 是一個瀏覽器標準,允許網頁應用與用戶的閃電網路錢包互動。 類似於 Web3 錢包(如 MetaMask)用於以太坊,WebLN 提供者(如 Alby) 將閃電網路功能帶到網頁中,使網站可以請求支付、創建發票等。

window.webln: WebLN 提供者在瀏覽器中注入 window.webln 對象, 網頁通過這個對象與閃電錢包互動。

WebLN 提供者

Alby

最流行的 WebLN 瀏覽器擴展。支援多種後端:託管、LND、Core Lightning、 Umbrel 等。Chrome、Firefox、Safari 都可用。

Joule

連接到自己的 LND 節點的擴展。 完全非託管,需要自己運行節點。

BlueWallet

移動端錢包也支援 WebLN, 通過掃描 QR 碼與網頁互動。

Zeus

移動端節點管理器, 支援 WebLN 連接。

基本 API

WebLN API 方法:

// 檢測 WebLN 是否可用
if (typeof window.webln !== 'undefined') {
  // WebLN 提供者已安裝
}

// 啟用 WebLN(請求用戶授權)
await window.webln.enable();

// 獲取節點資訊
const info = await window.webln.getInfo();
console.log(info.node.pubkey);

// 發送支付
const response = await window.webln.sendPayment(bolt11Invoice);
console.log(response.preimage); // 支付證明

// 創建發票
const invoice = await window.webln.makeInvoice({
  amount: 1000,           // satoshis
  defaultMemo: 'Coffee'
});
console.log(invoice.paymentRequest); // BOLT11 發票

// 簽名訊息
const signature = await window.webln.signMessage('Hello');

// 驗證訊息
const verified = await window.webln.verifyMessage(
  signature.signature,
  'Hello'
);

支付按鈕實現

完整的支付按鈕示例:

<button id="pay-button">Pay 1000 sats</button>

<script>
document.getElementById('pay-button').addEventListener('click', async () => {
  // 檢查 WebLN 是否可用
  if (typeof window.webln === 'undefined') {
    alert('請安裝 WebLN 擴展(如 Alby)');
    return;
  }

  try {
    // 啟用 WebLN
    await window.webln.enable();

    // 從後端獲取發票(或使用 LNURL)
    const response = await fetch('/api/create-invoice', {
      method: 'POST',
      body: JSON.stringify({ amount: 1000 })
    });
    const { invoice } = await response.json();

    // 請求用戶支付
    const payment = await window.webln.sendPayment(invoice);

    // 支付成功
    console.log('支付成功!Preimage:', payment.preimage);
    alert('謝謝你的支付!');

  } catch (error) {
    if (error.message === 'User rejected') {
      console.log('用戶取消了支付');
    } else {
      console.error('支付失敗:', error);
    }
  }
});
</script>

進階功能

進階 WebLN 功能:

// Keysend(自發支付)
await window.webln.keysend({
  destination: 'node_pubkey...',
  amount: 1000,
  customRecords: {
    // TLV 自訂資料
    7629168: 'Hello!'  // Keysend 預留類型
  }
});

// LNURL 支援
await window.webln.lnurl('lnurl1...');

// 請求發票(讓用戶創建發票給你)
const invoice = await window.webln.makeInvoice({
  amount: 5000,
  defaultMemo: 'Refund'
});

// 使用 webln-js 庫簡化開發
import { requestProvider } from 'webln';

async function pay() {
  const webln = await requestProvider();
  await webln.sendPayment(invoice);
}

// 監聽 WebLN 事件
window.addEventListener('webln:enabled', () => {
  console.log('WebLN 已啟用');
});

與 LNURL 配合

WebLN + LNURL Workflow

LNURL-pay Example Flow:
1. Website shows LNURL QR code or button
2. User clicks, WebLN handles LNURL
3. WebLN requests invoice from server
4. User confirms payment
5. WebLN sends payment

Code Example:
// Using LNURL
const lnurl = 'lnurl1dp68gurn8ghj7...';

try {
  await window.webln.enable();
  const result = await window.webln.lnurl(lnurl);
  console.log('LNURL result:', result);
} catch (error) {
  console.error('LNURL failed:', error);
}

Lightning Address Support:
// Parse Lightning Address to LNURL
const address = '[email protected]';
const lnurlPayUrl = `https://${domain}/.well-known/lnurlp/${user}`;
// Then use webln.lnurl()

最佳實踐

優雅降級

不要假設用戶有 WebLN。提供備選方案如 QR 碼掃描、 複製發票等傳統方式。

用戶授權

只在需要時調用 enable()。不要在頁面載入時就請求授權, 等用戶主動點擊付款按鈕。

錯誤處理

處理用戶拒絕、餘額不足、網路錯誤等情況。 提供清晰的錯誤訊息。

支付確認

驗證 preimage 確認支付成功。 不要只依賴前端回調。

使用 WebLN 的網站

Applications Supporting WebLN

Content Platforms:
• Stacker News: Bitcoin discussion forum
• Fountain: Podcast app
• Nostr clients: Snort, Iris, etc.
• Y'alls: Paid articles platform

Games:
• Lightning Crush: Match-3 game
• Satoshi's Games: Various mini-games
• Lightning Spin: Roulette game

Tools:
• LN.Tips: Tipping tool
• Amboss: Node analytics
• LightningNetwork+: Node ranking
• 1ML: Network explorer

Merchants:
• Bitrefill: Gift cards
• Fold: Shopping cashback
• Other Lightning-integrated merchants

開發資源

開發工具:

npm 套件:
npm install webln
npm install @webbtc/webln-types  # TypeScript 類型

React Hook:
npm install @alby/bitcoin-connect

import { BitcoinConnectProvider, useLnProvider } from '@alby/bitcoin-connect';

function PayButton() {
  const { provider, connect, isConnected } = useLnProvider();

  const pay = async () => {
    if (!isConnected) await connect();
    await provider.sendPayment(invoice);
  };

  return <button onClick={pay}>Pay</button>;
}

測試環境:
├── 使用 Polar 建立本地測試網路
├── Alby 擴展支援 regtest/testnet
└── 或使用 MockWebLN 進行單元測試

安全提醒: WebLN 擴展可以存取你的閃電錢包。只安裝可信的擴展, 並謹慎授權網站訪問你的錢包功能。

相關資源

下一步: 了解 LNURL 如何簡化閃電網路互動。

已複製連結
已複製到剪貼簿