You are here

public function StripeReview::buildPaneForm in Commerce Stripe 8

Builds the pane form.

Parameters

array $pane_form: The pane form, containing the following basic properties:

  • #parents: Identifies the position of the pane form in the overall parent form, and identifies the location where the field values are placed within $form_state->getValues().

\Drupal\Core\Form\FormStateInterface $form_state: The form state of the parent form.

array $complete_form: The complete form structure.

Overrides CheckoutPaneInterface::buildPaneForm

File

src/Plugin/Commerce/CheckoutPane/StripeReview.php, line 98

Class

StripeReview
Adds payment intent confirmation for Stripe.

Namespace

Drupal\commerce_stripe\Plugin\Commerce\CheckoutPane

Code

public function buildPaneForm(array $pane_form, FormStateInterface $form_state, array &$complete_form) {

  // The only point of this pane is passing the stripe payment intent ID (and
  // some other data) to js when first loading the page (and not when
  // submitting the form).
  if (!empty($form_state
    ->getValues()) || !empty($form_state
    ->getUserInput())) {
    return $pane_form;
  }
  $intent_id = $this->order
    ->getData('stripe_intent');

  /** @var \Drupal\commerce_stripe\Plugin\Commerce\PaymentGateway\StripeInterface $stripe_plugin */
  $stripe_plugin = $this->order
    ->get('payment_gateway')->entity
    ->getPlugin();
  if ($intent_id !== NULL) {
    try {
      $intent = PaymentIntent::retrieve($intent_id);
    } catch (ApiErrorException $e) {
      ErrorHelper::handleException($e);
    }
  }
  else {
    $payment_process_pane = $this->checkoutFlow
      ->getPane('payment_process');
    assert($payment_process_pane instanceof CheckoutPaneInterface);
    $capture = $payment_process_pane
      ->getConfiguration()['capture'];
    $intent = $stripe_plugin
      ->createPaymentIntent($this->order, $capture);
  }
  if ($intent->status === PaymentIntent::STATUS_REQUIRES_PAYMENT_METHOD) {
    $payment_method = $this->order
      ->get('payment_method')->entity;
    assert($payment_method instanceof PaymentMethodInterface);
    $payment_method_remote_id = $payment_method
      ->getRemoteId();
    $intent = PaymentIntent::update($intent->id, [
      'payment_method' => $payment_method_remote_id,
    ]);
  }

  // To display validation errors.
  $pane_form['payment_errors'] = [
    '#type' => 'markup',
    '#markup' => '<div id="payment-errors"></div>',
    '#weight' => -200,
  ];
  $pane_form['#attached']['library'][] = 'commerce_stripe/stripe';
  $pane_form['#attached']['library'][] = 'commerce_stripe/checkout_review';
  $pane_form['#attached']['drupalSettings']['commerceStripe'] = [
    'publishableKey' => $stripe_plugin
      ->getPublishableKey(),
    'clientSecret' => $intent->client_secret,
    'buttonId' => $this->configuration['button_id'],
    'orderId' => $this->order
      ->id(),
    'paymentMethod' => $intent->payment_method,
  ];
  $profiles = $this->order
    ->collectProfiles();
  if (isset($profiles['shipping']) && !$profiles['shipping']
    ->get('address')
    ->isEmpty()) {
    $pane_form['#attached']['drupalSettings']['commerceStripe']['shipping'] = $profiles['shipping']
      ->get('address')
      ->first()
      ->toArray();
  }
  $cacheability = new CacheableMetadata();
  $cacheability
    ->addCacheableDependency($this->order);
  $cacheability
    ->setCacheMaxAge(0);
  $cacheability
    ->applyTo($pane_form);
  return $pane_form;
}