solidus_nexio 0.7.10 → 0.7.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d41277b3e134349ca38560b0fdcaff483ca1a5c06f0009638bb6d1a760a021d
4
- data.tar.gz: 206b628b09f118160b59f250de348348d49fd397a6562b887d403f710cb530fe
3
+ metadata.gz: 1b8b26c32f6aadcf7970abe96f50a80c434ab4dbfa8d3fee871b2fca6addb14c
4
+ data.tar.gz: d43e6cd590a8b93d2920f2e8bebb571823be7bfbd666601559016d5dcb61cad6
5
5
  SHA512:
6
- metadata.gz: 1e11394077942c416ecd6d009624543ba30d88e5d357e4c11d8a354f23e7b0c012e08d78be80252f29232fbbbe93dc653fc006c7d40bcfb49bb12765d51e23e2
7
- data.tar.gz: '098789028bed9c285c82dd4bd9ccd7a887aedcdb0207e70ca6dfa8a0cddbbc7210b61fff8fd336be0c9218053239b1c507cd9b4df666fd126109c10b509a6f3b'
6
+ metadata.gz: 6a32db735b15b242878bdb8a30e1a4c80223bd6ad3ebb82b6ec3be65f4499d66aa39c8cfee285f482136c471d52f2b97750e2304d72127a44cff5e0415f5c6fc
7
+ data.tar.gz: 99f7045179675543de2420dc5dd6e300eb08942552550754349e49052f2288bcb28d771c76c985d1ffc720077170641fc4c37f12b903f5afa434f0ccb959460e
@@ -13,15 +13,36 @@ module SolidusNexio
13
13
  end
14
14
 
15
15
  def authorize!
16
- fetch_nexio_amp_transaction or clean_nexio_after { super }
16
+ authorize_apm_safely or clean_nexio_after { super }
17
17
  end
18
18
 
19
19
  def purchase!
20
- fetch_nexio_amp_transaction or clean_nexio_after { super }
20
+ fetch_nexio_amp_transaction('Purchase') or clean_nexio_after { super }
21
+ end
22
+
23
+ def update_payment_state_from_nexio(action = nil)
24
+ return unless response_code.present?
25
+
26
+ transaction = payment_method.gateway.get_transaction(response_code)
27
+ unless transaction
28
+ error_message = "#{action}: The transaction is not found."
29
+ record_response(build_response(false, error_message))
30
+ return
31
+ end
32
+
33
+ message = "#{action}: The transaction #{transaction.data['id']} is updated."
34
+ record_response(build_response(true, message, transaction.data))
35
+ self.state = SolidusNexio::Mappings.payment_state(transaction.status)
36
+ self.amount = failed? || void? ? 0 : transaction.amount
37
+ save
21
38
  end
22
39
 
23
40
  private
24
41
 
42
+ def build_response(success, message, params = {})
43
+ ActiveMerchant::Billing::Response.new(success, message, params, test: payment_method.gateway.test?)
44
+ end
45
+
25
46
  def save_nexio_amp_id
26
47
  self.response_code = nexio_apm_transaction_id if nexio_apm_transaction_id.present?
27
48
  end
@@ -34,14 +55,10 @@ module SolidusNexio
34
55
  source.clean_nexio_cvv if nexio_card?
35
56
  end
36
57
 
37
- def fetch_nexio_amp_transaction
58
+ def fetch_nexio_amp_transaction(action = nil)
38
59
  return unless response_code.present? && nexio_apm?
39
60
 
40
- transaction = payment_method.gateway.get_transaction(response_code)
41
- if transaction
42
- self.amount = transaction.amount
43
- self.state = SolidusNexio::Mappings.payment_state(transaction.status)
44
- save!
61
+ if update_payment_state_from_nexio(action)
45
62
  return true if completed? || pending?
46
63
  else
47
64
  invalidate!
@@ -50,6 +67,18 @@ module SolidusNexio
50
67
  raise Spree::Core::GatewayError, I18n.t('spree.payment_processing_failed')
51
68
  end
52
69
 
70
+ def authorize_apm_safely
71
+ return unless nexio_apm?
72
+
73
+ if update_payment_state_from_nexio('Authorize')
74
+ return true if completed? || pending?
75
+ elsif response_code.present?
76
+ self.auth_confirmation_required = true
77
+ pend! unless completed? || pending?
78
+ PaymentConfirmationJob.set(wait: SolidusNexio.config.payment_confirmation_timeout.minutes).perform_later(self)
79
+ end
80
+ end
81
+
53
82
  Spree::Payment.include self
54
83
  # source set after other attribute assignments
55
84
  Spree::Payment.before_validation :save_nexio_amp_id, on: :create, if: :nexio_apm?
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusNexio
4
+ class PaymentConfirmationJob < ApplicationJob
5
+ def perform(payment)
6
+ PaymentConfirmationService.call(payment)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusNexio
4
+ PaymentConfirmationService = Struct.new(:payment) do
5
+ class << self
6
+ def call(payment)
7
+ return unless payment.nexio_apm? && payment.auth_confirmation_required
8
+
9
+ new(payment).confirm_payment_auth!
10
+ clear_auth_confirmation(payment)
11
+ end
12
+
13
+ protected
14
+
15
+ def clear_auth_confirmation(payment)
16
+ payment.update!(auth_confirmation_required: false)
17
+ end
18
+ end
19
+
20
+ def confirm_payment_auth!
21
+ return unless auth_confirmed
22
+
23
+ invalidate_payment unless update_payment_state_from_nexio('Auth Confirmation') && auth_confirmed
24
+ end
25
+
26
+ private
27
+
28
+ delegate :update_payment_state_from_nexio, to: :payment
29
+
30
+ def auth_confirmed
31
+ payment.completed? || payment.pending?
32
+ end
33
+
34
+ def invalidate_payment
35
+ payment.order&.cancel! or payment.void!
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ class AddAuthConfirmationRequiredToSpreePayment < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_column :spree_payments, :auth_confirmation_required, :boolean
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusNexio
4
- VERSION = '0.7.10'
4
+ VERSION = '0.7.11'
5
5
  end
data/lib/solidus_nexio.rb CHANGED
@@ -11,7 +11,7 @@ module SolidusNexio
11
11
  'solidus_nexio_solidus_nexio_'
12
12
  end
13
13
 
14
- @config = OpenStruct.new(merchant_secrets: [], save_webhooks: false, webhooks: [])
14
+ @config = OpenStruct.new(merchant_secrets: [], save_webhooks: false, webhooks: [], payment_confirmation_timeout: 3)
15
15
 
16
16
  def self.config
17
17
  yield @config if block_given?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_nexio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.10
4
+ version: 0.7.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Whitespectre
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-08 00:00:00.000000000 Z
11
+ date: 2023-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nexio_activemerchant
@@ -104,6 +104,7 @@ files:
104
104
  - app/decorators/models/solidus_nexio/credit_card_decorator.rb
105
105
  - app/decorators/models/solidus_nexio/payment_decorator.rb
106
106
  - app/helpers/solidus_nexio/checkout_helper.rb
107
+ - app/jobs/solidus_nexio/payment_confirmation_job.rb
107
108
  - app/models/solidus_nexio/alternative_payment_method.rb
108
109
  - app/models/solidus_nexio/apm_source.rb
109
110
  - app/models/solidus_nexio/nexio_payment_commons.rb
@@ -112,6 +113,7 @@ files:
112
113
  - app/services/solidus_nexio/encryption_service.rb
113
114
  - app/services/solidus_nexio/mappings.rb
114
115
  - app/services/solidus_nexio/nexio_data.rb
116
+ - app/services/solidus_nexio/payment_confirmation_service.rb
115
117
  - app/views/solidus_nexio/payment_states/capture.html.erb
116
118
  - app/views/spree/admin/payments/source_forms/_nexio_apm.html.erb
117
119
  - app/views/spree/admin/payments/source_forms/_nexio_own_form.html.erb
@@ -128,6 +130,7 @@ files:
128
130
  - config/routes.rb
129
131
  - db/migrate/20210723155452_create_solidus_nexio_solidus_nexio_webhooks.rb
130
132
  - db/migrate/20211109171335_add_solidus_nexio_apm_source.rb
133
+ - db/migrate/20230509093147_add_auth_confirmation_required_to_spree_payment.rb
131
134
  - lib/solidus_nexio.rb
132
135
  - lib/solidus_nexio/engine.rb
133
136
  - lib/solidus_nexio/version.rb