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