> ## Documentation Index
> Fetch the complete documentation index at: https://docs.oneclickdz.com/llms.txt
> Use this file to discover all available pages before exploring further.

# التحقق من الحالة بالمرجع

> التحقق من حالة شحن الهاتف المحمول باستخدام مرجعك المخصص

<div dir="rtl">
  ## نظرة عامة

  يُرجع حالة شحن هاتف محمول باستخدام قيمة `ref` التي حددتها عند [إرسال الشحن](/ar/api-reference/mobile/send-topup).

  <Note>
    إذا أرسلت طلبًا بدون `ref`، استخدم [check-by-id](/ar/api-reference/mobile/check-by-id) مع `topupId` المُرجع.
  </Note>

  ## المعلمات

  <ParamField path="ref" type="string" required>
    مرجعك الداخلي كما وفّرته في طلب الشحن
  </ParamField>

  ## الاستجابة

  <ResponseField name="success" type="boolean" required>
    `true` إذا تم العثور على الشحن وإرجاع حالته
  </ResponseField>

  <ResponseField name="data" type="object" required>
    <Expandable title="properties">
      <ResponseField name="_id" type="string">
        معرّف الشحن الداخلي
      </ResponseField>

      <ResponseField name="ref" type="string">
        مرجعك الداخلي
      </ResponseField>

      <ResponseField name="status" type="string">
        الحالة الحالية للشحن. القيم المحتملة:

        * `PENDING`: قيد المعالجة
        * `SUCCESS`: اكتمل الشحن
        * `FAILED`: فشل بشكل نهائي (الرصيد مُسترد)
        * `UNKNOWN_ERROR`: حالة غير محددة - انتظر، لا تسترد الأموال
      </ResponseField>

      <ResponseField name="MSSIDN" type="string">
        رقم الهاتف الذي تم شحنه
      </ResponseField>

      <ResponseField name="operator" type="string">
        مشغّل الشبكة: `Mobilis`، `Djezzy`، أو `Ooredoo`
      </ResponseField>

      <ResponseField name="planCode" type="string">
        رمز الخطة المستخدمة
      </ResponseField>

      <ResponseField name="planName" type="string">
        الاسم المقروء للخطة
      </ResponseField>

      <ResponseField name="amount" type="number">
        مبلغ الشحن بالدينار الجزائري
      </ResponseField>

      <ResponseField name="cost" type="number">
        التكلفة الفعلية من رصيدك
      </ResponseField>

      <ResponseField name="createdAt" type="string">
        طابع زمني للإنشاء (ISO 8601)
      </ResponseField>

      <ResponseField name="updatedAt" type="string">
        طابع زمني لآخر تحديث للحالة (ISO 8601)
      </ResponseField>
    </Expandable>
  </ResponseField>

  ## قيم الحالة

  | الحالة          | المعنى             | الإجراء                              |
  | --------------- | ------------------ | ------------------------------------ |
  | `PENDING`       | الشحن قيد المعالجة | تحقق مجددًا بعد 5-10 ثوانٍ           |
  | `SUCCESS`       | الشحن اكتمل بنجاح  | أبلغ المستخدم بالنجاح                |
  | `FAILED`        | الشحن فشل نهائيًا  | الرصيد مُسترد - يمكن المحاولة مجددًا |
  | `UNKNOWN_ERROR` | حالة غير محددة     | **انتظر 24 ساعة** - لا تسترد الأموال |

  ## الأمثلة

  <CodeGroup>
    ```bash cURL theme={null}
    curl https://api.oneclickdz.com/v3/mobile/topup/ref/order-001 \
      -H "X-Access-Token: YOUR_API_KEY"
    ```

    ```javascript Node.js theme={null}
    const ref = "order-001";
    const response = await fetch(
      `https://api.oneclickdz.com/v3/mobile/topup/ref/${encodeURIComponent(ref)}`,
      {
        headers: { "X-Access-Token": "YOUR_API_KEY" },
      }
    );
    const data = await response.json();
    console.log("Status:", data.data.status);
    ```

    ```python Python theme={null}
    import requests

    ref = 'order-001'
    response = requests.get(
        f'https://api.oneclickdz.com/v3/mobile/topup/ref/{ref}',
        headers={'X-Access-Token': 'YOUR_API_KEY'}
    )
    data = response.json()
    print('Status:', data['data']['status'])
    ```

    ```php PHP theme={null}
    <?php
    $ref = 'order-001';
    $ch = curl_init("https://api.oneclickdz.com/v3/mobile/topup/ref/{$ref}");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Access-Token: YOUR_API_KEY']);
    $data = json_decode(curl_exec($ch), true);
    echo 'Status: ' . $data['data']['status'];
    ?>
    ```
  </CodeGroup>

  ### مثال على الاستجابة

  ```json theme={null}
  {
    "success": true,
    "data": {
      "_id": "6901616fe9e88196b4eb64b0",
      "ref": "order-001",
      "status": "SUCCESS",
      "MSSIDN": "0776543210",
      "operator": "Djezzy",
      "planCode": "PREPAID_DJEZZY",
      "planName": "📱 PREPAID | عادي",
      "amount": 500,
      "cost": 496.25,
      "createdAt": "2025-10-29T00:35:59.454Z",
      "updatedAt": "2025-10-29T00:36:05.123Z"
    }
  }
  ```

  ## استراتيجية الاستطلاع (Polling)

  ```javascript theme={null}
  async function pollTopUpStatus(ref, maxAttempts = 12, intervalMs = 5000) {
    for (let attempt = 1; attempt <= maxAttempts; attempt++) {
      const response = await fetch(
        `https://api.oneclickdz.com/v3/mobile/topup/ref/${encodeURIComponent(ref)}`,
        {
          headers: { "X-Access-Token": API_KEY },
        }
      );

      const data = await response.json();

      if (!data.success) {
        throw new Error(`Failed to check status: ${data.error.message}`);
      }

      const { status } = data.data;

      if (status === "SUCCESS") {
        return { success: true, data: data.data };
      }

      if (status === "FAILED") {
        return { success: false, data: data.data };
      }

      if (status === "UNKNOWN_ERROR") {
        // Stop polling - schedule a check after 24h, do NOT refund
        return { success: null, data: data.data, requiresManualReview: true };
      }

      // Still PENDING - wait and retry
      if (attempt < maxAttempts) {
        await new Promise((resolve) => setTimeout(resolve, intervalMs));
      }
    }

    // Timeout - treat as UNKNOWN_ERROR
    return { success: null, timedOut: true, requiresManualReview: true };
  }
  ```

  ## متى تستخدم هذا الـ Endpoint

  <CardGroup cols={2}>
    <Card title="استعلامات المستخدمين" icon="user">
      عندما يسأل المستخدمون عن طلباتهم باستخدام معرّف الطلب الخاص بك
    </Card>

    <Card title="إدارة الطلبات" icon="list-check">
      التكامل مع نظام تتبع الطلبات الحالي لديك
    </Card>

    <Card title="صفحات الحالة" icon="display">
      عرض حالة الطلب باستخدام مراجع مواجهة العملاء
    </Card>

    <Card title="دعم العملاء" icon="headset">
      البحث عن الطلبات عبر أرقام المراجع الخاصة بالعملاء
    </Card>
  </CardGroup>

  ## استجابة الخطأ

  **404 - غير موجود:**

  ```json theme={null}
  {
    "success": false,
    "error": {
      "code": "NOT_FOUND",
      "message": "Top-up with reference 'order-12345' not found"
    },
    "requestId": "req_1730160975_abc123"
  }
  ```

  هذا يعني أنه لا يوجد شحن بهذا المرجع. الأسباب المحتملة:

  * لم يُرسَل المرجع أبداً
  * خطأ إملائي في المرجع
  * المرجع ينتمي إلى حساب مختلف

  ## أفضل الممارسات

  <AccordionGroup>
    <Accordion title="استخدم مراجع ذات معنى">
      أنشئ مراجع تكون:

      * فريدة في نظامك
      * سهلة التعرف عليها (مثل `order-{timestamp}-{userId}`)
      * آمنة في عناوين URL (بدون أحرف خاصة)
      * قابلة للبحث في قاعدة بياناتك
    </Accordion>

    <Accordion title="احفظ المعرّفَين">
      احفظ كلاً من مرجعك ومعرّف topupId الخاص بـ API:

      ```javascript theme={null}
      await db.orders.update({
        orderId: 'order-12345',
        apiTopupId: response.data.topupId,
        apiTopupRef: response.data.topupRef
      });
      ```

      يتيح لك ذلك التتبع باستخدام أي من المعرّفين.
    </Accordion>

    <Accordion title="تعامل مع المراجع المفقودة">
      إذا نسيت تقديم `ref`، ينشئ الـ API مرجعاً تلقائياً. احفظه:

      ```javascript theme={null}
      const response = await sendTopup({ 
        plan_code: 'PREPAID_DJEZZY',
        MSSIDN: '0778037340',
        amount: 500
        // No ref provided
      });

      // API returns: { topupRef: "auto-gen-1730160975" }
      await db.orders.update({
        orderId: order.id,
        apiRef: response.data.topupRef
      });
      ```
    </Accordion>
  </AccordionGroup>

  ## Endpoints ذات الصلة

  <CardGroup cols={3}>
    <Card title="التحقق من الحالة بالمعرّف" icon="fingerprint" href="/ar/api-reference/mobile/check-by-id">
      البحث بـ topupId
    </Card>

    <Card title="إرسال الشحن" icon="paper-plane" href="/ar/api-reference/mobile/send-topup">
      إرسال شحن جديد
    </Card>

    <Card title="قائمة الشحنات" icon="list" href="/ar/api-reference/mobile/list-topups">
      عرض الشحنات السابقة
    </Card>
  </CardGroup>
</div>
