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

Rails 7中Stripe::Checkout跳转后报错问题求助

Rails7跳转Stripe Checkout页面报错排查与解决

核心问题分析

你遇到的问题包含两个层面:

  1. Stripe提示「页面无法找到」,但终端显示302跳转成功——大概率是Stripe Checkout Session创建失败或URL无效
  2. 浏览器控制台的CSP限制与预加载资源警告——属于Rails安全策略与前端资源加载的适配问题

一、解决Stripe页面找不到的问题

1. 检查Stripe Session创建的错误捕获

当前代码未处理Stripe API异常,可能Session创建失败但未被发现。修改CheckoutController#stripe方法,添加错误捕获:

def stripe    
  unless session[:stripe].present?
    redirect_to overview_path, alert: "购物车信息已过期,请重新结算"
    return
  end

  begin
    @session = Stripe::Checkout::Session.create({
      payment_method_types: ['card'],
      line_items: session[:stripe],
      mode: 'payment',
      success_url: checkout_success_url, # 必须用绝对URL(_url后缀),不能用相对路径(_path)
      cancel_url: checkout_cancel_url,
    })
    redirect_to @session.url, allow_other_host: true
  rescue Stripe::APIError => e
    logger.error "Stripe创建会话失败:#{e.message}"
    redirect_to overview_path, alert: "支付准备失败,请稍后重试"
  end
end

注意:success_url和cancel_url必须是绝对URL,Rails中要用_url后缀的路由辅助方法(比如checkout_success_url),不能用_path,否则Stripe会拒绝创建Session。

2. 修正Line Items的金额单位

Stripe要求unit_amount必须是最小货币单位(比如人民币1元=100分,美元1美元=100美分),如果你的product.price是以「元/美元」为单位的数值,必须转换:
修改Checkout#set_stripe方法中的unit_amount字段:

unit_amount: (product.price * 100).to_i, # 转换为最小货币单位并转为整数

3. 验证Session[:stripe]的有效性

确保session[:stripe]在跳转到stripe动作时没有丢失或为空,可在Checkout#set_stripe末尾添加打印语句验证格式:

# 在Checkout#set_stripe末尾添加
puts "Stripe Line Items: #{result.inspect}"
return result

二、解决CSP与预加载资源警告

1. 配置Rails Content Security Policy(CSP)

Rails7默认启用CSP,需要允许Stripe的资源域名。修改config/initializers/content_security_policy.rb:

Rails.application.config.content_security_policy do |policy|
  policy.default_src :self, :https
  # 允许Stripe的脚本、样式和iframe
  policy.script_src :self, :https, 'https://js.stripe.com', 'unsafe-eval'
  policy.style_src :self, :https, 'unsafe-inline', 'https://js.stripe.com'
  policy.frame_src :self, 'https://js.stripe.com', 'https://hooks.stripe.com'
  # 其他必要的规则...
end

注:unsafe-eval是临时适配Stripe的方案,更安全的方式是使用Stripe的nonce机制,但快速排查阶段可以先添加该规则。

2. 移除不必要的Stripe预加载脚本

如果你的overview页面中加载了stripe.js但并未在本地使用(只是跳转Stripe的URL),可以删除相关预加载代码,避免「预加载资源未及时使用」的警告。


三、额外验证步骤

  1. 查看Stripe Dashboard的「日志」页面,搜索最近的Checkout Session请求,确认是否有API错误提示
  2. 在终端打印@session.url,直接复制到浏览器打开,验证URL是否有效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:43:09