【问题标题】:Rails Stripe "Plan already exists"Rails Stripe“计划已经存在”
【发布时间】:2017-12-05 16:51:32
【问题描述】:

我是 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 

【问题讨论】:

  • 检查 Stripe::Plan.id 并打印其值
  • 它告诉我!! # 的未定义方法 `id'。所以当我尝试打印它时它没有价值。当我第一次创建它时,我将 ID 分配给了字符串“test”。
  • 能把用户点击订阅按钮时生成的参数贴出来吗?
  • 你是这个意思吗? “✓”, “authenticity_token”=> “ZJPFaGjSGLkACju0m7UkixWQ1kTXvko45HfLdfCP6wggmR8L7U6T7I56nrooYzCpqH7vg0VX7 + PWG + WDqOiCmw ==”, “stripeToken”=> “tok_1Ab24XL51Wq7fLz4OQOZ8f44”, “stripeTokenType”=> “卡”,“stripeEmail "=>"123456@gmail.com", "controller"=>"payments", "action"=>"create", "order_id"=>"18"} 允许:false>
  • 如果用户点击订阅按钮,参数只是 <:parameters>"payments", "action"=>"new", "order_id"=>" 18"} 允许:false>

标签: ruby-on-rails stripe-payments


【解决方案1】:

您检查计划是否存在的方式不正确。 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

【讨论】:

  • 确实,这根本不是“写”;-)
  • @MickaelFM 哈哈很好看:)
猜你喜欢
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2017-02-07
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多