ربط واتساب API مع Laravel — إرسال رسائل التحقق OTP بسهولة
دليل عملي خطوة بخطوة لربط تطبيقات Laravel بـ WhatsApp Cloud API عبر منصة EzyCode Connect. يتضمن كلاس خدمة متكامل، دعم التحقق الإديمبوتنت (Idempotency)، وإدارة الـ Webhooks لتحديث حالات التسليم في قاعدة بياناتك.
معلومات بيئة التشغيل والحدود الفعلية
- في بيئة الاختبار (Sandbox): يمكنك إرسال الرسائل لما يصل إلى 5 أرقام مستلمين موثقين في لوحة التحكم.
- في بيئة الإنتاج: بعد حجز رقم افتراضي وتفعيله عبر مزود الاتصالات (Telnyx)، يمكنك الإرسال لأي رقم هاتف دون قائمة المستلمين المسبقة.
- التسعير: تكلفة رسالة التحقق الواحدة (OTP) هي 0.009$ بنظام الدفع حسب الاستخدام (Pay As You Go) دون أي اشتراك شهري إلزامي.
1تهيئة المتغيرات وملفات الإعداد في Laravel
أضف مفتاح الـ API الخاص بك ورابط الخدمة إلى ملف .env ثم مررهما في config/services.php:
# .env EZYCODE_API_KEY=ezk_live_xxxxxxxxxxxxxxxxxxxx EZYCODE_API_URL=https://connect-dashboard.ezycode.dev/connect/v1
// config/services.php
return [
// ...
'ezycode' => [
'api_key' => env('EZYCODE_API_KEY'),
'base_url' => env('EZYCODE_API_URL', 'https://connect-dashboard.ezycode.dev/connect/v1'),
],
];2إنشاء كلاس الخدمة App\Services\WhatsAppService
كلاس خدمة متوافق مع Laravel 10/11/12 يستخدم واجهة Http Client المدمجة مع ترويسة Idempotency-Key لمنع تكرار الإرسال بالخطأ:
<?php
namespace App\Services;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
class WhatsAppService
{
protected string $baseUrl;
protected string $apiKey;
public function __construct()
{
$this->baseUrl = config('services.ezycode.base_url');
$this->apiKey = config('services.ezycode.api_key');
}
/**
* Send OTP Verification Message
*
* @param string $phone E.164 formatted number (e.g. +201000000000)
* @param string $otpCode 6-digit code
* @return array
*/
public function sendOtp(string $phone, string $otpCode): array
{
$idempotencyKey = 'otp_' . Str::uuid();
$response = Http::withToken($this->apiKey)
->withHeaders([
'Idempotency-Key' => $idempotencyKey,
'Content-Type' => 'application/json',
'Accept' => 'application/json',
])
->timeout(10)
->post("{$this->baseUrl}/messages", [
'to' => $phone,
'type' => 'text',
'text' => "رمز التحقق الخاص بك في منصتنا هو: {$otpCode}. لا تشاركه مع أي شخص.",
]);
if ($response->failed()) {
Log::error('EzyCode WhatsApp OTP dispatch failed', [
'status' => $response->status(),
'body' => $response->json(),
]);
return [
'success' => false,
'status' => $response->status(),
'error' => $response->json('message') ?? 'Connection failed',
];
}
return [
'success' => true,
'message_id' => $response->json('data.id'),
'status' => $response->json('data.status'),
];
}
}3استدعاء الخدمة داخل Controller لإرسال كود التحقق
نموذج كامل لتوليد رمز عشوائي مكون من 6 أرقام، حفظه في الكاش لمدة 5 دقائق، وإرساله فوراً للمستخدم:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Services\WhatsAppService;
use Illuminate\Http\Request;
class WhatsAppOtpController extends Controller
{
public function requestOtp(Request $request, WhatsAppService $whatsApp)
{
$validated = $request->validate([
'phone' => ['required', 'string', 'regex:/^\+[1-9]\d{1,14}$/'],
]);
$otp = (string) random_int(100000, 999999);
cache()->put('otp_' . $validated['phone'], $otp, now()->addMinutes(5));
$result = $whatsApp->sendOtp($validated['phone'], $otp);
if (!$result['success']) {
return response()->json([
'error' => 'تعذر إرسال رمز التحقق. يرجى المحاولة لاحقاً.'
], 422);
}
return response()->json([
'message' => 'تم إرسال رمز التحقق بنجاح عبر واتساب',
'message_id' => $result['message_id'],
]);
}
}4استقبال إشعارات الـ Webhooks والتحقق من التوقيع
استقبل أحداث تسليم الرسائل وقراءتها لحظياً، وتأكد من أمان الطلب عبر التحقق من توقيع HMAC-SHA256:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class EzyCodeWebhookController extends Controller
{
public function handle(Request $request)
{
$signature = $request->header('X-EzyCode-Signature');
$secret = config('services.ezycode.webhook_secret');
if ($secret && $signature) {
$expected = hash_hmac('sha256', $request->getContent(), $secret);
if (!hash_equals($expected, $signature)) {
return response()->json(['error' => 'Invalid signature'], 401);
}
}
$event = $request->input('event');
$data = $request->input('data');
Log::info("EzyCode Webhook Received: {$event}", $data);
// Update message status in your database: sent, delivered, read, failed
return response()->json(['status' => 'acknowledged'], 200);
}
}الأسئلة الشائعة لمطوري Laravel
هل أحتاج حساب فيسبوك مطور معقد للبدء؟
لا، يمكنك التسجيل فوراً في EzyCode Connect والحصول على بيئة Sandbox جاهزة فوراً مع مفتاح API لاختبار الإرسال دون الحاجة لتوثيق تجاري مسبق.
كيف يعمل Idempotency-Key في لارافيل؟
عند إرسال ترويسة Idempotency-Key مع الطلب، تضمن منصة EzyCode عدم خصم الرصيد أو إرسال رسالة مكررة للمستخدم حتى لو حدث انقطاع في الشبكة وأعاد Laravel إرسال الطلب.
ما هي تكلفة الرسالة في بيئة الإنتاج؟
سعر رسالة الـ OTP هو 0.009$ فقط لكل رسالة بنظام شحن الرصيد المسبق (Pay-as-you-go). لا توجد رسوم شهرية ثابتة.
ما هي صيغة رقم الهاتف المطلوبة؟
يجب إرسال الرقم بصيغة E.164 الدولية مسبوقاً برمز الدولة وبدون أصفار إضافية، مثل +201000000000 أو +966500000000.
ابدأ في ربط تطبيقك الآن في 5 دقائق
أنشئ حسابك المجاني، انسخ مفتاح الاختبار، وابدأ في إرسال أول رسالة تحقق عبر واتساب على الفور.