← Blog
Developer playbook · 16 دقيقة للقراءة · Published أبريل 2026 · Author Serhat Dogan

مركز هجرة SMS-Activate 2026: قائمة التحقق للمطور، تعيين API ومقارنة استرداد

مركز هجرة SMS-Activate 2026: قائمة التحقق للمطور، تعيين API ومقارنة استرداد

If you are still carrying handler_api.php calls in your repo pointed at sms-activate.org, this is the hub you open at 9pm on a Friday and close with a working integration before midnight. Real endpoint mapping, real code diffs, refund policy comparison, and the gotchas that will bite you between the line you change and the alert that wakes you up on Monday morning.

لماذا توجد هذه الدليل الإرشادي

معظم منشورات "SMS-Activate مات، إليك قائمة بالبدائل" تفوّت الجزء الذي يستهلك بالفعل ساعات المطورين: الكود. التسجيل لدى مزود جديد يستغرق خمس دقائق. إعادة كتابة تكامل كان يعمل بصمت في الإنتاج لسنوات، مع حالات زاوية غير مختبرة ومتعقب تكلفة مرفق به، يستغرق وقتًا أطول مما تعتقد.

بعد أن أطلقنا طبقة التوافق الخاصة بنا في يناير 2026، بدأنا نتلقى نفس الأسئلة الثلاثة من كل فريق جربها:

  1. ما هي نقاط النهاية التي تتطابق بشكل نظيف وما هي التي تحتاج إلى تعديلات يدوية؟
  2. كيف يمكنني الحفاظ على تتبع التكاليف وتدفق استرداد الأموال الخاص بي دون إعادة كتابة؟
  3. ما الذي يتعطل بصمت ويظهر بعد أسبوع كمفاجأة في الفواتير؟

هذا الدليل الإرشادي يجيب على هذه الأسئلة الثلاثة بالترتيب ويقدم لك كودًا جاهزًا للنسخ واللصق يمكنك تدقيقه قبل تشغيله.

ملخص 48 ساعة: ما حدث بالفعل

أُغلقت SMS-Activate في 29 ديسمبر 2025. لم يكن هناك لافتة صيانة مجدولة، ولا أداة ترحيل، ولا إشعار عام. المستخدمون الذين حاولوا تسجيل الدخول واجهوا صفحة واحدة تقول إن الخدمة أُغلقت بشكل دائم. أعادت واجهة برمجة التطبيقات إعادة تعيين الاتصال على كل نقطة نهاية في غضون ساعات قليلة.

حدثت ثلاثة أشياء بسرعة:

لا تزال التداعيات تتكشف. اعتبارًا من أبريل 2026، هناك قضايا دعاوى قضائية صغيرة نشطة في روسيا واثنتان على الأقل من الدعاوى القضائية المجتمعية المنسقة التي تحاول استرداد الأرصدة المجمدة. لا شيء من ذلك يساعد الكود الخاص بك، ولهذا السبب سنركز على الجزء الذي يمكنك إصلاحه بالفعل.

الجزء 1: خريطة إيقاف واجهة برمجة التطبيقات

قدمت SMS-Activate نقطة نهاية عامة واحدة في https://sms-activate.org/stubs/handler_api.php. كان كل إجراء عبارة عن معلمة سلسلة استعلام على هذا العنوان. يربط الجدول أدناه كل إجراء رئيسي بما يعادله في VerifySMS. تقبل طبقة التوافق في https://api.verifysms.app/compat/handler_api.php نفس شكل سلسلة الاستعلام بالضبط.

إجراء SMS-Activateالغرضطبقة توافق VerifySMSواجهة برمجة تطبيقات VerifySMS الأصلية
getBalanceإرجاع رصيد USD كنصتعمل دون تغيير. تُرجع ACCESS_BALANCE:X.YYGET /v1/balance تُرجع JSON
getNumbersStatusالتوفر حسب البلدتعمل. تُرجع تنسيق الخريطة القديمGET /v1/countries/availability
getNumberاستئجار رقم لخدمةتعمل. تُرجع ACCESS_NUMBER:id:+phonePOST /v1/rentals
setStatusتأكيد أو إلغاء عقد إيجارتعمل. رموز الحالة 1/3/6/8 تتصرف بشكل متطابقPOST /v1/rentals/{id}/status
getStatusالاستقصاء عن وصول الرسائل القصيرةتعمل. تُرجع STATUS_WAIT_CODE، STATUS_OK:CODE، STATUS_WAIT_RETRYGET /v1/rentals/{id}
getPricesجلب جدول الأسعارتعمل. تُرجع تسعير VerifySMS بتنسيق JSON القديمGET /v1/prices
getCountriesخريطة رموز البلدانتعمل. تُرجع معرفات رقمية قديمة ورموز ISO-3166GET /v1/countries
getTopCountriesByServiceأعلى البلدان حسب الخدمةتُرجع بيانات VerifySMS في الوقت الفعلي بدلاً من ترتيبات SMS-Activate المخزنة مؤقتًاGET /v1/services/{id}/top-countries

هناك عدد قليل من إجراءات SMS-Activate الأقل استخدامًا لا تتطابق بشكل مباشر. getRentServicesAndCountries وواجهة برمجة التطبيقات لتأجير طويل الأجل كانت خاصة بـ SMS-Activate وليس لها طبقة توافق. إذا كان تكاملك يستخدم هذه، فيجب عليك الانتقال إلى نقطة النهاية الأصلية لتأجير طويل الأجل في VerifySMS على POST /v1/rentals/long، والتي تم توثيقها بشكل منفصل.

الجزء 2: جولات ترحيل الكود

المقتطفات التالية هي الشكل الدقيق الذي اختبرته مقابل بيئة الاختبار الخاصة بنا في يناير. لقد أبقيتها مملة عمدًا حتى تتمكن من قراءتها مقابل الكود الخاص بك دون تبديل السياق.

Python (requests)

التغيير الوحيد المطلوب هو عنوان URL الأساسي. إذا كنت قد قمت بالفعل بتغليف واجهة برمجة التطبيقات في وحدة عميل صغيرة، فإن الفرق هو سطر واحد.

import os
import requests

# BEFORE
# BASE_URL = "https://sms-activate.org/stubs/handler_api.php"
# AFTER
BASE_URL = "https://api.verifysms.app/compat/handler_api.php"
API_KEY = os.environ["SMS_API_KEY"]

def get_number(service: str, country: int) -> tuple[str, str]:
    resp = requests.get(BASE_URL, params={
        "api_key": API_KEY,
        "action": "getNumber",
        "service": service,
        "country": country,
    }, timeout=30)
    resp.raise_for_status()
    # ACCESS_NUMBER:12345:+441234567890
    status, rental_id, phone = resp.text.split(":", 2)
    if status != "ACCESS_NUMBER":
        raise RuntimeError(f"unexpected response: {resp.text}")
    return rental_id, phone

def wait_for_code(rental_id: str, deadline_seconds: int = 180) -> str:
    import time
    start = time.monotonic()
    while time.monotonic() - start < deadline_seconds:
        resp = requests.get(BASE_URL, params={
            "api_key": API_KEY,
            "action": "getStatus",
            "id": rental_id,
        }, timeout=15).text
        if resp.startswith("STATUS_OK:"):
            return resp.split(":", 1)[1]
        time.sleep(4)
    # Mark as unused so we get the refund
    requests.get(BASE_URL, params={
        "api_key": API_KEY,
        "action": "setStatus",
        "status": 8,
        "id": rental_id,
    }, timeout=15)
    raise TimeoutError(f"no code after {deadline_seconds}s")

Node.js (axios)

import axios from "axios";

// BEFORE
// const BASE_URL = "https://sms-activate.org/stubs/handler_api.php";
// AFTER
const BASE_URL = "https://api.verifysms.app/compat/handler_api.php";
const API_KEY = process.env.SMS_API_KEY;

export async function getNumber(service, country) {
  const { data } = await axios.get(BASE_URL, {
    params: { api_key: API_KEY, action: "getNumber", service, country },
    timeout: 30_000,
  });
  const [status, rentalId, phone] = data.split(":");
  if (status !== "ACCESS_NUMBER") {
    throw new Error(`unexpected response: ${data}`);
  }
  return { rentalId, phone };
}

export async function waitForCode(rentalId, deadlineMs = 180_000) {
  const start = Date.now();
  while (Date.now() - start < deadlineMs) {
    const { data } = await axios.get(BASE_URL, {
      params: { api_key: API_KEY, action: "getStatus", id: rentalId },
      timeout: 15_000,
    });
    if (data.startsWith("STATUS_OK:")) return data.split(":")[1];
    await new Promise((r) => setTimeout(r, 4000));
  }
  await axios.get(BASE_URL, {
    params: { api_key: API_KEY, action: "setStatus", status: 8, id: rentalId },
    timeout: 15_000,
  });
  throw new Error(`no code after ${deadlineMs}ms`);
}

PHP (curl)

<?php
// BEFORE
// const BASE_URL = "https://sms-activate.org/stubs/handler_api.php";
// AFTER
const BASE_URL = "https://api.verifysms.app/compat/handler_api.php";

function sms_call(array $params): string {
    $params["api_key"] = getenv("SMS_API_KEY");
    $url = BASE_URL . "?" . http_build_query($params);
    $ch  = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    $body = curl_exec($ch);
    curl_close($ch);
    return $body;
}

function get_number(string $service, int $country): array {
    $resp = sms_call(["action" => "getNumber", "service" => $service, "country" => $country]);
    [$status, $id, $phone] = explode(":", $resp, 3);
    if ($status !== "ACCESS_NUMBER") {
        throw new RuntimeException("unexpected: $resp");
    }
    return ["id" => $id, "phone" => $phone];
}

Go (net/http)

package sms

import (
    "errors"
    "fmt"
    "io"
    "net/http"
    "net/url"
    "os"
    "strings"
    "time"
)

// BEFORE
// const baseURL = "https://sms-activate.org/stubs/handler_api.php"
// AFTER
const baseURL = "https://api.verifysms.app/compat/handler_api.php"

func call(params url.Values) (string, error) {
    params.Set("api_key", os.Getenv("SMS_API_KEY"))
    req, _ := http.NewRequest("GET", baseURL+"?"+params.Encode(), nil)
    client := &http.Client{Timeout: 30 * time.Second}
    resp, err := client.Do(req)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    return string(body), nil
}

func GetNumber(service string, country int) (id, phone string, err error) {
    body, err := call(url.Values{
        "action":  {"getNumber"},
        "service": {service},
        "country": {fmt.Sprint(country)},
    })
    if err != nil {
        return "", "", err
    }
    parts := strings.SplitN(body, ":", 3)
    if len(parts) != 3 || parts[0] != "ACCESS_NUMBER" {
        return "", "", errors.New("unexpected: " + body)
    }
    return parts[1], parts[2], nil
}

مثال Go مكتوب عمدًا بدون أي عميل طرف ثالث حتى تتمكن من إدراجه في خدمة بسيطة دون إضافة تبعيات. نفس النمط ينطبق في كل لغة أخرى: قم بتبديل عنوان URL، احتفظ بالباقي، ودع معالجة الأخطاء الحالية الخاصة بك تنتقل.

الجزء 3: مشاكل قد تسبب لك المتاعب

هذه هي الأماكن التي تكون فيها طبقة التوافق وفية لغرائب SMS-Activate ولكن الغرائب نفسها ستفاجئك إذا لم تلمس هذا الكود منذ فترة.

معرفات البلدان ليست رموز ISO

قامت SMS-Activate بترقيم البلدان بترتيبها الخاص: روسيا كانت 0، الولايات المتحدة الأمريكية كانت 187، إندونيسيا كانت 6، وهكذا. إذا كانت تكاملاتك تحتوي على هذه الأرقام السحرية المضمنة، فإنها لا تزال تعمل على طبقة التوافق. إذا كنت تكتب كودًا جديدًا، ففضل تنسيق ISO-3166 alpha-2 (RU، US، ID) الذي تقبله طبقة التوافق أيضًا. لا تخلط بين الأسلوبين في نفس موقع الاستدعاء، لأن تصحيح الأخطاء المستقبلي سيكون مؤلمًا.

رمز الحالة 3 مقابل 6

كان رمز الإجراء 3 في setStatus يعني "طلب رسالة SMS أخرى" في عالم SMS-Activate، وكان الرمز 6 يعني "قبول الرمز كصالح". هذان الرمزان يسهل تبديلهما على عجل ولهما نتائج فوترة معاكسة: 3 يبقيك مدينًا، 6 يؤكد التحقق الناجح. طبقة التوافق تتصرف بنفس الطريقة. ابحث في الكود الخاص بك عن setStatus وتأكد من أن الفرع الذي يأخذ الرمز 6 يعمل فقط بعد أن تتأكد من نجاح التحقق.

مهلات وقواطع الدوائر

أعادت SMS-Activate تحت الحمل أحيانًا استجابة 200 بجسم فارغ بدلاً من خطأ HTTP. العملاء الدفاعيون يغلفون الاستدعاء بمهلة ويعاملون الجسم الفارغ كإشارة إعادة محاولة. VerifySMS لا تُرجع جسمًا فارغًا أبدًا على طبقة التوافق. إذا كان عميلك لا يزال يعامل الجسم الفارغ كإعادة محاولة، فسيؤدي ذلك إلى استهلاك الميزانية بسبب شبكة غير مستقرة لأن إعادة المحاولة ستصطدم بمعرف تأجير مختلف. النمط الأكثر أمانًا هو التحقق من بادئات الاستجابة المعروفة (ACCESS_، STATUS_، BAD_) ومعاملة أي شيء آخر كفشل تام، وليس فشل عابر.

حدود المعدل تنتقل من لكل مفتاح إلى لكل IP

كانت حدود معدل SMS-Activate مرتبطة بمفتاح واجهة برمجة التطبيقات. حدود معدل VerifySMS مرتبطة بمزيج من مفتاح واجهة برمجة التطبيقات وعنوان IP المصدر، لأننا نرى الكثير من الإساءة من نصوص برمجية للكشط تشارك مفتاحًا واحدًا عبر شبكة روبوتات. بالنسبة لحركة المرور العادية في الإنتاج من خادم واحد أو مجموعة موازنة تحميل، يكون هذا غير مرئي. إذا كنت تشغل وظائف CI موزعة تشترك جميعها في مفتاح اختبار واحد، فقد ترى 429 في المرة الأولى التي تسخن فيها الأسطول معًا. الحل هو السماح للاختبار التجريبي بالعمل من عقدة واحدة ليوم واحد قبل التوسع.

توقيت استرداد الأموال يبدو فوريًا لأنه في الواقع فوري

هذه ليست فخًا بقدر ما هي مفاجأة سارة. بينما استغرقت استردادات SMS-Activate بضع ساعات لتظهر في رصيدك، تظهر استردادات VerifySMS في غضون 60 ثانية. إذا كان متعقب التكاليف الخاص بك يقرأ الرصيد بجدول زمني، فسيسجل استرداد الأموال كائتمان لم يكن النظام القديم سيكتشفه. غالبًا ما تشير لوحات معلومات التسوية إلى هذا كشذوذ في اليوم الأول.

الجزء 4: مقارنة الأسعار الواقعية

قبل الإغلاق، كانت SMS-Activate هي الحد الأدنى للسوق. كانت الأرقام الروسية تكلف 0.03 دولار إلى 0.05 دولار لكل عملية تحقق، والمشترون بكميات كبيرة دفعوا أقل من ذلك. هذا الحد الأدنى قد اختفى. هذا هو المكان الذي يتواجد فيه المزودون المتبقون في أبريل 2026 للخدمات الأكثر شيوعًا، مأخوذة من صفحة التسعير العامة لكل مزود في :

الخدمة5simTextVerifiedSMSPVASMS-MANVerifySMS
WhatsApp / Russia$0.014$0.05$0.035$0.10
WhatsApp / USA$0.27$0.25$0.28$0.22$0.18
Telegram / Russia$0.016$0.05$0.04$0.10
Telegram / USA$0.35$0.40$0.38$0.30$0.20
Google / Indonesia$0.07$0.08$0.06$0.10

النمط بسيط: تفوز 5sim و SMS-MAN بأسعار روسية منخفضة للغاية، TextVerified هي الفئة المميزة للولايات المتحدة، و VerifySMS تقع في المنتصف مع حد أدنى ثابت قدره 0.10 دولار لكل شيء باستثناء أرقام الولايات المتحدة غير VoIP الأكثر تكلفة. إذا كانت ميزانيتك مضبوطة على أسعار SMS-Activate الدنيا، فتوقع دفع ضعف إلى خمسة أضعاف لكل عملية تحقق بغض النظر عن البديل الذي تختاره.

ملاحظتان على هذا الجدول. أولاً، كل مزود (بما في ذلك VerifySMS) يرفع ويخفض أسعار البلدان الفردية استجابة لتكاليف شركات الاتصالات، لذا قم بتأكيد السعر الحالي في لوحة التحكم الخاصة بك قبل تخصيص ميزانية. ثانيًا، يعتمد السعر *الفعلي* لكل عملية تحقق ناجحة على نسبة استرداد الأموال. مزود بسعر 0.08 دولار ومعدل نجاح 70٪ يكلفك أكثر لكل نجاح من مزود بسعر 0.10 دولار مع استرداد تلقائي ومعدل نجاح 90٪.

الجزء 5: قائمة التحقق من الترحيل المكونة من 10 خطوات

هذا هو التسلسل الفعلي الذي مررنا به مستخدمينا في يناير. يفترض مطورًا واحدًا لديه وصول إلى المستودع، وخدمة إنتاج واحدة، وبيئة اختبار. قم بتوسيع نسب الاختبار التجريبي إذا كنت تشغل خدمات متعددة أو مستودعًا واحدًا.

  1. جرد كل موقع استدعاء. قم بتشغيل git grep -n 'sms-activate\.org\|handler_api\.php\|getNumber\|setStatus' وسرد كل ملف يصل إلى واجهة برمجة التطبيقات القديمة. إذا وجدت أكثر من اثني عشر، فاختر وحدة تغليف وقم بمركزة الاستدعاءات أولاً قبل الترحيل.
  2. احصل على مفتاح API لـ VerifySMS. قم بالتسجيل، وأضف مبلغًا صغيرًا من الرصيد، وقم بإنشاء مفتاح مقيد للاختبار. احتفظ بمفتاح الإنتاج خارج المستودع.
  3. غيّر عنوان URL الأساسي. استبدل مضيف SMS-Activate بـ api.verifysms.app/compat/handler_api.php. لا تغير سلسلة الاستعلام. قم بتثبيت هذا بمفرده حتى يكون الفرق نظيفًا.
  4. قم بتشغيل اختباراتك الحالية. إذا كانت الاختبارات تصل إلى واجهة برمجة التطبيقات الحقيقية، فقم بتوجيهها إلى بيئة الاختبار وراقب عدم تطابق الأشكال. إذا كانت تحاكي واجهة برمجة التطبيقات، فقم بتشغيلها مقابل نقطة النهاية الحية للاختبار أيضًا حتى تلتقط انحراف العقد.
  5. أعد تأكيد معرفات البلدان. قم بتصفح الكود الخاص بك بحثًا عن ثوابت البلدان. إذا كنت تستخدم معرفات الأرقام القديمة، فإنها لا تزال تعمل. إذا كانت لديك الفرصة، فاستبدلها برموز ISO-3166 لأن المطور التالي الذي يلمس هذا الملف سيشكرك.
  6. قم بتوصيل مطالبات استرداد الأموال. تأكد من أن مسار المهلة الخاص بك يستدعي setStatus بالرمز 8. بدون هذا، ستظل تحصل على استردادات (نقوم تلقائيًا باسترداد الإيجارات المنتهية) ولكن متعقب التكاليف الخاص بك سيتأخر عن الواقع.
  7. قم بتحديث متعقب التكاليف الخاص بك. اقرأ التكلفة من رأس الاستجابة X-VerifySMS-Cost بدلاً من تحليلها من جدول الأسعار. هذا التغيير الوحيد يجعل لوحة معلومات الشؤون المالية الخاصة بك دقيقة إلى السنت.
  8. المراقبة. أضف تنبيهات لمعدل النجاح، وزمن الاستجابة p95، ونسبة استرداد الأموال مقابل خط الأساس الحالي الخاص بك. اختر عتبات يمكنك الدفاع عنها، وليس تلك التي تعتقد أنها ستكون "جيدة بما فيه الكفاية".
  9. اختبر 5 بالمائة لمدة 24 ساعة. قم بتوجيه شريحة صغيرة من حركة مرور الإنتاج عبر نقطة النهاية الجديدة. راقب لوحة التحكم، وليس فقط التنبيهات.
  10. قم بتغيير الباقي. بمجرد أن تكون نافذة الاختبار التجريبي نظيفة، قم بنقل الـ 95 بالمائة المتبقية واترك كود العميل القديم معلقًا (وليس محذوفًا) لدورة إصدار واحدة حتى يكون لديك تراجع سريع.

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

أسئلة متكررة

هل طبقة توافق SMS-Activate واجهة برمجة تطبيقات حقيقية أم مجرد واجهة وهمية؟

إنها نقطة نهاية حقيقية في api.verifysms.app/compat/handler_api.php تقبل كل إجراء رئيسي من مستندات SMS-Activate العامة: getBalance، getNumber، getStatus، setStatus، getPrices، و getCountries. يتم توجيه الطلبات إلى واجهة برمجة التطبيقات الأصلية الخاصة بنا في الخلفية، لذا تحصل على تسعير VerifySMS وتغطيتها وسلوك استرداد الأموال دون أي تغييرات في الكود من جانبك.

هل سيعمل مفتاح واجهة برمجة التطبيقات القديم الخاص بي؟

لا. توقفت مفاتيح واجهة برمجة تطبيقات SMS-Activate عن المصادقة في اليوم الذي توقفت فيه الخدمة. تحتاج إلى مفتاح جديد من VerifySMS. قم بالتسجيل، وأضف مبلغًا صغيرًا من الرصيد، وقم بإنشاء مفتاح من لوحة التحكم. تنسيق المفتاح متطابق في الطول حتى تتمكن من لصقه في نفس متغير البيئة.

كيف تعمل استردادات الأموال مقارنة بـ SMS-Activate؟

تطلب SMS-Activate منك استدعاء setStatus بالرمز 8 في غضون 20 دقيقة لوضع علامة على رقم على أنه غير مستخدم، وتمت معالجة استردادات الأموال يدويًا في غضون ساعات قليلة. تقبل VerifySMS نفس استدعاء setStatus وتعيد المبلغ بالكامل إلى رصيدك في غضون 60 ثانية. إذا نسيت استدعاء setStatus تمامًا، فإن نظامنا لا يزال يعيد تلقائيًا أي رقم لم يتلق أبدًا رسالة SMS بعد انتهاء نافذة التأجير.

ما هي البلدان المدعومة؟

تغطي VerifySMS أكثر من 200 دولة. كل دولة قدمتها SMS-Activate متاحة على VerifySMS، بما في ذلك روسيا وإندونيسيا وفيتنام ونيجيريا والولايات المتحدة. يمكنك الاحتفاظ بتعيين معرف البلد الحالي الخاص بك أو الترحيل إلى رموز ISO-3166 alpha-2 في أي وقت تريد.

هل التسعير هو نفسه؟

لا. أسعار SMS-Activate الدنيا البالغة 0.03 دولار إلى 0.05 دولار لكل عملية تحقق للأرقام الروسية قد اختفت من السوق المفتوحة. تتراوح أسعار السوق الحالية من 0.10 دولار للخدمات الشائعة إلى 0.25 دولار لأرقام الولايات المتحدة غير VoIP على المنصات الأكثر صرامة. تتقاضى VerifySMS 0.10 دولار كحد أدنى وتنشر أسعارًا لكل بلد على لوحة التحكم.

هل أحتاج إلى تغيير منطق الاستقصاء الخاص بي؟

لا. يستدعي استدعاء getStatus STATUS_WAIT_CODE و STATUS_OK بنفس التنسيق الذي استخدمته SMS-Activate. لا تزال فترات الاستقصاء من 3 إلى 5 ثوانٍ تعمل. السلوك الجديد الوحيد هو أن VerifySMS تعرض أيضًا عنوان URL لخطاف الويب في لوحة التحكم، لذا يمكنك إيقاف الاستقصاء تمامًا إذا كنت تفضل تدفقًا يعتمد على الأحداث.

ماذا يحدث إذا تم إيقاف طبقة التوافق في أي وقت؟

تعتبر طبقة التوافق واجهة عامة دائمة. إذا قمنا بتغيير سلوكها في أي وقت، فسننشر فترة إيقاف تشغيل مدتها ستة أشهر على الأقل مع ملاحظة ترحيل كاملة. واجهة برمجة التطبيقات الأصلية لـ VerifySMS بتنسيق JSON موثقة أيضًا، لذا يمكنك الانتقال من طبقة التوافق بالسرعة التي تناسبك عندما يصبح ذلك منطقيًا.

كيف يمكنني الاختبار دون إنفاق المال؟

تكشف لوحة تحكم VerifySMS عن وضع صندوق رمل يُرجع أرقام هواتف محاكاة ورموز SMS مُعدة مسبقًا دون خصم رصيدك. قم بتبديل علامة صندوق الرمل في لوحة التحكم أو أرسل رأس X-Sandbox-Mode مع أي طلب لتشغيل مسارات الكود الخاصة بك قبل الانتقال إلى الإنتاج.

هل يمكنني الترحيل من خدمات أخرى أيضًا؟

نعم. تمت كتابة هذا الدليل الإرشادي حول واجهة برمجة تطبيقات SMS-Activate لأن هذا هو المكان الذي يوجد فيه معظم الكود المعلق، ولكن نفس قائمة التحقق تنطبق على عمليات الترحيل من 5sim أو SMS-MAN أو أي خدمة أخرى متوافقة مع handler_api. تتعرف طبقة التوافق على معلمات handler_api.php بغض النظر عن الخدمة التي كنت تتصل بها سابقًا.

كم من الوقت يستغرق الترحيل الحقيقي؟

لتكامل خدمة واحدة مع بضع عشرات من مواقع الاستدعاء، خطط لساعتين إلى أربع ساعات من العمل المركز، بالإضافة إلى نافذة اختبار تجريبي مدتها 24 ساعة قبل أن تقوم بتغيير حركة المرور بالكامل. قد تستغرق عمليات الترحيل الأكبر متعددة الخدمات مع معالجة الأخطاء المخصصة والتحليلات وإعادة المحاولات وقتًا أطول ولكنها عادةً ما تنتهي في يوم عمل واحد.

هل أفقد بياناتي التاريخية؟

ذهب سجل التحقق من SMS-Activate دون اتصال بالإنترنت عندما توقفت الخدمة وهو غير قابل للاسترداد. تحتفظ VerifySMS بسجل تدقيق كامل لكل محاولة تحقق على حسابك لمدة 12 شهرًا، ويمكن الوصول إليه من لوحة التحكم وعبر الامتداد /compat/handler_api.php?action=getHistory.

هل يؤثر هذا على وضع الامتثال أو اللائحة العامة لحماية البيانات (GDPR) الخاص بي؟

VerifySMS مسجلة في المملكة المتحدة وتتبع اللائحة العامة لحماية البيانات في المملكة المتحدة. ننشر سياسة الاحتفاظ بالبيانات الخاصة بنا، والمعالجات الفرعية، واتفاقية حماية البيانات (DPA) على صفحة الخصوصية. إذا كان إعدادك السابق يتطلب اتفاقية حماية بيانات مع SMS-Activate، فاتصل بنا وسنقوم بالتوقيع المشترك على نفس الاتفاقية في غضون يوم عمل واحد.

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

إذا قرأت حتى هذه النقطة، فلديك بالفعل القطع التي تحتاجها. ابدأ بخطوة الجرد، واجعل تبديل عنوان URL الأساسي أمام زميل للمراجعة، وقم بتشغيل الاختبار التجريبي طوال الليل. الدليل الإرشادي صغير عن قصد؛ الجزء الصعب هو الانضباط للتوقف بعد نافذة الاختبار التجريبي بدلاً من تغيير كل شيء في التزام واحد.

قراءة ذات صلة على بقية الموقع:

هل أنت مستعد لإنجاز الترحيل في أمسية واحدة؟

إنشاء مفتاح API لـ VerifySMS →

وضع صندوق رمل متضمن · ضمان استرداد تلقائي · 200+ دولة · طبقة توافق SMS-Activate على /compat/handler_api.php

Next steps

If you have read this far, you already have the pieces you need. Start with the inventory step, get the base URL swap in front of a teammate for review, and run the canary overnight. The playbook is small on purpose; the hard part is the discipline to stop after the canary window instead of cutting everything over in one commit.

Related reading on the rest of the site:

Ready to cut the migration to a single evening?

Create a VerifySMS API key →

Sandbox mode included · Auto-refund guarantee · 200+ countries · SMS-Activate compat layer on /compat/handler_api.php