contacts_events-8.x-1.x-dev/src/EventSubscriber/StripeIntentOrderSubscriber.php
src/EventSubscriber/StripeIntentOrderSubscriber.php
<?php
namespace Drupal\contacts_events\EventSubscriber;
use Drupal\commerce_order\Entity\OrderInterface;
use Drupal\commerce_order\Event\OrderEvent;
use Drupal\commerce_payment\Entity\PaymentGatewayInterface;
use Drupal\commerce_price\Price;
use Drupal\commerce_stripe\EventSubscriber\OrderPaymentIntentSubscriber;
use Drupal\commerce_stripe\Plugin\Commerce\PaymentGateway\StripeInterface;
use Drupal\Core\TempStore\PrivateTempStoreFactory;
/**
* Contacts Events event subscriber.
*/
class StripeIntentOrderSubscriber extends OrderPaymentIntentSubscriber {
/**
* The contacts events booking flow private tempstore.
*
* @var \Drupal\Core\TempStore\PrivateTempStore
*/
private $tempstore;
/**
* Set the private tempstore.
*
* @param \Drupal\Core\TempStore\PrivateTempStoreFactory $factory
* The private temp store factory.
*
* @return $this
*/
public function setPrivateTempstore(PrivateTempStoreFactory $factory) {
$this->tempstore = $factory->get('contacts_events.booking_flow');
return $this;
}
/**
* {@inheritdoc}
*/
public function onOrderUpdate(OrderEvent $event) {
$order = $event->getOrder();
$this->updateOrder($order);
}
/**
* Mark an order's intent for update, if there is one.
*
* @param \Drupal\commerce_order\Entity\OrderInterface $order
* The order to check and, if required, mark for update.
*/
public function updateOrder(OrderInterface $order): void {
$gateway = $order->get('payment_gateway');
if ($gateway->isEmpty() || !$gateway->entity instanceof PaymentGatewayInterface) {
return;
}
$plugin = $gateway->entity->getPlugin();
if (!$plugin instanceof StripeInterface) {
return;
}
$intent_id = $order->getData('stripe_intent');
if ($intent_id === NULL) {
return;
}
$total_price = $this->getPaymentAmount($order);
if ($total_price !== NULL) {
$amount = $this->toMinorUnits($total_price);
$this->updateList[$intent_id] = $amount;
}
}
/**
* Get the payment amount from the private tempstore.
*
* @param \Drupal\commerce_order\Entity\OrderInterface $order
* The order.
*
* @return \Drupal\commerce_price\Price|null
* The payment amount, or NULL if there is none specified.
*/
private function getPaymentAmount(OrderInterface $order): ?Price {
$amount = $this->tempstore->get("{$order->id()}:payment_amount");
return $amount ? Price::fromArray($amount) : $order->getBalance();
}
}
