Rails Stripe检索ID错误“没有这样的计划”

时间:2017-07-04 18:29:30

标签: ruby-on-rails stripe-payments

所以我的计划在/ orders / 26 /付款时说Stripe :: InvalidRequestError 没有这样的计划:我的计划的标题 此代码应检查计划是否已存在,如果不存在,则将用户订阅。我认为这是有效的,因为它适用于我已经有一个具有相同ID的计划并且它说“计划已经存在”的情况。如何防止发生此错误?
这是我的代码:

class PaymentsController < ApplicationController
  before_action :set_order

  def new
  end

  def create
   @user = current_user

   customer = Stripe::Customer.create(
   source: params[:stripeToken],
   email:  params[:stripeEmail],
   )

# Storing the customer.id in the customer_id field of user
  @user.customer_id = customer.id

   @plan = Stripe::Plan.retrieve(@order.service.title)
    unless @plan
     plan = Stripe::Plan.create(
      :name => @order.service.title,
      :id => @order.service.title,
      :interval => "month",
      :currency => @order.amount.currency,
      :amount => @order.amount_pennies,
      )
    else
     subscription = Stripe::Subscription.create(
       :customer => @user.customer_id,
       :plan => @order.service.title
      )
    end

  @order.update(payment: plan.to_json, state: 'paid')
  redirect_to order_path(@order)

  rescue Stripe::CardError => e
  flash[:error] = e.message
  redirect_to new_order_payment_path(@order)

  end

  private

  def set_order
    @order = Order.where(state: 'pending').find(params[:order_id])
  end

end

2 个答案:

答案 0 :(得分:2)

documentation表示如果您尝试检索不存在的计划,则会引发错误。所以你只需要抓住错误:

begin
  @plan = Stripe::Plan.retrieve(@order.service.title)
rescue 
  @plan = Stripe::Plan.create(...)
end

答案 1 :(得分:0)

稍微改进版本。很遗憾没有办法检查计划是否存在,你必须依赖吞咽异常。这是我的版本,它试图检索计划,如果错误是404,它会创建计划。否则,让弹出异常。因此,它不会吞下所有异常,这在您使用财务API时非常重要。

def retrieve_or_create_plan(id)
  begin
    Stripe::Plan.retrieve(id)
  rescue Stripe::InvalidRequestError => e
    if e.response.http_status == 404
      Stripe::Plan.create(
        name: 'Your plan name',
        id: id,
        interval: :month,
        currency: :usd,
        amount: 100
      )
    else
      raise e
    end
  end
end