我有一个rails应用程序,其中Stripe的设置类似于this文档。当我点击"用卡支付"按钮并输入它说成功的测试卡信息,然后给我一条错误信息:
resources :charges
get 'charges/shipping'
get 'charges/address'
post 'charges/update_order'
即使我的路线是这样的:
charges_controller
我的class ChargesController < ApplicationController
...
def new
@order = current_order
end
def create
# Amount in cents
@amount = current_order.total * 100
@user = current_user
@order = current_order
if @user.stripe_customer_id
customer = @user.stripe_customer_id
else
customer = Stripe::Customer.create(
:email => params[:stripeEmail],
:source => params[:stripeToken]
)
@user.update_attributes(stripe_customer_id: customer.id)
end
@order.update_attributes(order_status_id: 2)
@order.update_attributes(date_placed: DateTime.now)
# OrderMailer.order_placed(@order.user, @order).deliver_now
session[:order_id] = nil
charge = Stripe::Charge.create(
:customer => @user.stripe_customer_id,
:amount => @amount.to_i,
:description => 'Rails Stripe customer',
:currency => 'usd'
)
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to new_charge_path
end
private
def order_params
params.permit(:subtotal, :tax, :shipping, :total, :order_status_id, :user_id, :date_placed, :shipping_choice)
end
end
读起来像这样:
post "charges/new"
如果我手动将routes.rb
插入Stripe::CardError
,表示它已成功,但会重定向到同一页面(表示CREATE EXTENSION btree_gist;
)并且没有注册费用条纹仪表板。
谁能看到我出错的地方?
答案 0 :(得分:0)
您似乎不允许var apigClientFactory = {};
apigClientFactory.newClient = function (config) {
var apigClient = { };
if(config === undefined) {
config = {
accessKey: '',
secretKey: '',
sessionToken: '',
region: '',
apiKey: undefined,
defaultContentType: 'application/json',
defaultAcceptType: 'application/json'
};
}
...
中的'stripeToken'参数。因为骆驼的情况可能有点繁琐,但要确保你允许这样的param:
order_params
如果没有这个,那么该参数为null,并且会给你一个Stripe失败。
答案 1 :(得分:0)
问题在于控制器中的这一部分:
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to new_charge_path
您应该删除redirect_to new_charge_path
,只需让Stripe呈现错误消息即可。无需重定向错误。 Stripe会为您处理错误处理(这是Stripe非常棒的原因之一)。
目前,每次成功购买后,您的redirect_to
都被视为 路径。不仅仅是错误。
<强>更新强>
进一步查看您的代码。每次成功购买后,您似乎都没有redirect_to
。所以无论如何,你应该删除redirect_to new_charge_path
,因为它目前是=> e
的任意对象。它可能看起来与错误处理有关,导致它低于该块,但事实上它没有。您应该在redirect_to successful_path
正上方添加render :success
或rescue Stripe::CardError =>
(例如)。然后让Stripe处理(或救援)尝试购买失败,如前所述。
答案 2 :(得分:0)
没有看到你的客户端代码,我无法确定 - 但听起来你的客户端代码试图POST到/charges/new
- 这是不存在的 - 所以它失败了。我建议你将你的客户端代码更新到你想要处理的路由,然后从那里继续调试。
答案 3 :(得分:0)
尝试重新启动服务器以重新加载路由。运行rake routes | grep charges
以验证您是否看到POST /charges/new
。
等等,我知道为什么。你应该 GET /charges/new
和 POST 到/charges
。向我们展示您的视图代码,特别是表单提交URL地址。
请参阅http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions
答案 4 :(得分:0)
最后,我必须将表单上的代码更改为charge_path
而不是new_charge_path
,以便它会点击create
操作。尽管这与Stripe文档有所不同,但最终还是起作用了。