From b84e26fe9a7014726501d4197b552540fc5c3dee Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Mon, 27 Jul 2026 01:35:01 +0300 Subject: [PATCH] =?UTF-8?q?=D8=AA=D8=B3=D8=AC=D9=8A=D9=84=20=D9=86=D8=AA?= =?UTF-8?q?=D9=8A=D8=AC=D8=A9=20send=5Ffcm.php=20=E2=80=94=20=D9=85=D8=B3?= =?UTF-8?q?=D8=A7=D8=B1=20=D8=A7=D9=84=D8=B1=D8=B3=D8=A7=D8=A6=D9=84=20?= =?UTF-8?q?=D9=83=D8=A7=D9=86=20=D8=B5=D9=86=D8=AF=D9=88=D9=82=D8=A7=D9=8B?= =?UTF-8?q?=20=D8=A3=D8=B3=D9=88=D8=AF=20=D8=A8=D8=A7=D9=84=D9=83=D8=A7?= =?UTF-8?q?=D9=85=D9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit send_fcm.php هي نقطة كل الرسائل والمكالمات بين الراكب والسائق (التطبيقان يستدعيانها مباشرة)، ولم تكن تحتوي أي error_log إطلاقاً — بخلاف FcmService التي تطبع [FCM_DEBUG] وتخدم دورة حياة الرحلة فقط. النتيجة أن فشل الرسائل كان غير قابل للتشخيص: لا سبب، ولا رد Google، ولا حتى معرفة إن كان الطلب وصل. وقد وعدت المستخدم بقراءة [FCM_DEBUG] لهذا المسار وهو وعد خاطئ — لا وجود له هنا. أُضيفت ثلاث نقاط: - نتيجة الإرسال: category + طرف من التوكن + http + طول التوكن + رد Google عند الفشل. طول التوكن مقصود: توكن FCM الحقيقي ~163 محرفاً، والمشفّر في جدول tokens 216 — فيُكشف أي blob مشفّر من سطر واحد. - رفض 403: التطبيقان لا يرسلان x-api-key، فلحظة ضبط FCM_INTERNAL_API_KEY تموت كل الرسائل بينهما بصمت. الآن يُسجَّل السبب صريحاً. - رفض 400 على target فارغ: يعني أن المُرسِل لا يملك توكن الطرف الآخر (tokenPassenger أو driverToken لم يصله في حمولة القبول). Co-Authored-By: Claude Opus 5 --- backend/ride/firebase/send_fcm.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/backend/ride/firebase/send_fcm.php b/backend/ride/firebase/send_fcm.php index 98abe732..6dcd463b 100644 --- a/backend/ride/firebase/send_fcm.php +++ b/backend/ride/firebase/send_fcm.php @@ -6,6 +6,9 @@ header('Content-Type: application/json; charset=utf-8'); $apiKey = $_SERVER['HTTP_X_API_KEY'] ?? ''; $expectedKey = getenv('FCM_INTERNAL_API_KEY'); if (!empty($expectedKey) && !hash_equals($expectedKey, $apiKey)) { + // ‏فشل صامت خطير: التطبيقان لا يرسلان x-api-key إطلاقاً، فلحظة ضبط + // ‏FCM_INTERNAL_API_KEY في البيئة تموت **كل** الرسائل والمكالمات بينهما. + error_log('[SEND_FCM] REJECTED 403 — FCM_INTERNAL_API_KEY set but request sent no x-api-key'); http_response_code(403); echo json_encode(['status' => 'error', 'message' => 'Unauthorized']); exit; @@ -49,6 +52,10 @@ $tone = $requestData['tone'] ?? 'default'; $customData = $requestData['data'] ?? []; if (!$target) { + // ‏يعني أن المُرسِل لا يملك توكن الطرف الآخر — عادةً tokenPassenger أو + // ‏driverToken فارغ في التطبيق لأنه لم يصله في حمولة القبول. + error_log('[SEND_FCM] REJECTED 400 — empty target. category=' + . (string)($requestData['data']['category'] ?? '?')); http_response_code(400); echo json_encode(['status' => 'error', 'message' => 'Missing: target, title, or body.']); exit; @@ -197,6 +204,17 @@ $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); +// ‏هذه النقطة هي مسار كل الرسائل والمكالمات بين الراكب والسائق (التطبيقان +// ‏يستدعيانها مباشرة)، ولم تكن تسجّل شيئاً إطلاقاً — بخلاف FcmService التي +// ‏تطبع [FCM_DEBUG]. فكان فشل الرسائل غير قابل للتشخيص: لا سبب ولا رد Google. +$logCategory = (string)($customData['category'] ?? ''); +$logTarget = $isTopic ? "topic:$target" : substr((string)$target, 0, 16) . '…'; +error_log( + "[SEND_FCM] category=$logCategory target=$logTarget http=$httpCode" + . " len=" . strlen((string)$target) + . ($httpCode == 200 ? '' : " response=$result") +); + // الرد if ($httpCode == 200) { echo json_encode([