Contoh Kode
Snippet siap-pakai dalam cURL, Node.js, Python, dan PHP untuk skenario integrasi yang umum.
Halaman ini mengumpulkan contoh-contoh paling sering digunakan saat mengintegrasikan dengan API whatsGo. Ganti whats_sk_xxxxx dengan API key milikmu dan sesuaikan nomor telepon dengan format E.164.
Mengirim pesan teks
Pesan WhatsApp paling dasar — cukup nomor tujuan dan isi teks.
cURL
curl -X POST https://whats.sahabatmobile.com/external-api/whatsapp/messages \
-H "Authorization: Bearer whats_sk_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"to": "6281234567890",
"type": "text",
"text": {
"body": "Halo! Pesan ini dikirim melalui API whatsGo."
}
}'
Node.js (fetch)
const BASE = 'https://whats.sahabatmobile.com/external-api';
const API_KEY = 'whats_sk_xxxxx';
async function sendText(to, body) {
const res = await fetch(`${BASE}/whatsapp/messages`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
to,
type: 'text',
text: { body },
}),
});
const data = await res.json();
if (!data.success) {
throw new Error(data.error?.message || 'Gagal mengirim pesan');
}
return data.data;
}
// Contoh pemanggilan
sendText('6281234567890', 'Halo! Pesan ini dikirim melalui API whatsGo.')
.then(console.log)
.catch(console.error);
Python (requests)
import requests
BASE = "https://whats.sahabatmobile.com/external-api"
API_KEY = "whats_sk_xxxxx"
def send_text(to: str, body: str) -> dict:
resp = requests.post(
f"{BASE}/whatsapp/messages",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={
"to": to,
"type": "text",
"text": {"body": body},
},
)
data = resp.json()
if not data["success"]:
raise Exception(data.get("error", {}).get("message", "Gagal mengirim pesan"))
return data["data"]
# Contoh pemanggilan
result = send_text("6281234567890", "Halo! Pesan ini dikirim melalui API whatsGo.")
print(result)
PHP (cURL)
<?php
$base = 'https://whats.sahabatmobile.com/external-api';
$apiKey = 'whats_sk_xxxxx';
function sendText(string $to, string $body): array
{
global $base, $apiKey;
$ch = curl_init("{$base}/whatsapp/messages");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer {$apiKey}",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
'to' => $to,
'type' => 'text',
'text' => ['body' => $body],
]),
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// Contoh pemanggilan
$result = sendText('6281234567890', 'Halo! Pesan ini dikirim melalui API whatsGo.');
print_r($result);
Mengirim OTP via template (Node.js)
Untuk kirim OTP ke pengguna, kamu perlu template WhatsApp yang sudah di-approve. Berikut contoh menggunakan Node.js dengan parameter 1-param.
const BASE = 'https://whats.sahabatmobile.com/external-api';
const API_KEY = 'whats_sk_xxxxx';
async function sendOTP(to, otpCode) {
const res = await fetch(`${BASE}/whatsapp/messages`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
to,
type: 'template',
template: {
name: 'otp_verification',
language: { code: 'id' },
components: [
{
type: 'BODY',
parameters: [
{ type: 'text', text: otpCode },
],
},
],
},
}),
});
const data = await res.json();
if (!data.success) {
throw new Error(data.error?.message || 'Gagal mengirim OTP');
}
return data.data;
}
// Contoh: kirim OTP 6 digit
const otp = String(Math.floor(100000 + Math.random() * 900000));
sendOTP('6281234567890', otp)
.then(() => console.log(`OTP ${otp} terkirim`))
.catch(console.error);
Jangan log OTP di produksi. Di contoh di atas, console.log hanya untuk debugging. Gunakan variabel environment untuk menyimpan API key, jangan hardcode.
List template lalu kirim (Node.js)
Ketika kamu tidak tahu nama template atau bahasa yang tersedia, ambil daftar template dari API dulu lalu kirim berdasarkan name dan language yang diinginkan.
const BASE = 'https://whats.sahabatmobile.com/external-api';
const API_KEY = 'whats_sk_xxxxx';
const headers = {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
};
// 1. Ambil daftar template
async function getTemplates() {
const res = await fetch(`${BASE}/whatsapp/templates?page=1&per_page=100`, { headers });
const data = await res.json();
if (!data.success) throw new Error(data.error?.message);
return data.data;
}
// 2. Kirim template berdasarkan nama dan bahasa
async function sendTemplate(to, templateName, languageCode, variables) {
const parameters = variables.map((v) => ({ type: 'text', text: v }));
const res = await fetch(`${BASE}/whatsapp/messages`, {
method: 'POST',
headers,
body: JSON.stringify({
to,
type: 'template',
template: {
name: templateName,
language: { code: languageCode },
components: [
{ type: 'BODY', parameters },
],
},
}),
});
const data = await res.json();
if (!data.success) throw new Error(data.error?.message);
return data.data;
}
// Contoh pemanggilan
(async () => {
// Cari template yang mengandung kata "promo"
const templates = await getTemplates();
const promo = templates.find(
(t) => t.name.includes('promo') && t.language === 'id'
);
if (!promo) {
console.log('Template promo tidak ditemukan');
return;
}
const result = await sendTemplate(
'6281234567890',
promo.name,
promo.language,
['Diskon 50%', 'Berlaku hingga 31 Desember']
);
console.log('Template terkirim:', result.messageId);
})();
Konfirmasi order dengan tombol Quick Reply
Kirim pesan konfirmasi order dengan tombol interaktif agar pelanggan cukup menekan satu tombol untuk merespons.
const BASE = 'https://whats.sahabatmobile.com/external-api';
const API_KEY = 'whats_sk_xxxxx';
async function sendOrderConfirmation(to, orderId, total) {
const res = await fetch(`${BASE}/whatsapp/messages`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
to,
type: 'interactive',
interactive: {
type: 'button',
body: {
text: `Konfirmasi pesanan #${orderId}\nTotal: Rp ${total.toLocaleString('id-ID')}\n\nApakah kamu ingin melanjutkan pembayaran?`,
},
action: {
buttons: [
{
type: 'reply',
reply: { id: 'confirm_yes', title: 'Ya, Lanjut' },
},
{
type: 'reply',
reply: { id: 'confirm_no', title: 'Batal' },
},
],
},
},
}),
});
const data = await res.json();
if (!data.success) {
throw new Error(data.error?.message || 'Gagal mengirim konfirmasi');
}
return data.data;
}
// Contoh pemanggilan
sendOrderConfirmation('6281234567890', 'ORD-2026-001', 250000)
.then(console.log)
.catch(console.error);
Respons dari pelanggan akan dikirim ke webhook kamu sebagai event interactive_response. Pastikan kamu sudah mengonfigurasi endpoint webhook.
Promosi dengan header gambar (PHP)
Kirim pesan promosi dengan gambar header dan tombol CTA (Call to Action) yang mengarah ke URL tujuan.
<?php
$base = 'https://whats.sahabatmobile.com/external-api';
$apiKey = 'whats_sk_xxxxx';
function sendPromoWithImage(string $to, string $imageUrl, string $caption, string $ctaTitle, string $ctaUrl): array
{
global $base, $apiKey;
$payload = [
'to' => $to,
'type' => 'interactive',
'interactive' => [
'type' => 'button',
'header' => [
'type' => 'image',
'image' => ['link' => $imageUrl],
],
'body' => [
'text' => $caption,
],
'action' => [
'buttons' => [
[
'type' => 'url',
'url' => $ctaUrl,
'title' => $ctaTitle,
],
],
],
],
];
$ch = curl_init("{$base}/whatsapp/messages");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer {$apiKey}",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return [
'status' => $httpCode,
'response' => json_decode($response, true),
];
}
// Contoh pemanggilan
$result = sendPromoWithImage(
'6281234567890',
'https://example.com/images/promo-banner.jpg',
"🔥 Flash Sale Hari Ini!\n\nDiskon hingga 70% untuk semua kategori.\nBerlaku sampai tengah malam.",
'Beli Sekarang',
'https://example.com/promo'
);
if ($result['response']['success']) {
echo "Promo berhasil dikirim!\n";
} else {
echo "Gagal: " . $result['response']['error']['message'] . "\n";
}
Sync kontak dari CRM internal (Python)
Contoh sinkronisasi kontak dari database CRM internal ke whatsGo. Menggunakan endpoint kontak dengan batch upsert dan handle duplikat.
import requests
BASE = "https://whats.sahabatmobile.com/external-api"
API_KEY = "whats_sk_xxxxx"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
def upsert_contact(name: str, phone: str, email: str = None, tags: list = None) -> dict:
"""Buat atau update kontak berdasarkan nomor telepon."""
payload = {
"name": name,
"phone": phone,
}
if email:
payload["email"] = email
if tags:
payload["tags"] = tags
resp = requests.post(f"{BASE}/contacts", headers=headers, json=payload)
data = resp.json()
if not data["success"]:
print(f" Gagal sync {name}: {data.get('error', {}).get('message')}")
return None
return data["data"]
def sync_from_crm(contacts_from_db: list):
"""Iterasi kontak dari CRM dan upsert ke whatsGo."""
success = 0
failed = 0
for contact in contacts_from_db:
result = upsert_contact(
name=contact["nama"],
phone=contact["telepon"],
email=contact.get("email"),
tags=contact.get("tags", []),
)
if result:
success += 1
print(f" ✓ {contact['nama']} ({result['id']})")
else:
failed += 1
print(f"\nSelesai: {success} berhasil, {failed} gagal")
# Contoh data dari database CRM
crm_contacts = [
{
"nama": "Budi Santoso",
"telepon": "6281234567890",
"email": "budi@example.com",
"tags": ["vip", "loyal"],
},
{
"nama": "Siti Rahayu",
"telepon": "6285678901234",
"email": "siti@example.com",
"tags": ["member"],
},
{
"nama": "Andi Pratama",
"telepon": "6289876543210",
"email": None,
"tags": ["new"],
},
]
sync_from_crm(crm_contacts)
Menerima webhook (Node.js + Express)
Contoh server sederhana untuk menerima event webhook dari whatsGo. Untuk penjelasan lengkap tentang event, header keamanan, dan cara verifikasi, lihat dokumentasi webhook.
import express from 'express';
import crypto from 'crypto';
const app = express();
const PORT = 3000;
const WEBHOOK_SECRET = process.env.WHATS_WEBHOOK_SECRET;
// Raw body untuk verifikasi signature
app.post('/webhooks/whatsgo', express.raw({ type: 'application/json' }), (req, res) => {
// 1. Verifikasi signature dari whatsGo
const signature = req.headers['x-whatsgo-signature'];
const timestamp = req.headers['x-whatsgo-timestamp'];
if (!signature || !timestamp) {
console.error('Missing webhook signature headers');
return res.status(401).json({ error: 'Unauthorized' });
}
const expected = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(`${timestamp}.${req.body}`)
.digest('hex');
if (signature !== expected) {
console.error('Invalid webhook signature');
return res.status(401).json({ error: 'Invalid signature' });
}
// 2. Parse payload
const event = JSON.parse(req.body);
const eventType = event.event;
// 3. Dispatch ke handler sesuai event type
switch (eventType) {
case 'message.received':
handleMessageReceived(event.data);
break;
case 'message.status':
handleMessageStatus(event.data);
break;
case 'interactive_response':
handleInteractiveResponse(event.data);
break;
default:
console.log(`Event tidak dikenal: ${eventType}`);
}
// 4. Selalu return 200 agar whatsGo tidak retry
res.status(200).json({ received: true });
});
function handleMessageReceived(data) {
console.log(`Pesan dari ${data.from}: ${data.text?.body}`);
}
function handleMessageStatus(data) {
console.log(`Status pesan ${data.messageId}: ${data.status}`);
}
function handleInteractiveResponse(data) {
console.log(`Respons tombol: ${data.buttonId} dari ${data.from}`);
}
app.listen(PORT, () => {
console.log(`Webhook server berjalan di port ${PORT}`);
});
Menerima webhook (Python + Flask)
Contoh serupa menggunakan Python dan Flask. Pastikan kamu memahami format payload webhook di dokumentasi webhook.
import hmac
import hashlib
import os
from flask import Flask, request, jsonify
app = Flask(__name__)
WEBHOOK_SECRET = os.environ["WHATS_WEBHOOK_SECRET"]
def verify_signature(payload_bytes: bytes, signature: str, timestamp: str) -> bool:
"""Verifikasi HMAC-SHA256 signature dari whatsGo."""
expected = hmac.new(
WEBHOOK_SECRET.encode(),
f"{timestamp}.{payload_bytes.decode()}".encode(),
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, signature)
@app.route("/webhooks/whatsgo", methods=["POST"])
def webhook_handler():
# 1. Verifikasi signature
signature = request.headers.get("x-whatsgo-signature")
timestamp = request.headers.get("x-whatsgo-timestamp")
if not signature or not timestamp:
return jsonify({"error": "Unauthorized"}), 401
if not verify_signature(request.data, signature, timestamp):
return jsonify({"error": "Invalid signature"}), 401
# 2. Parse payload
event = request.get_json()
event_type = event.get("event")
# 3. Dispatch ke handler
if event_type == "message.received":
handle_message_received(event["data"])
elif event_type == "message.status":
handle_message_status(event["data"])
elif event_type == "interactive_response":
handle_interactive_response(event["data"])
else:
print(f"Event tidak dikenal: {event_type}")
# 4. Selalu return 200
return jsonify({"received": True}), 200
def handle_message_received(data):
sender = data.get("from", "unknown")
text = data.get("text", {}).get("body", "")
print(f"Pesan dari {sender}: {text}")
def handle_message_status(data):
message_id = data.get("messageId", "unknown")
status = data.get("status", "unknown")
print(f"Status pesan {message_id}: {status}")
def handle_interactive_response(data):
button_id = data.get("buttonId", "unknown")
sender = data.get("from", "unknown")
print(f"Respons tombol {button_id} dari {sender}")
if __name__ == "__main__":
app.run(port=3000, debug=True)
SDK resmi untuk Node.js, Python, dan PHP sedang dalam pengembangan. Nantikan pembaruan di halaman ini atau langganan newsletter whatsGo untuk notifikasi rilis.