重定向到 Stripe 结账 URL 时出现 302 响应

Lis*_*ker 1 ruby ruby-on-rails stripe-payments ruby-on-rails-7

在我的 Rails 7 应用程序中,我正在使用订阅模型,因此通过 Stripe API 实现订阅。

请参阅下面的付款方式 (subscriptions_controller.rb),当用户单击“选择计划”按钮时会触发该付款方式。重定向有效,然后无效,然后再次有效;我没有改变订阅的创建方式以及检索 URL 的方式。

def payment
    @subscription = current_user.subscription
    if @subscription
      plan_id = params[:plan_id]
      @subscription.update(id: @subscription.id, plan_id:, user_id: current_user.id, active: true)
    else
      subscription_id = SecureRandom.uuid
      plan_id = params[:plan_id]
      @subscription = Subscription.new(id: subscription_id, plan_id:, user_id: current_user.id)
    end

    @checkout_session = create_checkout_session(@subscription)
    @subscription.checkout_session_id = @checkout_session.id
    @subscription.save!
    redirect_to @checkout_session.url, allow_other_host: true
  end

private

def create_checkout_session(subscription)
    Stripe::Checkout::Session.create({
      customer: current_user.stripe_id,
      payment_method_types: ['card'],
      line_items: [{
        price: subscription.plan.stripe_price_id,
        quantity: 1
      }],
      mode: 'subscription',
      success_url: subscription_url(subscription),
      cancel_url: new_subscription_url
    })
  end
Run Code Online (Sandbox Code Playgroud)

错误信息

  • 在我的终端中,我收到 302。
  • 页面显示:

“出现问题。找不到您要查找的页面。请检查网址或联系商家。”

  • 控制台抛出:

“CheckoutInitError:未设置 apiKey”。

在重定向之前调用 raise 并从那里获取 URL 是可行的。从 Stripe 开发者日志(即从创建的结帐会话)获取 URL 也可以。

我的重定向呼叫出了什么问题?

我在redirect_to调用之前添加了一个raise并检查URL是否相同:

>> @checkout_session.url

"https://checkout.stripe.com/c/pay/cs_test_a1ayFdxprxmpwtZA9cyvECPG2bNaLnCN7e5UToqdr8oNrDxZKfm1BrFts9#fidkdWxOYHwnPyd1blpxYHZxWjA0SENmbjZOdzF0UWNqbkhndD1SY0l8TUxkR2B0fUZ9PH9MX0w2T05Bcz1Cb11taU1AcTxRQkhWTFZGdWo2Z1F1MXZJfENzcDdOYlxjM0NAV01nUlRsTkNDNTVLX0twf3FyQicpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl"


>> redirect_to @checkout_session.url, allow_other_host: true

"<html><body>You are being <a href=\"https://checkout.stripe.com/c/pay/cs_test_a1ayFdxprxmpwtZA9cyvECPG2bNaLnCN7e5UToqdr8oNrDxZKfm1BrFts9#fidkdWxOYHwnPyd1blpxYHZxWjA0SENmbjZOdzF0UWNqbkhndD1SY0l8TUxkR2B0fUZ9PH9MX0w2T05Bcz1Cb11taU1AcTxRQkhWTFZGdWo2Z1F1MXZJfENzcDdOYlxjM0NAV01nUlRsTkNDNTVLX0twf3FyQicpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl\">redirected</a>.</body></html>"
Run Code Online (Sandbox Code Playgroud)

第一个有效,第二个(它被重定向到的那个)末尾有一个反斜杠(当我将其发布到此处时您甚至看不到)。如果我把它取下来刷新一下,它就会起作用。为什么添加此内容以及如何删除它?

小智 10

我今天刚刚遇到这个问题并发现了问题。看起来 Turbo 正在搞乱重定向。

我只需添加data: { turbo: false }到重定向到 Stripe 的支付路径的链接即可解决此问题。