Skip to content

التحقق برمز OTP عبر واتساب (v1) ​

الـ API ده بيبعت رمز لمرة واحدة لرقم على واتساب ويتحقق من الرمز اللي المستخدم بيكتبه. Otpera بيولّد الرمز ويوصّله ويطبّق مدة الصلاحية وحدود المحاولات، وبيخزّنه كـ hash بس. السيرفر بتاعك عمره ما بيشوف الرمز.

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

إزاي بيشتغل ​

text
1. Your server  ── POST /verifications {to} ─────────▶ Otpera
2. Otpera       ── WhatsApp: "Your code is 482913" ──▶ User
3. User         ── types 482913 into your app ───────▶ Your server
4. Your server  ── POST /verifications/:id/check ────▶ Otpera → { valid: true }
الخطوةالنقطةالغرض
١POST /verificationsإنشاء عملية تحقق وإرسال الرمز
٢POST /verifications/{id}/checkالتحقق من الرمز اللي اتكتب
–POST /verifications/{id}/resendإرسال رمز جديد لنفس العملية
–GET /verifications/{id}قراءة الحالة الحالية

كل النقاط محتاجة مفتاح بصلاحية verifications:write. الرابط الأساسي: https://api.otpera.com/api/v1.

١. إنشاء عملية تحقق ​

POST /verifications

الحقلالنوعمطلوبالوصف
tostringأيوهرقم المستلم بصيغة E.164 (+201012345678) أو رقم مصري محلي 01012345678
purposestringلأتسمية من عندك (signup، login، checkout). الافتراضي verification
locale"ar" | "en"لألغة رسالة واتساب. الافتراضي لغة مساحة العمل
channel"whatsapp"لأواتساب بس حاليًا

ابعت هيدر Idempotency-Key علشان لو الطلب اتكرر ما يتبعتش رمز تاني.

bash
curl -X POST https://api.otpera.com/api/v1/verifications \
  -H "Authorization: Bearer $OTPERA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f1c2b9e-1c55-4c1e-8f0a-3f7b0e7f9a21" \
  -d '{ "to": "+201012345678", "purpose": "signup", "locale": "ar" }'

الرد 201 Created ​

json
{
  "data": {
    "id": "8b0c3f8e-2f7a-4f5e-9a51-0d6c1e6b2f10",
    "recipient_e164": "+201012345678",
    "purpose": "signup",
    "channel": "whatsapp",
    "status": "pending",
    "attempts": 0,
    "max_attempts": 5,
    "send_count": 1,
    "delivery_status": "sent",
    "expires_at": "2026-11-05T10:10:00.000Z",
    "verified_at": null,
    "created_at": "2026-11-05T10:00:00.000Z"
  }
}

المستخدم بيستلم رسالة زي:

رمز التحقق الخاص بك في متجري: 482913 — صالح لمدة 10 دقائق. لا تشاركه مع أي شخص.

إنشاء عملية جديدة لنفس الرقم ونفس purpose بيلغي أي عملية قديمة لسه مستنية، فآخر رمز بس هو اللي بيشتغل.

٢. التحقق من الرمز ​

POST /verifications/{id}/check بجسم { "code": "482913" } (من ٤ لـ ٨ أرقام).

json
{ "data": { "id": "8b0c…", "valid": true, "status": "verified", "reason": null, "attemptsRemaining": 4 } }

اعتمد دايمًا على valid. لو false، الحقل reason بيقولك السبب:

reasonstatusتعرض للمستخدم
incorrect_codepending"الرمز غلط" + عدد المحاولات الباقية
too_many_attemptsfailed"محاولات كتير، اطلب رمز جديد"
expiredexpired"الرمز انتهى، اطلب رمز جديد"
already_verifiedverifiedالرمز اتستخدم قبل كده
canceledcanceledاتطلب رمز أحدث، استخدم آخر رمز

الرمز بيتحقق مرة واحدة بس حتى لو وصل طلبين في نفس اللحظة.

٣. إعادة الإرسال ​

POST /verifications/{id}/resend من غير body. بيبعت رمز جديد لنفس العملية ويمدّ الصلاحية.

  • ٣٠ ثانية بين كل إرسال والتاني (429 مع retryAfter).
  • أقصى ٥ مرات إرسال للعملية الواحدة.
  • بس لو الحالة pending (غير كده 409).

الحالات ​

الحالةالمعنى
pendingالرمز اتبعت ومستني التحقق
verifiedالرمز الصح اتكتب
expiredعدّت ١٠ دقايق من غير تحقق صحيح
failedمحاولات غلط كتير أو فشل التسليم على واتساب
canceledاتلغت بعملية أحدث لنفس الرقم ونفس الغرض

الحدود ​

الحدالقيمة
صلاحية الرمز١٠ دقايق
محاولات غلط لكل عملية٥
مرات الإرسال لكل عملية٥
الانتظار بين الإرسال٣٠ ثانية
عمليات جديدة لنفس الرقم٥ كل ١٠ دقايق
عمليات جديدة لكل مساحة عمل٣٠٠ في الساعة

كل رمز بيوصل بيستهلك رصيد واحد من باقتك.

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

  • نادِ Otpera من السيرفر بس. الواجهة بتكلّم السيرفر بتاعك، والسيرفر معاه المفتاح.
  • اربط data.id بالجلسة على السيرفر، وما تعتمدش على id جاي من المتصفح لوحده.
  • حط Rate limit على الـ endpoint بتاعك اللي بيطلب الرمز (لكل IP ولكل حساب).
  • اعرض عدّاد ٣٠ ثانية لزرار إعادة الإرسال.
  • استخدم purpose علشان تفصل بين الدخول والدفع مثلًا.

otpera.com · WhatsApp order confirmation & OTP