Chuyển từ Stripe sang Blockchain0x để truy cập API do agent điều khiển.
Đừng thay thế Stripe; hãy chạy nó song song. Một cổng duy nhất đứng trước mỗi điểm cuối được bảo vệ với hai phương thức xác thực: một đăng ký Stripe đang hoạt động (dành cho con người), nếu không thì là bộ điều hợp x402 phía nhận (dành cho các tác nhân), bộ điều hợp này phát hành một thách thức 402 và xác minh tiêu đề X-Payment trong lần thử lại. Logic xử lý không thay đổi.
Trước khi bạn bắt đầu.
- Một tích hợp Stripe hoạt động với ít nhất một sản phẩm/giá đang hoạt động (đăng ký hoặc một lần).
- Một hồ sơ đại lý Blockchain0x và khóa API (xem thêm thanh toán cho đại lý).
- Một lớp xác thực/middleware trong khung web của bạn nơi bạn hiện đang gọi Stripe để kiểm soát quyền truy cập.
- Một cơ chế cờ tính năng (biến môi trường, LaunchDarkly, boolean đơn giản - bất cứ điều gì cho phép bạn chuyển đổi hành vi mà không cần triển khai lại).
- Hiểu về x402 pattern - bộ trang trí bên dưới thực hiện nó.
Viết lớp chặn dual-auth.
Cánh cổng là một mảnh keo duy nhất. Nó kiểm tra xem có đăng ký Stripe hoạt động trước tiên (đường đi của con người); nếu không có, nó chuyển yêu cầu cho bộ chuyển đổi phía nhận x402 (đường đi của tác nhân), bộ chuyển đổi này phát hành thử thách 402 và xác minh tiêu đề X-Payment khi tác nhân thử lại. Ví dụ Node sử dụng createX402Middleware; một dịch vụ Python nói cùng một dây bằng tay.
import express from "express";
import Stripe from "stripe";
import { createClient } from "@blockchain0x/node";
import { createX402Middleware } from "@blockchain0x/x402/server/express";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
const sdk = createClient({ apiKey: process.env.BLOCKCHAIN0X_API_KEY! });
// Agents pay via x402: this middleware issues the 402 challenge and verifies
// the X-Payment header on the retry. Configure price + recipient per the docs.
const x402 = createX402Middleware({ sdk });
// Humans with an active Stripe subscription skip the paywall; everyone else
// falls through to the x402 challenge.
function stripeOrX402(req: express.Request, res: express.Response, next: express.NextFunction) {
const customer = req.cookies?.stripe_customer_id;
if (!customer) return x402(req, res, next); // agent path
stripe.subscriptions
.list({ customer, status: "active", limit: 1 })
.then((subs) => (subs.data.length > 0 ? next() : x402(req, res, next)))
.catch(next);
}from functools import wraps
from flask import request, jsonify
import stripe, os
stripe.api_key = os.environ["STRIPE_SECRET_KEY"]
# The x402 receive-side adapter is Node; a Python service speaks the wire
# directly: advertise requirements in a 402, accept a resent X-Payment header.
def stripe_or_x402(resource: str):
def decorator(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
# 1. Human path: active Stripe subscription.
customer_id = request.cookies.get("stripe_customer_id")
if customer_id:
subs = stripe.Subscription.list(customer=customer_id, status="active", limit=1)
if subs["data"]:
return fn(*args, **kwargs)
# 2. Agent path: a valid X-Payment header ("exact-usdc:<base64(json)>")
# means the caller paid; verify it, then let the request through.
if request.headers.get("X-Payment"):
return fn(*args, **kwargs)
# 3. No auth - advertise the x402 requirements in a 402.
return jsonify({
"version": 1,
"resource": resource,
"accepts": [{"scheme": "exact-usdc", "network": "eip155:8453"}],
}), 402
return wrapper
return decoratorÁp dụng nó vào điểm cuối.
Trình xử lý bản thân không thay đổi - bộ trang trí xử lý logic xác thực/thanh toán, sau đó chuyển tiếp đến triển khai hiện có chỉ khi thanh toán được giải quyết. Đây là điều làm cho việc di chuyển có rủi ro thấp: các luồng của con người không bị ảnh hưởng, bạn chỉ thêm một con đường thay thế.
// Apply the gate to the endpoint. The x402 middleware handles the 402
// challenge and the X-Payment verification; your handler only runs once paid.
app.get("/api/premium-feature",
stripeOrX402,
async (req, res) => {
const result = await runPremiumFeature();
res.json(result);
},
);@app.get("/api/premium-feature")
@stripe_or_x402("/api/premium-feature")
def premium_feature():
return run_premium_feature()Triển khai ở chế độ shadow, rồi bật chế độ enabled.
Đừng bật đồng thời cả hai luồng cho tất cả mọi người. Mô hình rollout an toàn gồm bốn giai đoạn - shadow, silent agent enablement, public agent enablement, observe. Luồng Stripe vẫn giữ nguyên trong suốt quá trình; lưu lượng agent tăng dần.
# Rollout plan: keep Stripe-only working while you add the agent path.
# Week 1 - shadow mode
# - Deploy the decorator with the agent-path branch behind a feature flag (off).
# - Human Stripe flow continues unchanged.
# - Sandbox-test the agent path against Base Sepolia.
# Week 2 - silent agent enablement
# - Turn the agent-path branch on for a single internal agent.
# - Verify the 402 issues correctly and settlement works end-to-end.
# - Wire alerting on the 402-issued / 402-settled rate.
# Week 3 - public agent enablement
# - Document the x402 contract in your developer docs.
# - Announce to existing customers building agents.
# - Continue measuring: human Stripe flow should be unchanged.
# Week 4+ - observe
# - Track the ratio of agent settlements to human subscriptions.
# - As agent traffic grows, you may decide to keep Stripe only for humans
# and let everything else go through x402. That is a later decision -
# the architecture above supports either trajectory.Bốn sai lầm khiến việc sử dụng hai đường ray trở nên đau đớn.
Cố gắng thay thế Stripe thay vì tăng cường nó
Stripe là chính xác cho các thanh toán một lần của con người và các đăng ký của con người. Cố gắng buộc lưu lượng tác nhân qua Stripe (hóa đơn theo cuộc gọi, giá động) sẽ phá vỡ các mức tối thiểu của mạng thẻ và cấu trúc phí. Mẫu thành công là tăng cường: giữ Stripe làm những gì nó giỏi (con người thanh toán bằng thẻ) và thêm thanh toán x402 / tác nhân cho lưu lượng mà Stripe chưa bao giờ được thiết kế cho. Đừng chọn một trong hai.
Trả về 401 cho các agent thay vì 402
Hầu hết các điểm cuối hiện có trả về 401 Unauthorized khi không có phiên Stripe. Các tác nhân không biết phải làm gì với 401 - họ chỉ hiểu 402 Payment Required như là tín hiệu 'thanh toán để tiếp tục'. Cổng phải phân biệt: 'người gọi này không được phép và không thể thanh toán' (401 thực, trả về 401) so với 'người gọi này không xác thực nhưng có thể thanh toán' (trả về thách thức x402 402).
Cho phép các tác nhân bỏ qua giá của Stripe
Nếu đăng ký Stripe của bạn là $20/tháng cho các cuộc gọi không giới hạn và báo giá x402 của bạn là $0.01/cuộc gọi, một đại lý về lý thuyết có thể trả $0.01 một lần và nhận được một cuộc gọi trong khi một người trả $20 cho nhiều cuộc gọi. Điều đó là tốt cho lưu lượng đại lý sử dụng thỉnh thoảng và bị hỏng cho lưu lượng đại lý cao. Đặt giá mỗi cuộc gọi sao cho một đại lý nặng sẽ tự nhiên đạt đến ngưỡng đăng ký - sau đó cung cấp cho họ tùy chọn chuyển đổi.
Không ghi lại con đường nào đã được thực hiện
Một yêu cầu gỡ lỗi đến: 'khách hàng này nói rằng họ đã thanh toán nhưng chúng tôi không giao hàng'. Nếu bạn chưa ghi lại đường dẫn xác thực nào đã phê duyệt cuộc gọi, bạn không biết liệu có nên xem hồ sơ của Stripe hay của Blockchain0x. Luôn ghi lại quyết định: nhánh nào đã khớp, customer_id hoặc tham chiếu X-Payment / giao dịch, và một ID tương quan. Nếu không có nó, mọi sự cố đường ray đôi sẽ mất gấp đôi thời gian để phân loại.
Khi đường ray kép được kích hoạt.
Với kiến trúc đã được thiết lập, phần còn lại là hoạt động. Độ bền của webhook xử lý cả luồng sự kiện của Stripe và Blockchain0x. Kiểm soát chi tiêu bảo vệ bất kỳ tác nhân nào bạn vận hành. Đánh giá bảo mật trước khi ra mắt áp dụng giống như một tích hợp một đường ray.
Các mẫu webhook mà các nhà phát triển thường hỏi nhất
Thiết lập các kiểm soát chi tiêu của agent mà vẫn tồn tại sau khi bị tiêm nhắc
Bảo mật ví agent của bạn trước khi ra mắt
Tài liệu đầy đủ tại docs.blockchain0x.com. Bề mặt sản phẩm liên quan: API Thanh toán. Khung so sánh: So sánh.