You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    end
    
    这里必须添加allow_other_host: true,因为Stripe结账页面的域名与你的Rails应用域名不同,Rails默认会拦截跨主机跳转。

内容的提问来源于stack exchange,提问作者German

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:54:57