本指南以一个 Solana 请求为例,走完 x402 的整个流程:读取价格、付款,然后获得附带结算凭证的结果。其他 15 条链的用法相同,只是路径不同。
您需要准备一个钱包和一个 x402 客户端。钱包中需持有 Solana 上的 USDC,或 Base 上的 USDC 或 EURC;x402 客户端负责读取 402 响应、用您的钱包签署付款,并带上付款重新发送请求。关于 x402 客户端,请参阅
x402.org 上的 x402 文档。
1. 发送请求
不附带付款,直接发送 RPC 请求:
curl -i https://x402.erpc.global/v1/solana-mainnet \
--header 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
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/2 402
x-payment-required: eyJ4NDAyVmVyc2lvbiI6Mi…
x-rpc-methods: getSlot
x-rpc-weight: 1000
x-rpc-price-usd: 0.001
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:
{
"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", … },
…
}
{
"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 请求头:
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"}'
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/2 200
x-payment-response: <RECEIPT>
HTTP/2 200
x-payment-response: <RECEIPT>
{ "jsonrpc": "2.0", "id": 1, "result": … }
{ "jsonrpc": "2.0", "id": 1, "result": … }
一笔付款只能支付一个请求。如果再次发送同一笔付款,会被拒绝并返回 402 payment_invalid 或 409 duplicate_payment,请求也不会被再次转发。
响应
如果 x402.erpc.global 在要求付款之前就返回错误,该请求不收取任何费用。
在 Solana 上,读取范围过大的调用(例如对大型程序发送不带过滤条件的 getProgramAccounts)会在要求付款之前收到 HTTP 200 和一个 JSON-RPC 错误,因此不收取任何费用。
后续步骤