UrielSender porte les numéros WhatsApp et livre les réponses à votre application. Django n’ouvre pas de session WhatsApp. Il envoie un appel REST pour parler, et il vérifie une signature HMAC avant de croire un webhook.
Deux sens, deux vérifications
À l’aller, l’application s’authentifie avec sa clé d’API et demande l’envoi d’un texte ou d’un média vers un numéro déjà connecté dans le tableau de bord. Au retour, UrielSender appelle une URL de votre site. Ce second appel doit prouver qu’il vient bien du service, pas d’un client qui a deviné l’adresse.
Vérifier le corps brut
L’en-tête s’appelle X-Uriel-Signature. C’est le HMAC-SHA256 du corps brut, avec le secret rendu à la création du webhook. Il peut être préfixé par sha256= : on retire ce préfixe avant de comparer. Relire request.POST ou ré-encoder le dictionnaire change les octets, et une signature valide devient fausse.
import hashlib
import hmac
from django.conf import settings
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
def _signature(header):
value = (header or "").strip()
if value.lower().startswith("sha256="):
return value.split("=", 1)[1]
return value
@csrf_exempt
def urielsender_webhook(request):
if request.method != "POST":
return HttpResponse(status=405)
body = request.body
given = _signature(request.headers.get("X-Uriel-Signature", ""))
digest = hmac.new(
settings.URIELSENDER_WEBHOOK_SECRET.encode(),
body,
hashlib.sha256,
).hexdigest()
if not hmac.compare_digest(given, digest):
return HttpResponse(status=401)
return HttpResponse(status=200)
compare_digest évite de s’arrêter au premier caractère différent. Le secret et la clé d’API viennent des variables d’environnement, jamais du dépôt. La vue est exemptée de CSRF parce que l’appelant n’est pas un formulaire du site : la signature tient ce rôle.
Répondre vite
On répond 200 dès que la signature est bonne et que l’événement est enregistré. L’envoi d’un message, la mise à jour d’une fiche ou un appel lent se font ensuite, dans une tâche. Un webhook qui attend une minute se fait rappeler, et le même événement arrive deux fois. On garde donc un identifiant d’événement pour ignorer le doublon.
Le tour du produit, les numéros multiples et le pilotage par MCP sont dans l’article sur l’API. Le site du service est urielsender.site.