SubscriptionPaymentService
in package
Logique commune de passage d'un paiement d'abonnement à l'état « payé ».
Utilisée par la validation manuelle d'un administrateur, par le retour de la passerelle Djomy et par
son webhook : le paiement passe à COMPLETED, la commande liée à TERMINER et l'abonnement est activé,
le tout dans une transaction. L'opération est idempotente, ce qui permet de recevoir plusieurs
notifications pour un même paiement sans effet de bord.
Table of Contents
Properties
- $entityManager : EntityManagerInterface
- $logger : LoggerInterface
- $subscriptionService : SubscriptionService
Methods
- __construct() : mixed
- markPaymentCompleted() : bool
- Marque un paiement comme encaissé et active l'abonnement associé.
- reportPossibleDoublePayment() : void
- Journalise en `critical` un succès reçu pour un paiement déjà encaissé avec une autre transaction.
Properties
$entityManager read-only
private
EntityManagerInterface
$entityManager
$logger read-only
private
LoggerInterface
$logger
$subscriptionService read-only
private
SubscriptionService
$subscriptionService
Methods
__construct()
public
__construct(EntityManagerInterface $entityManager, SubscriptionService $subscriptionService, LoggerInterface $logger) : mixed
Parameters
- $entityManager : EntityManagerInterface
-
Transaction et persistance.
- $subscriptionService : SubscriptionService
-
Activation de l'abonnement rattaché au paiement.
- $logger : LoggerInterface
-
Trace l'origine de chaque validation.
markPaymentCompleted()
Marque un paiement comme encaissé et active l'abonnement associé.
public
markPaymentCompleted(Payment $payment[, string|null $source = null ][, string|null $transactionId = null ]) : bool
Dans une transaction, le paiement est relu avec un verrou d'écriture pour absorber les appels
concurrents (retour navigateur et webhook simultanés) : s'il est déjà COMPLETED, rien n'est modifié.
Sinon, faute d'abonnement lié, un warning est journalisé et une exception levée (le paiement n'est pas
marqué payé) ; autrement le paiement passe à COMPLETED (avec updatedAt), la commande liée à
Order::TERMINER, puis l'abonnement lié est activé via SubscriptionService::activateSubscription().
Si le paiement est déjà COMPLETED et que la transaction reçue diffère de celle enregistrée, un
double paiement possible est journalisé en critical (voir self::reportPossibleDoublePayment()).
Parameters
- $payment : Payment
-
Paiement à solder.
- $source : string|null = null
-
Origine de la validation (
djomy_return,djomy_webhook,admin…), pour les journaux. - $transactionId : string|null = null
-
Transaction du prestataire à l'origine de l'appel, si connue.
Tags
Return values
bool —true si le paiement vient d'être validé, false s'il l'était déjà.
reportPossibleDoublePayment()
Journalise en `critical` un succès reçu pour un paiement déjà encaissé avec une autre transaction.
public
reportPossibleDoublePayment(Payment $payment, string|null $transactionId, string|null $source) : void
Le client a alors probablement payé deux fois : un remboursement manuel est à étudier. Sans effet si la transaction reçue est inconnue ou identique à celle enregistrée.
Parameters
- $payment : Payment
-
Paiement déjà
COMPLETED. - $transactionId : string|null
-
Transaction réussie reçue.
- $source : string|null
-
Origine de l'appel, pour les journaux.