通过 x402 发送第一个付费请求

本指南以一个 Solana 请求为例,走完 x402 的整个流程:读取价格、付款,然后获得附带结算凭证的结果。其他 15 条链的用法相同,只是路径不同。
您需要准备一个钱包和一个 x402 客户端。钱包中需持有 Solana 上的 USDC,或 Base 上的 USDC 或 EURC;x402 客户端负责读取 402 响应、用您的钱包签署付款,并带上付款重新发送请求。关于 x402 客户端,请参阅 x402.org 上的 x402 文档。

1. 发送请求

不附带付款,直接发送 RPC 请求:
bash
curl -i https://x402.erpc.global/v1/solana-mainnet \
  --header 'Content-Type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
响应为 402 Payment Required。响应头给出方法和价格:
http
HTTP/2 402
x-payment-required: eyJ4NDAyVmVyc2lvbiI6Mi…
x-rpc-methods: getSlot
x-rpc-weight: 1000
x-rpc-price-usd: 0.001
响应体在 accepts 中列出支付选项,每种可用于支付该请求的稳定币对应一项。amount 以稳定币的最小单位计,因此 1000 即 0.001 USDC,或 0.001 EURC:
json
{
  "error": { "code": "payment_required", "message": "Payment required", "request_id": "…" },
  "x402Version": 2,
  "accepts": [
    { "scheme": "exact", "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "amount": "1000", "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", … },
    { "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", … },
    { "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42", … }
  ],
  "pricing": { "methods": ["getSlot"], …, "weight": 1000, "rawWeight": 42, …, "price": "$0.001", … },
  …
}

2. 用 x402 客户端付款

将 402 响应交给您的 x402 客户端。客户端会选择您的钱包能够支付的选项,按该金额签署一笔付款,并将其编码为 X-Payment 请求头的值。这笔付款无需 SOL 或 ETH 来支付网络手续费。

3. 附上付款,再次发送请求

再次发送相同的请求体,并将付款放入 X-Payment 请求头:
bash
curl -i https://x402.erpc.global/v1/solana-mainnet \
  --header 'Content-Type: application/json' \
  --header 'X-Payment: <PAYMENT_PAYLOAD>' \
  --data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
请勿修改请求体。价格根据请求体计算,因此如果修改后的请求体价格不同,付款就不再与之匹配,请求会收到 price_mismatch。
付款完成验证和结算后,RPC 结果随之返回,结算凭证位于 X-Payment-Response 响应头中:
http
HTTP/2 200
x-payment-response: <RECEIPT>
json
{ "jsonrpc": "2.0", "id": 1, "result": … }
一笔付款只能支付一个请求。如果再次发送同一笔付款,会被拒绝并返回 402 payment_invalid 或 409 duplicate_payment,请求也不会被再次转发。

响应

如果 x402.erpc.global 在要求付款之前就返回错误,该请求不收取任何费用。
状态码error.code含义
402payment_required未附带付款。响应体中给出价格和支付选项。
402payment_invalid付款未通过验证。请签署新的付款,然后再次发送请求。
402price_mismatch付款与该请求的 402 响应所提供的任何选项都不匹配,例如价格不符。
402payment_amount_too_low金额低于 x402.erpc.global 结算的最低付款额。
402settlement_failed收到的结算结果为失败。响应会再次提供支付选项。
409duplicate_payment该付款已被使用。
400method_not_supported、invalid_request该路径不出售此方法,或不接受该请求体。不收取任何费用。
413batch_too_large批量请求超过 100 次调用。不收取任何费用。
500configuration_error该路径目前无法处理请求。不收取任何费用。
503payment_unavailable目前无法提供任何支付选项。不收取任何费用。请在 Retry-After 给出的秒数之后重试。
503service_busy服务繁忙,同一时间的请求过多。不收取任何费用。请在 Retry-After 给出的秒数之后重试。
502settlement_failed结算结果未知:付款可能已经完成,且未附带结算凭证。在签署新的付款之前,请先在 Solana 或 Base 上确认您签署的付款是否已经完成。
502、504upstream_error、upstream_timeout付款已结算,但链没有响应,或未能及时响应。结算凭证仍会附上。再次发送请求需要一笔新的付款。
在 Solana 上,读取范围过大的调用(例如对大型程序发送不带过滤条件的 getProgramAccounts)会在要求付款之前收到 HTTP 200 和一个 JSON-RPC 错误,因此不收取任何费用。

后续步骤