Webhooks
Recevez chaque étape de vos livraisons, signée.
Un webhook est une adresse de votre serveur que Fofo Express appelle à chaque événement de vos livraisons, y compris celles créées depuis l’application. Votre site met la commande à jour sans interroger l’API en boucle.
Configurer une adresse
Le propriétaire de la boutique ajoute l’adresse (HTTPS obligatoire) et choisit les événements. Un secret de signature whsec_… est affiché une seule fois ; il peut être régénéré. Un bouton « Tester » envoie un événement ping.
Événements
| Événement | Envoyé quand |
|---|---|
delivery.created | La livraison est créée. |
delivery.location_confirmed | Le client a indiqué sa position. |
delivery.courier_assigned | Un livreur a accepté la course. |
delivery.picked_up | Le colis est enlevé. |
delivery.delivered | Le colis est remis. |
delivery.failed | La remise a échoué. |
delivery.returned | Le colis est revenu à la boutique. |
delivery.cancelled | La livraison est annulée. |
delivery.expired | Aucune position ou aucun livreur dans le délai. |
payment.confirmed | Le paiement du client est confirmé. |
Chaque événement est envoyé une seule fois par adresse et par livraison.
Contenu
POST /votre-adresse HTTP/1.1
Content-Type: application/json
Fofo-Event: delivery.delivered
Fofo-Event-Id: 6f1c2a54-…
Fofo-Signature: t=1791812548,v1=5f2b…{
"id": "6f1c2a54-…",
"type": "delivery.delivered",
"createdAt": "2026-10-12T14:02:11.000Z",
"data": {
"id": "…",
"reference": "FX-522PDJ",
"externalRef": "WC-10482",
"status": "DELIVERED",
"…": "…"
}
}data est la livraison telle que la renvoie GET /deliveries/{id} au moment de l’événement. Pour l’état le plus récent, relisez la livraison : l’ordre d’arrivée des événements n’est pas garanti.
Vérifier la signature
Fofo-Signature contient l’horodatage t (secondes) et v1, le HMAC-SHA256 en hexadécimal de "{t}.{corps brut}" calculé avec votre secret. Refusez la requête si la signature ne correspond pas ou si t date de plus de 5 minutes.
function fofo_signature_valide(string $secret, string $entete, string $corps): bool {
parse_str(str_replace(',', '&', $entete), $parts);
$t = (int) ($parts['t'] ?? 0);
if (!isset($parts['v1']) || abs(time() - $t) > 300) {
return false;
}
$attendu = hash_hmac('sha256', $t . '.' . $corps, $secret);
return hash_equals($attendu, $parts['v1']);
}
$corps = file_get_contents('php://input');
if (!fofo_signature_valide(getenv('FOFO_WEBHOOK_SECRET'), $_SERVER['HTTP_FOFO_SIGNATURE'] ?? '', $corps)) {
http_response_code(400);
exit;
}
$evenement = json_decode($corps, true);
http_response_code(200);Réponse et nouvelles tentatives
- Répondez par un code
2xxen moins de 10 secondes ; faites les traitements longs ensuite. - Sinon, Fofo Express réessaie après 1, 5, 15, 60, 180, 360 puis 720 minutes.
- Une adresse en échec continu pendant 72 heures est désactivée et le propriétaire prévenu par email. La réactiver remet le compteur à zéro.
- Le journal des envois (30 jours) montre chaque tentative, avec un bouton « Renvoyer ».
- Utilisez
Fofo-Event-Idpour ignorer un événement déjà traité.