Dokumentasi ini menjelaskan cara berinteraksi dengan Node.js Gateway (Baileys) menggunakan aplikasi PHP Anda. Semua komunikasi dari PHP ke Node.js menggunakan metode HTTP POST dengan *payload* berformat JSON.
Semua permintaan diarahkan ke Base URL dan Port tempat server Node.js Anda berjalan (default: 3000).
http://[IP_SERVER_NODE]:[PORT_NODE]
Contoh: http://192.168.1.10:3000 atau http://localhost:3000
/session/status/:sessionId
| Nama | Deskripsi | Contoh |
|---|---|---|
:sessionId | ID Sesi (Nomor WA Anda tanpa +) | 62876543210 |
| Status Node.js | Keterangan | Respon JSON Kunci |
|---|---|---|
| connected | Sesi aktif dan siap kirim. | {"status": "connected", "user": {...}, "webhook_registered": true/false} |
| qr_required | Sesi baru atau terputus (Kode 515), perlu di-scan. | {"status": "qr_required", "qr": "data:image/png;base64,...", ...} |
| connecting | Sedang mencoba menghubungkan/memulihkan sesi. | {"status": "connecting", ...} |
/webhook/register
Endpoint ini menyimpan URL Webhook Anda ke database SQLite, sehingga Gateway tahu ke mana harus mengirim pesan masuk untuk sesi tersebut.
{
"sessionId": "62876543210",
"webhookUrl": "http://domainanda.com/receiver/wa_webhook.php"
}
| Nama | Wajib | Deskripsi |
|---|---|---|
sessionId | Ya | ID sesi (nomor WA pengirim). |
webhookUrl | Ya | URL lengkap tempat PHP Anda akan menerima data pesan masuk. |
/session/logout/:sessionId
| Nama | Deskripsi |
|---|---|
:sessionId | ID Sesi yang akan di-logout/dihapus kredensialnya. |
Aksi ini akan menghapus sesi dari WhatsApp, menghapus file kredensial lokal, dan menghapus URL Webhook dari database.
{"status": "success", "message": "Session successfully disconnected and files removed."}
/groups/:sessionId
Mengambil semua daftar grup yang diikuti oleh nomor WhatsApp tersebut. Sangat berguna untuk memetakan grup departemen (Engineering, Housekeeping, dll).
| Nama | Deskripsi | Contoh |
|---|---|---|
:sessionId | Nomor WA pengirim (harus berstatus connected). | 62812345678 |
{
"status": "success",
"data": [
{
"id": "12036302839485@g.us",
"subject": "Grup Engineering Hotel",
"participants_count": 12
},
{
"id": "12036304958671@g.us",
"subject": "Grup Housekeeping",
"participants_count": 8
}
]
}
@g.us adalah ID unik yang harus disimpan di database PHP Anda pada kolom wa_group_id.
/keepalive
Endpoint ringan ini dirancang untuk mencegah server Node.js (terutama yang berjalan di CloudLinux Passenger atau *container* yang memiliki *idle timeout*) dinonaktifkan atau ditidurkan (sleep) oleh sistem *hosting* karena tidak adanya aktivitas.
Endpoint ini harus dipanggil secara otomatis menggunakan Cron Job setiap 2-5 menit sekali.
{"status": "alive", "timestamp": "..."}
/send
{
"sessionId": "62876543210",
"to": "6281234567890", // atau format seperti ini "120363028311xx" untuk ID Grup
"text": "Halo, ini pesan dari API Gateway."
}
| Nama | Wajib | Deskripsi |
|---|---|---|
sessionId | Ya | ID sesi pengirim (nomor WA yang terhubung). |
to | Ya | Nomor tujuan (format 628xxxxxxxx). |
text | Ya | Isi pesan teks. |
/send-media
{
"sessionId": "62876543210",
"to": "6281234567890",
"url": "http://192.168.1.10/uploads/my_file.pdf",
"caption": "Deskripsi opsional untuk media."
}
| Nama | Wajib | Deskripsi |
|---|---|---|
sessionId | Ya | ID sesi pengirim. |
to | Ya | Nomor tujuan. |
url | Ya | URL publik file media (JPG, PNG, PDF, MP4, dsb). |
caption | Tidak | Teks deskripsi yang menyertai media. |
/send-button
{
"sessionId": "62876543210",
"to": "6281234567890",
"text": "Pilih menu layanan:",
"footer": "Layanan Pelanggan 24 Jam.",
"button1": "Info Harga",
"button2": "Layanan Teknis"
}
| Nama | Wajib | Deskripsi |
|---|---|---|
sessionId | Ya | ID sesi pengirim. |
to | Ya | Nomor tujuan. |
text | Ya | Isi pesan utama. |
footer | Tidak | Teks kecil di bawah tombol. |
button1 | Ya | Teks untuk tombol pertama. |
button2 | Tidak | Teks untuk tombol kedua (maks. 3 tombol). |
/send-list-message
{
"sessionId": "62876543210",
"to": "6281234567890",
"text": "Silakan pilih produk yang Anda minati.",
"footer": "Toko Online Kami.",
"title": "Daftar Produk Terbaru",
"sections": [
{
"title": "Kategori A",
"rows": [
{ "rowId": "A1", "title": "Produk X", "description": "Deskripsi Produk X" }
]
},
{
"title": "Kategori B",
"rows": [
{ "rowId": "B1", "title": "Produk Y", "description": "Deskripsi Produk Y" }
]
}
]
}
| Nama | Wajib | Deskripsi |
|---|---|---|
sections | Ya | Array grup/kategori list. Setiap item harus memiliki title dan array rows. |
rows | Ya | Array item yang dapat diklik. Setiap item harus memiliki rowId unik dan title. |
Jika Anda menggunakan Shared Hosting dengan CloudLinux Passenger, aplikasi Node.js akan dinonaktifkan (sleep) setelah beberapa waktu *idle*. Untuk menjaga Gateway tetap aktif 24/7, gunakan *service* Ping / Keep-Alive.
/keepalive di aplikasi Node.js Anda.
Pastikan kode ini ada di *file* index.js Anda:
app.get('/keepalive', (req, res) => {
// Log di konsol hanya untuk verifikasi (opsional)
// console.log('Keep Alive request received at:', new Date().toISOString());
res.json({ status: 'alive', timestamp: new Date().toISOString() });
});
Jadwalkan perintah ini untuk dijalankan **setiap 3-5 menit sekali** menggunakan fitur Cron Job di cPanel Anda.
*/3 * * * * /usr/bin/curl --silent --output /dev/null https://api.domainanda.com/keepalive
Penjelasan Perintah:
*/3 * * * *: Menjalankan perintah setiap 3 menit./usr/bin/curl: Utilitas untuk mengirim *request* HTTP.--silent --output /dev/null: Memastikan tidak ada *output* (dan *error* jaringan) yang dikirimkan ke email Anda (menjaga *hosting* bersih).https://api.domainanda.com/keepalive: Ganti dengan URL publik Node.js Gateway Anda.Gunakan fungsi CURL di PHP untuk mengirim permintaan ke Node.js Gateway. Selalu tangani respons JSON dan periksa kunci "status".
<?php
// GANTI DENGAN URL GATEWAY PUBLIK ANDA
$base_url_node = "https://api.domainanda.com";
/**
* Helper untuk mengirim POST Request ke Node.js
*/
function sendRequest($endpoint, $payload) {
global $base_url_node;
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $base_url_node . $endpoint,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10, // Timeout diatur 10 detik
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => array(
"Content-Type: application/json"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
return ["status" => "error", "message" => "CURL Error: " . $err];
} else {
$res = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE || empty($res)) {
// Tangani respons non-JSON atau kosong (misal: error 503 HTML)
return ["status" => "error", "message" => "Invalid JSON response or empty response: " . $response];
}
return $res;
}
}
/**
* Helper untuk mengirim GET Request Status
*/
function getStatus($sessionId) {
global $base_url_node;
$url = $base_url_node . "/session/status/" . $sessionId;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // Tambahkan timeout
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close($curl);
return json_decode($response, true);
}
?>
<?php
// Contoh penggunaan fungsi sendRequest
$sessionId = "62876543210";
$targetNumber = "6281234567890";
$payload = [
"sessionId" => $sessionId,
"to" => $targetNumber,
"text" => "Pesan percobaan dari PHP."
];
$res = sendRequest("/send", $payload);
if (isset($res['status']) && $res['status'] === "success") {
echo "<p class='success'>Pesan berhasil terkirim!</p>";
} else {
$error_msg = $res['message'] ?? 'Respon gagal atau tidak valid.';
echo "<p class='error'>Gagal mengirim pesan: " . $error_msg . "</p>";
}
?>