Как вызвать Stripe Checkout с контроллера rails

Я использую api проверки полосы с приложением rails. Я хочу перенаправить на страницу оформления заказа, когда пользователь отправляет форму. Проблема, с которой я сталкиваюсь, заключается в том, что для проверки Stripe требуется нажатие кнопки, которая запускает функцию javascript, которая принимает идентификатор сеанса и перенаправляет на страницу проверки.

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

Я пытался вызвать функцию javascript непосредственно из контроллера rails и передать ей идентификатор сеанса, мне не удалось заставить это работать, но я чувствую, что это, вероятно, близко к решению. Как конкретно я могу запустить функцию javascript после того, как контроллер создал сеанс

Это функция Javascript, которую я хочу вызвать в своем контроллере

function go_to_stripe(sessionId) {
  var stripe = Stripe("<%=ENV["STRIPE_PUB_KEY"]%>");

  stripe.redirectToCheckout({
    sessionId: sessionId
  }).then(function (result) {
    console.log("hitting the then with result of ", result);
  });
}

Я пробовал это в контроллере (и в нескольких его вариантах), но он не вызывает функцию javascript.

# this returns the session id 
@stripe_session_id = create_stripe_session(@cart)
respond_to do |format|
   format.html 
   format.js { render :js => "go_to_stripe("+@stripe_session_id+");" }
end

2 ответа

Нашел исправление на основе https://signalvnoise.com/posts/3697-server-generated-javascript-responses

Ключ имел remote: true в форме, а также имя файла javascript так же, как действие контроллера. измените javascript в файле, чтобы он содержал тело функции.

javascript

var stripe = Stripe("<%=ENV["STRIPE_PUB_KEY"]%>");

stripe.redirectToCheckout({
  sessionId: "<%= @stripe_session_id %>"
}).then(function (result) {
  console.log("hitting the then with result of ", result);
});

контроллер рельсов

@stripe_session_id = create_stripe_session(@cart)
respond_to do |format|
  format.html
  format.js
end

Я написал руководство по перенаправлению на Stripe Checkout с контроллера Rails. Идея состоит в том, чтобы создать сеанс Stripe после регистрации пользователя (с помощью Devise) в пределах the after_sign_up_path_forметод:

      def after_sign_up_path_for(resource)
    super(resource)

        Stripe.api_key = "#{ENV['STRIPE_API_KEY']}"

        # See https://stripe.com/docs/api/checkout/sessions/create
        # for additional parameters to pass.
        # {CHECKOUT_SESSION_ID} is a string literal; do not change it!
        # the actual Session ID is returned in the query parameter when your customer
        # is redirected to the success page.
        session = Stripe::Checkout::Session.create(
            success_url: "success_url",
            cancel_url: "cancel_url",
            payment_method_types: ['card'],
            mode: 'payment',
            line_items: [{
                # For metered billing, do not pass quantity
                quantity: 1,
                price: ENV['STRIPE_PRICE_ID']
            }],
            locale: "fr",
            customer_email: current_user.email
        )

        return session.url

  end

При этом пользователь автоматически перенаправляется на Checkout.

Другие вопросы по тегам