Guide pour recevoir notre Webhook JSON

Notre serveur envoie des webhooks sous forme de POST JSON vers l’URL que vous avez configurée. Voici comment les intercepter et les traiter.

Flux du webhook

Serveur Webhook Votre serveur Traitement JSON Réponse HTTP 200
Points importants :

Exemple en PHP

<?php
$payload = json_decode(file_get_contents('php://input'), true);
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

$secret = 'VOTRE_CLE_SECRETE';
$expected = hash_hmac('sha256', json_encode($payload), $secret);

if (!hash_equals($expected, $signature)) {
    http_response_code(403);
    exit('Signature invalide');
}

if ($payload['type'] === 'question') {
    $question = $payload['question'];
    $tag = $payload['tag'];
    $lang = $payload['lang'];
}

http_response_code(200);
echo 'Webhook reçu';
?>

Exemple en Node.js (Express)

const express = require('express');
const crypto = require('crypto');
const app = express();

app.use(express.json());

app.post('/webhook', (req, res) => {
    const payload = req.body;
    const signature = req.header('X-Signature') || '';

    const secret = 'VOTRE_CLE_SECRETE';
    const expected = crypto.createHmac('sha256', secret)
                           .update(JSON.stringify(payload))
                           .digest('hex');

    if (signature !== expected) return res.status(403).send('Signature invalide');

    if (payload.type === 'question') {
        console.log(`Question reçue [${payload.lang}/${payload.tag}]: ${payload.question}`);
    }

    res.send('Webhook reçu');
});

app.listen(3000, () => console.log('Serveur webhook prêt sur le port 3000'));

Exemple en Python (Flask)

from flask import Flask, request, abort
import hmac, hashlib, json

app = Flask(__name__)
secret = b'VOTRE_CLE_SECRETE'

@app.route('/webhook', methods=['POST'])
def webhook():
    payload = request.get_json()
    signature = request.headers.get('X-Signature', '')

    expected = hmac.new(secret, json.dumps(payload).encode(), hashlib.sha256).hexdigest()
    if signature != expected:
        abort(403, 'Signature invalide')

    if payload['type'] == 'question':
        print(f"Question reçue [{payload['lang']}/{payload['tag']}]: {payload['question']}")

    return 'Webhook reçu', 200

if __name__ == '__main__':
    app.run(port=5000)

Ce diagramme et ces exemples montrent comment recevoir, vérifier et traiter le webhook JSON de manière sécurisée et simple pour votre serveur.