MikhPay (Mikrotik Hotspot Monitor & Transaction System) adalah aplikasi web berbasis PHP untuk mengelola dan memantau Hotspot MikroTik, khususnya untuk pembuatan voucher otomatis. Versi ini telah dimodernisasi dengan penambahan REST API untuk integrasi eksternal, Portal Pembelian Voucher Mandiri terintegrasi dengan Sistem QRIS Dinamis Mandiri (tanpa potongan payment gateway pihak ketiga), serta sistem Pengerasan Keamanan (Security Hardening) kelas enterprise.
Aplikasi ini dikembangkan dan dimodifikasi dari kode sumber asli Mikhmon v3 oleh Laksamadi Guko.
-
Portal Pembelian Mandiri (
frontpage.php)- Tampilan Modern: Desain premium berorientasi mobile-first (Light Theme, Glassmorphism, dan Bottom Nav).
- Sistem QRIS Mandiri: Membuat QR Code QRIS dinamis (berisi nominal unik tambahan) secara lokal (offline) langsung dari string QRIS Statis Anda tanpa pihak ketiga.
- Real-time Updates: Status pembayaran dapat terpantau menggunakan HTTP Polling.
-
REST API Endpoint (
api.php)- Keamanan: Otentikasi aman menggunakan parameter
api_keyatau headerX-API-Key. - Informasi Paket: Endpoint cepat untuk melihat profil hotspot dan detail harga.
- Generate Voucher: Pembuatan kode voucher secara otomatis dan programatis untuk diintegrasikan dengan aplikasi pihak ketiga.
- Keamanan: Otentikasi aman menggunakan parameter
-
Verifikasi Pembayaran Otomatis (
qris_verify.php)- Dukungan MacroDroid/Tasker: Endpoint verifikasi ringan untuk disambungkan dengan aplikasi automasi HP (pembaca notifikasi E-Wallet/Mutasi Bank) menggunakan
QRIS_SECRET_TOKEN. - Auto-Cleanup: Terdapat cronjob pembersih transaksi (
cron_qris.php) untuk membatalkan tagihan kedaluwarsa setelah 15 menit agar kode unik terbebas.
- Dukungan MacroDroid/Tasker: Endpoint verifikasi ringan untuk disambungkan dengan aplikasi automasi HP (pembaca notifikasi E-Wallet/Mutasi Bank) menggunakan
-
Penguatan Keamanan Sistem (Security Hardening - v1.7 & v1.8)
- Brute-Force Protection: Membatasi kegagalan percobaan login administrator maksimal 5 kali. IP yang melanggar diblokir otomatis selama 10 menit (
data/login_rate_limit.json). - Session Fixation Protection: Meregenerasi ID sesi peramban secara otomatis (
session_regenerate_id(true)) sesaat setelah login administrator sukses. - Session Cookie Hardening: Mengamankan parameter
session_start()di semua entry point dengan parameter cookie ketat (HttpOnly,SameSite=Lax,use_only_cookies, danSecuredinamis yang menyesuaikan protokol HTTPS/HTTP). - Konfigurasi Aman
.env.php: Mengisolasi semua kunci API ke dalam berkas.env.phpterproteksi eksekusi PHP (exit;), mencegah kebocoran informasi teks polos jika diakses publik di server non-Apache (Nginx, IIS, Caddy). - Rate Limiting Webhook: Membatasi laju request verifikasi webhook hingga maksimal 60 request per menit per alamat IP untuk menangkal serangan Denial of Service (DoS).
- Pembersihan Cache Logout: Menghapus total
localStorage&sessionStorageperamban saat administrator logout.
- Brute-Force Protection: Membatasi kegagalan percobaan login administrator maksimal 5 kali. IP yang melanggar diblokir otomatis selama 10 menit (
Important
PENTING UNTUK INSTALASI DI VPS/LINUX (aaPanel, cPanel, dll.):
Setelah Anda melakukan git clone atau mengunggah berkas ke VPS, folder-folder berikut wajib memiliki pemilik (Owner) www (atau user web server Anda) dan izin menulis (Write Permission / 755 / 775):
data/(Penyimpanan database JSON & konfigurasi)voucher/(Penyimpanan data transaksi pembelian voucher pelanggan)logs/(Penyimpanan catatan error log sistem)include/(Penyimpanan file konfigurasi dinamis)
Jika folder di atas masih dimiliki oleh root (biasanya karena proses upload/clone via root), Anda akan mengalami masalah: gagal menyimpan tambah router, mengubah password loading berputar terus-menerus, serta status beli voucher error saat bayar QRIS karena file transaksi gagal terbuat.
Solusi Cepat via Terminal SSH (sebagai root):
chown -R www:www data voucher logs include
chmod -R 755 data voucher logs include(Ubah www:www sesuai user web server di panel Anda jika berbeda, misalnya www-data).
Buat berkas baru bernama .env.php di root direktori MikhPay Anda (sejajar dengan index.php). Salin dan sesuaikan konfigurasi berikut:
<?php header('HTTP/1.0 403 Forbidden'); exit; ?>
# ==============================================================================
# BERKAS KONFIGURASI LINGKUNGAN (.env.php)
# ==============================================================================
# API Key untuk mengamankan REST API (api.php / cron_retry.php)
MIKHMON_API_KEY="mikhmon_api_key_12345"
# Kredensial QRIS Mandiri (Ganti dengan string hasil scan QR statis Anda)
QRIS_MODE=true
QRIS_STATIC_STRING="00020101021126670016COM.GO-JEK.WWW0118...YOUR_QRIS_STRING..."
QRIS_SECRET_TOKEN="ganti_dengan_token_rahasia_anda_123"
# WebSocket (Pusher / Soketi) - Opsional
WS_APP_ID="YOUR_PUSHER_APP_ID"
WS_APP_KEY="YOUR_PUSHER_KEY"
WS_APP_SECRET="YOUR_PUSHER_SECRET"
WS_CLUSTER="ap1"
# Konfigurasi Tambahan Soketi (Hanya jika menggunakan server WebSocket mandiri)
# WS_HOST="your-soketi-host.com"
# WS_PORT="6001"
# WS_SCHEME="https"Kredensial MikroTik, nama sesi, IP, user, password, dan dnsname diatur secara otomatis melalui Web Admin Panel MikhPay pada menu Admin Settings > Add Router / Edit Settings.
Important
Berkas include/config.php bawaan repositori sudah dikonfigurasi secara dinamis untuk memuat sesi dari database (data/database.php). Anda TIDAK PERLU menyalin atau mengubah nama config.php.example menjadi config.php. Biarkan include/config.php bawaan apa adanya agar pengaturan sesi tetap tersimpan otomatis ke database.
- Web Admin Panel:
http://localhost/admin.php - Portal Mandiri Pelanggan:
http://localhost/(Otomatis diarahkan kefrontpage.php) - REST API:
http://localhost/api.php - Notification Webhook:
http://localhost/notification.php
Sebagai alternatif pengganti MacroDroid yang lebih mudah dikonfigurasi, andal, dan ramah baterai, Anda dapat menggunakan aplikasi Android bawaan MikhPay-Forwarder yang berada di dalam repositori ini pada folder android-app/.
- Konfigurasi Instan: Hanya perlu mengisi URL Webhook (
https://yourdomain.com/qris_verify.php) dan Token API Anda. - Sistem Latar Belakang Tangguh: Menggunakan NotificationListenerService bawaan Android yang berjalan 24/7 di latar belakang dengan konsumsi daya sangat rendah.
- Mulai Otomatis (Auto-Start on Boot): Otomatis aktif kembali di latar belakang saat HP dinyalakan ulang (restart) tanpa intervensi manual.
- Abaikan Optimasi Baterai: Satu ketukan tombol untuk menonaktifkan pembatasan daya baterai Android agar layanan tidak dibunuh oleh sistem HP secara sepihak.
- Auto-Parsing & Regex Kustom: Mengekstrak nominal transfer secara cerdas dari notifikasi (seperti GoPay Merchant, Dana, OVO, Shopee Partner, dll.). Dilengkapi kolom pengatur Regex kustom langsung di aplikasi untuk format teks khusus.
- Panel Log Riwayat Lokal: Menampilkan daftar 20 pengiriman notifikasi terakhir secara visual lengkap dengan status sukses/gagal dan respon server di halaman utama.
- Simulator Notifikasi Terintegrasi: Tombol uji simulasi terintegrasi untuk memicu notifikasi masuk tiruan langsung dari aplikasi guna memverifikasi parser Regex dan Webhook secara end-to-end tanpa uang sungguhan.
- Respon Getar Sukses (Haptic Feedback): HP bergetar singkat setiap kali notifikasi pembayaran masuk berhasil terverifikasi dan diteruskan ke server MikhPay.
Panduan detail kompilasi dan cara penggunaan dapat Anda lihat di README.md Aplikasi Android.
Agar kode voucher terbuat secara otomatis di MikroTik setelah pelanggan mentransfer saldo ke GoPay/OVO/Dana Anda:
- Gunakan HP Android yang login ke akun e-wallet/bank penerima dana QRIS Anda (yang akan memunculkan notifikasi mutasi saldo masuk).
- Unduh dan pasang aplikasi MacroDroid - Device Automation dari Google Play Store.
- Buka MacroDroid, berikan semua izin akses yang diminta, terutama Akses Notifikasi (Notification Access) di Pengaturan Sistem Android Anda.
Agar notifikasi dan MacroDroid tidak dimatikan oleh sistem Android saat HP dalam kondisi terkunci:
- Masuk ke Pengaturan HP > Aplikasi > GoPay Merchant / MacroDroid.
- Di bagian Baterai/Battery, setel ke Tidak Dibatasi / Unrestricted.
- Di bagian Recent Apps HP Anda, kunci (Lock) aplikasi GoPay Merchant dan MacroDroid agar tidak terhapus saat membersihkan RAM.
- Klik Tambah Makro (Add Macro).
- Pemicu (Triggers - Merah):
- Klik + > pilih Event Perangkat > Notifikasi > Notifikasi Diterima.
- Pilih Pilih Aplikasi > centang GoPay Merchant (atau aplikasi e-wallet Anda lainnya).
- Di kolom Teks Berisi, pilih Sembarang (Any).
- Tindakan (Actions - Biru):
- Klik + > pilih Aplikasi > HTTP Request.
- Pilih metode GET.
- Masukkan URL Webhook Anda. Ganti
domain-anda.comdengan alamat web MikhPay Anda, gunakan token rahasia dari.env.php, dan gunakan variabel{notification}di ujungnya (klik tombol titik tiga[...]-> Notification -> Notification Text untuk memasukkannya secara otomatis):(Gunakanhttps://[domain-anda.com]/qris_verify.php?token=[token_rahasia_anda]&nominal={notification}https://jika web server Anda memaksa sambungan SSL agar request tidak diblokir/dialihkan). - Klik Simpan (ikon disket di pojok kanan bawah).
Selesai! Server MikhPay Anda secara otomatis akan membaca kalimat notifikasi tersebut, menyaring angkanya, dan langsung memproses pelunasan voucher dalam hitungan detik.
Agar pelanggan dapat membeli voucher secara langsung saat terhubung ke Hotspot, Anda perlu menghubungkan halaman login bawaan MikroTik (login.html) dengan portal MikhPay.
Edit berkas login.html di dalam folder hotspot MikroTik Anda (dapat diunduh via FTP atau menu Files di Winbox). Tambahkan kode tombol berikut:
<a href="http://[ip-atau-domain-mikhpay]/" style="display:block; background:#4f46e5; color:white; padding:12px; text-align:center; border-radius:8px; text-decoration:none; font-weight:bold; margin-top:10px;">
Beli Voucher Otomatis (QRIS / E-Wallet)
</a>Ganti [ip-atau-domain-mikhpay] dengan alamat IP atau Domain tempat Anda meng-host MikhPay.
Karena pelanggan yang belum login diblokir akses internetnya oleh MikroTik, Anda wajib mendaftarkan alamat IP server MikhPay ke Walled Garden agar dapat diakses secara gratis sebelum login.
Jalankan perintah berikut di New Terminal Winbox MikroTik Anda:
# Izinkan akses ke Web Server MikhPay
/ip hotspot walled-garden ip add dst-host=[ip-atau-domain-mikhpay] action=allow
# Izinkan sistem pembayaran e-wallet agar pelanggan bisa scan QR dari HP-nya
/ip hotspot walled-garden add dst-host=*.gopay.co.id action=allow
/ip hotspot walled-garden add dst-host=*.go-pay.co.id action=allow
/ip hotspot walled-garden add dst-host=*.gopayapi.com action=allow
/ip hotspot walled-garden add dst-host=*.shopeepay.co.id action=allow
# Izinkan WebSocket Pusher untuk deteksi real-time
/ip hotspot walled-garden add dst-host=*.pusher.com action=allow
/ip hotspot walled-garden add dst-host=*.pusherapp.com action=allow
# Izinkan font dan aset web CDN
/ip hotspot walled-garden add dst-host=fonts.googleapis.com action=allow
/ip hotspot walled-garden add dst-host=fonts.gstatic.com action=allow
/ip hotspot walled-garden add dst-host=cdnjs.cloudflare.com action=allow
Ganti 172.16.11.91 pada baris pertama dengan IP/Domain publik hosting portal MikhPay Anda.
Setelah pembayaran lunas, portal MikhPay akan memunculkan tombol "Hubungkan Sekarang". Tombol ini otomatis mengirimkan parameter login langsung ke MikroTik (http://[dnsname]/login?username=[voucher]&password=[voucher]) sehingga pengguna langsung terhubung ke internet tanpa perlu mengetik kode voucher secara manual.
Gunakan header X-API-Key atau parameter query api_key untuk otentikasi.
- Endpoint:
GET /api.php - Parameter:
action=profilessession=Hotspot(Nama sesi router Anda)
- Contoh Request:
GET http://localhost/api.php?action=profiles&session=Hotspot&api_key=mikhmon_api_key_12345
- Endpoint:
POST /api.php - Parameter POST:
action=generatesession=Hotspotprofile=Profil_1Jam_2K(Nama profil hotspot di MikroTik)qty=1
- Penyebab: VPS (seperti aaPanel) menonaktifkan fungsi
putenv()demi alasan keamanan melalui direktifdisable_functionsdi filephp.ini. - Solusi: MikhPay v1.0+ sudah dilengkapi helper
mikhmonEnv()yang aman dan kompatibel tanpa bergantung padaputenv(). Jika Anda masih menemui kendala ini, pastikan Anda menggunakan berkasinclude/env_config.phpterbaru.
- Penyebab: Web server (user
wwwatauwww-data) tidak memiliki hak akses menulis (write permission) pada folder/data. Hal ini terjadi jika Anda melakukan clone/pull git menggunakan userroot. - Solusi: Ubah kepemilikan owner folder
data/menjadiwwwlewat File Manager aaPanel (klik kanan folderdata-> Permission -> Ubah Owner kewwwdengan permission755/775dan centang Apply to subdir).
- Penyebab: Pengguna lama Mikhmon terbiasa mengubah nama berkas
.exampleke.php. Pada MikhPay v1.0+, berkasinclude/config.phpsudah disertakan langsung di repositori untuk menjembatani sesi router ke database. - Solusi: Biarkan
include/config.phpbawaan apa adanya. Anda hanya perlu menyalin.env.exampleke.env.phpdi root folder dan menyesuaikan API Key Anda di sana.
- Penyebab 1 (Izin Folder): Web server tidak memiliki hak akses menulis (write permission) pada folder
/voucherdi server aaPanel/Hosting Anda, sehingga berkas transaksi.jsontidak bisa tersimpan. - Solusi 1: Masuk ke File Manager hosting Anda, cari folder
voucher/(buat jika belum ada), klik kanan -> Permission -> Ubah Owner kewww(atauwww-data) dengan permission755atau775(centang Apply to subdir). Lakukan hal yang sama untuk folderdata/danlogs/. - Penyebab 2 (Variabel MacroDroid Salah): Pada aksi HTTP Request di MacroDroid, Anda memasukkan variabel
{not_title}(Judul Notifikasi). Ini salah karena judul notifikasi adalah "GoPay Merchant", bukan teks isi pesan yang mengandung nominal transfer. - Solusi 2: Ubah parameter
&nominal={not_title}pada URL MacroDroid menjadi&nominal={notification}(atau[notification]) agar yang dikirimkan adalah isi teks notifikasi lengkap. - Penyebab 3 (OPcache Caching): Pada aaPanel, konfigurasi
.env.phpyang baru saja diperbarui tidak langsung dibaca oleh web server karena tersimpan di memori OPcache PHP-FPM. - Solusi 3: Lakukan restart layanan PHP (PHP-FPM) atau Nginx di aaPanel Anda untuk membersihkan cache memori.
- Penyebab 1 (Kunci Enkripsi Mismatch): Anda baru saja mengubah atau menambahkan
ENCRYPTION_KEYpada file.env.php. Karena kunci berubah, password MikroTik Anda yang tersimpan di database (dienkripsi dengan kunci lama) tidak dapat didekripsi dengan benar (menjadi karakter acak/sampah) sehingga koneksi ditolak. - Solusi 1: Masuk ke Admin Panel MikhPay Anda -> Session Settings -> klik Edit pada router Anda -> Ketik ulang password asli MikroTik Anda (misal
password_mikrotik_anda) -> Klik Save. Ini akan mengenkripsi ulang password menggunakan kunci baru Anda di.env.php. - Penyebab 2 (API Port MikroTik Mati): Fitur API pada MikroTik belum diaktifkan.
- Solusi 2: Buka Winbox -> masuk ke IP > Services -> pastikan status
api(port8728) dalam keadaan aktif (Enabled).
Riwayat pembaruan sistem dan log perbaikan versi lengkap dapat Anda akses secara detail di berkas changelog.md.
