· 9 days ago
x402 协议是 Coinbase 推出的开放支付标准,利用 HTTP 402 “Payment Required” 状态码实现链上微支付(如 USDC),特别适合 API 或内容服务的按需付费场景。它与 Rails 的 RESTful 架构高度契合,通过 middleware 或轻量 SDK 集成,能最小化代码变更。
x402 协议是 Coinbase 推出的开放支付标准,利用 HTTP 402 “Payment Required” 状态码实现链上微支付(如 USDC),特别适合 API 或内容服务的按需付费场景。它与 Rails 的 RESTful 架构高度契合,通过 middleware 或轻量 SDK 集成,能最小化代码变更。以下是最简洁的接入指南,基于 Coinbase 的官方 SDK 和社区扩展(如 l402_middleware gem,它直接支持 x402 的 L402 变体)。整个过程只需 5-10 行核心代码,优雅地嵌入 Rails 的 Rack 栈。
Gemfile 和 config/routes.rb)。在 Gemfile 中添加以下 gem:
# Coinbase 官方 Ruby SDK,用于钱包生成、交易签名和 facilitator 集成
gem 'coinbase-sdk-ruby', '~> 1.0' # 处理 x402 的链上部分
# L402 middleware(社区 gem,支持 x402 的 HTTP 402 响应和支付验证)
gem 'l402_middleware', git: 'https://github.com/rits1272/l402_middleware.git' # 或发布版 gem
运行 bundle install。如果需要客户端侧支持(如浏览器支付),安装 @coinbase/x402-sdk(JS):
yarn add @coinbase/x402-sdk
x402 的“facilitator” 是核心,它处理支付验证和结算(Coinbase 托管版免费)。在 config/initializers/x402.rb 中配置:
# config/initializers/x402.rb
require 'coinbase/sdk'
Coinbase::SDK.configure do |config|
config.api_key = ENV['COINBASE_API_KEY'] # 从环境变量加载
config.base_url = 'https://api.coinbase.com' # 或 Testnet
end
# 定义支付参数(示例:0.01 USDC per API 调用)
X402_CONFIG = {
amount: '0.01',
currency: 'USDC',
chain: 'base', # Base Layer 2 网络
facilitator_url: 'https://facilitator.coinbase.com/x402' # Coinbase 托管
}.freeze
Rails 的 Rack middleware 是接入 x402 的最佳方式:它拦截请求,检查支付,返回 402 响应,并在支付后放行。无需修改控制器逻辑。
在 config/application.rb 中添加:
# config/application.rb
module YourApp
class Application < Rails::Application
config.middleware.use L402Middleware, X402_CONFIG # 自动处理 402 响应和验证
end
end
x402-payment(如果支付已完成),验证链上交易(调用 Coinbase SDK)。未支付时,返回 JSON 元数据(金额、地址、链 ID),客户端(如 AI 代理)据此发起支付。假设你有一个付费 API(如 /api/data),在控制器中标记付费端点:
# app/controllers/api/data_controller.rb
class Api::DataController < ApplicationController
before_action :require_x402_payment, only: :show # 只对 show 动作要求支付
def show
# 你的业务逻辑:返回付费数据
render json: { data: 'Premium content unlocked!' }
end
private
def require_x402_payment
# Middleware 已处理 402,但这里可自定义逻辑
unless request.headers['x402-payment']
# 手动触发 402(fallback)
response.set_header('WWW-Authenticate', "x402 #{X402_CONFIG.to_json}")
render json: { error: 'Payment required' }, status: :payment_required
end
end
end
在 config/routes.rb 中定义路由:
# config/routes.rb
Rails.application.routes.draw do
namespace :api do
resources :data, only: :show # /api/data
end
end
对于服务器端(seller),以上已够;如果你的 Rails app 也需作为 buyer(e.g., AI 代理调用外部 API),在服务层添加:
# app/services/x402_payment_service.rb
class X402PaymentService
include Coinbase::SDK::Wallets # 从 SDK 导入
def pay_for_resource(url, amount = X402_CONFIG[:amount])
# 1. 发送 HEAD 请求检查 402
response = HTTP.head(url)
if response.status == 402
payment_req = JSON.parse(response.headers['WWW-Authenticate'].split('x402 ')[1])
# 2. 生成临时钱包并支付(抽象 crypto 细节)
wallet = create_wallet # SDK 方法
tx_hash = wallet.transfer(payment_req['address'], amount, payment_req['chain'])
# 3. 重发请求带支付证明
HTTP.get(url, headers: { 'x402-payment' => { tx_hash: tx_hash, amount: amount }.to_json })
else
response.body # 无需支付
end
end
end
使用示例:在控制器或 job 中调用 X402PaymentService.new.pay_for_resource('https://external-api.com/data')。
rails server,用 curl 测试:curl -v http://localhost:3000/api/data # 应返回 402 + 支付元数据
# 模拟支付后:curl -H "x402-payment: {tx_hash: 'dummy'}" http://localhost:3000/api/data
Moon · 9 days
Share with your followers.
Reply