Implementation

Code examples and best practices for implementing webhook handlers.

Framework Examples

Node.js (Express)

import express from 'express';
import crypto from 'crypto';

const app = express();

// Capture raw body for signature verification
app.use(express.json({
  verify: (req: any, _res, buf) => { req.rawBody = buf; }
}));

function isValidSignature(rawBody: Buffer, signature: string, secret: string) {
  const computed = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
  return (
    computed.length === (signature || '').length &&
    crypto.timingSafeEqual(Buffer.from(computed, 'hex'), Buffer.from(signature || '', 'hex'))
  );
}

app.post('/webhooks', async (req: any, res) => {
  const signature = req.header('X-Zellify-Signature') || '';
  const secret = process.env.ZELLIFY_WEBHOOK_SECRET || '';

  if (!isValidSignature(req.rawBody, signature, secret)) {
    return res.status(401).json({ error: 'Invalid signature' });
  }

  const event = req.body;

  // Acknowledge quickly
  res.status(200).json({ received: true });

  // Process asynchronously
  process.nextTick(async () => {
    try {
      await WebhookHandler.processEvent(event);
    } catch (err) {
      console.error('Webhook processing error:', err);
    }
  });
});

app.listen(3000, () => console.log('Webhook server running on 3000'));

Python (Flask)

PHP (Laravel-style controller)

Java (Spring Boot)

Go (net/http)

Last updated