golang基于闪电网络实现API按请求计费的中间件插件库ln-paywall的使用

Golang基于闪电网络实现API按请求计费的中间件插件库ln-paywall的使用

概述

ln-paywall是一个Go中间件,用于通过比特币和闪电网络实现API按请求计费的功能。它支持多种主流Go web框架,并提供客户端库来简化支付流程。

工作原理

  1. 第一次请求会返回402 Payment Required状态码,并在响应体中包含闪电网络发票(BOLT-11格式)
  2. 第二次请求需要包含已支付发票的X-Preimage头信息
  3. 中间件会验证发票是否已支付且未被重复使用

前置条件

  1. 运行中的闪电网络节点(支持lnd或c-lightning)
  2. 支持的存储机制(用于缓存已使用的支付凭证)

使用示例

基本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

相关项目

  1. ElementsProject/paypercall - Express中间件和反向代理
  2. koa-web-monetization - Koa中间件
  3. moonbanking.com API - 使用类似功能的API
  4. 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的工作原理是:

  1. 客户端在调用API前需要先支付闪电网络发票
  2. 服务端验证支付后允许访问API
  3. 支付信息可以存储在内存或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"}),
)

客户端集成

客户端需要处理以下流程:

  1. 首次请求API会收到402 Payment Required响应
  2. 响应中包含闪电网络发票
  3. 客户端支付发票
  4. 使用支付预映像再次请求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);
}

生产环境建议

  1. 使用Redis作为存储后端确保持久性
  2. 设置合理的发票有效期(通常15-30分钟)
  3. 考虑实现退款机制
  4. 监控支付成功率调整定价策略
  5. 为高价值API实现多级定价

ln-paywall为Golang开发者提供了一种简单的方式将闪电网络支付集成到API中,实现微支付场景。通过中间件模式,它可以轻松与现有应用集成,无需大幅修改代码结构。

回到顶部