Von Stripe zu Blockchain0x migrieren für den agentengestützten API-Zugriff.
Ersetzen Sie Stripe nicht; führen Sie es parallel aus. Ein einzelnes Tor steht vor jedem geschützten Endpunkt mit zwei Authentifizierungsmethoden: einem aktiven Stripe-Abonnement (für Menschen), andernfalls dem x402-Empfangsadapter (für Agenten), der eine 402-Herausforderung ausgibt und den X-Payment-Header bei der Wiederholung überprüft. Die Handler-Logik ändert sich nicht.
Bevor Sie beginnen.
- Eine funktionierende Stripe-Integration mit mindestens einem aktiven Produkt/Preis (Abonnement oder einmalig).
- Ein Blockchain0x-Agentenprofil und API-Schlüssel (siehe add-payments-to-agent).
- Eine Auth-/Middleware-Schicht in Ihrem Web-Framework, wo Sie derzeit Stripe aufrufen, um den Zugriff zu steuern.
- Ein Feature-Flag-Mechanismus (Umgebungsvariable, LaunchDarkly, einfacher Boolean - alles, was es Ihnen ermöglicht, das Verhalten ohne Neuimplementierung umzuschalten).
- Verständnis des x402-Musters - der folgende Dekorator implementiert es.
Schreiben Sie das Dual-Auth-Gate.
Das Gate ist das einzige Bindeglied. Es überprüft zuerst ein aktives Stripe-Abonnement (der menschliche Pfad); wenn es keines gibt, übergibt es die Anfrage an den x402-Empfangsadapter (den Agentenpfad), der die 402-Herausforderung ausgibt und den X-Payment-Header überprüft, wenn der Agent es erneut versucht. Das Node-Beispiel verwendet createX402Middleware; ein Python-Dienst spricht das gleiche Protokoll von Hand.
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 decoratorWenden Sie es auf den Endpunkt an.
Der Handler selbst ändert sich nicht - der Dekorator behandelt die Auth-/Zahlungslogik und leitet dann nur weiter, wenn die Zahlung abgeschlossen ist. Das macht die Migration risikoarm: Menschliche Abläufe bleiben unberührt, Sie haben nur einen alternativen Pfad hinzugefügt.
// 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()Rollout im Shadow-, dann im Enabled-Modus.
Nicht beide Pfade gleichzeitig für alle umschalten. Das sichere Rollout-Muster hat vier Phasen - Shadow, stilles Aktivieren der Agenten, öffentliches Aktivieren der Agenten, Beobachten. Der Stripe-Flow bleibt dabei unverändert; der Agentenverkehr wird schrittweise hochgefahren.
# 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.Vier Fehler, die Dual-Rail schmerzhaft machen.
Versuchen, Stripe zu ersetzen, anstatt es zu ergänzen
Stripe ist korrekt für einmalige menschliche Checkouts und menschliche Abonnements. Zu versuchen, Agentenverkehr über Stripe zu leiten (Rechnungen pro Aufruf, dynamische Preisgestaltung), verstößt gegen die Mindestanforderungen und Gebührenstrukturen des Kartennetzwerks. Das erfolgreiche Muster ist die Erweiterung: Lassen Sie Stripe das tun, was es gut kann (Menschen bezahlen mit Karten), und fügen Sie x402 / Agentenzahlungen für den Verkehr hinzu, für den Stripe nie konzipiert wurde. Wählen Sie nicht das eine oder das andere.
Gibt 401 an Agenten zurück statt 402
Die meisten vorhandenen Endpunkte geben 401 Unauthorized zurück, wenn es keine Stripe-Sitzung gibt. Agenten wissen nicht, was sie mit 401 tun sollen - sie verstehen nur 402 Payment Required als das 'bezahlen, um fortzufahren'-Signal. Das Tor muss unterscheiden: 'dieser Anrufer ist nicht autorisiert und kann nicht bezahlen' (echte 401, geben Sie 401 zurück) versus 'dieser Anrufer ist nicht authentifiziert, kann aber bezahlen' (geben Sie die x402 402-Herausforderung zurück).
Agenten erlauben, die Stripe-Preise zu umgehen
Wenn Ihr Stripe-Abonnement $20/Monat für unbegrenzte Anrufe beträgt und Ihr x402-Angebot $0,01/Anruf ist, kann ein Agent technisch gesehen einmal $0,01 bezahlen und einen Anruf erhalten, bei dem ein Mensch $20 für viele bezahlt. Das ist in Ordnung für gelegentliche Agentenverkehr und kaputt für hochvolumigen Agentenverkehr. Setzen Sie den Preis pro Anruf so, dass ein schwerer Agent natürlich die Abonnementsgrenze erreicht - bieten Sie ihnen dann die Möglichkeit, zu wechseln.
Nicht protokollieren, welcher Pfad genommen wurde
Eine Debug-Anfrage kommt herein: 'Dieser Kunde sagt, dass er bezahlt hat, aber wir haben nicht geliefert'. Wenn Sie nicht protokolliert haben, welcher Auth-Pfad den Anruf genehmigt hat, wissen Sie nicht, ob Sie die Aufzeichnungen von Stripe oder Blockchain0x überprüfen sollen. Protokollieren Sie immer die Entscheidung: welcher Zweig übereinstimmte, die customer_id oder die X-Payment-/Transaktionsreferenz und eine Korrelations-ID. Ohne dies dauert jeder Dual-Rail-Vorfall doppelt so lange, um ihn zu triagieren.
Sobald die Dual-Rail aktiv ist.
Mit der Architektur ist der Rest operationell. Die Webhook-Robustheit verarbeitet sowohl Stripe- als auch Blockchain0x-Ereignisströme. Ausgabensteuerungen schützen alle Agenten, die Sie betreiben. Die Sicherheitsüberprüfung vor dem Start gilt genau wie eine Single-Rail-Integration.
Die Webhook-Muster, nach denen Entwickler am häufigsten fragen
Richten Sie Ausgabensteuerungen für Agenten ein, die Eingabeaufforderungsinjektionen überstehen
Sichern Sie Ihre Agenten-Wallet, bevor Sie live gehen
Vollständige Referenz unter docs.blockchain0x.com. Zugehörige Produktoberfläche: Payment API. Vergleichsrahmen: Vergleiche.