beginTransaction();
// Ambil data paket
$stmt = $pdo->prepare("SELECT radius_data,durasi,nama_profile,harga_paket FROM profile_paket WHERE id = :idp");
$stmt->execute([':idp' => $_POST['idp']]);
$paket = $stmt->fetch(PDO::FETCH_ASSOC);
// ====== KIRIM KE API MIKROTIK ======
$stmt = $pdo->prepare("SELECT ip_address,username,password,port_api,radius_nas_data FROM setting_mikrotik WHERE id = :id");
$stmt->execute([':id' => $_POST['idm']]);
$mikrotik = $stmt->fetch(PDO::FETCH_ASSOC);
$dataMik = json_decode($mikrotik['radius_nas_data']);
if (!$paket) {
throw new Exception("Paket tidak ditemukan.");
}
$data = json_decode($paket['radius_data']);
$kode = $data ? 'VR' : 'VM'; // VR = Radius, VM = MikroTik
$jenis = $data ? 'sv-radius' : 'sv-mikrotik';
$karakter = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm";
$str = $paket['durasi'];
$jumlah = intval($_POST['jumlah']);
$date = date('Y-m-d H:i:s');
// Validasi jumlah
if ($jumlah < 1 || $jumlah > 200) {
throw new Exception("Jumlah voucher harus antara 1-200.");
}
// Generate voucher unik
$voucherList = [];
while (count($voucherList) < $jumlah) {
$kodevoucher = $str . substr(str_shuffle($karakter), 0, 7) . $kode;
// Pastikan tidak duplikat di DB & array
$cek = $pdo->prepare("SELECT COUNT(*) FROM ganerate_voucher WHERE voucher = :voucher");
$cek->execute([':voucher' => $kodevoucher]);
if ($cek->fetchColumn() == 0 && !in_array($kodevoucher, $voucherList)) {
$voucherList[] = $kodevoucher;
}
}
// Kirim ke Radius atau MikroTik
$successVoucher = [];
$failVoucher = [];
if ($data) {
// ====== KIRIM KE RADIUS ======
$radius = new CrudRadiusServer();
$apiResponse = $radius->request('add_user', 'POST', [
'jenis' => 'Hotspot',
'username' => $voucherList,
'password' => $voucherList,
'groupname' => $data->groupname,
'nasgroupname' => $dataMik->data->{'nasgroupname'}
]);
foreach ($apiResponse['results'] as $res) {
if ($res['status'] === 'success') {
$successVoucher[] = $res['username'];
} else {
$failVoucher[] = $res['username'];
}
}
if (empty($successVoucher)) {
throw new Exception("Tidak ada voucher yang berhasil dibuat di Radius.");
}
} else {
require('router_api/routeros_api.class.php');
$API = new RouterosAPI();
$API->debug = false;
if (!$API->connect2($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password'], $mikrotik['port_api'])) {
throw new Exception("Gagal konek ke API MikroTik.");
}
foreach ($voucherList as $vcr) {
$result = $API->comm('/ip/hotspot/user/add', [
"name" => $vcr,
"password" => $vcr,
"profile" => $paket['nama_profile'], // pastikan field profile ada di DB
"server" => "all"
]);
if (isset($result['!trap'])) {
$failVoucher[] = $vcr;
} else {
$successVoucher[] = $vcr;
}
}
$API->disconnect();
if (empty($successVoucher)) {
throw new Exception("Tidak ada voucher yang berhasil dibuat di MikroTik.");
}
}
// Insert ke DB hanya yang sukses
$values = [];
$params = [];
foreach ($successVoucher as $voucher) {
$values[] = "(?, ?, ?, ?, ?, ?, ?)";
$params[] = $_POST['ids']; // id_data_server
$params[] = $_POST['idm']; // id_setting_mikrotik
$params[] = $_POST['idp']; // id_profile_paket
$params[] = $voucher; // voucher
$params[] = $paket['harga_paket']; // harga
$params[] = $jenis; // jenis
$params[] = $date; // create_time
}
$sql = "INSERT INTO ganerate_voucher
(id_data_server, id_setting_mikrotik, id_profile_paket, voucher, harga, jenis, create_time)
VALUES " . implode(", ", $values);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
// Commit transaksi
$pdo->commit();
$totalSuccess = count($successVoucher);
$totalError = count($failVoucher);
sweetAlert("$totalSuccess voucher berhasil dibuat. Gagal: $totalError", "success");
} catch (Exception $e) {
$pdo->rollBack();
// sweetAlert("Gagal membuat voucher: " . $e->getMessage(), "error");
}
}
?>
Akumulasi Keuangan Voucher
set_list("setting_mikrotik", $SqlDataWHId);
?>
Mikrotik
Login Page Script
");
navigator.clipboard.writeText(text).then(() => {
// console.log("Script berhasil disalin!");
});
}
| Server |
Voucher |
Harga |
Biaya |
Saldo |
Status |
Dibuat |
Aktif |
Expired |