Update: 2026-08-07 15:50:04

This commit is contained in:
Hamza-Ayed
2026-08-07 15:50:04 +03:00
parent b2a95c53aa
commit 9338e76894
11 changed files with 1375 additions and 4 deletions
+63 -1
View File
@@ -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 فقط حالياً) ---
// تعريف المتغيرات التي سنستخرجها