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

一处Stripe Checkout正常运行,另一处预检请求返回403错误

解决Rails中Stripe Checkout 403预检失败问题

以下是针对你遇到的问题的具体排查和修复步骤:

1. 优先检查CSRF令牌传递

Rails默认启用CSRF保护,异步JS请求必须携带正确的CSRF令牌才能通过验证。捐赠控制器的请求大概率是通过Rails原生表单提交(自动包含authenticity_token字段),但注册页面的JS请求可能遗漏了这个关键令牌:

  • 打开浏览器控制台,查看注册页面发起的请求Headers,确认是否存在X-CSRF-Token字段
  • 如果没有,修改JS代码,从页面meta标签中提取令牌并添加到请求头:
    const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
    // 假设你是用fetch请求后端创建Checkout Session
    fetch('/participant_registrations', {
      method: 'POST',
      headers: {
        'X-CSRF-Token': csrfToken,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ /* 你的请求参数 */ })
    })
    .then(response => response.json())
    .then(data => {
      const stripe = Stripe('你的公钥');
      stripe.redirectToCheckout({ sessionId: data.session_id });
    });
    

2. 查看Rails日志定位具体错误

打开log/development.log(开发环境),找到注册控制器create方法对应的请求日志,里面会明确给出403错误的原因(比如Can't verify CSRF token authenticity),这是最直接的问题定位方式。

3. 确认路由与请求方法匹配

运行rails routes命令,检查注册控制器create对应的路由HTTP方法是否为POST,避免出现路由被错误配置为GET或其他方法的情况。

4. 排查CORS配置(本地开发或跨域场景)

如果你的注册页面运行在与后端不同的域名/端口下,检查config/initializers/cors.rb的配置,确保允许当前来源的请求:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:3000' # 替换为你的前端域名/端口
    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

修改后重启Rails服务器生效。

5. 对比捐赠控制器的代码差异

虽然你说代码是复制过来的,但仔细核对以下几点:

  • 注册控制器create方法是否正确返回Checkout Session ID,且响应格式为JSON
  • 注册页面的Stripe JS初始化代码是否与捐赠页面完全一致,包括公钥的使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:45:14