src/EventSubscriber/StripeSubscriber.php line 142

Open in your IDE?
  1. <?php
  2.     namespace App\EventSubscriber;
  3.     /* 
  4.     bin/stripe listen --forward-to localhost:4242/cultureroute/public/stripe/webhook
  5.     */
  6.     use App\Event\OrderPaymentEvent;
  7.     use App\Event\StripeEvent;
  8.     use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9.     use App\Entity\User;
  10.     use App\Entity\StripeCustomer;
  11.     use Psr\Log\LoggerInterface;
  12.     use Doctrine\ORM\EntityManagerInterface;
  13.     class StripeSubscriber implements EventSubscriberInterface
  14.     {
  15.         private $dispatcher;
  16.         private $stripe;
  17.         public function __construct(
  18.             private LoggerInterface $lifecycleLogger,
  19.             private EntityManagerInterface $entityManager,
  20.             OrderPaymentEventSubscriber $orderEventSubscriber
  21.         )
  22.         {
  23.             $config = new \App\Entity\Configuration;
  24.             $this->lifecycleLogger $lifecycleLogger;
  25.             $this->entityManager $entityManager;
  26.             $this->stripe = new \Stripe\StripeClient($config->getStripeSecretKey());
  27.             $this->dispatcher = new  \Symfony\Component\EventDispatcher\EventDispatcher();
  28.             $this->dispatcher->addSubscriber($orderEventSubscriber);
  29.         }
  30.         public static function getSubscribedEvents() : array
  31.         {
  32.             return [
  33.                 StripeEvent::CHARGE_SUCCEEDED => 'onChargeSucceeded',
  34.                 StripeEvent::SESSION_COMPLETED => 'onSessionCompleted',
  35.                 StripeEvent::CUSTOMER_CREATED => 'onCustomerCreated',
  36.                 StripeEvent::PAYMENT_INTENT_CREATED => 'onPaymentCreated',
  37.             ];
  38.         }
  39.         public function getSession(\Stripe\PaymentIntent $payment_intent): ?\Stripe\Checkout\Session
  40.         {
  41.             $sessions $this->stripe->checkout->sessions->all(['payment_intent' => $payment_intent->id'limit'=>1]);
  42.             $this->lifecycleLogger->info('getSession', [
  43.                 'sessions' =>$sessions
  44.             ]);
  45.             if (!count($sessions)) {
  46.                 $this->lifecycleLogger->error('getSession', [
  47.                     'payment_intent' => $payment_intent->id
  48.                 ]);
  49.                 return null;
  50.             }
  51.             $session $sessions->first();
  52.             $this->lifecycleLogger->info('getSession', [
  53.                 'session' =>$session
  54.             ]);
  55.             return $session;
  56.         }
  57.         
  58.         public function onPaymentCreated(StripeEvent $event)
  59.         {
  60.             $stripeEvent $event->getEvent(); //Stripe event object (instanceof \Stripe\Event)
  61.             $payment_intent $event->getDataObject(); //Stripe session object (instanceof \Stripe\PaymentIntent)
  62.             // Log the event
  63.             $this->lifecycleLogger->info('StripePaymentCreated', [
  64.                 'amount' => $payment_intent->amount,
  65.                 'customer' => $payment_intent->customer,
  66.                 'pi_id' => $payment_intent->id,
  67.             ]);
  68.             $session $this->getSession($payment_intent);
  69.             $OrderPaymentEvent = new OrderPaymentEvent($session->client_reference_id);
  70.             $this->dispatcher->dispatch($OrderPaymentEventOrderPaymentEvent::CREATED);
  71.         }
  72.         public function onSessionCompleted(StripeEvent $event)
  73.         {
  74.             /** @var \Stripe\Event */
  75.             $stripeEvent $event->getEvent();
  76.             /** @var \Stripe\Checkout\Session */
  77.             $session $event->getDataObject();
  78.             // Log the event
  79.             $this->lifecycleLogger->info(StripeEvent::SESSION_COMPLETED, [
  80.                 'payment_status' => $session->payment_status,
  81.                 'client_reference_id' => $session->client_reference_id,
  82.                 'customer' => $session->customer
  83.             ]);
  84.             // si c'est payé on le dit(pour séparer Stripe de la gestion de la commande)
  85.             $OrderPaymentEvent = new OrderPaymentEvent($session->client_reference_id);
  86.             if($session->payment_status == 'paid')
  87.                 $this->dispatcher->dispatch($OrderPaymentEventOrderPaymentEvent::SUCCESS);
  88.             
  89.             // On met à jour les infos de l'utilisateur sur Stripe
  90.             // Si le process normal a été suivi, on a déjà le lien entre les User et les customers
  91.             $User $this->entityManager->getRepository(User::class)->findOneByReference($session->customer);
  92.             if (!$User) {
  93.                 throw new \Error('Pas de client avec la référence "'.$session->customer.'"');
  94.                 return;
  95.             }
  96.             $paramsCustomer = [];
  97.             $paramsCustomer['address']['city'] = $User->getVille();
  98.             $paramsCustomer['address']['postal_code'] = $User->getCp();
  99.             if (count($User->getShopUserAdresses())) {
  100.                 $paramsCustomer['address']['city'] = $User->getShopUserAdresses()[0]->getVille();
  101.                 $paramsCustomer['address']['postal_code'] = $User->getShopUserAdresses()[0]->getCodePostal();
  102.                 $paramsCustomer['address']['line1'] = $User->getShopUserAdresses()[0]->getAdresse();
  103.             }
  104.             $paramsCustomer["name"] = $User->getPrenom().' '.$User->getNom();
  105.             $paramsCustomer["phone"] = $User->getTelephone();
  106.             $this->stripe->customers->update(
  107.                 $User->getReference(),
  108.                 $paramsCustomer
  109.             );
  110.         }
  111.         // permet de faire le lien entre un Use et un customer
  112.         public function onCustomerCreated(StripeEvent $event)
  113.         {
  114.             /** @var \Stripe\Event */
  115.             $stripeEvent $event->getEvent();
  116.             /** @var \Stripe\Customer */
  117.             $customer $event->getDataObject();
  118.             // Log the event
  119.             $this->lifecycleLogger->info(StripeEvent::CUSTOMER_CREATED, [
  120.                 'email' => $customer->email,
  121.                 'id' => $customer->id
  122.             ]);
  123.             $reference $customer->email;
  124.             $User $this->entityManager->getRepository(User::class)->findOneByMail($reference);
  125.             if (!$User) {
  126.                 throw new \Error('Pas de client avec la référence "'.$reference.'"');
  127.                 return;
  128.             }
  129.             if (!$User->getReference()) {
  130.                 $User->setReference($customer->id);
  131.                 $this->entityManager->flush();
  132.             }
  133.         }
  134.         
  135.         public function onChargeSucceeded(StripeEvent $event)
  136.         {
  137.             /** @var \Stripe\Event */
  138.             $stripeEvent $event->getEvent();
  139.             /** @var \Stripe\Charge */
  140.             $charge $event->getDataObject();
  141.             // Log the event
  142.             $this->lifecycleLogger->info($stripeEvent::CHARGE_SUCCEEDED, [
  143.                 'stripeEvent' => var_export($stripeEvent,true)
  144.             ]);
  145.         }
  146.     }