From d6620ea2837ede4bc45d3cac3e1fba73bb748c17 Mon Sep 17 00:00:00 2001 From: Brian Quinn Date: Fri, 17 Dec 2010 11:20:09 +0000 Subject: [PATCH] Handle connection errors gracefully --- lib/spree/paypal_express.rb | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/spree/paypal_express.rb b/lib/spree/paypal_express.rb index 920543b..58efbbf 100644 --- a/lib/spree/paypal_express.rb +++ b/lib/spree/paypal_express.rb @@ -28,6 +28,9 @@ module Spree::PaypalExpress end redirect_to (gateway.redirect_url_for response.token, :review => payment_method.preferred_review) + rescue ActiveMerchant::ConnectionError => e + gateway_error I18n.t(:unable_to_connect_to_gateway) + redirect_to :back end # Outbound redirect to PayPal from checkout payments step @@ -51,6 +54,9 @@ module Spree::PaypalExpress end redirect_to (gateway.redirect_url_for response.token, :review => payment_method.preferred_review) + rescue ActiveMerchant::ConnectionError => e + gateway_error I18n.t(:unable_to_connect_to_gateway) + redirect_to :back end # Inbound post from PayPal after (possible) successful completion @@ -103,12 +109,16 @@ module Spree::PaypalExpress else paypal_finish end + else gateway_error(@ppx_details) #Failed trying to get payment details from PPX redirect_to edit_order_checkout_url(@order, :step => "payment") end + rescue ActiveMerchant::ConnectionError => e + gateway_error I18n.t(:unable_to_connect_to_gateway) + redirect_to edit_order_url(@order) end # Local call from A) Order Review Screen, or B) Automatically after paypal_confirm (no review). @@ -180,6 +190,9 @@ module Spree::PaypalExpress #Failed trying to complete pending payment! redirect_to edit_order_checkout_url(@order, :step => "payment") end + rescue ActiveMerchant::ConnectionError => e + gateway_error I18n.t(:unable_to_connect_to_gateway) + redirect_to edit_order_url(@order) end private @@ -347,10 +360,15 @@ module Spree::PaypalExpress end def gateway_error(response) - text = response.params['message'] || - response.params['response_reason_text'] || - response.message - msg = "#{I18n.t('gateway_error')} ... #{text}" + if response.is_a? ActiveMerchant::Billing::Response + text = response.params['message'] || + response.params['response_reason_text'] || + response.message + else + text = response.to_s + end + + msg = "#{I18n.t('gateway_error')}: #{text}" logger.error(msg) flash[:error] = msg end