Update: 2026-06-21 02:07:00
This commit is contained in:
@@ -21,12 +21,22 @@ $rideId = filterRequest("id");
|
||||
$driverId = $user_id;
|
||||
$status = filterRequest("status"); // القيمة التي يرسلها التطبيق: 'accepted'
|
||||
$passengerToken = filterRequest("passengerToken");
|
||||
$passengerFingerprint = filterRequest("passengerFingerprint");
|
||||
$passengerIdValue = filterRequest("passenger_id");
|
||||
|
||||
if (empty($rideId) || empty($driverId)) {
|
||||
printFailure("Missing required parameters");
|
||||
exit;
|
||||
}
|
||||
|
||||
// Self-ride validation
|
||||
$driverFingerprint = isset($_SERVER['HTTP_X_DEVICE_FP']) ? $_SERVER['HTTP_X_DEVICE_FP'] : '';
|
||||
if (!empty($driverFingerprint) && $driverFingerprint === $passengerFingerprint) {
|
||||
error_log("[accept_ride] Self-ride attempt blocked. DriverID=$driverId, Fingerprint=$driverFingerprint");
|
||||
printFailure("Self-matching is not allowed");
|
||||
exit;
|
||||
}
|
||||
|
||||
// status whitelist — لا نقبل قيمة عشوائية من التطبيق
|
||||
$allowedStatuses = ['accepted', 'Apply'];
|
||||
if (!in_array($status, $allowedStatuses, true)) {
|
||||
@@ -158,9 +168,11 @@ try {
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// STEP E — جلب passenger_id وإرسال الإشعارات
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
$passengerId = $con->prepare("SELECT passenger_id FROM ride WHERE id = ? LIMIT 1");
|
||||
$passengerId->execute([$rideId]);
|
||||
$passengerIdValue = $passengerId->fetchColumn();
|
||||
if (empty($passengerIdValue)) {
|
||||
$passengerId = $con->prepare("SELECT passenger_id FROM ride WHERE id = ? LIMIT 1");
|
||||
$passengerId->execute([$rideId]);
|
||||
$passengerIdValue = $passengerId->fetchColumn();
|
||||
}
|
||||
|
||||
if ($passengerIdValue) {
|
||||
// Socket — real-time update على خريطة الراكب
|
||||
|
||||
@@ -242,6 +242,7 @@ try {
|
||||
// STEP C — بناء الـ payload وإرسال الرحلة للسائقين
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
$kazan = (float) $price - (float) $price_for_driver;
|
||||
$passengerFp = isset($_SERVER['HTTP_X_DEVICE_FP']) ? $_SERVER['HTTP_X_DEVICE_FP'] : '';
|
||||
$payload = [
|
||||
(string) $startLat,
|
||||
(string) $startLng,
|
||||
@@ -249,7 +250,7 @@ try {
|
||||
(string) $endLat,
|
||||
(string) $endLng,
|
||||
(string) $distance_text,
|
||||
"",
|
||||
(string) $passengerFp,
|
||||
(string) $passenger_id,
|
||||
(string) $passenger_name,
|
||||
(string) $passenger_token,
|
||||
|
||||
@@ -140,18 +140,30 @@ try {
|
||||
|
||||
// تخزين الدين في الـ Redis لمدة 6 شهور (15552000 ثانية)
|
||||
try {
|
||||
$redis = new Redis();
|
||||
$redis->connect('127.0.0.1', 6379);
|
||||
$redisPass = getenv('REDIS_PASSWORD');
|
||||
if ($redisPass) $redis->auth($redisPass);
|
||||
$redis->setOption(Redis::OPT_PREFIX, 'siro:');
|
||||
$redisKey = "passenger_debt_" . $passenger_id;
|
||||
// إضافة الدين الجديد إلى الدين السابق إن وجد
|
||||
$currentDebt = (float) $redis->get($redisKey);
|
||||
$newDebt = $currentDebt + $negativeDebt;
|
||||
$redis->setex($redisKey, 15552000, $newDebt);
|
||||
$redisInstance = null;
|
||||
if (isset($redis) && $redis !== null) {
|
||||
$redisInstance = $redis;
|
||||
} else if (extension_loaded('redis')) {
|
||||
$localRedis = new Redis();
|
||||
$redisHost = getenv('REDIS_MAIN_HOST') ?: getenv('REDIS_HOST') ?: '127.0.0.1';
|
||||
$redisPort = (int)(getenv('REDIS_MAIN_PORT') ?: getenv('REDIS_PORT') ?: 6379);
|
||||
$redisPass = getenv('REDIS_MAIN_PASSWORD') ?: getenv('REDIS_MAIN_AUTH') ?: getenv('REDIS_PASSWORD') ?: getenv('REDIS_AUTH');
|
||||
if ($localRedis->connect($redisHost, $redisPort, 1.5)) {
|
||||
if ($redisPass) $localRedis->auth($redisPass);
|
||||
$localRedis->setOption(Redis::OPT_PREFIX, 'siro:');
|
||||
$redisInstance = $localRedis;
|
||||
}
|
||||
}
|
||||
|
||||
if ($redisInstance !== null) {
|
||||
$redisKey = "passenger_debt_" . $passenger_id;
|
||||
// إضافة الدين الجديد إلى الدين السابق إن وجد
|
||||
$currentDebt = (float) $redisInstance->get($redisKey);
|
||||
$newDebt = $currentDebt + $negativeDebt;
|
||||
$redisInstance->setex($redisKey, 15552000, $newDebt);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
error_log("Redis Error: " . $e->getMessage());
|
||||
error_log("Redis Error in cancel_ride_by_driver: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,17 +173,16 @@ try {
|
||||
throw new Exception("Ride already finished or not found in local DB.");
|
||||
}
|
||||
|
||||
// 4b. Update driver_orders
|
||||
$checkStmt = $con->prepare("SELECT order_id FROM driver_orders WHERE order_id = ?");
|
||||
$checkStmt->execute([$rideId]);
|
||||
|
||||
if ($checkStmt->rowCount() > 0) {
|
||||
$con->prepare("UPDATE driver_orders SET driver_id = ?, status = ?, created_at = NOW() WHERE order_id = ?")
|
||||
->execute([$driver_id, $newStatus, $rideId]);
|
||||
} else {
|
||||
$con->prepare("INSERT INTO driver_orders (driver_id, order_id, created_at, status) VALUES (?, ?, NOW(), ?)")
|
||||
->execute([$driver_id, $rideId, $newStatus]);
|
||||
}
|
||||
// 4b. Update driver_orders (Optimized atomic query)
|
||||
$stmtOrders = $con->prepare("
|
||||
INSERT INTO `driver_orders` (`driver_id`, `order_id`, `status`, `created_at`)
|
||||
VALUES (?, ?, ?, NOW())
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`driver_id` = VALUES(`driver_id`),
|
||||
`status` = VALUES(`status`),
|
||||
`created_at` = NOW()
|
||||
");
|
||||
$stmtOrders->execute([$driver_id, $rideId, $newStatus]);
|
||||
|
||||
// ============================================================
|
||||
// 4c. Server-to-Server Payment Processing (S2S)
|
||||
|
||||
@@ -48,6 +48,7 @@ try {
|
||||
// 3. حساب العمولة (Kazan)
|
||||
$kazan = (double)$price - (double)$priceForDriver;
|
||||
|
||||
$passengerFp = isset($_SERVER['HTTP_X_DEVICE_FP']) ? $_SERVER['HTTP_X_DEVICE_FP'] : '';
|
||||
// 4. بناء Payload مطابق لـ add_ride.php (0 - 33)
|
||||
$payloadTemplate = [];
|
||||
$payloadTemplate[0] = (string)$startLat;
|
||||
@@ -56,7 +57,7 @@ try {
|
||||
$payloadTemplate[3] = (string)$endLat;
|
||||
$payloadTemplate[4] = (string)$endLng;
|
||||
$payloadTemplate[5] = (string)$distanceText;
|
||||
$payloadTemplate[6] = ""; // Driver ID placeholder
|
||||
$payloadTemplate[6] = (string)$passengerFp;
|
||||
$payloadTemplate[7] = (string)$passengerId;
|
||||
$payloadTemplate[8] = (string)$passengerName;
|
||||
$payloadTemplate[9] = (string)$passengerToken;
|
||||
|
||||
Reference in New Issue
Block a user