📄 Dokumentasi WhatsApp Gateway (Node.js & PHP)

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.


URL Dasar (Base URL)

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

PENTING: Saat menggunakan fitur kirim media, URL media wajib dapat diakses oleh server Node.js (gunakan IP LAN atau Alamat Publik).

Daftar Endpoint API

1. Cek Status Sesi / Minta QR Code / Inisialisasi

GET /session/status/:sessionId

Parameter Path:

NamaDeskripsiContoh
:sessionIdID Sesi (Nomor WA Anda tanpa +)62876543210

Respon (Kunci Penting):

Status Node.jsKeteranganRespon JSON Kunci
connectedSesi aktif dan siap kirim.{"status": "connected", "user": {...}, "webhook_registered": true/false}
qr_requiredSesi baru atau terputus (Kode 515), perlu di-scan.{"status": "qr_required", "qr": "data:image/png;base64,...", ...}
connectingSedang mencoba menghubungkan/memulihkan sesi.{"status": "connecting", ...}

2. Daftarkan Webhook URL (Penerima Pesan Masuk)

POST /webhook/register

Endpoint ini menyimpan URL Webhook Anda ke database SQLite, sehingga Gateway tahu ke mana harus mengirim pesan masuk untuk sesi tersebut.

Payload (JSON Body):

{
  "sessionId": "62876543210",
  "webhookUrl": "http://domainanda.com/receiver/wa_webhook.php"
}

Detail Parameter:

NamaWajibDeskripsi
sessionIdYaID sesi (nomor WA pengirim).
webhookUrlYaURL lengkap tempat PHP Anda akan menerima data pesan masuk.

3. Logout / Hapus Sesi Total

POST /session/logout/:sessionId

Parameter Path:

NamaDeskripsi
:sessionIdID Sesi yang akan di-logout/dihapus kredensialnya.

Aksi ini akan menghapus sesi dari WhatsApp, menghapus file kredensial lokal, dan menghapus URL Webhook dari database.

Respon Sukses:

{"status": "success", "message": "Session successfully disconnected and files removed."}

4. Ambil Daftar Grup WhatsApp (NEW)

GET /groups/:sessionId

Mengambil semua daftar grup yang diikuti oleh nomor WhatsApp tersebut. Sangat berguna untuk memetakan grup departemen (Engineering, Housekeeping, dll).

Parameter Path:

NamaDeskripsiContoh
:sessionIdNomor WA pengirim (harus berstatus connected).62812345678

Struktur Respon Sukses:

{
  "status": "success",
  "data": [
    {
      "id": "12036302839485@g.us",
      "subject": "Grup Engineering Hotel",
      "participants_count": 12
    },
    {
      "id": "12036304958671@g.us",
      "subject": "Grup Housekeeping",
      "participants_count": 8
    }
  ]
}
Catatan Teknis: ID grup yang berakhiran @g.us adalah ID unik yang harus disimpan di database PHP Anda pada kolom wa_group_id.

5. Service Ping / Keep-Alive

GET /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.

Cara Penggunaan:

Endpoint ini harus dipanggil secara otomatis menggunakan Cron Job setiap 2-5 menit sekali.

Respon Sukses:

{"status": "alive", "timestamp": "..."}

📌 Endpoint Pengiriman Pesan

6. Kirim Pesan Teks Sederhana ke Personal / Grup

POST /send

Payload (JSON Body):

{
  "sessionId": "62876543210",
  "to": "6281234567890", // atau format seperti ini "120363028311xx" untuk ID Grup
  "text": "Halo, ini pesan dari API Gateway."
}

Detail Parameter:

NamaWajibDeskripsi
sessionIdYaID sesi pengirim (nomor WA yang terhubung).
toYaNomor tujuan (format 628xxxxxxxx).
textYaIsi pesan teks.

7. Kirim Media (Gambar/Dokumen/Video via URL)

POST /send-media

Payload (JSON Body):

{
  "sessionId": "62876543210",
  "to": "6281234567890",
  "url": "http://192.168.1.10/uploads/my_file.pdf",
  "caption": "Deskripsi opsional untuk media."
}

Detail Parameter:

NamaWajibDeskripsi
sessionIdYaID sesi pengirim.
toYaNomor tujuan.
urlYaURL publik file media (JPG, PNG, PDF, MP4, dsb).
captionTidakTeks deskripsi yang menyertai media.

8. Kirim Pesan Button

POST /send-button

Payload (JSON Body):

{
  "sessionId": "62876543210",
  "to": "6281234567890",
  "text": "Pilih menu layanan:",
  "footer": "Layanan Pelanggan 24 Jam.",
  "button1": "Info Harga",
  "button2": "Layanan Teknis"
}

Detail Parameter:

NamaWajibDeskripsi
sessionIdYaID sesi pengirim.
toYaNomor tujuan.
textYaIsi pesan utama.
footerTidakTeks kecil di bawah tombol.
button1YaTeks untuk tombol pertama.
button2TidakTeks untuk tombol kedua (maks. 3 tombol).

9. Kirim List Message (Template)

POST /send-list-message

Payload (JSON Body):

{
  "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" }
      ]
    }
  ]
}

Detail Parameter Kunci:

NamaWajibDeskripsi
sectionsYaArray grup/kategori list. Setiap item harus memiliki title dan array rows.
rowsYaArray item yang dapat diklik. Setiap item harus memiliki rowId unik dan title.

🔌 Pencegahan Tidur (Keep-Alive Service)

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.

PRASYARAT: Anda harus sudah mengimplementasikan *endpoint* /keepalive di aplikasi Node.js Anda.

A. Implementasi di Node.js (Contoh Express.js)

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() });
});
    

B. Konfigurasi Cron Job (cPanel)

Jadwalkan perintah ini untuk dijalankan **setiap 3-5 menit sekali** menggunakan fitur Cron Job di cPanel Anda.

Perintah Cron (Setiap 3 Menit):

*/3 * * * * /usr/bin/curl --silent --output /dev/null https://api.domainanda.com/keepalive
    

Penjelasan Perintah:


Integrasi PHP (CURL)

Gunakan fungsi CURL di PHP untuk mengirim permintaan ke Node.js Gateway. Selalu tangani respons JSON dan periksa kunci "status".

Contoh Fungsi Helper PHP (Lengkap)

<?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);
  }
?>
  

Contoh Kirim Pesan Teks di PHP

<?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>";
  }
?>