Hey there, fellow JavaScript devs! Ready to dive into the world of WhatsApp webhooks? Let's get cracking!
Webhooks are like the cool kids of the API world – they let WhatsApp ping your server whenever something interesting happens. No more constant polling or twiddling your thumbs waiting for updates. With webhooks, you're always in the loop, real-time style.
Before we jump in, make sure you've got:
First things first, let's set up a simple Express server to handle those incoming webhooks:
const express = require('express'); const app = express(); const PORT = process.env.PORT || 3000; app.use(express.json()); app.post('/webhook', (req, res) => { // We'll fill this in soon, promise! res.sendStatus(200); }); app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
Head over to your WhatsApp Business API dashboard and set up your webhook URL. You'll need to provide a verify token – think of it as a secret handshake between WhatsApp and your server.
Here's how to handle that verification:
app.get('/webhook', (req, res) => { const VERIFY_TOKEN = 'your_super_secret_verify_token'; const mode = req.query['hub.mode']; const token = req.query['hub.verify_token']; const challenge = req.query['hub.challenge']; if (mode && token === VERIFY_TOKEN) { res.status(200).send(challenge); } else { res.sendStatus(403); } });
Now for the fun part – handling those juicy webhook events! WhatsApp will send all sorts of events your way, from new messages to delivery receipts.
app.post('/webhook', (req, res) => { const { body } = req; if (body.object === 'whatsapp_business_account') { body.entry.forEach(entry => { entry.changes.forEach(change => { if (change.field === 'messages') { const message = change.value.messages[0]; console.log('New message:', message); // Do something cool with the message! } }); }); res.sendStatus(200); } else { res.sendStatus(404); } });
Let's build a simple echo bot to respond to incoming messages:
const axios = require('axios'); async function sendWhatsAppMessage(to, message) { try { await axios.post('https://graph.facebook.com/v13.0/YOUR_PHONE_NUMBER_ID/messages', { messaging_product: 'whatsapp', to: to, text: { body: message }, }, { headers: { 'Authorization': `Bearer ${process.env.WHATSAPP_TOKEN}`, 'Content-Type': 'application/json', }, }); } catch (error) { console.error('Error sending message:', error); } } // In your webhook handler: if (message.type === 'text') { sendWhatsAppMessage(message.from, `You said: ${message.text.body}`); }
Don't forget to add some error handling and basic security:
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something broke!'); }); // Basic auth middleware function authenticate(req, res, next) { const authHeader = req.headers.authorization; if (authHeader === `Bearer ${process.env.WEBHOOK_SECRET}`) { next(); } else { res.sendStatus(401); } } app.use('/webhook', authenticate);
For local testing, ngrok is your best friend. It creates a secure tunnel to your localhost:
ngrok http 3000
Use the ngrok URL as your webhook URL in the WhatsApp dashboard.
And there you have it! You're now ready to rock the WhatsApp webhook world. Remember, this is just the beginning – there's so much more you can do with the WhatsApp API. Keep exploring, keep coding, and most importantly, have fun!
Happy webhooking, folks! 🚀