src/EventSubscriber/StripeSubscriber.php line 61

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