Integrasi Hotspot MikroTik & Cyberoam via SMS dan WhatsApp
Panduan teknis bagi Network Engineer untuk mengirim OTP Hotspot via SMS dan WhatsApp Business API menggunakan script POST /tool fetch di MikroTik dan Cyberoam.

Pelanggan hotspot mengetik nomor HP di captive portal, lalu menunggu kode yang tak kunjung datang, biang keroknya hampir selalu satu baris script yang salah memanggil API. Voucher OTP memang terlihat sederhana, tapi detail teknisnya yang menentukan jalan atau mentok. Di sini kita bahas cara menyambungkan MikroTik dan Cyberoam (Sophos) ke Zenziva lewat HTTP POST, via SMS, Voice, atau WhatsApp, dan kompatibel dengan dua platform Zenziva: Console dan WABA Platform.
Cari notifikasi tagihan otomatis, bukan login hotspot? Baca Panduan Notifikasi Tagihan
Arsitektur Otentikasi Hotspot Berbasis OTP
Sebelum menyentuh script, pahami alurnya. Saat pengunjung terkoneksi ke Access Point, mereka diarahkan ke Captive Portal. Saat mereka memasukkan nomor HP, router akan meng-generate password secara lokal lalu memanggil API Zenziva secara asinkron untuk mengirimkan password tersebut.
- Pengunjung terkoneksi ke Access Point dan diarahkan ke Captive Portal.
- Pengunjung memasukkan nomor HP.
- Router meng-generate password secara lokal.
- Router memanggil API Zenziva menggunakan HTTP POST.
- Pengunjung menerima SMS/WhatsApp berisi kode OTP, lalu login.
Kompatibilitas Platform dengan API Zenziva
Kuncinya ada di dua kebutuhan teknis yang berbeda. API Console (SMS & Voice) cuma butuh HTTP POST biasa dengan parameter form (userkey, passkey, to, message), hampir semua perangkat bisa. WABA Platform butuh custom header X-API-Key plus body JSON, jadi hanya perangkat yang bisa mengirim header kustom yang mendukungnya.
| Platform | Console (SMS & Voice) | WABA Platform |
|---|---|---|
| MikroTik (/tool fetch) | ✅ http-data (form POST) | ✅ http-header-field + JSON (RouterOS 6.43+) |
| Cyberoam / Sophos XG | ✅ parameter URL/POST (userkey, passkey, dll.) | ❌ tidak ada custom header / body JSON |
| Aplikasi billing (MixRadius, Mikhmon, dll.) | ✅ jika ada fitur custom HTTP gateway | ⚠️ hanya jika app mendukung header + JSON |
| Server / backend sendiri (PHP, Node, dll.) | ✅ penuh | ✅ penuh |
Karena Cyberoam dan Sophos XG hanya mendukung parameter URL/POST, tanpa custom HTTP header (X-API-Key) atau body JSON, keduanya tidak bisa memanggil WABA Platform secara langsung. Solusinya: pakai jalur SMS Console (seperti contoh di bawah), atau relay lewat skrip MikroTik / endpoint middleware kecil yang menerjemahkan request appliance menjadi format WABA.
1. Integrasi MikroTik Hotspot via /tool fetch (POST)
Di MikroTik, kita memanfaatkan fitur Event Scheduler pada User Profile. Buka WinBox, navigasi ke IP > Hotspot > User Profiles, lalu edit profile yang digunakan. Di tab 'Scripts', pada bagian 'On Login', Anda bisa memanggil API Zenziva.
Script A: Mengirim SMS Masking
Gunakan protokol HTTP Form-Data (http-data). Variabel $user akan otomatis terisi dengan username (nomor HP) pengunjung.
/tool fetch url="{CONSOLE_BASEURL}/masking/api/sendsms/" http-method=post http-data="userkey=API_USERKEY&passkey=API_PASSKEY&to=$user&message=Kode+Login+WiFi+Anda+adalah+$password" keep-result=no
Script B: Mengirim via WhatsApp Business API (WABA v1)
Kalau Anda memakai WABA Platform Zenziva (akun terbaru), pengirimannya lewat payload JSON dengan otentikasi di HTTP Header (X-API-Key), bukan userkey/passkey seperti Console. Di MikroTik, ini butuh syntax escape (\") di dalam string.
/tool fetch url="{WABA_BASEURL}/api/messages/v1/send" http-method=post http-header-field="X-API-Key: YOUR_API_KEY,Content-Type: application/json" http-data="{\"to\":\"$user\",\"templateName\":\"otp_hotspot\",\"templateLanguage\":\"id\",\"bodyVariables\":[\"$password\"]}" keep-result=no
Parameter keep-result=no sangat krusial biar memori penyimpanan MikroTik tidak cepat penuh gara-gara file respon HTTP.
2. Integrasi Cyberoam / Sophos (Custom HTTP Gateway)
Untuk Cyberoam atau Sophos XG Firewall, navigasi ke menu Identity > Guest Users > SMS Gateway. Karena UI Cyberoam didesain untuk integrasi webhook sederhana, kita mem-mapping parameternya secara eksplisit.
- Gateway Name: Zenziva API
- URL: {CONSOLE_BASEURL}/masking/api/sendsms/
- HTTP Method: POST
Pada bagian Request Parameters, masukkan:
| Parameter Name | Value |
|---|---|
| userkey | API_USERKEY |
| passkey | API_PASSKEY |
| to | {mobileno} (Variabel bawaan Cyberoam) |
| message | Kode OTP Anda: {password} |
3. Jalan Pintas: Bridge untuk WABA di Perangkat Terbatas
Cyberoam, Sophos, dan sebagian billing app lama tidak bisa mengirim custom header (X-API-Key) atau body JSON, jadi tidak bisa memanggil WABA Platform langsung. Triknya: pasang relay kecil, dan ini bisa serverless alias tanpa server sama sekali. Perangkat cukup memanggil URL biasa (parameter di query), lalu relay yang menyusun header dan JSON-nya ke Zenziva.
Ini adalah workaround dari komunitas, bukan fitur resmi Zenziva, jadi segala risiko kerusakan atau penyalahgunaan ditanggung sendiri. Wajib amankan sistem: pakai token rahasia, whitelist khusus untuk IP perangkat jaringan, dan pastikan running di HTTPS.
Relay-nya bisa di-host di mana saja. Dari yang paling gampang:
- Tanpa coding: pakai Pipedream, Make, atau n8n, buat workflow 'Webhook masuk → HTTP request keluar' dengan header X-API-Key dan body JSON. Cocok kalau Anda tidak mau menyentuh kode.
- Cloudflare Workers (rekomendasi): gratis sampai 100.000 request/hari, langsung dapat URL HTTPS, dan tanpa server sama sekali. Deploy cukup tempel kode di dashboard lalu klik Deploy.
- Google Apps Script: 100% gratis dan cuma butuh akun Google, tulis script-nya, klik Deploy > New deployment > Web app, dan URL endpoint langsung jadi. Opsi paling cocok buat yang terbiasa main di ekosistem Google.
- PHP/Node di server sendiri: kalau kebetulan punya web host, logika script yang sama tinggal di-deploy ke sana.
Contoh Cloudflare Worker. Simpan TOKEN, API_KEY, WABA_URL, TEMPLATE, dan LANG sebagai Environment Variables (Settings > Variables), jangan ditaruh di dalam kode:
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.searchParams.get('token') !== env.TOKEN)
return new Response('forbidden', { status: 403 });
const to = (url.searchParams.get('to') || '').replace(/[^0-9+]/g, '');
const otp = (url.searchParams.get('otp') || '').replace(/[^A-Za-z0-9]/g, '');
if (!to || !otp) return new Response('missing to/otp', { status: 400 });
const res = await fetch(env.WABA_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': env.API_KEY },
body: JSON.stringify({
to,
templateName: env.TEMPLATE,
templateLanguage: env.LANG,
bodyVariables: [otp],
}),
});
return new Response(await res.text(), { status: res.status });
},
};
Atau versi Google Apps Script. Simpan TOKEN, API_KEY, WABA_URL, TEMPLATE, dan LANG di Project Settings > Script Properties, lalu Deploy sebagai Web app (Execute as: Me, Who has access: Anyone):
function doGet(e) { const p = PropertiesService.getScriptProperties(); if (e.parameter.token !== p.getProperty('TOKEN')) return ContentService.createTextOutput('forbidden'); const to = (e.parameter.to || '').replace(/[^0-9+]/g, ''); const otp = (e.parameter.otp || '').replace(/[^A-Za-z0-9]/g, ''); if (!to || !otp) return ContentService.createTextOutput('missing to/otp'); const res = UrlFetchApp.fetch(p.getProperty('WABA_URL'), { method: 'post', contentType: 'application/json', headers: { 'X-API-Key': p.getProperty('API_KEY') }, payload: JSON.stringify({ to: to, templateName: p.getProperty('TEMPLATE'), templateLanguage: p.getProperty('LANG'), bodyVariables: [otp], }), muteHttpExceptions: true, }); return ContentService.createTextOutput(res.getContentText()); }
Di sisi perangkat, arahkan SMS/OTP gateway ke relay tadi pakai URL biasa, bagian ini pasti didukung Cyberoam, Sophos, maupun billing app:
https://relay-anda.workers.dev/?token=GANTI_TOKEN_RAHASIA&to={mobileno}&otp={password}Tips & Troubleshooting dari Lapangan
Kebanyakan integrasi gagal bukan karena API-nya, tapi karena detail kecil di sisi perangkat. Ini yang paling sering bikin OTP tidak sampai:
- Masalah sertifikat SSL di MikroTik jadul: pastikan impor root CA yang tepat ke /certificate. Endpoint Console pakai GlobalSign Root CA - R6; sedangkan WABA Platform pakai Google Trust Services LLC. Kalau pakai relay via Cloudflare Workers atau Google Apps Script, keduanya juga (sementara ini) pakai Google Trust Services LLC, jadi cukup satu root CA buat mengcover semuanya. Buat fase testing memang boleh pakai check-certificate=no, tapi pas naik produksi sangat disarankan impor CA demi keamanan.
- Spasi di pesan: di http-data, ganti tiap spasi jadi + (seperti contoh) atau %20. Kalau tidak, pesan bisa terpotong di spasi pertama.
- Format nomor tujuan: variabel $user biasanya nyedot username hotspot (berupa nomor HP). Console SMS bisa terima format 08xxxxxxxxxx, tapi WABA Platform strict harus format E.164 (+628xxxxxxxxxx). Pastikan dinormalisasi dulu kalau sistem portal menyimpannya dalam format yang beda.
- WABA wajib pakai template ter-approve: pastikan nama template (misal: otp_hotspot) sudah disetujui pihak Meta, dan mapping urutan bodyVariables harus match dengan placeholder {{1}}, {{2}} di dalam template tersebut.
Sebelum menanam script di On-Login, biasakan tes eksekusi perintah /tool fetch secara manual di Terminal WinBox pakai nomor sendiri. Kalau SMS atau WhatsApp-nya berhasil masuk, baru copas script-nya ke User Profile. Trik simpel ini bakal sangat menghemat waktu debugging.
- Console (SMS & Voice) cukup HTTP POST form (userkey/passkey), jalan di hampir semua perangkat, termasuk Cyberoam.
- WABA Platform butuh header X-API-Key + body JSON, didukung MikroTik, tapi tidak oleh SMS gateway bawaan Cyberoam/Sophos.
- Pakai keep-result=no di MikroTik supaya storage router tidak penuh oleh file respon HTTP.
- Uji script manual di Terminal sebelum dipasang ke On-Login.
Sudah siap mencoba? Cek biaya per pesan di halaman harga, lalu daftar dan ambil userkey/passkey (Console) atau API Key (WABA Platform) untuk mulai mengirim OTP hotspot hari ini.
Jangkau Pelanggan di Channel Favorit Mereka
Butuh WhatsApp, SMS, atau Voice Call? Pilih jalur komunikasi yang paling pas untuk kebutuhan bisnis Anda hari ini.