Update Banyak
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user