Aller au contenu

Webhooks

Bêta

Les webhooks Pennylane sont en bêta. Pennylane recommande elle-même de conserver les endpoints changelog en solution de repli pendant que la fonctionnalité se stabilise. Types d'événements connus à ce jour : customer_invoice.e_invoicing_status_updated et dms_file.created.

S'abonner

<?php

use Pennylane\Sdk\Pennylane;

$client = new Pennylane(); // lit PENNYLANE_API_TOKEN

$subscription = $client->webhookSubscriptions->create(
    callbackUrl: 'https://example.com/webhooks/pennylane', // doit être en HTTPS
    events: ['customer_invoice.e_invoicing_status_updated'],
);
echo $subscription->secret;

Stockez le secret immédiatement

Le secret utilisé pour vérifier les livraisons n'est renvoyé qu'une seule fois, à la création. Stockez-le immédiatement dans votre gestionnaire de secrets ; vous ne pourrez plus le récupérer ensuite.

Gérez les abonnements avec list(), get($id), update($id, ...) et delete($id).

Recevoir et vérifier les livraisons

Pennylane signe les livraisons avec un HMAC du corps brut à l'aide de votre secret. Vérifiez avant de faire confiance :

<?php

use Pennylane\Sdk\Webhooks\Webhooks;
use Pennylane\Sdk\Exception\WebhookSignatureException;

$secret = getenv('PENNYLANE_WEBHOOK_SECRET'); // depuis votre gestionnaire de secrets

$raw = file_get_contents('php://input'); // le corps BRUT, ne pas le re-sérialiser
$signature = $_SERVER['HTTP_X_PENNYLANE_SIGNATURE'] ?? '';

try {
    $event = Webhooks::parseEvent($raw, signature: $signature, secret: $secret);
} catch (WebhookSignatureException $e) {
    http_response_code(400);
    exit('bad signature');
}

if ($event->event === 'customer_invoice.e_invoicing_status_updated') {
    // ...
}

http_response_code(200);
echo json_encode(['ok' => true]);

En-tête de signature

À la mi-2026, Pennylane ne documente pas encore précisément le nom ni l'encodage de l'en-tête de signature. Webhooks::verifySignature() est volontairement tolérante : elle accepte les encodages HMAC-SHA256 en hexadécimal comme en base64, avec ou sans préfixe sha256= ou hmac-sha256=, comparés en temps constant. Inspectez vos premières livraisons réelles pour confirmer l'en-tête (généralement X-Pennylane-Signature) et figez votre intégration en conséquence.

Vous pouvez aussi vérifier manuellement :

$isValid = Webhooks::verifySignature($rawBody, $signatureHeader, $secret);

Repli : changelogs

Pour une synchronisation à livraison garantie, interrogez les endpoints changelog. Ils renvoient des événements de changement par ressource, paginés par curseur, ce qui rend triviale une boucle de synchronisation incrémentale :

foreach ($client->changelogs->customerInvoices() as $event) {
    // chaque événement référence la facture modifiée
}

Des changelogs existent pour les factures clients, les factures fournisseurs, les clients, les fournisseurs, les produits, les lignes d'écriture, les transactions et les devis.