إصلاح سوكيت الراكب وتوحيد مسارات الإشعارات
سوكيت الراكب (سبب عدم ظهور معلومات السائق عند القبول): - تطبيق الراكب كان يرسل id فقط بلا jwt، و passenger_socket.php يرفض أي اتصال بلا jwt ⇒ الراكب لا ينضم لغرفته أبداً ولا يستلم ride_status_change ولا driver_location_update. تظهر حالة القبول عبر الـ polling فقط بينما driver_info يصل بالسوكيت وحده. (سوكيت السائق يعتبر الـ jwt اختيارياً، ومن هنا جاء التباين بين التطبيقين.) - cancelled_by_driver كان يسقط من switch حالات الراكب فيبقى معلّقاً بعد إلغاء السائق. - حماية socket (late) من القراءة قبل التهيئة عند الانسحاب بلا jwt. الإشعارات والرسائل (سبب "مرات توصل ومرات لا"): - جدول tokens يخزّن توكن الراكب مشفّراً، و getRideWaiting.php كان يرجعه بلا فك تشفير ⇒ من يقبل من قائمة السوق يحمل blob مشفّراً يستخدمه كـ FCM target فيرفضه FCM بـ 400: لا إشعار قبول ولا رسائل. ومن يقبل من الـ dispatch/FCM يحمل نصاً صريحاً فتعمل. الفرق كان في طريقة القبول. - acceptRide.php يحلّ التوكن من القاعدة دائماً ولا يثق بالعميل (أصحّ أمنياً). - market_new_ride كان لا يحمل passengerId ولا الإحداثيات فتصل "null"؛ أُضيفت بلا أي PII لأن الحمولة تُبَثّ لكل سائق قريب لا للفائز فقط. - send_fcm.php: مهلة على OAuth (كان يعلّق حتى مهلة PHP فتُسقط الرسالة بصمت)، توحيد ding→default لأندرويد، وحقن title/body/tone في data مطابقةً لـ FcmService. - تطبيق السائق يقرأ title/body من data أولاً مثل الراكب، ولا يعرض فقاعة فارغة للرسائل الصامتة. السوكيت والإعدادات: - forwardLocationToPassengerSocket كان يقرأ lat/lng والحمولة فيها latitude/longitude ⇒ المسافة تخرج ضخمة والـ throttle معطّل تماماً فيُعاد التوجيه مع كل نبضة GPS. - notifyPassengerOnRideServer كان يرجع null بصمت مطلق عند حجب العنوان. - العنوان الافتراضي لسيرفر الموقع كان nginx/loction_server/driver_socket.php وهو ديمون Workerman لا يُخدَم عبر nginx ⇒ صار socket_driver:2021. (LOCATION_API_URL بقي على nginx لأن api_get_nearby.php سكربت عادي.) - ride_server/passenger_socket.php (النسخة التي يشغّلها Docker) كانت ناقصة كل كود مواصلاتي الموجود في passenger_server/ ⇒ نُقل مع REDIS_HOST. - .env.example: ALLOWED_SOCKET_URLS يغطّي أسماء حاويات Docker، وإضافة PASSENGER_SOCKET_INTERNAL_URL. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e269cb9b70
commit
143146c1b4
@@ -198,6 +198,38 @@ try {
|
||||
$passengerIdValue = $passengerId->fetchColumn();
|
||||
}
|
||||
|
||||
// 🆕 نحلّ توكن الراكب من القاعدة دائماً ولا نعتمد على ما يرسله التطبيق:
|
||||
// • مسار الـ dispatch/FCM يرسل التوكن سليماً (نص صريح من add_ride.php).
|
||||
// • مسار "سوق الرحلات" يرسله كما خرج من getRideWaiting.php أي **مشفّراً**
|
||||
// (جدول tokens يخزّنه مشفّراً — انظر ride/firebase/addToken.php)، فكان
|
||||
// FCM يرفضه بـ 400 ولا يصل الراكب أي إشعار قبول.
|
||||
// القيمة القادمة من العميل تبقى fallback أخيراً فقط.
|
||||
$passengerTokenFromClient = $passengerToken;
|
||||
$passengerToken = '';
|
||||
if ($passengerIdValue) {
|
||||
try {
|
||||
$stmtTok = $con->prepare("SELECT token FROM tokens WHERE passengerID = ? LIMIT 1");
|
||||
$stmtTok->execute([$passengerIdValue]);
|
||||
$rawPassengerToken = $stmtTok->fetchColumn();
|
||||
if (!empty($rawPassengerToken)) {
|
||||
$decryptedToken = false;
|
||||
try {
|
||||
$decryptedToken = $encryptionHelper->decryptData($rawPassengerToken);
|
||||
} catch (\Throwable $eTok) {
|
||||
$decryptedToken = false;
|
||||
}
|
||||
$passengerToken = ($decryptedToken !== false && $decryptedToken !== null && $decryptedToken !== '')
|
||||
? trim($decryptedToken)
|
||||
: $rawPassengerToken;
|
||||
}
|
||||
} catch (PDOException $eTok) {
|
||||
error_log("[accept_ride] passenger token lookup WARNING: " . $eTok->getMessage());
|
||||
}
|
||||
}
|
||||
if (empty($passengerToken)) {
|
||||
$passengerToken = $passengerTokenFromClient;
|
||||
}
|
||||
|
||||
if ($passengerIdValue) {
|
||||
// Socket — real-time update على خريطة الراكب
|
||||
if (function_exists('notifyPassengerOnRideServer')) {
|
||||
|
||||
Reference in New Issue
Block a user