"error", "message" => "Authentication failed."]); exit; } // قراءة البيانات القادمة من MTN (عادة تكون بصيغة JSON في الـ body) $json_data = file_get_contents('php://input'); $data = json_decode($json_data, true); $invoiceNumber = $data['invoice_number'] ?? null; $transactionId = $data['transaction_id'] ?? null; $paymentStatus = $data['status'] ?? null; if (empty($invoiceNumber) || empty($transactionId) || $paymentStatus !== 'success') { http_response_code(400); // Bad Request echo json_encode(["status" => "error", "message" => "Missing or invalid payment data."]); exit; } try { $con->beginTransaction(); // 1. البحث عن الفاتورة وتحديث حالتها $stmt = $con->prepare( "UPDATE `mtn_invoices` SET `status` = 'completed', `mtn_transaction_id` = :transaction_id WHERE `invoice_number` = :invoice_number AND `status` = 'pending'" ); $stmt->execute([ ':transaction_id' => $transactionId, ':invoice_number' => $invoiceNumber ]); if ($stmt->rowCount() > 0) { // تم تحديث الفاتورة بنجاح، الآن نقوم بإتمام العملية $invoiceId = $con->lastInsertId(); // ملاحظة: هذا قد لا يعمل دائماً مع UPDATE، الأفضل جلب الـ ID // جلب ID الفاتورة بعد التأكد من وجودها $idStmt = $con->prepare("SELECT id FROM `mtn_invoices` WHERE `invoice_number` = :invoice_number"); $idStmt->execute([':invoice_number' => $invoiceNumber]); $invoiceRecord = $idStmt->fetch(); $invoiceId = $invoiceRecord['id']; $finalizationResult = finalizeMtnPayment($con, $invoiceId); if ($finalizationResult['success']) { $con->commit(); echo json_encode(["status" => "success", "message" => "Transaction finalized."]); } else { $con->rollBack(); // يجب هنا التعامل مع الحالة التي فشل فيها الإيداع رغم نجاح الدفع error_log("CRITICAL: Payment received for invoice {$invoiceNumber} but finalization failed."); http_response_code(500); echo json_encode(["status" => "error", "message" => "Finalization failed."]); } } else { // لم يتم العثور على فاتورة معلقة بهذا الرقم (ربما تمت معالجتها سابقاً) $con->rollBack(); http_response_code(404); echo json_encode(["status" => "error", "message" => "Invoice not found or already processed."]); } } catch (Exception $e) { $con->rollBack(); error_log("Error in mtn_webhook_handler.php: " . $e->getMessage()); http_response_code(500); echo json_encode(["status" => "error", "message" => "An internal server error occurred."]); } ?>