AI ajanınıza ödeme eklemek için.
createClient'i @blockchain0x/node'dan (veya Python istemcisinden) kullanarak bir ajan oluşturun, payments.create ile bir USDC ödemesi gönderin ve imzalı webhook'u webhooks.verify ile doğrulayın. Harcama kontrolleri kontrol panelinde ayarlanır ve API üzerinden yalnızca okunur. Ajan asla özel anahtarlara doğrudan dokunmaz. Kaydolmaktan Base üzerinde ilk USDC ödemenize kadar on dakikadan az, TypeScript veya Python ile.
Başlamadan önce.
- Bir Blockchain0x hesabı (ücretsiz kayıt).
- Kontrol panelinden bir API anahtarı (bu kılavuz için
sk_test_anahtarını kullanın; daha sonrask_live_anahtarına geçeceksiniz). - Node.js 20+ veya Python 3.11+ ajan çalışma zamanınızda.
- Herhangi bir çerçeve üzerinde inşa edilmiş bir ajan - LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI Agents SDK, MCP veya düz SDK kodu. Talimatlar çerçeve bağımsızdır.
- Webhook almak için genel internetten erişilebilen bir HTTPS uç noktası (ngrok veya bir dağıtım önizlemesi geliştirme için uygundur).
Ajan profilini oluştur.
Ajan profili, ajanınızın gönderdiği veya aldığı her ödemenin adreslenebilir kimliğidir. Cüzdan adresini, kamu sayfasını, doğrulama rozetlerini ve (sonrasında) harcama politikasını taşır. Her mantıksal ajan için bir tane oluşturun.
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.
Bir ödeme gönderin.
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 transferWebhook'u yönetin.
Webhook'lar, bir ödemenin yerleştiğini nasıl öğrenirsiniz. Node'da, @blockchain0x/node'dan webhooks.verify HMAC kontrolünü yapar ve ayrımlı bir birleşim döndürür; diğer dillerde, ham gövde üzerinde aynı HMAC'ı hesaplayın. Olay türüne göre (gelen için payment.received) ayrılın, hızlı bir şekilde 2xx yanıt verin ve teslimatın zaman aşımına uğramaması için daha ağır olan her şeyi 2xx'in arkasında sıraya alın.
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)Gösterge panelinde harcama kontrolleri belirleyin.
Eğer ajanınız sadece alıyorsa, bunu atlayabilirsiniz. Eğer aynı zamanda ödüyorsa, kontrol panelinde bir harcama izni ayarlayın - bir dönem için bir harçlık ve her işlem için bir üst sınır. Bu, her ödemede arka uç tarafından uygulanır, bu nedenle ajan tarafı kurallarının asla yapamayacağı bir şekilde istemci enjeksiyonuna dayanır. İzni değiştiren hiçbir API veya SDK çağrısı yoktur (ajanın kendi anahtarı limitini genişletemez); API yalnızca okunabilir, bu nedenle kodunuz mevcut değerleri görüntülemek veya planlamak için alabilir.
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
}Tüm akışı Base Sepolia'da test edin.
Canlı sk_live_ anahtarlarına geçmeden önce, sk_test_ ile tam yolu baştan sona çalıştırın. Bir test anahtarı, her şeyi Base Sepolia'da tutar, burada cüzdanı kamu musluğundan finanse edersiniz ve yanıt şekilleri canlı ile eşleşir. Anahtar ön eki, ağı seçer, bu nedenle bir test anahtarı ana ağ fonlarını taşıyamaz.
Üç senaryoyu deneyin: payment.received tetikleyen bir sorunsuz ödeme, kaçırılan bir teslimat (webhook'u ölü bir URL'ye yönlendirin, ardından işlemi transactions.get ile alarak uzlaştırın) ve bir webhook tekrar denemesi (ilk seferde 500 döndürün, ikinci seferde 200, ve işleyicinizin idempotent olduğunu doğrulayın). Üçü de testten geçtiğinde, anahtarı değiştirin ve gönderin.
Takımlara bir haftaya mal olan beş hata.
Webhook imza doğrulamasını atlıyorsunuz
Eğer /webhooks/payment adresine gelen herhangi bir POST'u yetkili olarak kabul ederseniz, bir saldırgan sahte ödeme olayları oluşturabilir ve ajanınızı ücretsiz iş teslim etmeye kandırabilir. Her zaman webhook sırrıyla HMAC doğrulaması yapın, sabit zamanlı karşılaştırma kullanarak. İlk ihlal genellikle kaybolan doğrulamadır.
Ayrı bir onay olayı varsayarak
Gönderilen olaylar payment.received, payment.sent, wallet.deployed ve webhook.test'tir - ayrı bir onay olayı yoktur. payment.received, transfer bir blokta olduğunda tetiklenir. Çoğu iş için, bu teslimat için sinyalinizdir. Pahalı veya geri alınamaz bir şey için, işlemi transactions.get ile sorgulayın ve harekete geçmeden önce kendi onay eşiğinizi uygulayın; var olmayan bir olayı beklemeyin.
Webhook işleyicilerinde idempotency yok
Webhook'lar 2xx dışı yanıtlar üzerinde yeniden dener ve aynı olay yük altında birden çok kez gelir. İşleyiciniz idempotent olmalıdır: zaten işlediğiniz olay kimliklerinin küçük bir tablosunu tutun ve tekrarları atlayın. Aksi takdirde, geçici bir dalgalanma aynı işi iki kez teslim eder ve saatlerce çift yerine getirmeleri hata ayıklamakla geçirebilirsiniz.
Test ve canlı API anahtarlarını karıştırma
Test anahtarları (sk_test_) sandbox'a ulaşır ve Base Sepolia'yı kullanır; canlı anahtarlar (sk_live_) üretime ulaşır ve Base mainnet'i kullanır. Ortam yapılandırmalarında karıştırmak, çoğu 'geliştirirken çalışıyor, üretimde başarısız oluyor' biletinin sebebidir. Çalışma ortamınız ve anahtar öneki eşleşmiyorsa başlangıçta sert hata verin.
Eksik bir webhook'u başarısız bir ödeme olarak değerlendirmek
Başarısızlık olayı yoktur ve bir webhook atlanabilir (uç noktanız kapalıydı, bir teslimat düştü). Ajansı 'fonları bekliyor' döngüsünde bırakmayın. Uzlaştırın: gerçek durumu öğrenmek için işlemi transactions.get ile alın ve bekleyen herhangi bir akışta bir zaman aşımı koyun, böylece terkedilmiş bir ödeme tutulan kaynakları serbest bırakır, sonsuza kadar askıda kalmaz.
İlk ödemenizi aldığınızda.
Temel ödemeler çalışırken, en çok fayda sağlayan sonraki adımlar spend controls'dur (agent bütçeyle kontrolden çıkmasın diye), webhook robustness'tır (ödemeler yük altında sessizce düşmesin diye) ve identity verification'dır (karşı taraflar agent'ın public page'ine güvensin diye).
İstem enjeksiyonuna dayanacak şekilde ajanın harcama kontrollerini ayarlayın
Geliştiricilerin en çok sorduğu webhook desenleri
GitHub ve alan adı doğrulama rozetlerini kazanın
Tam API referansı docs.blockchain0x.com'da bulunmaktadır. Aynı API'ler için ürün yüzeyi: Ödeme API'si.