Files
Siro/walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/mtn_webhook_handler.php
2026-06-11 19:26:42 +03:00

87 lines
3.7 KiB
PHP
Executable File

<?php
// --- mtn_webhook_handler.php ---
// هذا هو الـ Webhook الرئيسي الذي يستقبل إشعار تأكيد الدفع من MTN
include "../../jwtconnect.php";
include "./finalize_payment.php"; // تضمين ملف إتمام العملية
header('Content-Type: application/json');
// **مهم جداً: التحقق من مصدر الطلب**
// يجب التحقق من أن هذا الطلب قادم فعلاً من MTN وليس من أي طرف آخر
// المثال التالي يستخدم مفتاح سري مشترك (Shared Secret)
$expectedToken = trim(file_get_contents('/home/intaleq-wallet/.mtnKey')); // يجب استبداله بتوكن حقيقي
$receivedToken = $_SERVER['HTTP_X_AUTH_TOKEN'] ?? '';
if (!hash_equals($expectedToken, $receivedToken)) {
http_response_code(401); // Unauthorized
echo json_encode(["status" => "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."]);
}
?>