From a6ad630b026cb45a0414bbd332195ea6ca2437e5 Mon Sep 17 00:00:00 2001 From: Brian Quinn Date: Wed, 24 Nov 2010 09:31:31 +0000 Subject: [PATCH] Improved handling of declined echecks --- .../paypal_express_callbacks_controller.rb | 28 ++++++++++++------- app/models/paypal_account.rb | 6 ++-- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/app/controllers/paypal_express_callbacks_controller.rb b/app/controllers/paypal_express_callbacks_controller.rb index e1e4a15..0ea0a0c 100644 --- a/app/controllers/paypal_express_callbacks_controller.rb +++ b/app/controllers/paypal_express_callbacks_controller.rb @@ -3,17 +3,17 @@ class PaypalExpressCallbacksController < Spree::BaseController skip_before_filter :verify_authenticity_token def notify + retrieve_details #need to retreive details first to ensure ActiveMerchant gets configured correctly. + @notification = Paypal::Notification.new(request.raw_post) # we only care about eChecks (for now?) - if @notification.params["payment_type"] == "echeck" && @notification.acknowledge + if @notification.params["payment_type"] == "echeck" && @notification.acknowledge && @payment case @notification.params["payment_status"] when "Denied" - retrieve_details create_txn PaypalTxn::TxnType::DENIED when "Completed" - retrieve_details create_txn PaypalTxn::TxnType::CAPTURE end @@ -24,17 +24,26 @@ class PaypalExpressCallbacksController < Spree::BaseController private def retrieve_details - @order = Order.find_by_number(@notification.params["invoice"]) - @payment = @order.checkout.payments.find(:first, + @order = Order.find_by_number(params["invoice"]) + + if @order + @payment = @order.checkout.payments.find(:first, :conditions => {"transactions.txn_type" => PaypalTxn::TxnType::AUTHORIZE, - "transactions.payment_type" => @notification.params["payment_type"]}, + "transactions.payment_type" => params["payment_type"]}, :joins => :transactions) + + @payment.try(:payment_method).try(:provider) #configures ActiveMerchant + end end def create_txn(txn_type) - if @payment.can_finalize? - @payment.finalize! - PaypalTxn.create(:payment => @payment, + if txn_type == PaypalTxn::TxnType::CAPTURE + @payment.finalize! if @payment.can_finalize? + elsif txn_type == PaypalTxn::TxnType::DENIED + #maybe we should do something? + end + + PaypalTxn.create(:payment => @payment, :txn_type => txn_type, :amount => @notification.params["payment_gross"].to_f, :payment_status => @notification.params["payment_status"], @@ -42,7 +51,6 @@ class PaypalExpressCallbacksController < Spree::BaseController :transaction_type => @notification.params["txn_type"], :payment_type => @notification.params["payment_type"]) - end end diff --git a/app/models/paypal_account.rb b/app/models/paypal_account.rb index ffe9540..0bbdc8d 100644 --- a/app/models/paypal_account.rb +++ b/app/models/paypal_account.rb @@ -32,7 +32,7 @@ class PaypalAccount < ActiveRecord::Base end def can_capture?(payment) - find_capture(payment).nil? + !echeck?(payment) && find_capture(payment).nil? end def credit(payment, amount=nil) @@ -86,7 +86,9 @@ class PaypalAccount < ActiveRecord::Base :order => 'created_at DESC') end - + def echeck?(payment) + payment.txns.exists?(:payment_type => "echeck") + end def gateway_error(text) msg = "#{I18n.t('gateway_error')} ... #{text}"