Update Banyak

This commit is contained in:
WD - Dev
2025-09-21 21:40:17 +07:00
parent c6bee729c5
commit efca8f5f80
145 changed files with 195185 additions and 1378 deletions
+136 -118
View File
@@ -1,141 +1,159 @@
<?php
// Callback Paydisini
$secret = '4f120457653057e4362b56639478af67';
$key = $_POST['key'] ?? '';
$order_id = $_POST['unique_code'] ?? '';
$status = $_POST['status'] ?? '';
$signature = $_POST['signature'] ?? '';
$sign = md5($secret . $order_id . 'CallbackStatus');
// simple callback (make sure whitelist paydisini 194.233.92.170)
if ($_POST['key'] == '4f120457653057e4362b56639478af67') {
$result = ['success' => false, 'message' => 'Invalid request'];
$key = $_POST['key'];
$order_id = $_POST['unique_code'];
$status = $_POST['status'];
$signature = $_POST['signature'];
$sign = md5('4f120457653057e4362b56639478af67' . $order_id . 'CallbackStatus');
// --- Fungsi logging ---
function writeLog($message) {
$dir = __DIR__ . "/logs";
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
$file = $dir . '/callback_' . date('Y-m-d') . '.log';
$log = "[" . date('Y-m-d H:i:s') . "] " . $message . PHP_EOL;
file_put_contents($file, $log, FILE_APPEND);
}
try {
if ($key !== $secret) {
throw new Exception("Invalid key");
}
include '../../../config/connect.php';
include '../../../config/whatsapp_api.php';
// Cari data payment
$stmt = $pdo->prepare("SELECT * FROM apk_payment WHERE order_id = :order_id");
$stmt->bindParam(':order_id', $order_id);
$stmt->execute();
$result = $stmt->fetch();
$stmt->execute([':order_id' => $order_id]);
$apk = $stmt->fetch(PDO::FETCH_ASSOC);
if ($apk) {
$apk['table_name'] = 'apk_payment';
$data = $apk;
} else {
$stmt = $pdo->prepare("SELECT * FROM client_payment WHERE order_id = :order_id");
$stmt->execute([':order_id' => $order_id]);
$client = $stmt->fetch(PDO::FETCH_ASSOC);
if ($client) {
$client['table_name'] = 'client_payment';
$data = $client;
}
}
if (!$data) {
throw new Exception("Order not found: $order_id");
}
// Generate log file name based on current date and time
$logFileName = 'log_' . date('Y-m-d H:i:s') . '.log';
// Log awal callback
// writeLog("Callback received | Order=$order_id | Status=$status | Signature=$signature | Expected=$sign");
// Prepare log message
$logMessage = "[" . date('Y-m-d H:i:s') . "] Received Callback - Order ID: $order_id, Status: $status, Signature: $signature, Expected Signature: $sign\n";
if ($signature !== $sign) {
throw new Exception("Signature mismatch");
}
// Write log message to file without opening the file manually (appending mode)
// file_put_contents($logFileName, $logMessage, FILE_APPEND);
// === APK_PAYMENT ===
if ($data['table_name'] === 'apk_payment') {
if ($status === 'Success') {
if ($data['jenis'] === 'PPPOE') {
// TODO: Update sukses PPPOE (kosong dulu)
// writeLog("Order $order_id: PPPOE payment success");
} elseif ($data['jenis'] === 'Hotspot') {
$stmt = $pdo->prepare("SELECT * FROM v_voucher_paygw WHERE order_id = :order_id");
$stmt->execute([':order_id' => $order_id]);
$vcr = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$vcr) throw new Exception("Voucher tidak ditemukan | Order=$order_id");
if ($signature != $sign) {
$result = array('success' => false);
$logMessage = "Signature mismatch, callback ignored.\n";
// file_put_contents($logFileName, $logMessage, FILE_APPEND);
} else if ($status == 'Success') {
if ($result['jenis'] == 'PPPOE') {
//Update Succesc untuk PPPOE ( di gunakan nanati );
} else if($result['jenis'] == 'Hotspot') {
// Ambil data voucher berdasarkan order_id
$stmt = $pdo->prepare("SELECT * FROM v_voucher_paygw WHERE order_id = :order_id");
$stmt->bindParam(':order_id', $order_id, PDO::PARAM_STR);
$stmt->execute();
$vcr = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$vcr) {
// Tidak ditemukan
exit("Voucher tidak ditemukan untuk order_id: $order_id");
}
// Konfigurasi koneksi MikroTik
$m_ip = $vcr['ip_address'];
$m_user = $vcr['username'];
$m_pass = $vcr['password'];
$m_port = $vcr['port_api'];
require('../../../config/routeros_api.class.php');
$API = new RouterosAPI();
$API->debug = false;
// Coba koneksi ke MikroTik
if ($API->connect2($m_ip, $m_user, $m_pass, $m_port)) {
try {
// Tambah user ke hotspot
$API->comm('/ip/hotspot/user/add', [
"name" => $vcr['voucher'],
"password" => $vcr['voucher'],
"profile" => $vcr['nama_profile'],
"server" => "all"
]);
// Update status berhasil
$update = $pdo->prepare("UPDATE ganerate_voucher SET status_create = '1' WHERE id = :id");
$update->execute([':id' => $vcr['id']]);
// Kirim pesan WhatsApp
$nomorList = array_filter(array_map('trim', explode(',', $vcr['nomor_whatsapp'])));
$APIwa = new PesanWA();
$Pesan = "Pembelian voucher kamu *BERHASIL!*\n\n"
. "Tanggal : " . $vcr['waktu_transaksi'] . "\n"
. "Pembayaran : QRIS\n\n"
. "Paket : " . $vcr['nama_paket'] . "\n"
. "Harga : Rp " . number_format($vcr['harga']) . "\n"
. "Kode Voucher : *" . $vcr['voucher'] . "*\n\n"
. "_Voucher hanya bisa digunakan pada 1 perangkat / device._\n\n"
. "Terima kasih telah menggunakan layanan kami.";
require('../../../config/routeros_api.class.php');
$API = new RouterosAPI();
$API->debug = false;
if (!empty($nomorList)) {
$APIwa->Send_Pesan($vcr['id_data_server'], 'sendMessage', $nomorList, $Pesan);
if ($API->connect2($vcr['ip_address'], $vcr['username'], $vcr['password'], $vcr['port_api'])) {
try {
$API->comm('/ip/hotspot/user/add', [
"name" => $vcr['voucher'],
"password" => $vcr['voucher'],
"profile" => $vcr['nama_profile'],
"server" => "all"
]);
$pdo->prepare("UPDATE ganerate_voucher SET status_create = '1' WHERE id = ?")
->execute([$vcr['id']]);
$nomorList = array_filter(array_map('trim', explode(',', $vcr['nomor_whatsapp'])));
if ($nomorList) {
$Pesan = "Pembelian voucher kamu *BERHASIL!*\n\n"
. "Tanggal : {$vcr['waktu_transaksi']}\n"
. "Pembayaran : QRIS\n\n"
. "Paket : {$vcr['nama_paket']}\n"
. "Harga : Rp " . number_format($vcr['harga']) . "\n"
. "Kode Voucher : *{$vcr['voucher']}*\n\n"
. "_Voucher hanya bisa digunakan pada 1 perangkat / device._\n\n"
. "Terima kasih telah menggunakan layanan kami.";
(new PesanWA())->Send_Pesan($vcr['id_data_server'], 'sendMessage', $nomorList, $Pesan);
}
// writeLog("Voucher {$vcr['voucher']} sukses ditambahkan di MikroTik & WA dikirim | Order=$order_id");
} catch (Exception $e) {
$pdo->prepare("UPDATE ganerate_voucher SET status_create = '0' WHERE id = ?")
->execute([$vcr['id']]);
// writeLog("Gagal tambah user hotspot | Order=$order_id | Error=" . $e->getMessage());
} finally {
$API->disconnect();
}
} catch (Exception $e) {
// Jika gagal saat perintah ke router
$update = $pdo->prepare("UPDATE ganerate_voucher SET status_create = '0' WHERE id = :id");
$update->execute([':id' => $vcr['id']]);
// error_log("Gagal menambahkan user hotspot: " . $e->getMessage());
} finally {
$API->disconnect();
} else {
$pdo->prepare("UPDATE ganerate_voucher SET status_create = '0' WHERE id = ?")
->execute([$vcr['id']]);
// writeLog("Gagal koneksi MikroTik | IP={$vcr['ip_address']} | Order=$order_id");
}
} else {
// Jika gagal konek ke MikroTik
$update = $pdo->prepare("UPDATE ganerate_voucher SET status_create = '0' WHERE id = :id");
$update->execute([':id' => $vcr['id']]);
// error_log("Gagal koneksi ke MikroTik pada IP: $m_ip");
$ids = array_map('intval', explode(',', $data['id_data_server']));
if ($ids) {
$in = implode(',', array_fill(0, count($ids), '?'));
$sql = "UPDATE data_server SET status='Aktif', expaired_date=? WHERE id IN ($in)";
$params = array_merge([$data['expaired_time']], $ids);
$pdo->prepare($sql)->execute($params);
}
// writeLog("Server status diupdate aktif | Order=$order_id");
}
$pdo->prepare("UPDATE apk_payment SET status='LUNAS' WHERE order_id=?")->execute([$order_id]);
$result = ['success' => true, 'message' => "Payment success, updated to LUNAS"];
// writeLog("Order $order_id status updated to LUNAS");
} elseif ($status === 'Canceled') {
$pdo->prepare("UPDATE apk_payment SET status='CANCELED' WHERE order_id=?")->execute([$order_id]);
$result = ['success' => true, 'message' => "Payment canceled"];
// writeLog("Order $order_id status updated to CANCELED");
} else {
// Pisahkan dan pastikan hanya angka
$idArray = array_map('intval', explode(',', $result['id_data_server']));
$placeholders = implode(',', array_fill(0, count($idArray), '?'));
$sql = "UPDATE data_server SET status = 'Aktif', expaired_date = ? WHERE id IN ($placeholders)";
$stmt = $pdo->prepare($sql);
$params = array_merge([$result['expaired_time']], $idArray);
$stmt->execute($params);
throw new Exception("Invalid status for apk_payment | Order=$order_id");
}
// Update payment status to "LUNAS"
$stmt = $pdo->prepare("UPDATE apk_payment SET status = 'LUNAS' WHERE order_id = :order_id");
$stmt->bindParam(':order_id', $order_id);
$stmt->execute();
$result = array('success' => true);
$logMessage = "Payment success for Order ID: $order_id, Status updated to LUNAS.\n";
// file_put_contents($logFileName, $logMessage, FILE_APPEND);
} else if ($status == 'Canceled') {
// Update payment status to "CANCELED"
$stmt = $pdo->prepare("UPDATE apk_payment SET status = 'CANCELED' WHERE order_id = :order_id");
$stmt->bindParam(':order_id', $order_id);
$stmt->execute();
$result = array('success' => true);
$logMessage = "Payment canceled for Order ID: $order_id, Status updated to CANCELED.\n";
// file_put_contents($logFileName, $logMessage, FILE_APPEND);
} else {
$result = array('success' => false);
$logMessage = "Invalid status received for Order ID: $order_id\n";
// file_put_contents($logFileName, $logMessage, FILE_APPEND);
}
// === CLIENT_PAYMENT ===
elseif ($data['table_name'] === 'client_payment') {
if ($status === 'Success') {
$pdo->prepare("UPDATE client_payment SET status='SUCCESS', update_time=NOW() WHERE order_id=?")
->execute([$order_id]);
$result = ['success' => true, 'message' => "Client payment success"];
// writeLog("Client payment sukses | Order=$order_id");
} elseif ($status === 'Canceled') {
$pdo->prepare("UPDATE client_payment SET status='CANCELED', update_time=NOW() WHERE order_id=?")
->execute([$order_id]);
$result = ['success' => true, 'message' => "Client payment canceled"];
// writeLog("Client payment canceled | Order=$order_id");
} else {
throw new Exception("Invalid status for client_payment | Order=$order_id");
}
}
} catch (Exception $e) {
$result = ['success' => false, 'message' => $e->getMessage()];
writeLog("ERROR | Order=$order_id | " . $e->getMessage());
}
// Set response header and return JSON result
header('Content-type: application/json');
header('Content-Type: application/json');
echo json_encode($result);
@@ -0,0 +1,4 @@
[2025-09-18 01:50:22] ERROR | Order=7733908392871 | Order not found: 7733908392871
[2025-09-18 01:56:26] ERROR | Order=4199868221255 | Order not found: 4199868221255
[2025-09-18 01:56:28] ERROR | Order=2580772857198 | Order not found: 2580772857198
[2025-09-18 22:25:16] ERROR | Order=0458599414057 | Order not found: 0458599414057
+3 -3
View File
@@ -50,7 +50,7 @@ session_start();
<br>
<div class="container" style="max-width: 900px;">
<center>
<img src="../../dist/img/logo.png" width="230px" class="mb-4">
<img src="../../dist/img/logo_clr.png" width="230px" class="mb-4">
</center>
<div class="card">
<div class="card-header bg-warning">
@@ -59,7 +59,7 @@ session_start();
<div class="card-body">
<div class="row">
<div class="col-md-6">
<table class="table table-borderless">
<table class="table table-borderless table-respon">
<tbody>
<tr>
<td>Nama Usaha</td>
@@ -104,7 +104,7 @@ session_start();
<div class="modal-dialog modal-dialog-centered modal-sm">
<div class="modal-content">
<div class="modal-header bg-warning">
<img src="../../dist/img/logo_long_white.png" width="100px">
<img src="../../dist/img/logo_wht.png" width="100px">
</div>
<small><small>
<div class="modal-body" style="background-color: rgb(240, 240, 240); text-align: left;">
+2 -2
View File
@@ -70,7 +70,7 @@ function generateOrderId($pdo) {
<br>
<div class="container" style="max-width: 900px;">
<center>
<img src="../../dist/img/logo.png" width="230px" class="mb-4">
<img src="../../dist/img/logo_clr.png" width="230px" class="mb-4">
</center>
<div class="card">
<div class="card-header bg-warning">
@@ -186,7 +186,7 @@ function generateOrderId($pdo) {
<div class="modal-dialog modal-dialog-centered modal-sm">
<div class="modal-content">
<div class="modal-header bg-warning">
<img src="../../dist/img/logo_long_white.png" width="100px">
<img src="../../dist/img/logo_wht.png" width="100px">
</div>
<small><small>
<div class="modal-body" style="background-color: rgb(240, 240, 240); text-align: left;">