首页 > 解决方案 > Rails 应用程序中的条带success_url 格式未创建正确的URL

问题描述

我有一个使用 Stripe Checkout 并创建 Stripe 会话然后重定向到结帐的应用程序。在我的控制器中,此代码工作正常:

session = Stripe::Checkout::Session.create(
      payment_method_types: ['card'],
      subscription_data: {
        items:             [{ plan: stripe_plan }],
      },
      customer:            stripe_customer_id,
      customer_email:      stripe_customer_email,
      client_reference_id: current_user.id,
      success_url:         "http://localhost:3000/welcome_new_subscriber?session_id={CHECKOUT_SESSION_ID}",
      cancel_url:          "http://localhost:3000/charges/new?stripe_plan=" + stripe_plan,
    )

并正确重定向到 URL:

http://localhost:3000/welcome_new_subscriber?session_id=cs_test_abcd1234

当我将 success_url 行更改为以下内容时(如一些网站上所建议的那样),它不起作用:

      success_url:         welcome_new_subscriber_url(:session_id => '{CHECKOUT_SESSION_ID}'),

URL 解析为:

http://localhost:3000/welcome_new_subscriber?session_id=%7BCHECKOUT_SESSION_ID%7D

{CHECKOUT_SESSION_ID} 似乎没有正确解析。知道我做错了什么吗 - 我已经尝试了所有我能想到的语法更改?

标签: ruby-on-railsrubystripe-payments

解决方案


当你使用

welcome_new_subscriber_url(:session_id => '{CHECKOUT_SESSION_ID}')

Rails 试图通过 URI 转义{}. 然而,Stripe gem 使用这些作为特殊字符来知道在哪里替换模板变量。

所以你可以使用

welcome_new_subscriber_url + "?session_id={CHECKOUT_SESSION_ID}"

不是最优雅的东西,但是Stripe的系统在这里有点奇怪(他们为什么不让你CHECKOUT_SESSION_ID自己通过?),所以我们必须凑合


推荐阅读