From 8a772c82191941ccb9b043e72cda412f385bf652 Mon Sep 17 00:00:00 2001 From: Vernon de Goede Date: Wed, 10 Oct 2018 18:18:40 +0200 Subject: [PATCH] Allow payment cancelations when payment is cancelable. --- Gemfile | 2 +- app/models/spree/gateway/mollie_gateway.rb | 36 +++++++++++++------ .../spree/payment/processing_decorator.rb | 18 ++++++++++ spree_mollie_gateway.gemspec | 2 +- 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/Gemfile b/Gemfile index f222d55..b416fd9 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } -gem 'mollie-api-ruby', '~> 4.0.0' +gem 'mollie-api-ruby', '~> 4.1.1' # Specify your gem's dependencies in spree_mollie_gateway.gemspec gemspec diff --git a/app/models/spree/gateway/mollie_gateway.rb b/app/models/spree/gateway/mollie_gateway.rb index c0532a0..8e3db5c 100644 --- a/app/models/spree/gateway/mollie_gateway.rb +++ b/app/models/spree/gateway/mollie_gateway.rb @@ -75,7 +75,7 @@ def create_customer(user) customer = Mollie::Customer.create( email: user.email, api_key: get_preference(:api_key), - ) + ) MollieLogger.debug("Created a Mollie Customer for Spree user with ID #{customer.id}") customer end @@ -167,6 +167,20 @@ def credit(credit_cents, payment_id, options) end end + def cancel(transaction_id) + begin + mollie_payment = ::Mollie::Payment.get( + transaction_id, + api_key: get_preference(:api_key) + ) + mollie_payment.delete(transaction_id) if mollie_payment.is_cancelable + ActiveMerchant::Billing::Response.new(true, 'Payment cancelled successful') + rescue Mollie::Exception => e + MollieLogger.debug("Refund failed for order #{order_number}: #{e.message}") + ActiveMerchant::Billing::Response.new(false, 'Payment cancelation unsuccessful') + end + end + def available_methods(params = nil) method_params = { api_key: get_preference(:api_key), @@ -208,16 +222,16 @@ def update_payment_status(payment) def update_by_mollie_status!(mollie_payment, payment) case mollie_payment.status - when 'paid' - payment.complete! unless payment.completed? - payment.order.finalize! - payment.order.update_attributes(:state => 'complete', :completed_at => Time.now) - when 'canceled', 'expired', 'failed' - payment.failure! unless payment.failed? - payment.order.update_attributes(:state => 'payment', :completed_at => nil) - else - MollieLogger.debug('Unhandled Mollie payment state received. Therefore we did not update the payment state.') - payment.order.update_attributes(state: 'payment', completed_at: nil) + when 'paid' + payment.complete! unless payment.completed? + payment.order.finalize! + payment.order.update_attributes(:state => 'complete', :completed_at => Time.now) + when 'canceled', 'expired', 'failed' + payment.failure! unless payment.failed? + payment.order.update_attributes(:state => 'payment', :completed_at => nil) + else + MollieLogger.debug('Unhandled Mollie payment state received. Therefore we did not update the payment state.') + payment.order.update_attributes(state: 'payment', completed_at: nil) end payment.source.update(status: payment.state) diff --git a/app/models/spree/payment/processing_decorator.rb b/app/models/spree/payment/processing_decorator.rb index 79d3657..6f06e44 100644 --- a/app/models/spree/payment/processing_decorator.rb +++ b/app/models/spree/payment/processing_decorator.rb @@ -7,8 +7,26 @@ def process!(amount = nil) end end + def cancel! + if payment_method.is_a? Spree::Gateway::MollieGateway + cancel_with_mollie + else + cancel_with_spree + end + end + private + def cancel_with_spree + response = payment_method.cancel(response_code) + handle_response(response, :void, :failure) + end + + def cancel_with_mollie + response = payment_method.cancel(transaction_id) + handle_response(response, :void, :failure) + end + def process_with_spree if payment_method && payment_method.auto_capture? purchase! diff --git a/spree_mollie_gateway.gemspec b/spree_mollie_gateway.gemspec index 42b6f6b..3c5bea6 100644 --- a/spree_mollie_gateway.gemspec +++ b/spree_mollie_gateway.gemspec @@ -50,5 +50,5 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'coffee-rails' spec.add_development_dependency 'database_cleaner' - spec.add_runtime_dependency 'mollie-api-ruby', '~> 4.0.0' + spec.add_runtime_dependency 'mollie-api-ruby', '~> 4.1.1' end