Ga naar hoofdinhoud
LerenGidsenTest agentbetalingen zonder echt geld
GIDS

Test agentbetalingen zonder echt geld.

12 minuten
KORTE ANTWOORD

Swap your API key for a sk_test_ key - that alone puts you on Base Sepolia. Fund the agent's wallet from the public Base Sepolia USDC faucet, make a real test payment with payments.create (test funds, no real money), and tunnel your local webhook through ngrok. The response shapes match live, so a flow that passes in test passes in production. Exercise the failure paths, not just the happy one.

VOORWAARDEN

Voordat je begint.

  • Een werkende integratie op live (of op zijn minst live-vormig) - zie add-payments-to-agent.
  • Een sk_test_ API-sleutel en bijbehorende testondertekeningsgeheim van het dashboard.
  • ngrok (of elke HTTPS-tunnel) voor webhook-levering tijdens de ontwikkeling.
  • Een aparte ontwikkelomgeving - aparte env-variabelen, aparte database (of op zijn minst aparte tabellen), aparte webhook-URL.
  • Comfort met de webhook patronen gids - deze gids gaat ervan uit dat je een handler hebt om tegen te testen.
STAP 1 VAN 5

Schakel over naar een test sleutel.

Een sk_test_ sleutel transacteert op Base Sepolia; een sk_live_ sleutel transacteert op Base mainnet. Het voorvoegsel kiest het netwerk - er is geen aparte netwerk omgevingsvariabele, en een test sleutel kan geen mainnet fondsen verplaatsen. Dus alles wat je verandert voor een ontwikkelomgeving is de sleutel (en het test webhook geheim).

# .env.development
# A sk_test_ key picks Base Sepolia automatically - there is no network env var.
BLOCKCHAIN0X_API_KEY=sk_test_01J9...
BLOCKCHAIN0X_WEBHOOK_SECRET=...   # the test webhook's secret, from the dashboard
STAP 2 VAN 5

Financier de portemonnee van de agent vanuit de kraan.

Test USDC heeft geen monetaire waarde, maar gedraagt zich verder als live USDC: dezelfde responsvormen, dezelfde balansregistratie. Er is geen SDK-aanroep die het mint - je financiert het walletadres van de agent vanuit de openbare Base Sepolia USDC faucet. Vind het adres in het dashboard of op de openbare pagina van de agent (of lees de agent met de SDK), en plak het vervolgens in de faucet.

TypeScript
import { createClient } from "@blockchain0x/node";

const client = createClient({ apiKey: process.env.BLOCKCHAIN0X_API_KEY! }); // sk_test_

// Look up the agent; its wallet address is shown in the dashboard and on the
// agent's public page. Fund THAT address from the Base Sepolia USDC faucet -
// there is no SDK call that mints test funds.
const agent = await client.agents.get("agt_123");
console.log(agent.id);
Python
from blockchain0x import Client

client = Client()  # reads BLOCKCHAIN0X_API_KEY (sk_test_)

# The agent's wallet address is in the dashboard / on its public page.
# Paste it into the public Base Sepolia USDC faucet to fund it.
agent = client.agents.get("agt_123")
print(agent["id"])
STAP 3 VAN 5

Doe een echte testbetaling.

Met de portemonnee gefinancierd, roep payments.create aan op je sk_test_ sleutel. Het is een echte overdracht op Base Sepolia met testfondsen, en het activeert de payment.received webhook precies zoals mainnet zou doen - zodat je het daadwerkelijke codepad uitoefent, niet een simulatie. Kijk hoe de gebeurtenis aankomt bij je getunnelde handler.

TypeScript
// On a sk_test_ key this is a REAL transfer on Base Sepolia (test funds, no
// real money). It fires the payment.received webhook just like mainnet does.
const tx = await client.payments.create({
  agentId: "agt_123",
  to: "0xRecipientOnSepolia",
  amountWei: "10000", // 0.01 USDC
});

console.log(tx); // watch payment.received arrive at your webhook
Python
tx = client.payments.create(body={
    "agentId": "agt_123",
    "to": "0xRecipientOnSepolia",
    "amountWei": "10000",  # 0.01 USDC
})

print(tx)  # watch payment.received arrive at your webhook

Drie scenario's om minimaal te oefenen: een betaling die aankomt (het gelukkige pad, payment.received), een betaling die nooit aankomt (wijs de webhook naar een dode URL en bevestig dat je reconciliatie-sweep de vastgelopen taak opvangt - het pad dat de meeste teams negeren), en een webhook-herhaling (dwing een 500 de eerste keer en 200 de tweede, verifieer dan dat je idempotentie het dubbele werk heeft overgeslagen).

STAP 4 VAN 5

Tunnel webhooks naar je lokale handler.

Testbetalingen sturen echte webhooks naar welke URL je ook hebt geconfigureerd voor de testwebhook. Voor lokale ontwikkeling geef je het een HTTPS-tunnel naar je laptop. ngrok is de eenvoudigste optie; elk omgekeerd tunneltool werkt.

# Tunnel your local webhook endpoint to a public HTTPS URL.
$ ngrok http 3000

# Forwarding   https://abc123.ngrok.app -> http://localhost:3000

# Paste the URL in the dashboard under Webhooks for your test
# environment - test and live keep separate webhook config.

Test- en livegebruik maken gebruik van aparte sleutels en aparte webhookconfiguratie, zodat je productie kunt richten op je echte eindpunt terwijl je lokale tunnel testgebeurtenissen afhandelt.

STAP 5 VAN 5

Failliet snel bij verkeerd geconfigureerde sleutels.

Het meest voorkomende productie-incident rond test/live-sleutels is stil: een implementatie komt met een testsleutel, er komen geen betalingen binnen, waarschuwingen worden pas na de volgende werkdag geactiveerd. Blokkeer dit bij opstarten: weiger te starten als de omgevingsvariabelen en het sleutelprefix niet overeenkomen.

TypeScript
// Fail fast if test/live get mixed up.
const apiKey = process.env.BLOCKCHAIN0X_API_KEY!;
const env = process.env.NODE_ENV;

if (env === "production" && apiKey.startsWith("sk_test_")) {
  throw new Error("Test key in production environment - aborting boot.");
}
if (env !== "production" && apiKey.startsWith("sk_live_")) {
  throw new Error("Live key in non-production environment - aborting boot.");
}
Python
import os, sys

api_key = os.environ["BLOCKCHAIN0X_API_KEY"]
env = os.environ.get("ENV", "development")

if env == "production" and api_key.startswith("sk_test_"):
    sys.exit("Test key in production environment - aborting boot.")
if env != "production" and api_key.startswith("sk_live_"):
    sys.exit("Live key in non-production environment - aborting boot.")
GEMEENSCHAPPELIJKE VALKUILEN

Vijf testfouten die later pijn doen.

Vergeten dat Base Sepolia zijn eigen keten is

Een sk_test_ sleutel transacteert op Base Sepolia, niet op Base mainnet. De block explorers, de walletadressen, en de gas tokens zijn allemaal apart. Een veelvoorkomende verwarring is om een echt Base-adres in een test te kopiëren, het te zien falen, en te denken dat de API kapot is. Financier het walletadres van de agent vanuit de Base Sepolia USDC faucet en betaal adressen die op die keten bestaan.

Niet testen van de foutpaden

De meeste teams testen het gelukkige pad - een betaling die payment.received activeert - en verzenden dan en ontdekken later dat hun niet-betaalde pad kapot is. Oefen het: wijs de webhook naar een dode URL en bevestig dat uw reconciliatie-sweep de vastgelopen taak opvangt, forceer een 500 van uw handler en verifieer dat de retry idempotent is, en controleer of payments.create's 503 (chain adapter niet aangesloten) wordt afgehandeld. Testomgevingen zijn goedkoop; productie debugging is duur.

Webhook-URL wijst nog steeds naar ngrok in productie

Het wisselen van sleutelvoorvoegsels is gemakkelijk te onthouden; het bijwerken van de webhook-URL is gemakkelijk te vergeten. Als je live gaat met de URL die nog steeds naar de ngrok-tunnel van je laptop wijst, zal de eerste productiebetaling een webhook in de leegte afvuren. Behandel de wijziging van de webhook-URL als onderdeel van de implementatielijst, niet als een eenmalige instelling.

Vertrouwen op testnet-timing als een proxy voor live-timing

Base Sepolia gedraagt zich niet identiek aan Base mainnet - bloktiming en congestie verschillen. Gebruik testnet niet om de doorvoer van mainnet te testen, en neem niet aan dat uw testnet-latentie is wat u in productie zult zien. Wanneer u echte cijfers nodig heeft, voer dan een kleine mainnet rooktest uit met een sk_live_ sleutel.

Testfixtures in gedeelde databases achterlaten

Als je dev- en prod-omgevingen een database delen (doe dat niet), komen testevenementen in dezelfde tabel als live-evenementen en breken ze je idempotentie dedupe (de evenement-ID-prefix is anders, maar de rij is echt). Isoleren van de webhook_events-tabel per omgeving is het minimum. Beter: volledig gescheiden DB's. Dit is een van die regels die overbodig lijkt totdat het één keer bijt.

VOLGENDE STAPPEN

Zodra de testlus in uw ontwikkelingscyclus zit.

Met een gezonde testloop op zijn plaats, is het resterende werk voornamelijk het versterken: betrouwbare webhook-afhandeling onder belasting, een laatste beveiligingschecklijst, en migraties van elke eerdere betalingsprovider die je mogelijk naast elkaar draait.

Volledige referentie op docs.blockchain0x.com. Testnetdetails: Base chain glossary. Productoppervlak: Payment API.

Laatst beoordeeld: 2026-05-15. Gepubliceerd onder CC BY 4.0.

Test het voordat je het verzendt.

Volledige sandbox: testsleutels, Base Sepolia, simuleerbare levenscyclus. Gratis.