所以我的计划在/ 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
答案 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