2017-06-06 34 views
0

我有一個Rails應用程序,其中Stripe設置類似於this文檔。當我打的「支付用卡」按鈕,進入它說,它是成功的測試卡信息,然後給了我一個錯誤消息說:Rails:條紋似乎工作,但不收費

No route matches [POST] "/charges/new" 

即使我的路線是這樣的:

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),並且在條形儀表板中不收費。

任何人都可以看到我要去哪裏錯了嗎?

+0

你能告訴我們'#create'方法的結束嗎?我們看到'rescue'塊的結尾,但不是'#create'方法的結尾。它應該在成功後重定向。此外,如果出現錯誤,您應該渲染:new'而不是'redirect_to new_charge_path',這將刪除所有表單值。 – Chloe

回答

0

最後,我不得不在表單上的代碼更改爲charge_path,而不是new_charge_path所以它會擊中create行動。儘管這與Stripe文檔不同,但它最終還是起作用。

0

看起來你不允許你的order_params中的'stripeToken'參數。因爲這可能是一個有點繁瑣,但要確保你允許param所喜歡的東西駱駝案例:

params.permit(:"stripeToken" … 

做不到這一點,即參數爲null,並且會給你一個條紋故障。

+0

不幸的是,這並沒有消除任何錯誤或使電荷通過。 – Liz

+0

你有沒有試過:stripe_token也許?我可以想象Rails在將駝峯案例轉換爲下劃線時做了一些事情。在這一點上,我可能會添加'byebug'寶石,然後在其中添加一個'byebug'行,以查看我得到的參數。 – stef

+0

這同樣適用於'params [:stripeEmail]' - 我只是覺得它是零。 – stef

0

問題是這部分在這裏你的控制器:

rescue Stripe::CardError => e 
    flash[:error] = e.message 
    redirect_to new_charge_path 

您應該刪除redirect_to new_charge_path,並且只是簡單地讓條紋呈現錯誤消息。不需要重定向錯誤。 Stripe負責爲你處理錯誤(這是使Stripe很棒的一件事情)。

目前,您的redirect_to被視爲道路後每次成功購買。不只是在錯誤。

更新

經進一步看你的代碼。每次成功購買後,您似乎都沒有redirect_to。所以無論如何,你應該刪除redirect_to new_charge_path,因爲它目前是任意的=> e。它可能看起來像是與處理錯誤有關,導致它在該塊之下,但事實上它不是。您應該在rescue Stripe::CardError =>之上添加redirect_to successful_pathrender :success(例如)。然後讓Stripe處理(或挽救)失敗嘗試進行購買,如前所述。

+0

不幸的是,這個刪除並沒有改變錯誤行爲。 :( – Liz

+0

嗯..這很奇怪,因爲實際發生的事情是你的重定向是每次購買後的事實上的路徑。仔細觀察你的代碼之後,你似乎沒有一條將條帶重定向到的路徑每次成功購買。因此,無論如何,您應該移除'redirect_to new_charge_path'並在'rescue Stripe :: CardError'上方添加一個重定向到您希望用戶在充電成功後結束的位置。 – Crashtor

0

沒有看到您的客戶端代碼,我不能確定 - 但它聽起來像您的客戶端代碼試圖POST到/charges/new - 這不存在 - 所以它失敗。我建議你更新你的客戶端代碼POST到你想要處理的路由,然後繼續從那裏調試。