Как вызвать 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.