Rails条纹“计划已存在”

时间:2017-07-02 07:04:57

标签: ruby-on-rails stripe-payments

我是Rails的新手,目前在我的第一个网站上工作。 所以这是我的问题:
每次我为服务创建订阅时,它都会给我一个Stripe :: InvalidRequestError,说“计划已经存在”。我发现必须对Stripe Plan ID做一些事情。

我想要做的是,当用户点击订阅时,它应检查具有相同ID的计划是否已存在。如果不存在具有相同ID的计划,则应创建计划。如果确实存在,则不应创建计划,只需将客户订阅到计划中。

这是我试过的:

  class PaymentsController < ApplicationController
    before_action :set_order

    def create
    @user = current_user

    unless Stripe::Plan.id == @order.service.title
     plan = Stripe::Plan.create(
      :name => @order.service.title,
      :id => @order.service.title,
      :interval => "month",
      :currency => @order.amount.currency,
      :amount => @order.amount_pennies,
     )
   end

上面你可以看到我认为我可以使用Stripe的ID,但显然这不起作用。

   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

   Stripe::Subscription.create(
     :customer => @user.customer_id,
     :plan => @order.service.title,
   )

   @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 

1 个答案:

答案 0 :(得分:0)

您检查计划是否存在的方式不会写Stripe::Plan.id无效,因此unless Stripe::Plan.id == @order.service.title始终失败。您应该使用retrieve方法获取计划并使用以下内容

@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,
  )
end
  

我想要做的是,当用户点击订阅时,它应该检查   如果具有相同ID的计划已存在。如果计划与之相同   ID不存在,它应该创建计划。如果确实存在,那就是它   不应该创建计划,只是订阅客户计划

在上述方法的else部分中,将代码编写为使用该计划创建订阅。所以最后的方法是

@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 => Your customer here,
    :plan => @order.service.title
  )
end