Aller au contenu

Webhooks

Le systeme de webhooks d’ArtisanCMS permet de notifier des services externes lorsque des evenements se produisent dans le CMS. Cela facilite les integrations avec des outils tiers sans developpement de plugin.

Le systeme repose sur les composants suivants :

ComposantRole
WebhookControllerInterface admin pour configurer les webhooks
WebhookServiceLogique de resolution et de dispatch des webhooks
WebhookDispatchJobJob asynchrone pour la livraison HTTP fiable
WebhookHookListenerEcouteur integre au HookManager du systeme de hooks
WebhookPolicyControle d’acces aux operations sur les webhooks

Depuis l’interface d’administration, un webhook se configure avec les champs suivants :

ChampDescription
NomLibelle descriptif pour identifier le webhook
URLEndpoint HTTP(S) qui recevra les notifications
SecretCle secrete utilisee pour signer les payloads
EvenementsListe des evenements auxquels s’abonner
ActifActive ou desactive le webhook
Route::resource('webhooks', WebhookController::class);

Les evenements declencheurs sont organises par categorie :

EvenementDeclencheur
content.createdCreation d’une page ou d’un article
content.updatedModification d’un contenu existant
content.publishedPublication d’un contenu
content.deletedSuppression d’un contenu
EvenementDeclencheur
user.createdCreation d’un nouveau compte utilisateur
user.updatedModification d’un profil utilisateur
EvenementDeclencheur
media.uploadedImport d’un nouveau fichier media
media.deletedSuppression d’un fichier media
EvenementDeclencheur
form.submittedSoumission d’un formulaire de contact

Chaque payload est signe avec HMAC SHA-256 pour garantir l’authenticite de la requete. La signature est transmise dans l’en-tete HTTP X-ArtisanCMS-Signature :

$signature = hash_hmac('sha256', $payload, $webhook->secret);

Le service recepteur doit verifier la signature en recalculant le HMAC avec le secret partage et en le comparant a la valeur de l’en-tete.

$expected = hash_hmac('sha256', $requestBody, $sharedSecret);
$valid = hash_equals($expected, $receivedSignature);

Le WebhookDispatchJob est mis en file d’attente pour garantir une livraison fiable :

  • Timeout : chaque requete a un delai maximal de 30 secondes.
  • Tentatives : en cas d’echec (timeout, erreur HTTP 5xx), le job est automatiquement reessaye.
  • Nombre de tentatives : 3 tentatives avec un delai exponentiel entre chaque essai.
  • Journalisation : chaque tentative (succes ou echec) est enregistree pour le diagnostic.
class WebhookDispatchJob implements ShouldQueue
{
public int $tries = 3;
public array $backoff = [30, 120, 300]; // Secondes entre les tentatives
}

Le WebhookHookListener s’enregistre automatiquement aupres du HookManager d’ArtisanCMS. Lorsqu’un hook interne est declenche, le listener verifie si des webhooks sont configures pour l’evenement correspondant et dispatche les jobs necessaires.

// Enregistrement automatique
HookManager::listen('content.*', [WebhookHookListener::class, 'handle']);

Les payloads sont envoyes en JSON avec la structure suivante :

{
"event": "content.published",
"timestamp": "2026-03-27T10:30:00Z",
"site_id": 1,
"data": {
"id": 42,
"type": "page",
"title": "Nouvelle page",
"url": "https://exemple.com/nouvelle-page"
}
}

La WebhookPolicy controle l’acces aux webhooks selon les permissions de l’utilisateur. Seuls les utilisateurs disposant de la permission webhooks.manage peuvent creer, modifier ou supprimer des webhooks.