Stripe Checkout-Integration

Aug 25 2020

Ich versuche, das Einfachste zu tun: den Benutzer mit 1 Produkt zur von Stripe gehosteten Checkout-Seite zu senden.

Keines der Beispiele von Stripe scheint zu funktionieren. Bisher habe ich Folgendes:

PHP create-checkout-session.php

require_once 'shared.php';

// ?session_id={CHECKOUT_SESSION_ID} means the redirect will have the session ID set as a query param
$checkout_session = \Stripe\Checkout\Session::create([ 'success_url' => $domain . '/success.html?session_id={CHECKOUT_SESSION_ID}',
    'cancel_url' => $domain . '/canceled.html', 'payment_method_types' => ['card'], //, 'alipay' 'mode' => 'payment', 'line_items' => [[ 'amount' => $price,
        'currency' => 'usd',
        'name' => $product, 'quantity' => 1, ]] ]); echo json_encode(['sessionId' => $checkout_session['id']]);

Diese PHP-Seite gibt korrekt eine Sitzungs-ID zurück.

HTML

<html>
  <head>
    <title>Buy cool new product</title>
    <script src="https://js.stripe.com/v3/"></script>
  </head>
  <body>
    <button id="checkout-button">Checkout</button>

    <script type="text/javascript">
      // Create an instance of the Stripe object with your publishable API key
      var stripe = Stripe('pk_test_key'); // removed for Stackoverflow post
      var checkoutButton = document.getElementById('checkout-button');

      checkoutButton.addEventListener('click', function() {
        // Create a new Checkout Session using the server-side endpoint you
        // created in step 3.
        fetch('create-checkout-session.php', {
          method: 'POST',
        })
        .then(function(response) {
          return response.json();
        })
        .then(function(session) {
          return stripe.redirectToCheckout({ sessionId: session.id });
        })
        .then(function(result) {
          // If `redirectToCheckout` fails due to a browser or network
          // error, you should display the localized error message to your
          // customer using `error.message`.
          if (result.error) {
            alert(result.error.message);
          }
        })
        .catch(function(error) {
          console.error('Error:', error);
        });
      });
    </script>
  </body>
</html>

Wenn ich auf die Schaltfläche klicke, passiert nichts und ich erhalte diesen Fehler auf Chrome devtools:

Error: IntegrationError: stripe.redirectToCheckout: You must provide one of lineItems, items, or sessionId.
    at new t (https://js.stripe.com/v3/:1:11100)
    at Lu (https://js.stripe.com/v3/:1:152624)
    at qu (https://js.stripe.com/v3/:1:152923)
    at Fu (https://js.stripe.com/v3/:1:153599)
    at Bu (https://js.stripe.com/v3/:1:153713)
    at e.redirectToCheckout (https://js.stripe.com/v3/:1:154128)
    at https://emu.net/stripetest/test.html:24:25

Ich verstehe diesen Fehler nicht. Es scheint, dass die Sitzungs-ID nicht korrekt übergeben wird. Der HTML-Code stammt direkt aus dem Stripe-Dokument unter:https://stripe.com/docs/payments/checkout/accept-a-payment

Um ehrlich zu sein, weiß ich noch nicht, wo ich suchen soll. Keines der Stripe-Beispiele scheint zu funktionieren. Hat jemand eine Idee was ich falsch mache?

Antworten

2 Mitya Aug 25 2020 at 01:25

Gemessen an der Struktur müssen sessionSie bestehen

{ sessionId: session.sessionId }

nicht

{ sessionId: session.id }