Rails 7应用中跳转至Stripe Checkout页面失败问题求助
问题解决思路
1. 修复控制器方法嵌套错误
你的CheckoutController中存在明显的方法嵌套问题——外层create方法包裹了内层的create定义,这会导致Ruby方法解析异常,无法正确执行生成Stripe Checkout Session的逻辑,最终响应输出异常。
修正后的控制器代码:
class CheckoutController < ApplicationController def create product = Product.find(params[:id]) @session = Stripe::Checkout::Session.create({ payment_method_types: ['card'], line_items: [{ price_data: { currency: 'usd', product_data: { name: product.name }, unit_amount: (product.price * 100).to_i, # 转换为分 }, quantity: 1 }], mode: 'payment', success_url: root_url, cancel_url: root_url, }) render js: "window.location.href = '#{@session.url}';" end end
2. 确保AJAX响应的JS正确执行
因为按钮使用了remote: true,Rails会发送AJAX请求,返回的JS需要被浏览器自动执行。如果修复方法后仍有问题,可检查以下几点:
- 打开浏览器控制台,查看是否有阻止跳转的JS错误
- 在开发者工具的Network标签中,确认响应的
Content-Type为application/javascript - 用
escape_javascript(简写j)转义Stripe URL,避免特殊字符破坏JS语法:render js: "window.location.href = '#{j(@session.url)}';"
3. 替代方案:放弃AJAX,直接跳转
如果AJAX方式始终有问题,可以改用普通POST请求+跳转的方式:
- 视图按钮移除
remote: true:<div> <strong>Price:</strong> <%= button_to "Buy now!", checkout_create_path, params: {id: product.id} %> </div> - 控制器改用
redirect_to,并添加跨主机跳转许可:
这里必须添加def create product = Product.find(params[:id]) @session = Stripe::Checkout::Session.create({ # 保持原有Session配置不变 payment_method_types: ['card'], line_items: [{ price_data: { currency: 'usd', product_data: { name: product.name }, unit_amount: (product.price * 100).to_i, }, quantity: 1 }], mode: 'payment', success_url: root_url, cancel_url: root_url, }) redirect_to @session.url, allow_other_host: true endallow_other_host: true,因为Stripe结账页面的域名与你的Rails应用域名不同,Rails默认会拦截跨主机跳转。
内容的提问来源于stack exchange,提问作者German
相关产品推荐
相关产品推荐

