Как я могу изменить Stripe Checkout вместо отправки запроса AJAX?

Я использую Stripe и Checkout для создания формы платежа, и я хочу, чтобы иметь возможность использовать Checkout awesome javascript library, но я также хочу изменить отправку формы с обычного POST на AJAX POST.

Итак, я попробовал добавить обработчик к элементу формы, который у вас должен был быть, но моя консольная строка никогда не запускалась, поэтому она не отправляется с использованием данной формы.

Затем я попытался изучить код, который появился при срабатывании оверлея. Это немного сбивает с толку, и мне просто интересно, мог ли кто-нибудь еще понять это, или если это стало сложно, потому что это вопрос безопасности?

// Stripe plugin
<form id="payment_form" method='post' action="{{url_for('process_payment')}}">
        <script
            src="https://checkout.stripe.com/checkout.js" class="stripe-button"
            data-key="test key">
        </script>
</form>

// Form submit handler
$(document).ready(function(){
    $("#payment_form").submit(function(e) {
        console.log("Processing...");
        ajax_payment();
        return false;
    });

});

Ответы

Ответ 1

Вы можете сделать это так. В этом примере используется PHP, но поменяйте свой предпочтительный серверный язык:

1) Создайте файл nocontent.php, который содержит эту строку: header("HTTP/1.0 204 No Content");, который неожиданно возвращает заголовок 'HTTP/1.0 204 No Content'. При запросе этой страницы браузер не будет ничего делать. Вы можете факультативно, чтобы эта страница обрабатывала данные POST, или вы можете просто создать эту фиктивную страницу с этой единственной строкой.

2) В вашем HTML поместите путь nocontent.php в атрибут <form tag action: <form action="nocontent.php".

3) Прикрепите функцию javascript к событию window.onbeforeunload. Это событие запускается, когда браузер запрашивает новую страницу, и поэтому уволен, хотя браузер, похоже, ничего не делает. Эта функция вызывается после того, как Stripe генерирует свой токен.

4) Ваша форма теперь содержит элементы <input type="hidden" name="stripeToken" value="..."/> и <input type="hidden" name="stripeEmail" value="..."/>.

5) Теперь у вас есть опции, в зависимости от того, когда вы обрабатывали данные формы POST.

  • a) Если ваша страница nocontent.php просто возвращает заголовок "без содержимого", вы можете теперь AJAX повторно отправить данные формы на другую страницу (как обычно), которая будет фактически обрабатывать данные POST и возвращать Stripe информацию о состоянии. Этот маршрут я взял.

  • b) Если ваша страница nocontent.php сама обрабатывает данные формы POST, вы можете сохранить ответ Stripe на сервере и использовать свой токен в качестве ключа в запросе ajax для получения статуса платежа всякий раз, когда он прибывает из Stripe,

Обратите внимание, что лучше перехватить и запретить Stripe инициировать событие отправки в самой форме, но я не имел надежного успеха с этим методом.

Ответ 2

Полоса запускает форму submit(). Вы можете установить обработчик событий (а не прослушиватель!), Чтобы предотвратить отправку обычного запроса POST.

Пример использования простого javascript:

var form = document.getElementById('myStripeForm');
form.submit = function() {
    // ... get form data here and send it through ajax

    // Prevent form submit.
    return false;
}

Пример использования jQuery:

$('#myStripeForm').get(0).submit = function() {
    var data = $(this).serializeArray();
    // process data and send ajax request

    $.ajax(...);

    // Prevent form submit.
    return false;
}

Ответ 3

Существует два варианта интеграции Checkout, первый, который вы используете, - это "простая" интеграция. Вторая - это обычная интеграция, которая имеет успешный обратный вызов (функция "токен" ). Это выглядит так:

<script>
  var handler = StripeCheckout.configure({
    key: 'pk_test_6pRNASCoBOKtIshFeQd4XMUh',
    image: '/square-image.png',
    token: function(token, args) {
      // Use the token to create the charge with a server-side script.
      // You can access the token ID with `token.id`
    }
  });

  document.getElementById('customButton').addEventListener('click', function(e) {
    // Open Checkout with further options
    handler.open({
      name: 'Demo Site',
      description: '2 widgets ($20.00)',
      amount: 2000
    });
    e.preventDefault();
  });
</script>

Вы добавили бы функцию ajax_payment в функцию token.