При базовой интеграции Stripe не удается загрузить страницу оплаты - PullRequest
0 голосов
/ 18 апреля 2019

Я использую пример быстрого запуска сервера, чтобы отправить пользователя в Stripe для совершения платежа

https://stripe.com/docs/payments/checkout/server

Требуемый идентификатор сеанса возвращается, и я отправляю его в Stripe.Пока страница оплаты не загружается.

Я поменял свой ключ API на XXXXX.

Установите PHP, чтобы показать все ошибки, и ни одна не существует.

Тройной проверил, что мойкод соответствует примеру интеграции (с очевидными необходимыми изменениями)

Проверено в моем аккаунте Stripe.

В ГОЛОВЕ

<script src="https://js.stripe.com/v3/"></script>

В PHP

require_once('stripe-php-6.31.5/init.php');

\Stripe\Stripe::setApiKey("pk_test_XXXXXXXXXXXXXXXXXXXXXXX");

$object = \Stripe\Checkout\Session::create([
        'success_url' => 'https://www.example.com/success',
        'cancel_url' => 'https://www.example.com/cancel',
        'payment_method_types' => ['card'],
        'line_items' => [[
        'amount' => 500,
        'currency' => 'gbp',
        'name' => 'T-shirt',
        'description' => 'Comfortable cotton t-shirt',
        'images' => ['https://www.example.com/t-shirt.png'],
        'quantity' => 1,
    ]]
]);

$session_id = $object->id;

if ($session_id) {

    echo "<script>
          var stripe = Stripe('pk_test_XXXXXXXXXXXXXXXXXXXXXXX');
          stripe.redirectToCheckout({
          sessionId: '{{" . $session_id . "}}'
          }).then(function (result) {
          });
          </script>";

} else {

    echo 'No Session ID!';

}

Страница оплаты Stripe должна загрузиться.

Кроме того, JavaScript, когда у меня есть session_id, выглядит следующим образом

stripe.redirectToCheckout({
                sessionId: 
'{{cs_KmeIFgWSfN5GW6tP2e5IQ0Vb9EA0q3pWGHZNoDfFKAdcc6kW7DwsM6dAbhQ30}}'
            }).then(function (result) {
                // If `redirectToCheckout` fails due to a browser or network
                // error, display the localized error message to your customer
                // using `result.error.message`.
            });

Затем пользователю показывается эта страница

<!DOCTYPE html>
<html>
<head>
    <title>KP Balance and Purchase</title>
    <script src="https://js.stripe.com/v3/"></script>

    <script>
        <!--
        function checkout(session_id) {

            var stripe = Stripe('pk_test_yLz5iASFgRnotoAQc79miQGz');

            stripe.redirectToCheckout({
                sessionId: '{{cs_KmeIFgWSfN5GW6tP2e5IQ0Vb9EA0q3pWGHZNoDfFKAdcc6kW7DwsM6dAbhQ30}}'
            }).then(function (result) {
                // If `redirectToCheckout` fails due to a browser or network
                // error, display the localized error message to your customer
                // using `result.error.message`.
            });

            }

        //-->
</script>

</head>
<body>

<form>
    <input type="button" onclick="checkout()" value="Buy Now!" />
</form>

</body>
</html>

Ответы [ 2 ]

5 голосов
/ 18 апреля 2019

Кроме того, javascript, как только у меня есть session_id, выглядит следующим образом

stripe.redirectToCheckout({
                sessionId: '{{cs_KmeIFgWSfN5GW6tP2e5IQ0Vb9EA0q3…kW7DwsM6dAbhQ30}}'

{{CHECKOUT_SESSION_ID}} обычно используется для обозначения «это заполнитель» в технической документации, но это не означает, что вы должны включать фигурные скобки в фактическое значение.

Ваш sessionId: '{{cs_KmeI…Q30}}' на самом деле должен быть просто sessionId: 'cs_KmeI…Q30' здесь.

0 голосов
/ 20 мая 2019

Я боролся с этим в течение нескольких дней и даже обратился к Stripe с просьбой о помощи. Я наконец получил это на работу.

НЕТ фигурных скобок , но также НЕТ кавычек . ПРОСТО имя переменной , которую вы (мы) присвоили переменной, указанной при ответе сервера. Это значение id массива, возвращенного из \Stripe\Checkout\Session::create([..])

Из вашего примера это будут session_id в PHP и sessionId в JS . Это означает, что ваш sessionId: '{{cs_KmeI…Q30}}' на самом деле должен быть просто sessionId: 'cs_KmeI…Q30'.

Вупи .. загрузили страницу оплаты НАКОНЕЦ! : O)

РЕДАКТИРОВАТЬ: Извините, но это был конец 14-часовой рабочий день. Мои глаза болят, и у меня болит голова. Всем доброе утро.

Нельзя помещать фактическое значение идентификатора сеанса с жестким кодом в одинарные кавычки, поскольку сеанс является изменчивым. После истечения этого сеанса или инициирования другого сеанса для другого платежа использование examp123le0fID не будет работать. Поэтому мы хотим использовать назначенное динамическое значение. Эта переменная не должна быть заключена ни в что - ни в кавычки, ни в кавычки.

При инициализации файла оплаты я создал переменную для идентификатора сеанса, используя массив, который нам возвращает Stripe. Это я сделал в PHP, так как это то, что я использую для этого раздела кода. Затем я добавил скрипт после секции body, который назначил это значение (переменную) новой переменной Java. Сразу после этого я добавил скрипт, который передал переменную java в файл java, содержащий код перенаправления Java Stripe. Внутри я назначил эту переменную новому имени, используя const, который затем был передан самому коду перенаправления. Это может быть долгий путь сделать это. Я не очень хорош в Java, Jason, Ajax и т. Д., И я не занимался программированием более 10 лет, но важно то, что этот подход сработал для нас.

Итак, в нашем файле donation.php есть:

                           $session = \Stripe\Checkout\Session::create([
                            'payment_method_types' => ['card'],
                            'line_items' => [[
                              'name' => 'Custom t-shirt',
                              'description' => 'Your custom designed t-shirt',
                              'amount' => 5000, /* order.amount */
                              'currency' => 'usd',
                              'quantity' => 1,
                            ]],
                            'success_url' => 'https://example.com/success',
                            'cancel_url' => 'https://example.com/cancel',
                          ]);

                        $stripeSession = array($session);
                        $sessId = ($stripeSession[0]['id']);

Затем сразу после конца тела в тот же файл я положил это:

<script type="text/javascript"> var ssId = "<?php echo $sessId ?>";</script> 

<script src="./client.js"></script>

где client - это файл js, содержащий код перенаправления Stripe. Внутри этого файла у нас было это:

const stripe = Stripe('pk_test_UKRcYdXTmraCEZspx8PE7NzB00QZyoUXp3');
const checkout_Id = (ssId);

и перенаправление Stripe:

 stripe.redirectToCheckout({
 sessionId: checkout_Id,
   });

И это вернуло полную страницу оформления заказа с разделом оплаты.

...