ส่ง request แรกของคุณแบบชำระเงินผ่าน x402

คู่มือนี้จะพาคุณส่ง request ของ Solana หนึ่งรายการผ่าน x402 ตั้งแต่อ่านราคา ชำระเงิน จนได้คำตอบพร้อม settlement receipt ส่วนอีก 15 เชนก็ใช้วิธีเดียวกันที่ path ของแต่ละเชน
คุณต้องมี wallet ที่มี USDC บน Solana หรือ USDC หรือ EURC บน Base และต้องมี x402 client ซึ่งเป็นซอฟต์แวร์ที่อ่าน response 402 ลงนามการชำระเงินด้วย wallet ของคุณ แล้วส่ง request อีกครั้งพร้อมการชำระเงินนั้น ดูข้อมูลเกี่ยวกับ x402 client ได้ในเอกสารของ x402 ที่ x402.org

1. ส่ง request

ส่ง RPC request โดยยังไม่ชำระเงิน:
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 โดย header จะระบุเมธอดและราคา:
http
HTTP/2 402
x-payment-required: eyJ4NDAyVmVyc2lvbiI6Mi…
x-rpc-methods: getSlot
x-rpc-weight: 1000
x-rpc-price-usd: 0.001
body แสดงตัวเลือกการชำระเงินใน accepts หนึ่งรายการต่อ stablecoin แต่ละตัวที่ใช้ชำระ request นี้ได้ ส่วน amount เป็นจำนวนในหน่วยที่เล็กที่สุดของ stablecoin ดังนั้น 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 client

ส่ง response 402 ให้ x402 client ของคุณ จากนั้น client จะเลือกตัวเลือกที่ wallet ของคุณชำระได้ ลงนามการชำระเงินตามจำนวนนั้น แล้ว encode ให้อยู่ในรูปแบบของ header X-Payment การชำระเงินนี้ไม่ต้องใช้ SOL หรือ ETH สำหรับค่าธรรมเนียมเครือข่าย

3. ส่ง request อีกครั้งพร้อมการชำระเงิน

ส่ง body เดิมอีกครั้ง โดยใส่การชำระเงินใน header 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"}'
ใช้ body เดิมโดยไม่แก้ไข ราคาคำนวณจาก body ดังนั้นหาก body ที่แก้ไขแล้วมีราคาต่างไป การชำระเงินจะไม่ตรงกับราคานั้นอีกต่อไป และระบบจะตอบกลับด้วย price_mismatch
เมื่อการชำระเงินผ่านการตรวจสอบและ settle แล้ว คำตอบ RPC จะกลับมาพร้อม settlement receipt ใน header X-Payment-Response:
http
HTTP/2 200
x-payment-response: <RECEIPT>
json
{ "jsonrpc": "2.0", "id": 1, "result": … }
การชำระเงินหนึ่งครั้งใช้ได้กับ request เดียว หากส่งการชำระเงินเดิมซ้ำ จะถูกปฏิเสธด้วย 402 payment_invalid หรือ 409 duplicate_payment และ request จะไม่ถูกส่งต่ออีก

รหัสสถานะการตอบกลับ

request ที่ x402.erpc.global ตอบกลับด้วยข้อผิดพลาดก่อนขอให้ชำระเงินจะไม่มีค่าใช้จ่าย
สถานะerror.codeสิ่งที่เกิดขึ้น
402payment_requiredไม่ได้ส่งการชำระเงินมา body ระบุราคาและตัวเลือกการชำระเงิน
402payment_invalidการชำระเงินไม่ผ่านการตรวจสอบ ให้ลงนามการชำระเงินใหม่แล้วส่ง request อีกครั้ง
402price_mismatchการชำระเงินไม่ตรงกับตัวเลือกใด ๆ ที่ response 402 ของ request นี้เสนอ เช่น ราคาไม่ตรง
402payment_amount_too_lowจำนวนเงินต่ำกว่าการชำระเงินขั้นต่ำที่ x402.erpc.global settle ได้
402settlement_failedระบบได้รับแจ้งว่าการ settle ล้มเหลว response จะเสนอตัวเลือกการชำระเงินอีกครั้ง
409duplicate_paymentการชำระเงินนี้ถูกใช้ไปแล้ว
400method_not_supported, invalid_requestpath นั้นไม่ได้ขายเมธอดนี้ หรือไม่รับ body นี้ ไม่มีการเรียกเก็บเงิน
413batch_too_largebatch มีมากกว่า 100 call ไม่มีการเรียกเก็บเงิน
500configuration_errorpath นั้นยังรับ request ไม่ได้ในขณะนี้ ไม่มีการเรียกเก็บเงิน
503payment_unavailableขณะนี้ไม่สามารถเสนอตัวเลือกการชำระเงินได้ ไม่มีการเรียกเก็บเงิน รอตามจำนวนวินาทีที่ระบุใน Retry-After แล้วลองใหม่
503service_busyมี request พร้อมกันมากเกินไป ไม่มีการเรียกเก็บเงิน รอตามจำนวนวินาทีที่ระบุใน Retry-After แล้วลองใหม่
502settlement_failedไม่ทราบผลของการ settle การชำระเงินอาจสำเร็จไปแล้ว และไม่มี receipt แนบมา ก่อนลงนามการชำระเงินใหม่ ให้ตรวจสอบบน Solana หรือ Base ว่าการชำระเงินที่คุณลงนามไว้สำเร็จหรือไม่
502, 504upstream_error, upstream_timeoutการชำระเงิน settle แล้ว แต่เชนไม่ตอบกลับ หรือไม่ตอบกลับภายในเวลาที่กำหนด receipt ยังแนบมาด้วย การส่ง request อีกครั้งต้องใช้การชำระเงินใหม่
บน Solana นั้น หากส่ง call ที่จะอ่านข้อมูลมากเกินไป เช่น getProgramAccounts แบบไม่ใส่ตัวกรองกับโปรแกรมขนาดใหญ่ ระบบจะตอบกลับด้วย HTTP 200 พร้อมข้อผิดพลาด JSON-RPC ก่อนมีการขอให้ชำระเงิน จึงไม่มีค่าใช้จ่าย

ขั้นตอนถัดไป