2017-07-04 3 views
1

私の計画はStripe :: InvalidRequestError at/orders/26/paymentsであると言います
私の計画のタイトルはありません。
このコードは、計画がすでに存在していないかどうかを確認し、計画を作成していない場合にはそれを確認してユーザーに登録します。私は既に同じIDの計画を持っていて、「計画はすでに存在している」と言っているので、これがうまくいったと思った。このエラーが発生しないようにするにはどうすればよいですか?
これは私のコードです:Rails Stripe 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

これは何を返しますか? @plan = Stripe :: Plan.retrieve(@ order.service.title) –

答えて

1

documentationは、あなたが存在しない計画を取得しようとした場合、それはエラーが発生しますと言っています。だからあなたはエラーをキャッチする必要があります:

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

これは動作します。ありがとうございました! –

+0

はランダムに生成されたプラン名です。プラン名が既にストライプに存在する場合、支払いが失敗しましたか? – Hashaam

0

少し改良されたバージョン。計画が存在し、それを飲み込む例外に頼らなければならないかどうかを確認する方法がないことは悲しいことです。ここで私のバージョンは、計画を取得しようとすると、エラーが404なら、計画を作成します。それ以外の場合は、例外をポップアップします。だから、あなたが財務APIを扱うときに重要なIMOであるすべての例外を飲み込むことはありません。

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 
関連する問題