如何更改Stripe的API版本以进行测试等

时间:2015-06-12 13:41:32

标签: ruby-on-rails stripe-payments

我们正在管理使用Stripe的旧Rails应用程序,但我们的Stripe版本比当前API落后26个月。我们正在寻求升级到当前的Stripe API,但由于许多更改会影响我们的系统,因此在更改我们的实时网站正在使用的实时API之前,我们非常喜欢测试更改的方法。< / p>

所以我有两个问题:

1)使用API​​时,我们非常依赖实时和测试模式之间的区别。有没有办法只升级测试模式API(不升级Live),这样我们就可以识别并纠正任何破坏而不会真正破坏用户体验?

2)是否可以一次升级一个版本的API,而不是一次升级,以使转换对我们来说更易于管理?

2 个答案:

答案 0 :(得分:12)

文档记录非常糟糕,但事实证明,您可以通过在使用Ruby绑定发送请求之前设置Stripe.api_version = 'YYYY-MM-DD',将Stripe API版本更改为您所需的任何版本({{3} }),或通过发送Stripe-Version HTTP标头。

因此,我们计划将规范配置为针对所有请求使用最新的API版本,并以此方式测试破损。

答案 1 :(得分:0)

以下是在代码内细粒度级别覆盖Stripe版本的一种方法。

这可以通过重写Stripe.api_version访问器方法来在线程局部变量中查找版本,或者如果找不到该版本,则退回到原始行为。 Stripe.api_version用作lib/stripe.rbStripe-Version HTTP标头的值。

注意:这适用于1.58.0版的条纹gem,尚未经过其他版本的测试:

首先,创建包含内容的文件config/initializers/stripe_api_version_overrider.rb

module StripeAPIVersionOverrider
  def api_version
    Thread.current[:__stripe_api_version_override] || super
  end

  def with_api_version(version, &block)
    original_version = api_version
    Thread.current[:__stripe_api_version_override] = version
    block.call
  ensure
    Thread.current[:__stripe_api_version_override] = original_version
  end
end

Stripe.singleton_class.prepend(StripeAPIVersionOverrider)

接下来,在您要使用其他版本的Stripe API的代码中,将其包装在传递给Stripe.with_api_version的块中:

Stripe.with_api_version "2016-07-06" do
  # API versions prior to 2016-07-06 did not support
  # retrieving canceled subscriptions.
  Stripe::Subscription.retrieve(subscription_id)
end

运行bin/spring stop以确保将这些更改加载到您的开发环境中。