أرسل أول طلب مدفوع عبر x402

يتتبّع هذا الدليل طلب Solana واحدًا عبر x402: قراءة السعر، ثم دفعه، ثم الحصول على الإجابة مع إيصال التسوية. وتعمل السلاسل الـ15 الأخرى بالطريقة نفسها، كلٌّ على مسارها.
تحتاج إلى محفظة فيها USDC على Solana، أو USDC أو EURC على Base، وإلى عميل x402: البرنامج الذي يقرأ استجابة 402، ويوقّع دفعة من محفظتك، ثم يعيد إرسال الطلب معها. لمعرفة المزيد عن عملاء x402، راجع وثائق x402 على x402.org.

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 قبل طلب أي دفعة، لذا لا يكلّف شيئًا.

الخطوات التالية