Teste pagamentos de agentes sem dinheiro real.
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.
Antes de você começar.
- Uma integração funcional ao vivo (ou pelo menos com formato ao vivo) - veja adicionar pagamentos ao agente.
- Uma chave de API
sk_test_e um segredo de assinatura de teste correspondente do painel. - ngrok (ou qualquer túnel HTTPS) para entrega de webhook em tempo de desenvolvimento.
- Um ambiente de desenvolvimento separado - variáveis de ambiente distintas, banco de dados distinto (ou pelo menos tabelas distintas), URL de webhook distinta.
- Conforto com o guia de padrões de webhook - este guia assume que você tem um manipulador para testar.
Mude para uma chave de teste.
Uma chave sk_test_ transaciona na Base Sepolia; uma chave sk_live_ transaciona na mainnet da Base. O prefixo escolhe a rede - não há variável de ambiente de rede separada, e uma chave de teste não pode mover fundos da mainnet. Portanto, tudo o que você muda para um ambiente de desenvolvimento é a chave (e o segredo do webhook de teste).
# .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 dashboardFinancie a carteira do agente a partir da torneira.
O USDC de teste não tem valor monetário, mas se comporta como USDC ao vivo: mesmas formas de resposta, mesmo rastreamento de saldo. Não há chamada SDK que o gera - você financia o endereço da carteira do agente a partir da torneira pública USDC Base Sepolia. Encontre o endereço no painel ou na página pública do agente (ou leia o agente com o SDK), depois cole na torneira.
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);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"])Faça um pagamento de teste real.
Com a carteira financiada, chame payments.create na sua chave sk_test_. É uma transferência real no Base Sepolia usando fundos de teste, e dispara o webhook payment.received exatamente como a mainnet faria - então você exercita o caminho de código real, não uma simulação. Observe o evento chegar ao seu manipulador tunelado.
// 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 webhooktx = client.payments.create(body={
"agentId": "agt_123",
"to": "0xRecipientOnSepolia",
"amountWei": "10000", # 0.01 USDC
})
print(tx) # watch payment.received arrive at your webhookTrês cenários para exercitar no mínimo: um pagamento que chega (o caminho feliz, payment.received), um pagamento que nunca chega (aponte o webhook para uma URL morta e confirme que sua varredura de reconciliação captura o trabalho preso - o caminho que a maioria das equipes ignora) e uma nova tentativa de webhook (force um 500 na primeira vez e 200 na segunda, então verifique se sua idempotência pulou o trabalho duplicado).
Tunelize webhooks para seu manipulador local.
Pagamentos de teste enviam webhooks reais para qualquer URL que você configurou para o webhook de teste. Para desenvolvimento local, forneça um túnel HTTPS para seu laptop. ngrok é a opção mais simples; qualquer ferramenta de túnel reverso funciona.
# 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.Teste e uso ao vivo utilizam chaves separadas e configuração de webhook separada, para que você possa deixar a produção apontada para seu endpoint real enquanto seu túnel local lida com eventos de teste.
Falhe rapidamente em chaves mal configuradas.
O incidente de produção mais comum em torno de chaves de teste/produção é silencioso: uma implementação chega com uma chave de teste, nenhum pagamento passa, alertas só disparam após o próximo dia útil. Bloqueie isso na inicialização: recuse-se a iniciar se as variáveis de ambiente e o prefixo da chave não corresponderem.
// 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.");
}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.")Cinco erros de teste que doem depois.
Esquecendo que a Base Sepolia é sua própria cadeia
Uma chave sk_test_ transaciona na Base Sepolia, não na mainnet da Base. Os exploradores de blocos, os endereços das carteiras e os tokens de gás são todos separados. Uma confusão comum é copiar um endereço real da Base para um teste, ver falhar e pensar que a API está quebrada. Financie o endereço da carteira do agente a partir da torneira de USDC da Base Sepolia e pague endereços que existem nessa cadeia.
Não testando os caminhos de falha
A maioria das equipes testa o caminho feliz - um pagamento que dispara payment.received - depois envia e descobre mais tarde que seu caminho não pago está quebrado. Exercite-o: aponte o webhook para uma URL inativa e confirme que sua varredura de reconciliação captura o trabalho preso, force um 500 do seu manipulador e verifique se a nova tentativa é idempotente, e verifique se o 503 de payments.create (adaptador de cadeia não conectado) é tratado. Ambientes de teste são baratos; depuração em produção é cara.
URL do webhook ainda apontando para ngrok em produção
Mudar os prefixos das chaves é fácil de lembrar; atualizar a URL do webhook é fácil de esquecer. Se você entrar em produção com a URL ainda apontando para o túnel ngrok do seu laptop, o primeiro pagamento de produção dispara um webhook no vazio. Trate a mudança da URL do webhook como parte da lista de verificação de implantação, não como uma configuração única.
Confiando no tempo da testnet como um proxy para o tempo real
Base Sepolia não se comporta de forma idêntica à mainnet Base - o tempo de bloco e a congestão diferem. Não use testnet para testar a capacidade da mainnet, e não assuma que sua latência de testnet é o que você verá em produção. Quando precisar de números reais, execute um teste de fumaça de pequena quantia na mainnet com uma chave sk_live_.
Deixando fixtures de teste em bancos de dados compartilhados
Se seus ambientes de desenvolvimento e produção compartilharem um banco de dados (não compartilhe), eventos de teste cairão na mesma tabela que eventos ao vivo e quebrarão sua deduplicação de idempotência (o prefixo do ID do evento é diferente, mas a linha é real). No mínimo, isole a tabela webhook_events por ambiente. Melhor: bancos de dados separados completamente. Esta é uma daquelas regras que parecem excessivas até que causem problemas uma vez.
Uma vez que o loop de teste está no seu ciclo de desenvolvimento.
Com um loop de teste saudável em funcionamento, o trabalho restante é principalmente de fortalecimento: manipulação confiável de webhook sob carga, uma lista de verificação de segurança final e migrações de qualquer provedor de pagamento anterior que você possa estar usando.
Os padrões de webhook que os desenvolvedores mais perguntam
Proteja sua carteira de agente antes de ir ao vivo
Migrar do Stripe para Blockchain0x para acesso à API dirigido por agentes
Referência completa em docs.blockchain0x.com. Detalhes da Testnet: Glossário da cadeia Base. Superfície do produto: API de Pagamento.