2015-01-31 37 views
1

我正在電子商務/市場應用上處理卡支付。用戶填寫訂單,包括送貨地址,賬單信息等,然後提交。如果填寫的表單沒有錯誤,則表單按預期工作,即保存訂單並收取卡。Rails 4 - 出現表單錯誤時處理卡支付

問題:表單發生錯誤時(例如:zip爲空),表單頁面會返回錯誤消息。但是如果信用卡信息是正確的,用戶就會被收取費用。只有在沒有表單錯誤的情況下,我才需要卡才能充電。

這是我的訂單控制器中的create方法。我想過在respond_to塊中移動條帶電荷塊,但這不起作用,因爲只有在付款批准後才能保存訂單。

由於這是一個市場,我還有一個付款轉賬區塊,也就是說付款的一部分被轉移給物品的賣家。此代碼只應在處理付款並保存訂單後運行。

def create 
    @order = Order.new(order_params) 

    Stripe.api_key = ENV["STRIPE_API_KEY"] 
    token = params[:stripeToken] 


    begin 
     charge = Stripe::Charge.create(
     :amount => (@listing.price * 100).floor, 
     :currency => "usd", 
     :card => token, 
     :description => "Charge from ABC" 
     ) 

    respond_to do |format| 
     if @order.save 
     format.html { redirect_to thankyou_path(:id => @order.id) } 
     format.json { render action: 'show', status: :created, location: @order } 
     AutoNotifier.orderconf_email(current_user, @order).deliver 
     AutoNotifier.sellerconf_email(current_user, @seller, @order).deliver 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end #end respond_to 

    if [email protected]? 
     transfer = Stripe::Transfer.create(
      :amount => (((@listing.price * 97.1) - 30) * 0.8).floor, #converting to cents per stripe requirement. 80 percent in cents goes to seller. 
      :currency => "usd", 
      :recipient => @seller.recipient 
     ) 
    end #end transfer 

    rescue Stripe::CardError => e 
     flash[:danger] = e.message 
    end #end rescue 

    end #end begin 

end #end create 
+0

您是否找到解決方案? – Tobias 2015-12-17 14:31:33

+0

是的,我使用了Deep發佈的解決方案的變體。回覆較晚,抱歉。我不在這裏。 – Moosa 2016-01-13 18:07:56

回答

0

你可以做的是將條帶電荷移動到模型中的方法。然後只需添加一個條件是這樣的:

def save_with_payment 
    if self.valid? 
     charge = Stripe::Charge.create(
    :amount => (@listing.price * 100).floor, 
    :currency => "usd", 
    :card => token, 
    :description => "Charge from ABC" 
    ) 
     self.stripe_customer_token = charge.id 
     save! 
    else 
     logger.error "#{self.errors.inspect}" 
     false 
    end 
    rescue Stripe::InvalidRequestError => e 
    logger.error "Stripe error while creating charge: #{e.message}" 
    errors.add :base, "There was a problem with your credit card." 
    false 
    end 

,並在控制器,你可以做的是:

respond_to do |format| 
     if @order.save_with_payment 
     format.html { redirect_to thankyou_path(:id => @order.id) } 
     format.json { render action: 'show', status: :created, location: @order } 
     AutoNotifier.orderconf_email(current_user, @order).deliver 
     AutoNotifier.sellerconf_email(current_user, @seller, @order).deliver 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end #end respond_to 

因此,這將檢查用戶輸入的數據是有效的,那麼只有將用戶收費。希望這可以幫助。

0

我假設您在創建訂單之前創建了費用,因爲您希望在創建訂單之前確保交易有效。

您在這裏有幾個選項。

  1. 您可以@order.valid?驗證爲了創建充電前,但將返回false,如果您有條紋充驗證。

  2. 您也可以驗證充電而不捕獲它,因爲每this page on the stripe support website,就像這樣:

    charge = Stripe::Charge.create(
        :amount => (@listing.price * 100).floor, 
        :currency => "usd", 
        :card => token, 
        :description => "Charge from ABC" 
        :capture => false 
        ) 
    

    通知的:capture => false。然後,一旦您創建訂單,您可以致電charge.capture。但是,您仍然希望處理(不太可能)的情況,即charge.capture返回錯誤或引發異常,並刪除訂單。

您也可以退還貨款,如果@order.save返回假的,但我建議你輸入錯誤至少檢查您捕獲的收費之前。

0

也許你應該看看交易。如果事務中的某些事件引發異常,則其中的所有內容都將恢復。