Update: 2026-08-07 15:50:04
This commit is contained in:
@@ -1,5 +1,20 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
// ============================================================
|
||||
// webhook_sms/webhook.php — مستقبِل الرسائل الواردة
|
||||
//
|
||||
// تطبيق أندرويد على هاتف يحمل رقمنا الثابت يوجّه كل رسالة تصله إلى
|
||||
// هنا. الرسائل نوعان ولكلٍّ مساره:
|
||||
// • إشعار دفع (Orange Money وأخواته) — النمط الأصلي
|
||||
// • طلب رحلة من راكب بلا إنترنت — بند 3.1 من دراسة الفرص
|
||||
//
|
||||
// الفرز أولاً ثم التوجيه: خلط المسارين في نمط واحد كان سيجعل كل
|
||||
// إضافة نمط جديد تخاطر بكسر الآخر.
|
||||
// ============================================================
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
require_once __DIR__ . '/../core/bootstrap.php';
|
||||
require_once __DIR__ . '/../sms/ride_request.php';
|
||||
|
||||
// !! تأكد أن هذا المفتاح يطابق المفتاح في تطبيق الأندرويد !!
|
||||
//define('SECRET_KEY', 'YOUR_SUPER_SECRET_KEY_123__');
|
||||
@@ -36,6 +51,53 @@ $message_body = $data['message'];
|
||||
$received_at = date('Y-m-d H:i:s');
|
||||
$log_entry = "[$received_at] From: $sender | Message: $message_body";
|
||||
|
||||
// --- 3.5 الفرز والتوجيه ---------------------------------------
|
||||
// نحفظ الوارد الخام دائماً قبل أي تحليل. المحلّل سيخطئ في البداية
|
||||
// حتماً (لهجات، أخطاء إملائية، صيغ لم نتوقّعها)، وبلا الخام لن نعرف
|
||||
// لماذا أخطأ ولا كيف نحسّنه.
|
||||
$senderNorm = smsNormalizePhone((string) $sender);
|
||||
$inboxId = null;
|
||||
$isRide = smsLooksLikeRideRequest((string) $message_body);
|
||||
|
||||
try {
|
||||
$con = Database::get('main');
|
||||
|
||||
$ins = $con->prepare("
|
||||
INSERT INTO sms_inbox (sender, sender_norm, body, intent)
|
||||
VALUES (?, ?, ?, ?)
|
||||
");
|
||||
$ins->execute([
|
||||
mb_substr((string) $sender, 0, 32),
|
||||
$senderNorm,
|
||||
(string) $message_body,
|
||||
$isRide ? 'ride' : 'payment',
|
||||
]);
|
||||
$inboxId = (int) $con->lastInsertId();
|
||||
} catch (Throwable $e) {
|
||||
error_log('[sms] تعذّر حفظ الوارد: ' . $e->getMessage());
|
||||
$con = null;
|
||||
}
|
||||
|
||||
if ($con && $isRide) {
|
||||
// معالجة فورية لا مؤجَّلة للكرون: الراكب واقف ينتظر رداً، ودقيقة
|
||||
// تأخير في قناة كهذه تعني أنه ظنّ أن الرقم لا يعمل. الكرون يبقى
|
||||
// شبكة أمان لما يفشل هنا فقط.
|
||||
$request = smsIntakeRideMessage($con, $senderNorm, (string) $message_body, $inboxId);
|
||||
if ($request) {
|
||||
smsProcessRequest($con, $request);
|
||||
}
|
||||
|
||||
$log_entry .= ' | ROUTED: ride request' . PHP_EOL;
|
||||
$logDir = __DIR__ . '/../../logs';
|
||||
if (!is_dir($logDir)) @mkdir($logDir, 0750, true);
|
||||
@file_put_contents($logDir . '/sms_webhook_log.txt', $log_entry, FILE_APPEND);
|
||||
|
||||
http_response_code(200);
|
||||
echo json_encode(['status' => 'success', 'message' => 'Ride request processed'],
|
||||
JSON_UNESCAPED_UNICODE);
|
||||
exit();
|
||||
}
|
||||
|
||||
// --- 4. تحليل الرسالة (يركز على Orange Money فقط حالياً) ---
|
||||
|
||||
// تعريف المتغيرات التي سنستخرجها
|
||||
|
||||
Reference in New Issue
Block a user