So fügen Sie Zahlungen zu Ihrem KI-Agenten hinzu.
Erstellen Sie einen Agenten mit createClient von @blockchain0x/node (oder dem Python-Client), senden Sie eine USDC-Zahlung mit payments.create und überprüfen Sie den signierten Webhook mit webhooks.verify. Ausgabensteuerungen werden im Dashboard festgelegt und sind über die API nur lesbar. Der Agent berührt niemals direkt private Schlüssel. Unter zehn Minuten von der Anmeldung bis zu Ihrer ersten USDC-Zahlung auf Base, in TypeScript oder Python.
Bevor Sie beginnen.
- Ein Blockchain0x-Konto (kostenlose Anmeldung).
- Ein API-Schlüssel aus dem Dashboard (verwenden Sie einen
sk_test_Schlüssel für diesen Leitfaden; Sie werden später zusk_live_wechseln). - Node.js 20+ oder Python 3.11+ in Ihrer Agentenlaufzeit.
- Ein Agent, der auf jedem Framework basiert - LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI Agents SDK, MCP oder einfachem SDK-Code. Die Anweisungen sind frameworkunabhängig.
- Ein HTTPS-Endpunkt, der über das öffentliche Internet erreichbar ist, um Webhooks zu empfangen (ngrok oder eine Bereitstellungsvorschau ist für die Entwicklung in Ordnung).
Erstellen Sie das Agentenprofil.
Das Agentenprofil ist die adressierbare Identität hinter jeder Zahlung, die Ihr Agent sendet oder empfängt. Es enthält die Wallet-Adresse, die öffentliche Seite, die Verifizierungsabzeichen und (später) die Ausgabenrichtlinie. Erstellen Sie eins pro logischen Agenten.
import { createClient } from "@blockchain0x/node";
const client = createClient({ apiKey: process.env.BLOCKCHAIN0X_API_KEY! }); // sk_test_ / sk_live_
const agent = await client.agents.create({ name: "research-bot" });
console.log(agent.id); // "agt_..."
// Public page: https://wallet.blockchain0x.com/a/{slug}from blockchain0x import Client
client = Client() # reads BLOCKCHAIN0X_API_KEY from the environment
agent = client.agents.create(body={"name": "research-bot"})
print(agent["id"]) # "agt_..."
# Public page: https://wallet.blockchain0x.com/a/{slug}After this call, the agent has a public page at https://wallet.blockchain0x.com/a/<slug> that any counterparty (human or agent) can hover for verification info. See the agent payment identity glossary entry for what that page exposes.
Zahlung senden.
payments.create sends USDC from the agent wallet. amountWei is base units (USDC has 6 decimals), so 0.01 USDC is the string "10000". The SDK auto-stamps an Idempotency-Key, and the call can return 503 until the chain adapter is wired for your network. To RECEIVE instead, settle an invoice you created in the dashboard with paymentRequests.settle - see the payment API page.
// Send a USDC payment from the agent wallet. amountWei is base units
// (USDC has 6 decimals): "10000" is 0.01 USDC. payments.create auto-stamps an
// Idempotency-Key and can return 503 until the chain adapter is wired.
const tx = await client.payments.create({
agentId: agent.id,
to: "0xRecipient",
amountWei: "10000",
});
console.log(tx); // the submitted transfer# amountWei is USDC base units (6 decimals): "10000" is 0.01 USDC.
tx = client.payments.create(body={
"agentId": agent["id"],
"to": "0xRecipient",
"amountWei": "10000",
})
print(tx) # the submitted transferVerarbeiten Sie den Webhook.
Webhooks sind, wie Sie erfahren, dass eine Zahlung abgeschlossen ist. In Node führt webhooks.verify von @blockchain0x/node die HMAC-Überprüfung durch und gibt eine diskriminierte Vereinigung zurück; in anderen Sprachen berechnen Sie dasselbe HMAC über den Rohkörper. Branch auf den Ereignistyp (payment.received für eingehend), antworten Sie schnell mit 2xx und stellen Sie alles Schwerere hinter die 2xx, damit die Lieferung nicht zeitlich abläuft.
import express from "express";
import { webhooks } from "@blockchain0x/node";
const app = express();
// Capture the RAW body. The HMAC is over the exact bytes on the wire.
app.use(express.raw({ type: "application/json" }));
app.post("/webhooks/payment", (req, res) => {
const result = webhooks.verify({
headers: req.headers,
rawBody: req.body, // Buffer, raw bytes
secret: process.env.BLOCKCHAIN0X_WEBHOOK_SECRET!,
});
if (!result.ok) return res.status(400).json({ code: result.code });
if (result.eventType === "payment.received") {
// USDC landed - deliver the work, fulfil the order, etc.
void deliver(result.eventId);
}
res.status(200).send("ok");
});import hmac, hashlib, os, time
from flask import Flask, request, abort
app = Flask(__name__)
SECRET = os.environ["BLOCKCHAIN0X_WEBHOOK_SECRET"].encode()
@app.post("/webhooks/payment")
def webhook():
raw = request.get_data() # RAW bytes - do not parse first
sig = request.headers.get("X-Blockchain0x-Signature", "")
ts = request.headers.get("X-Blockchain0x-Timestamp", "")
parts = dict(p.split("=", 1) for p in sig.split(",") if "=" in p)
t, v1 = parts.get("t", ts), parts.get("v1", sig)
want = hmac.new(SECRET, t.encode() + b"." + raw, hashlib.sha256).hexdigest()
if not hmac.compare_digest(want, v1) or abs(time.time() - int(t)) > 300:
abort(401)
if request.headers.get("X-Blockchain0x-Event-Type") == "payment.received":
deliver(request.get_json()) # USDC landed
return ("ok", 200)Setzen Sie Ausgabensteuerungen im Dashboard.
Wenn Ihr Agent nur empfängt, können Sie dies überspringen. Wenn er auch bezahlt, setzen Sie eine Ausgabenberechtigung - eine Zulage pro Zeitraum und eine Obergrenze pro Transaktion - im Dashboard. Es wird vom Backend bei jeder Zahlung durchgesetzt, sodass es eine Eingabeaufforderung-Injektion übersteht, auf die agentenseitige Regeln niemals reagieren können. Es gibt keinen API- oder SDK-Aufruf, der eine Berechtigung ändert (der eigene Schlüssel des Agenten kann sein Limit nicht erweitern); die API ist schreibgeschützt, sodass Ihr Code die aktuellen Werte abrufen kann, um sie anzuzeigen oder zu planen.
curl https://api.blockchain0x.com/v1/agents/agt_123/spend-permissions \
-H "Authorization: Bearer $BLOCKCHAIN0X_API_KEY"{
"allowance_wei": "5000000",
"per_tx_wei": "1000000",
"period_seconds": 86400,
"revoked_at": null
}Testen Sie den gesamten Ablauf auf Base Sepolia.
Bevor Sie zu sk_live_-Schlüsseln wechseln, führen Sie den gesamten Pfad von Anfang bis Ende mit sk_test_ aus. Ein Testschlüssel hält alles auf Base Sepolia, wo Sie die Wallet aus dem öffentlichen Wasserhahn finanzieren und die Antwortformen mit der Live-Version übereinstimmen. Das Schlüsselpräfix wählt das Netzwerk aus, sodass ein Testschlüssel keine Hauptnetzmittel bewegen kann.
Üben Sie drei Szenarien: eine Happy-Path-Zahlung, die payment.received auslöst, eine verpasste Lieferung (weisen Sie den Webhook auf eine tote URL, und versöhnen Sie sich, indem Sie die Transaktion mit transactions.get abrufen), und einen Webhook-Wiederholungsversuch (geben Sie beim ersten Mal 500 zurück, beim zweiten Mal 200, und bestätigen Sie, dass Ihr Handler idempotent ist). Wenn alle drei Tests bestehen, wechseln Sie den Schlüssel und versenden Sie.
Fünf Fehler, die Teams eine Woche kosten.
Überspringen der Überprüfung der Webhook-Signatur
Wenn Sie einen POST an /webhooks/payment als autoritativ akzeptieren, kann ein Angreifer gefälschte Zahlungsereignisse erstellen und Ihren Agenten dazu bringen, Arbeiten kostenlos zu liefern. Überprüfen Sie immer mit HMAC das Webhook-Geheimnis, indem Sie einen konstanten Zeitvergleich verwenden. Der erste Kompromiss ist fast immer die fehlende Überprüfung.
Annahme eines separaten Bestätigungsereignisses
Die gelieferten Ereignisse sind payment.received, payment.sent, wallet.deployed und webhook.test - es gibt kein separates Bestätigungsereignis. payment.received wird ausgelöst, wenn die Überweisung in einem Block ist. Für die meisten Arbeiten ist das Ihr Signal zur Lieferung. Für etwas Teures oder Irreversibles, rufen Sie die Transaktion mit transactions.get ab und wenden Sie Ihre eigene Bestätigungsgrenze an, bevor Sie handeln; warten Sie nicht auf ein Ereignis, das nicht existiert.
Keine Idempotenz bei Webhook-Handlern
Webhooks versuchen es bei Nicht-2xx-Antworten erneut, und dasselbe Ereignis wird unter Last mehrfach ankommen. Ihr Handler muss idempotent sein: Halten Sie eine kleine Tabelle von Ereignis-IDs, die Sie bereits verarbeitet haben, und überspringen Sie Duplikate. Andernfalls wird ein vorübergehender Aussetzer die gleiche Arbeit zweimal ausliefern und Sie werden Stunden mit dem Debuggen doppelter Erfüllungen verbringen.
Test- und Live-API-Schlüssel mischen
Testschlüssel (sk_test_) treffen die Sandbox und verwenden Base Sepolia; Live-Schlüssel (sk_live_) treffen die Produktion und verwenden das Base-Mainnet. Das Mischen in den Umgebungs-Konfigurationen ist die Ursache für die meisten 'funktioniert in der Entwicklung, schlägt in der Produktion fehl'-Tickets. Hard-Fail beim Start, wenn Ihre Laufzeitumgebung und der Schlüsselpräfix nicht übereinstimmen.
Ein fehlendes Webhook als fehlgeschlagene Zahlung behandeln.
Es gibt kein Fehlerereignis, und ein Webhook kann verpasst werden (Ihr Endpunkt war nicht erreichbar, eine Lieferung wurde abgebrochen). Lassen Sie den Agenten nicht in einer 'Warten auf Gelder'-Schleife stecken. Versöhnen Sie sich: Rufen Sie die Transaktion mit transactions.get ab, um den tatsächlichen Zustand zu erfahren, und setzen Sie ein Zeitlimit für jeden wartenden Fluss, damit eine aufgegebene Zahlung gehaltene Ressourcen freigibt, anstatt für immer zu hängen.
Sobald du deine erste Zahlung hast.
Mit funktionierenden Grundzahlungen sind die Folgemaßnahmen, die sich am meisten auszahlen, Ausgabensteuerungen (damit der Agent nicht mit dem Budget davonläuft), Webhook-Robustheit (damit Zahlungen unter Last nicht stillschweigend abgebrochen werden) und Identitätsüberprüfung (damit Gegenparteien der öffentlichen Seite des Agenten vertrauen).
Richten Sie Ausgabensteuerungen für Agenten ein, die Eingabeaufforderungsinjektionen überstehen
Die Webhook-Muster, nach denen Entwickler am häufigsten fragen
Verdienen Sie die GitHub- und Domain-Verifizierungsabzeichen
Die vollständige API-Referenz befindet sich unter docs.blockchain0x.com. Produktoberfläche für dieselben APIs: Payment API.