مركز هجرة 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، بدأنا نحصل على نفس الأسئلة الثلاثة من كل فريق حاولها:
- ما هي النقاط التي تترجم بشكل نظيف وأيها تحتاج إلى تغييرات يدوية؟
- كيف يمكنني الحفاظ على تتبع التكلفة وسير العمل الخاص بالاسترداد دون إعادة كتابة؟
- ما الذي ينكسر بصمت ويظهر بعد أسبوع كفاجئة في الفواتير؟
هذه الدورة التدريبية تجيب على تلك الأسئلة الثلاثة بالترتيب وتقدم لك كود نسخ-لصق يمكنك تدقيقه قبل تشغيله.
الملخص لمدة 48 ساعة: ماذا حدث بالفعل
ذهب SMS-Activate في الظلام في 29 ديسمبر 2025. لم يكن هناك بانر صيانة مجدول، ولا أداة هجرة، ولا إشعار عام. المستخدمون الذين حاولوا تسجيل الدخول واجهوا صفحة واحدة تقول أن الخدمة أغلقت بشكل دائم. واجه API إعادة اتصالات على كل نقطة نهاية خلال ساعات قليلة.
حدثت ثلاث أشياء بسرعة:
- أصبحت أرصدة لوحة القيادة غير قابلة للوصول. ذكرت التقارير على subreddit
r/smsوقنوات Telegram الرسمية أرصدة من 20 دولارًا إلى عدة آلاف من الدولارات مجمدة بدون مسار استرداد. - انكسرت التكاملات الجارية بشكل صعب. أي خدمة تقوم بالاستطلاع
handler_api.phpبدأت تتلقى أخطاء اتصال HTTP، والتي في معظم أجهزة تتبع الأخطاء تعني "مفتاح الدائرة، انذر الفريق". - أغلق نافذة الهجرة في أيام وليس أسابيع. في غضون 72 ساعة، كان لكل مزود آخر قائمة انتظار. 5sim، SMSPVA، و SMS-MAN أقر جميعًا بضغط القدرة. استمر VerifySMS لأننا كنا الأصغر في المجموعة ولدينا رأس مال احتياطي، لكنها كانت قريبة حقًا.
الخسائر لا تزال مستمرة. حتى أبريل 2026، هناك حالات نشطة في محاكم صغيرة في روسيا وعدة دعاوى قضائية منسقة من قبل المجتمع لمحاولة استرداد الأرصدة المجمدة. لا شيء من ذلك يساعدك على الكود، ولهذا السبب نحن نركز على الجزء الذي يمكنك فعله بالفعل.
الجزء 1: خريطة إزالة API
شحن SMS-Activate نقطة نهاية عامة واحدة في https://sms-activate.org/stubs/handler_api.php. كانت كل إجراء معلمة سلسلة استعلام على ذلك URL. الجدول أدناه يرسم كل إجراء رئيسي إلى ما يعادله في VerifySMS. طبقة التوافق في https://api.verifysms.app/compat/handler_api.php تقبل نفس شكل سلسلة الاستعلام.
| إجراء SMS-Activate | الغرض | طبقة توافق VerifySMS | API VerifySMS الأصلي |
|---|---|---|---|
getBalance | إرجاع الرصيد USD كنص | يعمل بدون تغيير. يرجع ACCESS_BALANCE:X.YY | GET /v1/balance يرجع JSON |
getNumbersStatus | التوفر حسب البلد | يعمل. يرجع خريطة التنسيق القديمة | GET /v1/countries/availability |
getNumber | استئجار رقم لخدمة | يعمل. يرجع ACCESS_NUMBER:id:+phone | POST /v1/rentals |
setStatus | تأكيد أو إلغاء عقد | يعمل. رموز الحالة 1/3/6/8 تتصرف بشكل متطابق | POST /v1/rentals/{id}/status |
getStatus | الاستطلاع لوصول الرسائل القصيرة | يعمل. يرجع STATUS_WAIT_CODE، STATUS_OK:CODE، STATUS_WAIT_RETRY | GET /v1/rentals/{id} |
getPrices | جلب جدول الأسعار | يعمل. يرجع أسعار VerifySMS في شكل JSON القديم | GET /v1/prices |
getCountries | خريطة رمز البلد | يعمل. يرجع كل من IDs القديمة الرقمية ورموز ISO-3166 | GET /v1/countries |
getTopCountriesByService | أفضل البلدان لكل خدمة | يرجع بيانات VerifySMS في الوقت الفعلي بدلاً من تصنيفات SMS-Activate المخزنة | GET /v1/services/{id}/top-countries |
عدد قليل من إجراءات SMS-Activate الأقل استخدامًا لا تترجم واحدًا لواحد. getRentServicesAndCountries و API الإيجار طويل الأجل كانت خاصة بـ SMS-Activate ولا يوجد لها طبقة توافق. إذا كان تكاملك يستخدم تلك، يجب أن تنتقل إلى نقطة نهاية الإيجار طويل الأجل الأصلية في VerifySMS في POST /v1/rentals/long، والتي توثق بشكل منفصل.
الجزء 2: مشي إعادة كتابة الكود
القطع التالية هي نفس الشكل الذي اختبرته ضد بيئة التطوير الخاصة بنا في يناير. لقد احتفظت بهم بتعمد بسيط حتى يمكنك قراءتهم ضد كودك بدون تبديل السياق.
Python (requests)
التغيير المطلوب الوحيد هو URL الأساسي. إذا كنت قد لففت API بالفعل في وحدة عميل صغيرة، يكون الفرق سطرًا واحدًا.
import os
import requests
# قبل
# BASE_URL = "https://sms-activate.org/stubs/handler_api.php"
# بعد
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"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)
# علامة كغير مستخدم حتى نحصل على الاسترداد
requests.get(BASE_URL, params={
"api_key": API_KEY,
"action": "setStatus",
"status": 8,
"id": rental_id,
}, timeout=15)
raise TimeoutError(f"لا يوجد رمز بعد {deadline_seconds} ثانية")
Node.js (axios)
import axios from "axios";
// قبل
// const BASE_URL = "https://sms-activate.org/stubs/handler_api.php";
// بعد
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(`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(`لا يوجد رمز بعد {deadlineMs}ms`);
}
PHP (curl)
<?php
// قبل
// const BASE_URL = "https://sms-activate.org/stubs/handler_api.php";
// بعد
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("غير متوقع: $resp");
}
return ["id" => $id, "phone" => $phone];
}
Go (net/http)
package sms
import (
"errors"
"fmt"
"io"
"net/http"
"net/url"
"os"
"strings"
"time"
)
// قبل
// const baseURL = "https://sms-activate.org/stubs/handler_api.php"
// بعد
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("غير متوقع: " + 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
كود الإجراء setStatus 3 يعني "طلب رسالة SMS أخرى" في عالم SMS-Activate، والرمز 6 يعني "قبول الرمز كصالح". هذان الرمزان سهلان للتبديل في عجلة من أمره وهما لهما نتائج مختلفة في الفواتير: 3 يحتفظ بك على الفاتورة، 6 يؤكد التحقق الناجح. طبقة التوافق تتصرف بنفس الطريقة. grep كودك لـ setStatus وتأكد من أن الفرع الذي يأخذ الرمز 6 فقط يعمل بعد أن تكون متأكدًا من نجاح التحقق.
المهلات وكسارات الدائرة
تحت الحمل، أحيانًا عاد SMS-Activate 200 مع جسم فارغ بدلاً من خطأ HTTP. العملاء الدفاعيون يلفون المكالم في مهلة ويعاملون الجسم الفارغ كإشارة إعادة المحاولة. VerifySMS لا يرجع جسمًا فارغًا على طبقة التوافق. إذا كان عميلك لا يزال يعامل الفارغ كإعادة المحاولة، فإنه سيحرق الميزانية على شبكة معطوبة لأن إعادة المحاولة ستضرب معرف إيجار مختلف. النمط الآمن هو التحقق من المعرفة المسبقة للاستجابة (ACCESS_، STATUS_، BAD_) ومعاملة أي شيء آخر كفشل صلب، وليس فشلًا عابرًا.
تتحرك حدود المعدل من لكل مفتاح إلى لكل IP
كانت حدود المعدل لـ SMS-Activate مفتاحًا إلى رمز API. حدود المعدل لـ VerifySMS مفتاحًا إلى مجموعة من رمز API وعنوان IP المصدر، لأننا نرى الكثير من الإساءة من نصوص كشط مشتركة بين مفتاح واحد عبر botnet. بالنسبة لحركة الإنتاج العادية من خادم واحد أو مجموعة موازنة الحمل، هذا غير مرئي. إذا كنت تشغل وظائف CI موزعة جميعها تشترك في مفتاح مرحلي واحد، فقد ترى 429 في المرة الأولى التي يبدأ فيها الأسطول بالدفء معًا. الحل هو السماح لـ canary بالعمل من عقدة واحدة لمدة يوم قبل التوسع.
توقيت الاسترداد يشعر بالفورية لأنه كذلك
هذا ليس فخًا بقدر ما هو مفاجأة سارة. بينما كانت استردادات SMS-Activate تستغرق بضع ساعات لظهورها في رصيدك، تظهر استردادات VerifySMS في غضون 60 ثانية. إذا كان متتبع التكلفة الخاص بك يقرأ الرصيد وفقًا لجدول زمني، فسيسجل الاسترداد كائتمان يفتقده النظام القديم. لوحات القيادة الخاصة بمراقبة التناقضات أحيانًا تعلم هذا كشذوذ في اليوم الأول.
الجزء 4: فحص واقعي لمقارنة الأسعار
قبل الإغلاق، كان SMS-Activate هو الحد الأدنى للسوق. تكلفة الأرقام الروسية كانت $0.03 إلى $0.05 لكل تحقق، والمشترين الكبار دفعوا أقل. هذا الحد الأدنى قد ذهب. هنا حيث يجلس مقدمو الخدمات المتبقون في أبريل 2026 للخدمات الأكثر شيوعًا، مأخوذة من صفحة التسعير العامة لكل مزود في :
| الخدمة | 5sim | TextVerified | SMSPVA | SMS-MAN | VerifySMS |
|---|---|---|---|---|---|
| واتساب / روسيا | $0.014 | — | $0.05 | $0.035 | $0.10 |
| واتساب / الولايات المتحدة | $0.27 | $0.25 | $0.28 | $0.22 | $0.18 |
| تلغرام / روسيا | $0.016 | — | $0.05 | $0.04 | $0.10 |
| تلغرام / الولايات المتحدة | $0.35 | $0.40 | $0.38 | $0.30 | $0.20 |
| جوجل / إندونيسيا | $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-خطوة
هذا هو التسلسل الفعلي الذي سار عليه مستخدمونا في يناير. يفترض مطورًا واحدًا مع الوصول إلى المستودع، خدمة إنتاج واحدة، وبيئة اختبار. قم بزيادة نسبة canary إذا كنت تشغل خدمات متعددة أو مستودع متعدد.
- جرد كل موقع مكالمة. قم بتشغيل
git grep -n 'sms-activate\.org\|handler_api\.php\|getNumber\|setStatus'وقم بإدراج كل ملف يضرب API القديم. إذا وجدت أكثر من اثني عشر، اختر وحدة تغطية وقم بتوسيط المكالمات أولاً قبل الهجرة. - احصل على مفتاح API من VerifySMS. قم بالتسجيل، وأضف مبلغًا صغيرًا من الرصيد، وقم بإنشاء مفتاح نطاق لمرحلة الاختبار. احتفظ بمفتاح الإنتاج خارج المستودع.
- تغيير عنوان URL الأساسي. استبدل مضيف SMS-Activate بـ
api.verifysms.app/compat/handler_api.php. لا تغير سلسلة الاستعلام. قم بالتزامن هذا وحده حتى يكون الفرق نظيفًا. - تشغيل الاختبارات الحالية. إذا كانت الاختبارات تضرب API الحقيقي، قم بتوجيهها إلى مرحلة الاختبار ومراقبة عدم تطابق الشكل. إذا كانت الاختبارات تحاكي API، قم بتشغيلها ضد نقطة النهاية الحية لمرحلة الاختبار أيضًا حتى تلتقط انحراف العقد.
- تأكيد معرفات البلد. قم بفحص الكود الخاص بك لثوابت البلد. إذا كنت تستخدم معرفات رقمية قديمة، فهي لا تزال تعمل. إذا كان لديك فرصة، استبدلها برموز ISO-3166 لأن المطور التالي الذي يلمس هذا الملف سيقدر ذلك.
- ربط مطالبات الاسترداد. تأكد من أن مسار المهلة يتصل بـ
setStatusمعstatus=8. بدون هذا، ستظل تحصل على استردادات (نحن نسترد تلقائيًا الإيجارات المنتهية الصلاحية) ولكن سيتم تأخير متتبع التكلفة الخاص بك عن الواقع. - تحديث متتبع التكلفة. قم بقراءة التكلفة من رأس
X-VerifySMS-Costبدلاً من تحليلها من جدول التسعير. هذا التغيير الوحيد يجعل لوحة القيادة المالية دقيقة حتى السنت. - مراقبة. أضف معدل النجاح، زمن الاستجابة 95، ونسبة الاسترداد تنبيهات ضد خط الأساس الحالي. اختر العتبات التي يمكنك الدفاع عنها، وليس تلك التي تعتقد أنها ستكون "جيدة".
- Canary 5 في المائة لمدة 24 ساعة. قم بتوجيه شريحة صغيرة من حركة الإنتاج من خلال نقطة النهاية الجديدة. مراقبة لوحة القيادة، وليس فقط التنبيهات.
- قطع الباقي. بمجرد أن تكون نافذة canary نظيفة، قم بتحريك 95 في المائة المتبقية وترك الكود القديم معلقًا (وليس محذوفًا) لمدة دورة إصدار واحدة حتى يكون لديك نافذة تراجع سريعة.
احذف الكود القديم في الإصدار التالي بعد ذلك. لا تترك مواقع المكالمات الميتة حولها لأكثر من أسبوع لأن الشخص التالي الذي يلمس الوحدة سيعيد لصقها في تكامل جديد عن طريق الخطأ.
الأسئلة الشائعة
هل طبقة توافق SMS-Activate هي API حقيقي أم مجرد نموذج وهمي؟
إنها نقطة نهاية حقيقية في api.verifysms.app/compat/handler_api.php التي تقبل كل إجراء رئيسي من وثائق SMS-Activate العامة: getBalance، getNumber، getStatus، setStatus، getPrices، و getCountries. يتم توجيه الطلبات إلى API الأصلي لدينا تحت الغطاء، لذا تحصل على تسعير VerifySMS، والتغطية، وسلوك الاسترداد بدون تغييرات في الكود من جانبك.
هل سيعمل مفتاح API القديم الخاص بي؟
لا. مفاتيح API لـ 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 webhook في لوحة القيادة، حتى تتمكن من إيقاف الاقتراع تمامًا إذا كنت تفضل تدفقًا قائمًا على الأحداث.
ماذا يحدث إذا تم إهمال طبقة التوافق؟
تعتبر طبقة التوافق واجهة عامة دائمة. إذا قمنا بتغيير سلوكها، سننشر نافذة إهمال دنيا مدتها ستة أشهر مع ملاحظة هجرة كاملة. API VerifySMS JSON الأصلي موثق أيضًا، حتى تتمكن من الهجرة بعيدًا عن طبقة التوافق في أي وقت يبدو مناسبًا.
كيف أختبر بدون إنفاق المال؟
لوحة القيادة VerifySMS تعرض وضع sandbox الذي يعود بأرقام هواتف محاكاة ورموز SMS معلبة بدون خصم رصيدك. قم بتبديل علامة sandbox في لوحة القيادة أو أرسل رأس X-Sandbox-Mode مع أي طلب لممارسة مسارات الكود الخاصة بك قبل الانتقال إلى الحالة الحية.
هل يمكنني الهجرة من خدمات أخرى أيضًا؟
نعم. هذا الدليل مكتوب حول API SMS-Activate لأن هذا هو المكان الذي يوجد فيه معظم الكودات المعطلة، ولكن نفس قائمة التحقق تنطبق على الهجرات من 5sim، SMS-MAN، أو أي خدمة أخرى متوافقة مع handler_api. طبقة التوافق تعترف بمعلمات handler_api.php بغض النظر عن الخدمة التي كنت تتصل بها سابقًا.
كم من الوقت تستغرق الهجرة الحقيقية؟
لدمج خدمة واحدة مع عدة عشرات من مواقع المكالمات، خطط على ساعتين إلى أربع ساعات من العمل المركّز، بالإضافة إلى نافذة canary مدتها 24 ساعة قبل قطع حركة المرور بالكامل. الهجرات الأكبر التي تتضمن خدمات متعددة ومعالجة الأخطاء المخصصة والتحليلات وعمليات إعادة المحاولة يمكن أن تستغرق وقتًا أطول ولكنها عادة ما تنتهي في غضون يوم عمل واحد.
هل أفقد بياناتي التاريخية؟
تاريخ التحقق من SMS-Activate ذهب غير متصل عندما تم إغلاق الخدمة وهو غير قابل للاسترداد. VerifySMS يحتفظ بسجل تدقيق كامل لكل محاولة تحقق على حسابك لمدة 12 شهرًا، ويمكن الوصول إليه من لوحة القيادة ومن خلال امتداد /compat/handler_api.php?action=getHistory.
هل يؤثر هذا على وضعية الامتثال لـ GDPR أو الامتثال؟
VerifySMS مسجل في المملكة المتحدة ويتبع UK GDPR. ننشر سياسة الاحتفاظ بالبيانات، والمعالجات الفرعية، وDPA على صفحة الخصوصية. إذا كان الإعداد السابق الخاص بك يتطلب DPA مع SMS-Activate، اتصل بنا وسنوقع نفس الاتفاقية في غضون يوم عمل واحد.
الخطوات التالية
إذا كنت قد قرأت هذا حتى الآن، فلديك بالفعل القطع التي تحتاجها. ابدأ بخطوة الجرد، واحصل على تبديل URL الأساسي أمام زميلك للمراجعة، وقم بتشغيل canary طوال الليل. الدليل صغير عن قصد؛ الجزء الصعب هو الانضباط للتوقف بعد نافذة canary بدلاً من قطع كل شيء في التزام واحد.
القراءة ذات الصلة على بقية الموقع:
- حالة التحقق من SMS 2026 — معيار مستقل كامل لـ 8 خدمات مع بيانات التسعير والحركة وسياسة الاسترداد.
- أفضل بدائل SMS-Activate في 2026 — دليل شامل — دليل غير مطور لخيارات الاستبدال.
- VerifySMS مقابل SMS-Activate — مقارنة شاملة — مقارنة جنبًا إلى جنب للفرق التي لا تزال تقيم.
- دليل تكامل API التحقق من SMS للمطور 2026 — تجول أصلي لـ VerifySMS API عندما تكون مستعدًا للانتقال بعيدًا عن طبقة التوافق.
جاهز لقطع الهجرة إلى مساء واحد؟
إنشاء مفتاح API لـ VerifySMS →وضع sandbox متضمن · ضمان الاسترداد التلقائي · 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:
- State of SMS Verification 2026 — full independent benchmark of 8 services with pricing, traffic, and refund policy data.
- أفضل بدائل SMS-Activate في 2026 — دليل شامل — non-developer guide to the replacement options.
- VerifySMS مقابل SMS-Activate — مقارنة شاملة — side-by-side comparison for teams still evaluating.
- SMS Verification API Integration Guide — native VerifySMS API walkthrough for when you are ready to move off the compat layer.
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