Bỏ qua nội dung chính
HọcHướng dẫnThêm thanh toán vào tác nhân AI của bạn
HƯỚNG DẪN

Cách thêm thanh toán vào AI agent của bạn.

10 minutes
CÂU TRẢ LỜI NGẮN

Tạo một tác nhân với createClient từ @blockchain0x/node (hoặc khách hàng Python), gửi một khoản thanh toán USDC với payments.create, và xác minh webhook đã ký với webhooks.verify. Các kiểm soát chi tiêu được thiết lập trong bảng điều khiển và chỉ đọc qua API. Tác nhân không bao giờ chạm vào khóa riêng trực tiếp. Dưới mười phút từ khi đăng ký đến khoản thanh toán USDC đầu tiên của bạn trên Base, bằng TypeScript hoặc Python.

CÁC ĐIỀU KIỆN TIÊN QUYẾT

Trước khi bạn bắt đầu.

  • Một tài khoản Blockchain0x (đăng ký miễn phí).
  • Một khóa API từ bảng điều khiển (sử dụng khóa sk_test_ cho hướng dẫn này; bạn sẽ chuyển sang sk_live_ sau).
  • Node.js 20+ hoặc Python 3.11+ trong thời gian chạy của bạn.
  • Một tác nhân được xây dựng trên bất kỳ khung nào - LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI Agents SDK, MCP, hoặc mã SDK thông thường. Các hướng dẫn không phụ thuộc vào khung.
  • Một điểm cuối HTTPS có thể truy cập từ internet công khai để nhận webhook (ngrok hoặc một bản xem trước triển khai là đủ cho phát triển).
BƯỚC 1 TRONG 5

Tạo hồ sơ đại lý.

Hồ sơ tác nhân là danh tính có thể truy cập đứng sau mỗi khoản thanh toán mà tác nhân của bạn gửi hoặc nhận. Nó chứa địa chỉ ví, trang công khai, huy hiệu xác minh, và (sau này) chính sách chi tiêu. Tạo một cái cho mỗi tác nhân logic.

TypeScript
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}
Python
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.

BƯỚC 2 TRONG 5

Gửi một khoản thanh toán.

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.

TypeScript
// 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
Python
# 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 transfer
BƯỚC 3 TRONG 5

Xử lý webhook.

Webhooks là cách bạn tìm ra một khoản thanh toán đã được giải quyết. Trong Node, webhooks.verify từ @blockchain0x/node thực hiện kiểm tra HMAC và trả về một hợp nhất phân biệt; trong các ngôn ngữ khác, tính toán cùng một HMAC trên thân dữ liệu thô. Phân nhánh theo loại sự kiện (payment.received cho inbound), phản hồi 2xx nhanh chóng, và xếp hàng bất kỳ thứ gì nặng hơn phía sau 2xx để giao hàng không bị hết thời gian.

TypeScript (Express)
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");
});
Python (Flask)
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)
BƯỚC 4 TRONG 5

Đặt các điều khiển chi tiêu trong bảng điều khiển.

Nếu tác nhân của bạn chỉ nhận, bạn có thể bỏ qua điều này. Nếu nó cũng thanh toán, hãy đặt quyền chi tiêu - một khoản trợ cấp theo kỳ và một giới hạn theo giao dịch - trong bảng điều khiển. Nó được thực thi bởi backend trên mọi khoản thanh toán, vì vậy nó tồn tại qua việc tiêm lệnh theo cách mà các quy tắc bên tác nhân không thể. Không có cuộc gọi API hoặc SDK nào thay đổi quyền (khóa của tác nhân không thể mở rộng giới hạn của nó); API chỉ đọc, vì vậy mã của bạn có thể lấy các giá trị hiện tại để hiển thị hoặc lập kế hoạch.

Đọc (curl)
curl https://api.blockchain0x.com/v1/agents/agt_123/spend-permissions \
  -H "Authorization: Bearer $BLOCKCHAIN0X_API_KEY"
Phản hồi
{
  "allowance_wei": "5000000",
  "per_tx_wei": "1000000",
  "period_seconds": 86400,
  "revoked_at": null
}
BƯỚC 5 TRONG 5

Kiểm tra toàn bộ quy trình trên Base Sepolia.

Trước khi chuyển sang khóa sk_live_, hãy chạy toàn bộ đường dẫn từ đầu đến cuối với khóa sk_test_. Một khóa thử nghiệm giữ mọi thứ trên Base Sepolia, nơi bạn cấp vốn cho ví từ vòi công cộng và các hình dạng phản hồi khớp với trực tiếp. Tiền tố khóa chọn mạng, vì vậy một khóa thử nghiệm không thể di chuyển quỹ mainnet.

Thực hiện ba kịch bản: một khoản thanh toán theo đường hạnh phúc phát ra payment.received, một lần giao hàng bị bỏ lỡ (chỉ định webhook đến một URL chết, sau đó đối chiếu bằng cách lấy giao dịch với transactions.get), và một lần thử lại webhook (trả về 500 lần đầu tiên, 200 lần thứ hai, và xác nhận rằng trình xử lý của bạn là idempotent). Khi cả ba đều vượt qua bài kiểm tra, hãy thay đổi khóa và phát hành.

CÁC CẠNH TRÁNH THƯỜNG GẶP

Năm sai lầm khiến các đội mất một tuần.

Bỏ qua xác minh chữ ký webhook

Nếu bạn chấp nhận bất kỳ POST nào đến /webhooks/payment là có thẩm quyền, một kẻ tấn công có thể tạo ra các sự kiện thanh toán giả và lừa tác nhân của bạn thực hiện công việc miễn phí. Luôn xác minh HMAC với bí mật webhook, sử dụng so sánh thời gian không đổi. Sự thỏa hiệp đầu tiên hầu như luôn là việc thiếu xác minh.

Giả sử có một sự kiện xác nhận riêng

Các sự kiện đã được gửi là payment.received, payment.sent, wallet.deployed và webhook.test - không có sự kiện xác nhận riêng biệt. payment.received kích hoạt khi chuyển khoản nằm trong một khối. Đối với hầu hết công việc, đó là tín hiệu của bạn để giao hàng. Đối với một thứ gì đó đắt đỏ hoặc không thể đảo ngược, hãy truy vấn giao dịch với transactions.get và áp dụng ngưỡng xác nhận của riêng bạn trước khi hành động; đừng chờ một sự kiện không tồn tại.

Không có idempotency trên các trình xử lý webhook

Webhooks thử lại trên các phản hồi không phải 2xx, và cùng một sự kiện sẽ đến nhiều lần dưới tải. Bộ xử lý của bạn phải là idempotent: giữ một bảng nhỏ các ID sự kiện mà bạn đã xử lý và bỏ qua các bản sao. Nếu không, một sự cố tạm thời sẽ giao cùng một công việc hai lần và bạn sẽ mất hàng giờ để gỡ lỗi các lần hoàn thành kép.

Trộn khóa API thử nghiệm và trực tiếp

Khóa thử nghiệm (sk_test_) truy cập vào sandbox và sử dụng Base Sepolia; khóa trực tiếp (sk_live_) truy cập vào sản xuất và sử dụng Base mainnet. Việc trộn lẫn chúng trong cấu hình môi trường là nguyên nhân của hầu hết các vé 'hoạt động trong dev, thất bại trong prod'. Thất bại cứng khi khởi động nếu môi trường chạy của bạn và tiền tố khóa không khớp.

Xử lý một webhook bị thiếu như một khoản thanh toán thất bại

Không có sự kiện thất bại, và một webhook có thể bị bỏ lỡ (điểm cuối của bạn bị ngắt, một giao hàng bị rơi). Đừng để tác nhân bị kẹt trong vòng lặp 'chờ tiền'. Hòa giải: truy xuất giao dịch với transactions.get để biết trạng thái thực tế, và đặt thời gian chờ cho bất kỳ luồng chờ nào để một khoản thanh toán bị bỏ rơi giải phóng tài nguyên bị giữ thay vì treo mãi mãi.

CÁC BƯỚC TIẾP THEO

Khi bạn có thanh toán đầu tiên.

Khi thanh toán cơ bản đã hoạt động, các việc tiếp theo mang lại giá trị lớn nhất là kiểm soát chi tiêu (để agent không vượt khỏi ngân sách), độ bền webhook (để thanh toán không bị rơi âm thầm dưới tải cao), và xác minh danh tính (để đối tác tin vào trang công khai của agent).

Tài liệu API đầy đủ nằm tại docs.blockchain0x.com. Bề mặt sản phẩm cho cùng các API: API Thanh toán.

Lần cuối được xem xét: 2026-05-15. Xuất bản theo CC BY 4.0.

Một POST và tác nhân của bạn đang được thanh toán.

Miễn phí để bắt đầu. Bao gồm các khóa thử nghiệm. Thanh toán đầu tiên được xác nhận trong chưa đầy mười phút.