87 lines
3.7 KiB
PHP
Executable File
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."]);
|
|
}
|
|
|
|
?>
|