> ## 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.

# التحقق من رقم الهاتف

> التحقق من صحة أرقام هواتف ADSL و4G قبل معالجة الطلبات

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

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

  <Info>
    يُعدّ التحقق **خطوة إلزامية** قبل إرسال أي طلب شحن لتجنب رسوم الطلبات الفاشلة.
  </Info>

  ## مرجع API

  <Card title="POST /v3/internet/check-number" icon="phone" href="/ar/api-reference/internet/validate-number">
    التوثيق الكامل للـ endpoint
  </Card>

  ## أنماط صياغة الأرقام

  ### ADSL

  أرقام ADSL هي أرقام هاتف أرضي جزائرية بالتنسيق: `0XX XXX XXXX`

  ```
  036362608  → صحيح (ولاية برج بوعريريج)
  031562900  → صحيح (ولاية عنابة)
  029000000  → صحيح (ولاية ورقلة)
  ```

  ### 4G

  أرقام 4G هي أرقام هواتف محمولة جزائرية: `06X XXX XXXX` أو `07X XXX XXXX`

  ```
  0661234567 → صحيح (Djezzy)
  0771234567 → صحيح (Mobilis)
  0551234567 → صحيح (Ooredoo)
  ```

  ## التحقق الأساسي

  <CodeGroup>
    ```javascript Node.js theme={null}
    async function validateInternetNumber(type, number) {
      const response = await fetch(
        "https://api.oneclickdz.com/v3/internet/check-number",
        {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            "X-Access-Token": process.env.API_KEY,
          },
          body: JSON.stringify({ type, number }),
        }
      );

      if (!response.ok) {
        const error = await response.json();
        throw new Error(error.error?.message || `Validation failed: ${response.status}`);
      }

      const result = await response.json();
      return result.data;
    }

    // Usage
    try {
      const validation = await validateInternetNumber('ADSL', '036362608');
      console.log('Number is valid:', validation);
    } catch (error) {
      console.error('Validation failed:', error.message);
    }
    ```

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

    def validate_internet_number(number_type, number):
        response = requests.post(
            'https://api.oneclickdz.com/v3/internet/check-number',
            headers={
                'Content-Type': 'application/json',
                'X-Access-Token': os.getenv('API_KEY')
            },
            json={'type': number_type, 'number': number}
        )

        if not response.ok:
            error = response.json()
            raise Exception(error.get('error', {}).get('message', f'Validation failed: {response.status_code}'))

        return response.json()['data']

    # Usage
    try:
        validation = validate_internet_number('ADSL', '036362608')
        print(f"Number is valid: {validation}")
    except Exception as e:
        print(f"Validation failed: {e}")
    ```

    ```php PHP theme={null}
    <?php

    function validateInternetNumber($type, $number) {
        $data = ['type' => $type, 'number' => $number];

        $ch = curl_init('https://api.oneclickdz.com/v3/internet/check-number');
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'X-Access-Token: ' . getenv('API_KEY')
        ]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpCode >= 400) {
            $error = json_decode($response, true);
            throw new Exception($error['error']['message'] ?? "Validation failed: {$httpCode}");
        }

        $result = json_decode($response, true);
        return $result['data'];
    }

    // Usage
    try {
        $validation = validateInternetNumber('ADSL', '036362608');
        echo "Number is valid\n";
    } catch (Exception $e) {
        echo "Validation failed: " . $e->getMessage() . "\n";
    }
    ?>
    ```

    ```bash cURL theme={null}
    curl https://api.oneclickdz.com/v3/internet/check-number \
      -X POST \
      -H "Content-Type: application/json" \
      -H "X-Access-Token: YOUR_API_KEY" \
      -d '{"type": "ADSL", "number": "036362608"}'
    ```
  </CodeGroup>

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

  ### رقم صحيح

  ```json theme={null}
  {
    "success": true,
    "data": {
      "valid": true,
      "type": "ADSL",
      "number": "036362608"
    }
  }
  ```

  ### رقم غير صحيح

  ```json theme={null}
  {
    "success": false,
    "error": {
      "code": "err_phone",
      "message": "Invalid phone number for ADSL service"
    }
  }
  ```

  ## التحقق المسبق من التنسيق

  تحقق من التنسيق محلياً قبل استدعاء API:

  ```javascript theme={null}
  function prevalidateNumber(type, number) {
    const cleaned = number.replace(/\s+/g, '');

    if (type === 'ADSL') {
      // Algerian landline: 0XX XXXXXXX
      const adslPattern = /^0[2-9]\d{7,8}$/;
      if (!adslPattern.test(cleaned)) {
        return {
          valid: false,
          error: 'ADSL numbers must be Algerian landline numbers (e.g., 036362608)'
        };
      }
    } else if (type === '4G') {
      // Algerian mobile: 06X or 07X followed by 8 digits
      const mobilePattern = /^0[67]\d{8}$/;
      if (!mobilePattern.test(cleaned)) {
        return {
          valid: false,
          error: '4G numbers must be Algerian mobile numbers (e.g., 0661234567)'
        };
      }
    }

    return { valid: true, cleaned };
  }
  ```

  ## التحقق الكامل من الإدخال

  <CodeGroup>
    ```javascript Node.js theme={null}
    async function validateCompleteFlow(type, number) {
      // Step 1: Validate service type
      if (!['ADSL', '4G'].includes(type)) {
        return {
          valid: false,
          error: 'INVALID_TYPE',
          message: 'Service type must be ADSL or 4G'
        };
      }

      // Step 2: Client-side format check
      if (!validateFormat(type, number)) {
        return {
          valid: false,
          error: 'INVALID_FORMAT',
          message: type === 'ADSL' 
            ? 'ADSL numbers must be 9 digits starting with 0 (e.g., 036362608)'
            : '4G numbers must be 12 digits starting with 213 (e.g., 213665983439)'
        };
      }

      // Step 3: API validation
      try {
        await validateInternetNumber(type, number);
        return { valid: true, type, number };
      } catch (error) {
        return {
          valid: false,
          error: 'API_VALIDATION_FAILED',
          message: error.message
        };
      }
    }

    // Usage
    const result = await validateCompleteFlow('ADSL', '036362608');

    if (!result.valid) {
      console.error(`Validation failed: ${result.message}`);
    } else {
      console.log('✅ Ready to place order');
    }
    ```

    ```python Python theme={null}
    async def validate_complete_flow(service_type, number):
        # Step 1: Validate service type
        if service_type not in ['ADSL', '4G']:
            return {
                'valid': False,
                'error': 'INVALID_TYPE',
                'message': 'Service type must be ADSL or 4G'
            }
        
        # Step 2: Client-side format check
        if not validate_format(service_type, number):
            message = (
                'ADSL numbers must be 9 digits starting with 0'
                if service_type == 'ADSL'
                else '4G numbers must be 12 digits starting with 213'
            )
            return {'valid': False, 'error': 'INVALID_FORMAT', 'message': message}
        
        # Step 3: API validation
        try:
            validate_internet_number(service_type, number)
            return {'valid': True, 'type': service_type, 'number': number}
        except Exception as e:
            return {'valid': False, 'error': 'API_VALIDATION_FAILED', 'message': str(e)}

    # Usage
    result = await validate_complete_flow('ADSL', '036362608')

    if not result['valid']:
        print(f"Validation failed: {result['message']}")
    else:
        print('✅ Ready to place order')
    ```

    ```php PHP theme={null}
    <?php

    function validateCompleteFlow($type, $number) {
        // Step 1: Validate service type
        if (!in_array($type, ['ADSL', '4G'])) {
            return ['valid' => false, 'error' => 'INVALID_TYPE',
                    'message' => 'Service type must be ADSL or 4G'];
        }
        
        // Step 2: Client-side format check
        if (!validateFormat($type, $number)) {
            $message = $type === 'ADSL'
                ? 'ADSL numbers must be 9 digits starting with 0'
                : '4G numbers must be 12 digits starting with 213';
            return ['valid' => false, 'error' => 'INVALID_FORMAT', 'message' => $message];
        }
        
        // Step 3: API validation
        try {
            validateInternetNumber($type, $number);
            return ['valid' => true, 'type' => $type, 'number' => $number];
        } catch (Exception $e) {
            return ['valid' => false, 'error' => 'API_VALIDATION_FAILED',
                    'message' => $e->getMessage()];
        }
    }

    // Usage
    $result = validateCompleteFlow('ADSL', '036362608');

    if (!$result['valid']) {
        echo "Validation failed: {$result['message']}\n";
    } else {
        echo "✅ Ready to place order\n";
    }
    ?>
    ```
  </CodeGroup>

  ## تخزين نتائج التحقق مؤقتاً

  ```javascript theme={null}
  class ValidationCache {
    constructor(ttlMs = 5 * 60 * 1000) { // 5 minutes
      this.cache = new Map();
      this.ttlMs = ttlMs;
    }

    getKey(type, number) {
      return `${type}:${number}`;
    }

    get(type, number) {
      const key = this.getKey(type, number);
      const entry = this.cache.get(key);

      if (!entry) return null;
      if (Date.now() - entry.timestamp > this.ttlMs) {
        this.cache.delete(key);
        return null;
      }

      return entry.result;
    }

    set(type, number, result) {
      const key = this.getKey(type, number);
      this.cache.set(key, { result, timestamp: Date.now() });
    }
  }

  const validationCache = new ValidationCache();

  async function validateWithCache(type, number) {
    const cached = validationCache.get(type, number);
    if (cached) return cached;

    const result = await validateInternetNumber(type, number);
    validationCache.set(type, number, result);
    return result;
  }
  ```

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

  <CardGroup cols={2}>
    <Card title="التحقق المبكر" icon="bolt">
      تحقق من التنسيق من جهة العميل قبل استدعاء API
    </Card>

    <Card title="رسائل واضحة" icon="message">
      قدّم رسائل خطأ محددة ومفيدة
    </Card>

    <Card title="التخزين المؤقت للنتائج" icon="database">
      خزّن الأرقام الصحيحة مؤقتاً لمدة 5 دقائق
    </Card>

    <Card title="ملاحظات مرئية" icon="eye">
      أظهر حالة التحقق في الوقت الفعلي أثناء الكتابة
    </Card>
  </CardGroup>

  ## رسائل خطأ واضحة للمستخدم

  قدّم ملاحظات واضحة بناءً على نوع الخطأ:

  ```javascript theme={null}
  function getValidationErrorMessage(type, error) {
    const messages = {
      INVALID_TYPE: 'Please select either ADSL or 4G service type.',
      
      INVALID_FORMAT: {
        ADSL: 'Please enter a valid ADSL number (9 digits starting with 0).\nExample: 036362608',
        '4G': 'Please enter a valid 4G number (12 digits starting with 213).\nExample: 213665983439'
      },
      
      API_VALIDATION_FAILED: {
        default: 'This number is not valid for the selected service type.',
        'ERR_PHONE': 'This number cannot be used for internet recharge.'
      }
    };
    
    if (error === 'INVALID_FORMAT') {
      return messages.INVALID_FORMAT[type];
    }
    
    if (error === 'API_VALIDATION_FAILED') {
      return messages.API_VALIDATION_FAILED.default;
    }
    
    return messages[error] || 'Unable to validate number. Please try again.';
  }
  ```

  ## اختبار التحقق

  ```javascript theme={null}
  async function testValidation() {
    const testCases = [
      // ADSL tests
      { type: 'ADSL', number: '036362608', expected: true },
      { type: 'ADSL', number: '031417237', expected: true },
      { type: 'ADSL', number: '36362608', expected: false },  // Missing 0
      { type: 'ADSL', number: '0363626081', expected: false }, // Too long
      
      // 4G tests
      { type: '4G', number: '213665983439', expected: true },
      { type: '4G', number: '213472731602', expected: true },
      { type: '4G', number: '0665983439', expected: false },   // Wrong format
      { type: '4G', number: '+213665983439', expected: false }, // Has +
    ];

    console.log('🧪 Testing validation...\n');

    for (const test of testCases) {
      const result = await validateCompleteFlow(test.type, test.number);
      const passed = result.valid === test.expected;
      
      console.log(
        `${passed ? '✅' : '❌'} ${test.type} ${test.number}: ${result.valid ? 'VALID' : 'INVALID'}`
      );
      
      if (!passed) {
        console.log(`  Expected: ${test.expected}, Got: ${result.valid}`);
      }
    }
  }
  ```

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

  <CardGroup cols={3}>
    <Card title="إرسال الشحنات" icon="satellite-dish" href="/ar/internet-topup-guides/3-sending-topups">
      تقديم طلبات الشحن المُتحقق منها
    </Card>

    <Card title="تحميل المنتجات" icon="list" href="/ar/internet-topup-guides/1-loading-products">
      جلب البطاقات المتاحة
    </Card>

    <Card title="مرجع API" icon="book" href="/ar/api-reference/internet/validate-number">
      التوثيق الكامل للـ endpoint
    </Card>

    <Card title="نظرة عامة" icon="book-open" href="/ar/internet-topup-guides/overview">
      العودة إلى نظرة عامة على التكامل
    </Card>

    <Card title="تتبع الحالة" icon="chart-line" href="/ar/internet-topup-guides/4-status-tracking">
      متابعة تنفيذ الطلبات
    </Card>

    <Card title="تسليم البطاقات" icon="file-code" href="/ar/internet-topup-guides/5-card-delivery">
      تسليم رموز البطاقات بأمان
    </Card>
  </CardGroup>
</div>
