chore: استيراد أولي من سيرو (ecfe7568) — بلا أي تعديل
نسخة كاملة من مستودع سيرو عند ecfe7568 لتكون أساس تطبيق «انطلق». نُسخ المتعقَّب في git فقط (12,509 ملفاً / 302 م.ب) بـ git archive، لا `cp -r` — فاستُثنيت تلقائياً مخلفات البناء (build · node_modules · .dart_tool · .gradle · Pods ≈ 10.7 غ.ب) وكل ما يستثنيه .gitignore. هذا الكوميت **بلا أي تعديل عمداً** حتى يكون كل ما يليه فرقاً مقروءاً مقابل سيرو الأصلي. سيرو نفسه لم يُمسّ. ⚠️ لا يبني بعد: `.env` و`lib/env/env.g.dart` غير متعقَّبين في سيرو (وهذا صحيح — أسرار لكل مستأجر). كل تطبيق فلاتر هنا يحتاج .env خاصاً بانطلق ثم توليد env.g.dart عبر build_runner. لا تُنسخ أسرار سيرو. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+84
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
//webhook.php
|
||||
// تضمين ملف الاتصال الذي يتحقق أيضاً من توكن JWT
|
||||
include "../jwtconnect.php";
|
||||
|
||||
// --- 1. قراءة البيانات المرسلة ---
|
||||
$expectedToken = trim(file_get_contents('/home/intaleq-wallet/.webhookKey') ?: 'secret'); // Replace with actual key
|
||||
$receivedToken = $_SERVER['HTTP_X_AUTH_TOKEN'] ?? '';
|
||||
|
||||
if (!hash_equals($expectedToken, $receivedToken)) {
|
||||
http_response_code(401);
|
||||
echo json_encode(["status" => "error", "message" => "Authentication failed."]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$json_data = file_get_contents('php://input');
|
||||
$data = json_decode($json_data, true);
|
||||
|
||||
if ($data === null || !isset($data['sender']) || !isset($data['message'])) {
|
||||
http_response_code(400); // Bad Request
|
||||
echo json_encode(['status' => 'error', 'message' => 'Invalid JSON data received']);
|
||||
exit();
|
||||
}
|
||||
|
||||
// --- 2. استخراج البيانات ---
|
||||
$sender = $data['sender'];
|
||||
$message_body = $data['message'];
|
||||
$received_at = date('Y-m-d H:i:s');
|
||||
$log_entry = "[$received_at] From: $sender | Message: $message_body";
|
||||
|
||||
// --- 3. تحليل الرسالة (يركز على Orange Money حالياً) ---
|
||||
$pattern_orangemoney_jo = '/تم استقبال حوالة مالية من (\d+)\s+من مزود الخدمة:\s+Orange Money إلى محفظتك بمبلغ ([\d,.]+)\s+دينار/';
|
||||
|
||||
if (preg_match($pattern_orangemoney_jo, $message_body, $matches)) {
|
||||
$payer_phone_raw = $matches[1];
|
||||
$amount_str = $matches[2];
|
||||
$amount = (float) str_replace(',', '', $amount_str);
|
||||
|
||||
// توحيد صيغة رقم الهاتف (إزالة 0096 إذا وجدت وإضافة 0)
|
||||
$payer_phone = $payer_phone_raw;
|
||||
if (substr($payer_phone_raw, 0, 4) === '0096') {
|
||||
$payer_phone = '0' . substr($payer_phone_raw, 4);
|
||||
}
|
||||
|
||||
$log_entry .= " | MATCH: Orange Money | SUCCESS: Parsed Amount = $amount, Payer Phone = $payer_phone";
|
||||
|
||||
// --- 4. منطق تحديث الفاتورة ---
|
||||
try {
|
||||
// البحث عن أحدث فاتورة مطابقة (نفس الرقم والمبلغ) بحالة انتظار وتحديثها
|
||||
$sql = "UPDATE invoices_sms SET status = 'completed'
|
||||
WHERE user_phone = :phone
|
||||
AND amount = :amount
|
||||
AND status = 'pending'
|
||||
ORDER BY created_at DESC
|
||||
LIMIT 1";
|
||||
|
||||
$stmt = $con->prepare($sql);
|
||||
$stmt->execute([
|
||||
':phone' => $payer_phone,
|
||||
':amount' => $amount
|
||||
]);
|
||||
|
||||
if ($stmt->rowCount() > 0) {
|
||||
$log_entry .= " | DB: SUCCESS - Invoice found and updated." . PHP_EOL;
|
||||
// يمكنك هنا إضافة كود لإرسال إشعار للمستخدم
|
||||
} else {
|
||||
$log_entry .= " | DB: WARNING - No pending invoice found for this transaction." . PHP_EOL;
|
||||
}
|
||||
|
||||
} catch (PDOException $e) {
|
||||
$log_entry .= " | DB: ERROR - " . $e->getMessage() . PHP_EOL;
|
||||
}
|
||||
|
||||
} else {
|
||||
$log_entry .= " | INFO: Message did not match any known payment pattern. Ignored." . PHP_EOL;
|
||||
}
|
||||
|
||||
// كتابة السجل (مهم لتصحيح الأخطاء)
|
||||
file_put_contents('sms_log.txt', $log_entry, FILE_APPEND);
|
||||
|
||||
// إرسال رد إلى تطبيق الأندرويد
|
||||
http_response_code(200);
|
||||
echo json_encode(['status' => 'success', 'message' => 'Webhook processed.']);
|
||||
?>
|
||||
Reference in New Issue
Block a user