Événements Symfony
Le bundle dispatch des événements Symfony pour permettre à l’application consommatrice de se brancher proprement sur le billing.
Tableau des événements et propriétés
| Event | Méthodes disponibles |
|---|---|
PaymentSucceededEvent | getCustomerId(), getPaymentIntentId(), getAmount() (centimes), getCurrency(), getInvoiceId(): ?string, getCheckoutSessionId(): ?string, getAmountInDecimal(): float |
PaymentFailedEvent | getCustomerId(), getPaymentIntentId(), getAmount(), getCurrency(), getAmountInDecimal(): float |
SubscriptionCreatedEvent | getSubscription(): Subscription |
SubscriptionUpdatedEvent | getSubscription(): Subscription |
SubscriptionDeletedEvent | getSubscription(): Subscription |
WebhookReceivedEvent | getEvent(): \Stripe\Event |
WebhookHandledEvent | getEvent(): \Stripe\Event |
Webhook lifecycle
WebhookReceivedEvent
Déclenché dès réception d’un webhook Stripe valide.
WebhookHandledEvent
Déclenché après le passage des handlers configurés.
Événements métier
SubscriptionCreatedEvent
Émis lorsqu’un abonnement local a été créé ou synchronisé depuis Stripe.
SubscriptionUpdatedEvent
Émis lorsqu’un abonnement local est modifié après un webhook ou une synchronisation.
SubscriptionDeletedEvent
Émis lorsqu’un abonnement est supprimé ou terminé.
PaymentSucceededEvent
Émis sur paiement confirmé. Cet événement est particulièrement utile pour:
- valider une commande
- déclencher une réservation
- envoyer une notification
- archiver une facture applicative additionnelle si besoin
PaymentFailedEvent
Émis lorsque Stripe signale un échec de paiement.
Exemple d’écoute
use CashierBundle\Event\PaymentSucceededEvent;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
#[AsEventListener(event: PaymentSucceededEvent::class)]
final class ConfirmOrderListener
{
public function __invoke(PaymentSucceededEvent $event): void
{
$customerId = $event->getCustomerId();
$paymentIntentId = $event->getPaymentIntentId();
// retrouver votre commande et la confirmer
}
}Bonne pratique
Gardez les listeners métier:
- idempotents
- rapides
- traçables
Si le traitement devient lourd, déléguez vers Messenger ou un bus applicatif.
Intégration Messenger
Les événements Symfony peuvent déclencher des messages async. Messages disponibles:
CancelSubscriptionMessageProcessInvoiceMessageRetryPaymentMessageSyncCustomerDetailsMessageUpdateSubscriptionQuantityMessage
Nécessite symfony/messenger dans composer.json.
Exemple : déclencher SyncCustomerDetailsMessage depuis un listener CustomerUpdatedEvent:
use CashierBundle\Event\CustomerUpdatedEvent;
use CashierBundle\Message\SyncCustomerDetailsMessage;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\Messenger\MessageBusInterface;
#[AsEventListener(event: CustomerUpdatedEvent::class)]
final class SyncCustomerDetailsListener
{
public function __construct(
private MessageBusInterface $messageBus,
) {
}
public function __invoke(CustomerUpdatedEvent $event): void
{
$this->messageBus->dispatch(new SyncCustomerDetailsMessage($event->getStripeCustomerId()));
}
}