入門
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 如何簡化閃電網路互動。
已複製連結