golang基于闪电网络实现API按请求计费的中间件插件库ln-paywall的使用
Golang基于闪电网络实现API按请求计费的中间件插件库ln-paywall的使用
概述
ln-paywall是一个Go中间件,用于通过比特币和闪电网络实现API按请求计费的功能。它支持多种主流Go web框架,并提供客户端库来简化支付流程。
工作原理
- 第一次请求会返回
402 Payment Required
状态码,并在响应体中包含闪电网络发票(BOLT-11格式) - 第二次请求需要包含已支付发票的
X-Preimage
头信息 - 中间件会验证发票是否已支付且未被重复使用
前置条件
- 运行中的闪电网络节点(支持lnd或c-lightning)
- 支持的存储机制(用于缓存已使用的支付凭证)
使用示例
基本Gin中间件示例
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/philippgille/ln-paywall/ln"
"github.com/philippgille/ln-paywall/storage"
"github.com/philippgille/ln-paywall/wall"
)
func main() {
r := gin.Default()
// 配置中间件
invoiceOptions := wall.DefaultInvoiceOptions // 价格: 1聪; 备注: "API call"
lndOptions := ln.DefaultLNDoptions // 地址: "localhost:10009", 证书文件: "tls.cert", Macaroon文件: "invoice.macaroon"
storageClient := storage.NewGoMap() // 本地内存缓存
lnClient, err := ln.NewLNDclient(lndOptions)
if err != nil {
panic(err)
}
// 使用中间件
r.Use(wall.NewGinMiddleware(invoiceOptions, lnClient, storageClient))
r.GET("/ping", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
客户端示例
package main
import (
"fmt"
"io/ioutil"
"github.com/philippgille/ln-paywall/ln"
"github.com/philippgille/ln-paywall/pay"
)
func main() {
// 设置客户端
lndOptions := ln.LNDoptions{ // 默认地址: "localhost:10009", 证书文件: "tls.cert"
MacaroonFile: "admin.macaroon", // admin.macaroon 用于支付
}
lnClient, err := ln.NewLNDclient(lndOptions)
if err != nil {
panic(err)
}
client := pay.NewClient(nil, lnClient) // 如果未提供http.Client则使用http.DefaultClient
// 发送请求到ln-paywalled API
res, err := client.Get("http://localhost:8080/ping")
if err != nil {
panic(err)
}
defer res.Body.Close()
// 打印响应体
resBody, err := ioutil.ReadAll(res.Body)
if err != nil {
panic(err)
}
fmt.Println(string(resBody))
}
支持的框架
- Gin
- Echo
- gorilla/mux
- 标准net/http HandlerFunc
相关项目
- ElementsProject/paypercall - Express中间件和反向代理
- koa-web-monetization - Koa中间件
- moonbanking.com API - 使用类似功能的API
- coinbee.io - 比特币支付墙服务
通过ln-paywall,您可以轻松地为Go API添加闪电网络支付功能,实现真正的按请求计费。
更多关于golang基于闪电网络实现API按请求计费的中间件插件库ln-paywall的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang基于闪电网络实现API按请求计费的中间件插件库ln-paywall的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用ln-paywall实现Golang闪电网络API计费中间件
ln-paywall是一个基于闪电网络的Golang中间件库,允许开发者实现API按请求计费的功能。下面我将详细介绍如何使用这个库。
基本概念
ln-paywall的工作原理是:
- 客户端在调用API前需要先支付闪电网络发票
- 服务端验证支付后允许访问API
- 支付信息可以存储在内存或Redis中
安装
go get github.com/philippgille/ln-paywall
基本使用示例
package main
import (
"net/http"
"time"
"github.com/philippgille/ln-paywall/ln"
"github.com/philippgille/ln-paywall/paywall"
"github.com/philippgille/ln-paywall/storage"
)
func main() {
// 1. 创建LND客户端配置
lndOptions := ln.LNDoptions{
Address: "localhost:10009", // LND节点地址
CertFile: "tls.cert", // TLS证书路径
MacaroonFile: "admin.macaroon", // Macaroon文件路径
}
// 2. 创建存储(这里使用内存存储,生产环境建议用Redis)
storage := storage.NewMemoryStorage()
// 3. 创建支付处理器
invoiceOptions := paywall.InvoiceOptions{
Amount: 1000, // 每请求1000 satoshis
Description: "API访问费用",
Expiry: 15 * time.Minute, // 发票有效期
Storage: storage,
LNDoptions: lndOptions,
}
// 4. 创建支付中间件
paywallMiddleware := paywall.NewMiddleware(invoiceOptions)
// 5. 创建HTTP处理器
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("付费API访问成功!"))
})
// 6. 应用中间件
protectedHandler := paywallMiddleware.Handler(handler)
// 7. 启动服务器
http.ListenAndServe(":8080", protectedHandler)
}
高级配置
使用Redis存储
redisOptions := storage.RedisOptions{
Addr: "localhost:6379",
Password: "", // 无密码
DB: 0, // 默认DB
}
storage, err := storage.NewRedisStorage(redisOptions)
if err != nil {
panic(err)
}
自定义支付成功处理器
paywallMiddleware := paywall.NewMiddleware(invoiceOptions,
paywall.WithSuccessHandler(func(w http.ResponseWriter, r *http.Request) {
// 支付成功后的自定义处理
w.Header().Set("X-Payment-Status", "verified")
}),
)
设置白名单路径
paywallMiddleware := paywall.NewMiddleware(invoiceOptions,
paywall.WithWhitelistPaths([]string{"/free", "/health"}),
)
客户端集成
客户端需要处理以下流程:
- 首次请求API会收到402 Payment Required响应
- 响应中包含闪电网络发票
- 客户端支付发票
- 使用支付预映像再次请求API
示例客户端代码:
async function callPaidApi() {
// 第一次请求
let response = await fetch('/protected-api');
if (response.status === 402) {
// 获取发票
const invoice = response.headers.get('X-Invoice');
// 使用WebLN或其他方式支付发票
await window.webln.enable();
const { preimage } = await window.webln.sendPayment(invoice);
// 使用预映像再次请求
response = await fetch('/protected-api', {
headers: {
'X-Preimage': preimage
}
});
}
// 处理响应
const data = await response.json();
console.log(data);
}
生产环境建议
- 使用Redis作为存储后端确保持久性
- 设置合理的发票有效期(通常15-30分钟)
- 考虑实现退款机制
- 监控支付成功率调整定价策略
- 为高价值API实现多级定价
ln-paywall为Golang开发者提供了一种简单的方式将闪电网络支付集成到API中,实现微支付场景。通过中间件模式,它可以轻松与现有应用集成,无需大幅修改代码结构。