# وضع الاختبار وبطاقات الاختبار (/ar/get-started/test-mode)

ابنِ واختبر الدمج بتاعك مع XPay من الأول للآخر من غير ما تحرّك فلوس حقيقية.

وضع الاختبار بيئة منفصلة تمامًا بتحاكي الحساب الفعلي: نفس الـ API، ونفس حمولات الـ webhook، ونفس واجهة لوحة التحكم، وكل حاجة تانية منفصلة. الحسابات الجديدة بتبدأ في وضع الاختبار وبتفضل فيه لحد ما نشاطك يتوافق عليه للدفع الفعلي.

وضع الاختبار هو المكان اللي بتبني وتختبر وتكسّر فيه. مفيش أي حاجة بتعملها في وضع الاختبار بتمس بطاقة حقيقية، ولا عملاءك الفعليين، ولا رصيدك الفعلي.

## إيه المنفصل وإيه المتشابه [#إيه-المنفصل-وإيه-المتشابه]

| في وضع الاختبار                                      | في الحساب الفعلي                        |
| ---------------------------------------------------- | --------------------------------------- |
| مفاتيح API `pk_test_...` و`sk_test_...`              | مفاتيح API `pk_live_...` و`sk_live_...` |
| عملاء ومعاملات وتسويات اختبارية                      | عملاء ومعاملات وتسويات فعلية            |
| سجل رصيد اختباري منفصل عن الفعلي                     | سجل رصيد فعلي                           |
| نقاط نهاية webhook اختبارية (بتتظبط لوحدها)          | نقاط نهاية webhook فعلية                |
| **نفس** أشكال طلبات وردود الـ API                    | نفس الشيء                               |
| **نفس** أحداث الـ webhook والبيانات اللي بتحملها     | نفس الشيء                               |
| **نفس** واجهة لوحة التحكم، مع شريط ولون برتقالي خفيف | نفس الواجهة، من غير شريط                |

لما تنتقل للحساب الفعلي، مش بتغيّر أي كود. بس بتبدّل مفاتيح الاختبار بمفاتيح الحساب الفعلي وتظبط نقاط نهاية webhook فعلية.

## تقدر تختبر إيه [#تقدر-تختبر-إيه]

* **مدفوعات البطاقات** بنتايج نجاح وفشل متوقّعة (شوف الجدول تحت).
* **تدفّقات 3D Secure**، بما فيها النجاح والفشل والإلغاء وانتهاء المهلة (عن طريق محاكي ACS).
* **المبالغ المستردة**، كاملة أو جزئية، من لوحة التحكم أو الـ API.
* **الـ Webhooks** لنقطة نهاية حقيقية أو محلية، بما فيها إعادة المحاولة وإعادة الإرسال من لوحة التحكم.
* **الدفع المستضاف، وDrop-in، وواجهة Elements** بالكامل من الأول للآخر.
* **التسويات**، بمحاكاة على جدول الاختبار.

## بطاقات الاختبار [#بطاقات-الاختبار]

XPay بيقبل أربع بطاقات اختبار في وضع الاختبار. رقم البطاقة بيحدّد البنك المُصدِر والشبكة، و**تاريخ الانتهاء** بيحدّد نتيجة الدفع.

| الشبكة     | البنك المُصدِر      | رقم البطاقة           | العملة |
| ---------- | ------------------- | --------------------- | ------ |
| Mastercard | البنك الأهلي المصري | `5123 4500 0000 0008` | EGP    |
| Visa       | بنك مصر             | `4508 7500 1574 1019` | EGP    |
| Mastercard | كريدي أجريكول مصر   | `5111 1111 1111 1118` | EGP    |
| Mastercard | دولية               | `2223 0000 0000 0007` | USD    |

أي رقم بطاقة تاني بيترفض في وضع الاختبار. البطاقة الدولية هي اللي تستخدمها لما تحب تختبر شريحة الرسوم الدولية.

## نتيجة الدفع حسب تاريخ الانتهاء [#نتيجة-الدفع-حسب-تاريخ-الانتهاء]

في وضع الاختبار، **تاريخ الانتهاء** هو اللي بيقرّر الدفعة هتنجح ولا هتفشل، وهتفشل إزاي. رقم البطاقة نفسه ملوش دخل.

| تاريخ الانتهاء | النتيجة                 |
| -------------- | ----------------------- |
| `01/39`        | APPROVED                |
| `05/39`        | DECLINED                |
| `01/27`        | INSUFFICIENT\_FUNDS     |
| `04/27`        | EXPIRED\_CARD           |
| `08/28`        | TIMED\_OUT              |
| `01/37`        | ACQUIRER\_SYSTEM\_ERROR |
| `02/37`        | UNSPECIFIED\_FAILURE    |
| `05/37`        | UNKNOWN                 |

استخدم `01/39` للمسار الناجح. واستخدم الباقي علشان تتأكد إن كودك بيتعامل صح مع حالات الفشل الواقعية: الـ Payment Intent بينتقل لـ `payment_failed`، والـ Charge بياخد `failure_code`، وبيوصلك الـ webhooks المطابقة (`payment_intent.payment_failed`، `charge.failed`).

## نتيجة الـ CVV حسب قيمته [#نتيجة-الـ-cvv-حسب-قيمته]

الـ **CVV** بيتحكم في نتيجة مطابقة الـ CVV اللي بتظهر على الـ Charge الناتج.

| CVV   | النتيجة        |
| ----- | -------------- |
| `100` | MATCH          |
| `101` | NOT\_PROCESSED |
| `102` | NO\_MATCH      |

استخدم `100` إلا لو بتختبر التعامل مع عدم تطابق الـ CVV.

## الـ 3D Secure في وضع الاختبار [#الـ-3d-secure-في-وضع-الاختبار]

كل دفعة اختبار بتمر بتدفّق تحدّي 3D Secure 2 الكامل عن طريق محاكي الـ sandbox بتاع XPay. بعد ما تبعت نموذج البطاقة، بتظهر صفحة ACS (سيرفر التحكم في الوصول) بتختار منها نتيجة المصادقة:

* **نجاح.** بيكمّل الدفعة على المسار الناجح.
* **رفض.** البنك المُصدِر بيرفض التحدّي. الدفعة بتفشل بـ `authentication_required` أو `card_declined` على حسب رد البنك.
* **إلغاء.** العميل بيقفل التحدّي.
* **انتهاء المهلة.** مفيش رد جوّه المهلة اللي حدّدها البنك المُصدِر.

كده تقدر تختبر فروع فشل الـ 3DS في الدمج بتاعك من غير ما تدوّر على بطاقة حقيقية فاشلة.

## رايح فين بعد كده [#رايح-فين-بعد-كده]

<Cards>
  <Card icon="<Rocket />" title="البداية السريعة" href="/get-started/quickstart">
    لسه معملتش دفعة اختبار؟ اعملها من الأول للآخر في خمس دقايق.
  </Card>

  <Card icon="<GitBranch />" title="اختار طريقة الدمج" href="/get-started/choose-your-integration">
    اختار طريقة الدمج اللي هتبني بيها فعليًا.
  </Card>

  <Card icon="<Webhook />" title="ظبّط نقطة نهاية webhook" href="/integrate/webhooks/setting-up-an-endpoint">
    اشترك في أحداث الاختبار وتحقّق من التوقيع قبل ما تنشر.
  </Card>

  <Card icon="<Cable />" title="تطوير الـ webhook محليًا" href="/integrate/webhooks/local-development">
    وجّه webhooks الاختبار لجهازك وأنت بتبني.
  </Card>
</Cards>