solidus_six_saferpay 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +220 -0
  4. data/Rakefile +56 -0
  5. data/app/assets/config/solidus_six_saferpay_manifest.js +2 -0
  6. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/amex.png +0 -0
  7. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/cirrus.png +0 -0
  8. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/delta.png +0 -0
  9. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/diners_club.png +0 -0
  10. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/directdebit.png +0 -0
  11. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/discover.png +0 -0
  12. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/egold.png +0 -0
  13. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/maestro.png +0 -0
  14. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/mastercard.png +0 -0
  15. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/paypal.png +0 -0
  16. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/solo.png +0 -0
  17. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/switch.png +0 -0
  18. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/twint.png +0 -0
  19. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/visa.png +0 -0
  20. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/visaelectron.png +0 -0
  21. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/westernunion.png +0 -0
  22. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/wirecard.png +0 -0
  23. data/app/assets/images/solidus_six_saferpay/credit_cards/icons/worldpay.png +0 -0
  24. data/app/assets/javascripts/solidus_six_saferpay/application.js +14 -0
  25. data/app/assets/javascripts/solidus_six_saferpay/saferpay_payment.js +120 -0
  26. data/app/assets/stylesheets/solidus_six_saferpay/application.css +15 -0
  27. data/app/assets/stylesheets/solidus_six_saferpay/loading_animation.scss +30 -0
  28. data/app/assets/stylesheets/solidus_six_saferpay/payments.scss +10 -0
  29. data/app/controllers/solidus_six_saferpay/application_controller.rb +5 -0
  30. data/app/controllers/spree/solidus_six_saferpay/checkout_controller.rb +93 -0
  31. data/app/controllers/spree/solidus_six_saferpay/payment_page/checkout_controller.rb +27 -0
  32. data/app/controllers/spree/solidus_six_saferpay/transaction/checkout_controller.rb +27 -0
  33. data/app/helpers/solidus_six_saferpay/application_helper.rb +4 -0
  34. data/app/jobs/solidus_six_saferpay/application_job.rb +4 -0
  35. data/app/mailers/solidus_six_saferpay/application_mailer.rb +6 -0
  36. data/app/models/solidus_six_saferpay/application_record.rb +5 -0
  37. data/app/models/spree/payment_method/saferpay_payment_method.rb +46 -0
  38. data/app/models/spree/payment_method/saferpay_payment_page.rb +13 -0
  39. data/app/models/spree/payment_method/saferpay_transaction.rb +12 -0
  40. data/app/models/spree/six_saferpay_payment.rb +69 -0
  41. data/app/services/spree/route_access.rb +5 -0
  42. data/app/services/spree/solidus_six_saferpay/assert_payment_page.rb +8 -0
  43. data/app/services/spree/solidus_six_saferpay/authorize_payment.rb +60 -0
  44. data/app/services/spree/solidus_six_saferpay/authorize_transaction.rb +8 -0
  45. data/app/services/spree/solidus_six_saferpay/initialize_payment.rb +57 -0
  46. data/app/services/spree/solidus_six_saferpay/initialize_payment_page.rb +15 -0
  47. data/app/services/spree/solidus_six_saferpay/initialize_transaction.rb +16 -0
  48. data/app/services/spree/solidus_six_saferpay/inquire_payment.rb +43 -0
  49. data/app/services/spree/solidus_six_saferpay/inquire_payment_page_payment.rb +7 -0
  50. data/app/services/spree/solidus_six_saferpay/inquire_transaction.rb +7 -0
  51. data/app/services/spree/solidus_six_saferpay/inquire_transaction_payment.rb +7 -0
  52. data/app/services/spree/solidus_six_saferpay/payment_validator.rb +62 -0
  53. data/app/services/spree/solidus_six_saferpay/process_authorized_payment.rb +87 -0
  54. data/app/services/spree/solidus_six_saferpay/process_payment_page_payment.rb +7 -0
  55. data/app/services/spree/solidus_six_saferpay/process_transaction_payment.rb +7 -0
  56. data/app/services/spree/solidus_six_saferpay/use_payment_page_gateway.rb +11 -0
  57. data/app/services/spree/solidus_six_saferpay/use_transaction_gateway.rb +11 -0
  58. data/app/views/spree/admin/payments/source_views/_saferpay_payment.erb +36 -0
  59. data/app/views/spree/api/payments/source_views/_saferpay_payment.json.jbuilder +1 -0
  60. data/app/views/spree/checkout/payment/_saferpay_payment.html.erb +12 -0
  61. data/app/views/spree/six_saferpay_payments/_six_saferpay_payment.html.erb +16 -0
  62. data/app/views/spree/solidus_six_saferpay/checkout/iframe_breakout_redirect.html.erb +7 -0
  63. data/config/locales/de.yml +52 -0
  64. data/config/locales/en.yml +52 -0
  65. data/config/locales/fr.yml +51 -0
  66. data/config/routes.rb +17 -0
  67. data/db/migrate/20190523075638_create_six_saferpay_payments.rb +31 -0
  68. data/lib/generators/solidus_six_saferpay/install/install_generator.rb +20 -0
  69. data/lib/solidus_six_saferpay.rb +5 -0
  70. data/lib/solidus_six_saferpay/configuration.rb +12 -0
  71. data/lib/solidus_six_saferpay/engine.rb +25 -0
  72. data/lib/solidus_six_saferpay/error_handler.rb +21 -0
  73. data/lib/solidus_six_saferpay/gateway.rb +183 -0
  74. data/lib/solidus_six_saferpay/gateway_response.rb +38 -0
  75. data/lib/solidus_six_saferpay/invalid_saferpay_payment.rb +11 -0
  76. data/lib/solidus_six_saferpay/payment_page_gateway.rb +55 -0
  77. data/lib/solidus_six_saferpay/transaction_gateway.rb +47 -0
  78. data/lib/solidus_six_saferpay/version.rb +3 -0
  79. data/lib/tasks/solidus_six_saferpay_tasks.rake +4 -0
  80. metadata +319 -0
@@ -0,0 +1,52 @@
1
+ ---
2
+ de:
3
+ spree:
4
+ solidus_six_saferpay:
5
+ checkout: &checkout
6
+ init:
7
+ checkout_not_initialized: Zahlung konnte nicht gestartet werden.
8
+ success:
9
+ payment_source_not_created: Six Saferpay Zahlungsquelle konnte nicht erstellt werden.
10
+ fail:
11
+ payment_failed: Die Zahlung konnte nicht abgeschlossen werden.
12
+ payment_page:
13
+ checkout:
14
+ <<: *checkout
15
+ transaction:
16
+ checkout:
17
+ <<: *checkout
18
+ solidus_six_saferpay:
19
+ errors:
20
+ general_error: Bezahlungsfehler
21
+ liability_shift_not_granted: Haftungsumkehr wurde abgelehnt
22
+ six_saferpay:
23
+ error_names:
24
+ ACTION_NOT_SUPPORTED: Die angeforderte Aktion wird im Kontext der Aktion nicht unterstützt un kann mit den Anforderungsdaten nicht ausgeführt werden.
25
+ ALIAS_INVALID: Der Alias ist nicht bekannt oder wird bereits verwendet (bei Registrierung).
26
+ AMOUNT_INVALID: Der Betrag entspricht nicht den Einschränkungen für diese Aktion.
27
+ AUTHENTICATION_FAILED: Falsches Password, falsches Client-Zertifikat, ungültiges Token, falscher HMAC.
28
+ BLOCKED_BY_RISK_MANAGEMENT: Aktion vom Risikomanagement gesperrt.
29
+ CARD_CHECK_FAILED: Ungültige Kartennummer oder CVC.
30
+ CARD_CVC_INVALID: Falscher CVC eingegeben.
31
+ CARD_CVC_REQUIRED: CVC nicht eingegeben, aber erforderlich.
32
+ CARD_EXPIRED: Karte abgelaufen.
33
+ COMMUNICATION_FAILED: Die Kommunikation zum Prozessor ist fehlgeschlagen.
34
+ COMMUNICATION_TIMEOUT: Saferpay hat nicht rechtzeitig eine Antwort vom externen System erhalten. Es ist möglich, dass eine Autorisierung erstellt wurde, aber Saferpay kann dies nicht wissen.
35
+ CONDITION_NOT_SATISFIED: Die in der Anfrage definierte Bedingung konnte nicht erfüllt werden.
36
+ CURRENCY_INVALID: Währung stimmt nicht mit der Währungstransaktion überein.
37
+ GENERAL_DECLINED: Transaktion aus einem unbekannten Grund abgelehnt.
38
+ INTERNAL_ERROR: Interner Fehler in Saferpay.
39
+ NO_CONTRACT: Für die Kombination aus Marke und Währung ist kein Vertrag verfügbar.
40
+ NO_CREDITS_AVAILABLE: Für dieses Konto ist kein Guthaben mehr verfügbar.
41
+ PAYMENTMEANS_INVALID: Ungültiges Zahlungsmittel (z. B. ungültige Karte).
42
+ PERMISSION_DENIED: Keine Berechtigung (z. B. Terminal gehört nicht dem Kunden).
43
+ 3DS_AUTHENTICATION_FAILED: Die 3D-sichere Authentifizierung ist fehlgeschlagen - die Transaktion muss abgebrochen werden.
44
+ TOKEN_EXPIRED: Das Token ist abgelaufen.
45
+ TOKEN_INVALID: Das Token ist für diesen Kunden nicht vorhanden oder wird bereits verwendet.
46
+ TRANSACTION_ABORTED: Die Transaktion wurde von Kundin/Kunde abgebrochen.
47
+ TRANSACTION_ALREADY_CAPTURED: Transaktion bereits erfasst.
48
+ TRANSACTION_DECLINED: Vom Prozessor abgelehnt.
49
+ TRANSACTION_IN_WRONG_STATE: Transaktion befindet sich in falschem Zustand.
50
+ TRANSACTION_NOT_FOUND: Transaktion konnte nicht gefunden werden.
51
+ TRANSACTION_NOT_STARTED: Die Transaktion wurde noch nicht von der Bezahlung gestartet. Daher ist kein endgültiges Ergebnis für die Transaktion verfügbar.
52
+ VALIDATION_FAILED: Validierung fehlgeschlagen.
@@ -0,0 +1,52 @@
1
+ ---
2
+ en:
3
+ spree:
4
+ solidus_six_saferpay:
5
+ checkout: &checkout
6
+ init:
7
+ checkout_not_initialized: Payment could not be initialized.
8
+ success:
9
+ payment_source_not_created: Six Saferpay payment source could not be created.
10
+ fail:
11
+ payment_failed: The payment could not be completed.
12
+ payment_page:
13
+ checkout:
14
+ <<: *checkout
15
+ transaction:
16
+ checkout:
17
+ <<: *checkout
18
+ solidus_six_saferpay:
19
+ errors:
20
+ general_error: Payment Error
21
+ liability_shift_not_granted: Liability Shift was rejected
22
+ six_saferpay:
23
+ error_names:
24
+ ACTION_NOT_SUPPORTED: The requested action is not supported in the given context or the action can't be executed with the request data.
25
+ ALIAS_INVALID: The alias is not known or already used (in case of registration).
26
+ AMOUNT_INVALID: The amount does not adhere to the restrictions for this action.
27
+ AUTHENTICATION_FAILED: Wrong password, wrong client certificate, invalid token, wrong HMAC.
28
+ BLOCKED_BY_RISK_MANAGEMENT: Action blocked by risk management.
29
+ CARD_CHECK_FAILED: Invalid card number or cvc.
30
+ CARD_CVC_INVALID: Wrong cvc entered.
31
+ CARD_CVC_REQUIRED: Cvc not entered but required.
32
+ CARD_EXPIRED: Card expired.
33
+ COMMUNICATION_FAILED: The communication to the processor failed.
34
+ COMMUNICATION_TIMEOUT: Saferpay did not receive a response from the external system in time. It’s possible that an authorization was created, but Saferpay is not able to know this.
35
+ CONDITION_NOT_SATISFIED: The condition which was defined in the request could not be satisfied.
36
+ CURRENCY_INVALID: Currency does not match referenced transaction currency.
37
+ GENERAL_DECLINED: Transaction declined by unknown reason.
38
+ INTERNAL_ERROR: Internal error in Saferpay.
39
+ NO_CONTRACT: No contract available for the brand / currency combination.
40
+ NO_CREDITS_AVAILABLE: No more credits available for this account.
41
+ PAYMENTMEANS_INVALID: Invalid means of payment (e.g. invalid card).
42
+ PERMISSION_DENIED: No permission (e.g. terminal does not belong to the customer).
43
+ 3DS_AUTHENTICATION_FAILED: 3D-secure authentication failed – the transaction must be aborted.
44
+ TOKEN_EXPIRED: The token is expired.
45
+ TOKEN_INVALID: The token either does not exist for this customer or was already used.
46
+ TRANSACTION_ABORTED: The transaction was aborted by the payer.
47
+ TRANSACTION_ALREADY_CAPTURED: Transaction already captured.
48
+ TRANSACTION_DECLINED: Declined by the processor.
49
+ TRANSACTION_IN_WRONG_STATE: Transaction is in the wrong state.
50
+ TRANSACTION_NOT_FOUND: Transaction could not be found.
51
+ TRANSACTION_NOT_STARTED: The transaction was not started by the payer. Therefore, no final result for the transaction is available.
52
+ VALIDATION_FAILED: Validation failed.
@@ -0,0 +1,51 @@
1
+ ---
2
+ fr:
3
+ spree:
4
+ solidus_six_saferpay:
5
+ checkout: &checkout
6
+ init:
7
+ checkout_not_initialized: Le paiement n'a pas pu être initialisé.
8
+ success:
9
+ payment_source_not_created: La source de paiement Six Saferpay n'a pas pu être créée.
10
+ fail:
11
+ payment_failed: Le paiement n'a pas pu être complété.
12
+ payment_page:
13
+ checkout:
14
+ <<: *checkout
15
+ transaction:
16
+ checkout:
17
+ <<: *checkout
18
+ solidus_six_saferpay:
19
+ errors:
20
+ liability_shift_not_granted: Le transfert de responsabilité a été rejeté
21
+ six_saferpay:
22
+ error_names:
23
+ ACTION_NOT_SUPPORTED: l'action demandé n'es pas prise en charge dans le contexte de l'action et ne peut pas être exécutée avec les données de la demande.
24
+ ALIAS_INVALID: l'alias es inconnu ou est déjà utilisé (à l'enregistrement).
25
+ AMOUNT_INVALID: le mentant ne correspond pas aux restrictions pour cette action.
26
+ AUTHENTICATION_FAILED: Mot de passe incorrect, certificat client incorrect, jeton non valide, HMAC incorrect.
27
+ BLOCKED_BY_RISK_MANAGEMENT: action bloquée par la gestion des risques.
28
+ CARD_CHECK_FAILED: Numéro de carte ou CVC non valide.
29
+ CARD_CVC_INVALID: CVC incorrect entré.
30
+ CARD_CVC_REQUIRED: CVC non entré, mais obligatoire.
31
+ CARD_EXPIRED: La carte a expiré.
32
+ COMMUNICATION_FAILED: la communication avec le processeur a échoué.
33
+ COMMUNICATION_TIMEOUT: Saferpay n'a pas reçu de réponse du système externe à temps. Il est possible qu'une autorisation ait été créée, mais Saferpay ne peut pas le savoir.
34
+ CONDITION_NOT_SATISFIED: la condition définie dans la demande n'a pas pu être remplie.
35
+ CURRENCY_INVALID: la devise ne correspond pas à la transaction de devise.
36
+ GENERAL_DECLINED: transaction rejetée pour une raison inconnue.
37
+ INTERNAL_ERROR: erreur interne dans Saferpay.
38
+ NO_CONTRACT: Il n'y a pas de contrat pour la combinaison marque / devise.
39
+ NO_CREDITS_AVAILABLE: plus aucun crédit disponible pour ce compte.
40
+ PAYMENTMEANS_INVALID: Offre non valide (par exemple, carte invalide).
41
+ PERMISSION_DENIED: Aucune autorisation (par exemple, le terminal n'est pas la propriété du client).
42
+ 3DS_AUTHENTICATION_FAILED: L'authentification 3D Secure a échoué - la transaction doit être abandonnée.
43
+ TOKEN_EXPIRED: le jeton a expiré.
44
+ TOKEN_INVALID: le jeton n'existe pas pour ce client ou est déjà utilisé.
45
+ TRANSACTION_ABORTED: La transaction a été annulée par le paiement.
46
+ TRANSACTION_ALREADY_CAPTURED: transaction déjà enregistrée.
47
+ TRANSACTION_DECLINED: rejeté par le processeur.
48
+ TRANSACTION_IN_WRONG_STATE: La transaction est dans un état incorrect.
49
+ TRANSACTION_NOT_FOUND: La transaction n'a pas pu être trouvée.
50
+ TRANSACTION_NOT_STARTED: La transaction n'a pas encore été lancée depuis le paiement. Par conséquent, aucun résultat final n'est disponible pour la transaction.
51
+ VALIDATION_FAILED: la validation a échoué.
data/config/routes.rb ADDED
@@ -0,0 +1,17 @@
1
+ Spree::Core::Engine.routes.draw do
2
+
3
+ namespace :solidus_six_saferpay do
4
+ namespace :payment_page do
5
+ get :init, controller: :checkout, defaults: { format: :json }
6
+ get :success, controller: :checkout
7
+ get :fail, controller: :checkout
8
+ end
9
+
10
+ namespace :transaction do
11
+ get :init, controller: :checkout, defaults: { format: :json }
12
+ get :success, controller: :checkout
13
+ get :fail, controller: :checkout
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,31 @@
1
+ class CreateSixSaferpayPayments < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :spree_six_saferpay_payments do |t|
4
+ t.references :order
5
+ t.references :payment_method
6
+
7
+ t.string :token
8
+ t.datetime :expiration
9
+ t.string :redirect_url
10
+ t.string :transaction_id
11
+ t.string :transaction_status
12
+ t.datetime :transaction_date
13
+ t.string :six_transaction_reference
14
+ t.string :display_text
15
+ t.string :masked_number
16
+ t.string :expiration_year
17
+ t.string :expiration_month
18
+ t.text :response_hash
19
+
20
+ t.timestamps
21
+ end
22
+
23
+ add_index :spree_six_saferpay_payments, :token, unique: true
24
+ add_index :spree_six_saferpay_payments, :transaction_id, unique: true
25
+ add_index :spree_six_saferpay_payments, :six_transaction_reference, unique: true
26
+
27
+ # hack around foreign_key restriction by manually defining them
28
+ add_foreign_key :spree_six_saferpay_payments, :spree_orders, column: :order_id
29
+ add_foreign_key :spree_six_saferpay_payments, :spree_payment_methods, column: :payment_method_id
30
+ end
31
+ end
@@ -0,0 +1,20 @@
1
+ module SolidusSixSaferpay
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def add_migrations
7
+ run 'bundle exec rake railties:install:migrations FROM=solidus_six_saferpay'
8
+ end
9
+
10
+ def run_migrations
11
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
12
+ if run_migrations
13
+ run 'bundle exec rake db:migrate'
14
+ else
15
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ require 'solidus_core'
2
+ require "solidus_support"
3
+
4
+ require "solidus_six_saferpay/engine"
5
+ require 'six_saferpay'
@@ -0,0 +1,12 @@
1
+ module SolidusSixSaferpay
2
+
3
+ class Configuration
4
+ def self.config
5
+ yield(self)
6
+ end
7
+
8
+ def self.error_handlers
9
+ @error_handlers ||= []
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ module SolidusSixSaferpay
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace SolidusSixSaferpay
4
+
5
+ config.autoload_paths += Dir["#{config.root}/lib/**/"]
6
+ config.eager_load_paths += Dir["#{config.root}/lib/**/"]
7
+
8
+ initializer "spree.six_payment.payment_methods", :after => "spree.register.payment_methods" do |app|
9
+ app.config.spree.payment_methods << Spree::PaymentMethod::SaferpayPaymentPage
10
+ app.config.spree.payment_methods << Spree::PaymentMethod::SaferpayTransaction
11
+ end
12
+
13
+ initializer "solidus_six_payments.assets.precompile" do |app|
14
+ app.config.assets.precompile += %w( solidus_six_saferpay/application.css )
15
+ app.config.assets.precompile += %w( solidus_six_saferpay/saferpay_payment.js )
16
+ app.config.assets.precompile += %w( solidus_six_saferpay/credit_cards/**/*.png )
17
+ end
18
+
19
+ config.generators do |g|
20
+ g.test_framework :rspec
21
+ g.fixture_replacement :factory_bot
22
+ g.factory_bot dir: 'spec/factories'
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ module SolidusSixSaferpay
2
+
3
+ class ErrorHandler
4
+ # Use a custom error handler so that host applications can configure their
5
+ # error handling
6
+ def self.handle(error, level: :error)
7
+ Rails.logger.send(level, error)
8
+
9
+ Configuration.error_handlers.each do |handler|
10
+ if !handler.respond_to?(:call)
11
+ Rails.logger.warn("SolidusSixSaferpay::Configuration ERROR: The attached error handler #{handler} can not be called with #{handler}.call(error, level: level)")
12
+
13
+ # skip to next handler
14
+ next
15
+ end
16
+ handler.call(error, level: level)
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,183 @@
1
+ module SolidusSixSaferpay
2
+ class Gateway
3
+
4
+ include Spree::RouteAccess
5
+
6
+ def initialize(options = {})
7
+ SixSaferpay.configure do |config|
8
+ config.success_url = options.fetch(:success_url)
9
+ config.fail_url = options.fetch(:fail_url)
10
+
11
+ # Allow config via ENV for static values
12
+ config.customer_id = options.fetch(:customer_id) { ENV.fetch('SIX_SAFERPAY_CUSTOMER_ID') }
13
+ config.terminal_id = options.fetch(:terminal_id) { ENV.fetch('SIX_SAFERPAY_TERMINAL_ID') }
14
+ config.username = options.fetch(:username) { ENV.fetch('SIX_SAFERPAY_USERNAME') }
15
+ config.password = options.fetch(:password) { ENV.fetch('SIX_SAFERPAY_PASSWORD') }
16
+ config.base_url = options.fetch(:base_url) { ENV.fetch('SIX_SAFERPAY_BASE_URL') }
17
+ config.css_url = options.fetch(:css_url) { ENV.fetch('SIX_SAFERPAY_CSS_URL') }
18
+ end
19
+ end
20
+
21
+ def initialize_payment(order, payment_method)
22
+ initialize_response = SixSaferpay::Client.post(
23
+ interface_initialize_object(order, payment_method)
24
+ )
25
+ response(
26
+ true,
27
+ "Saferpay Initialize Checkout response: #{initialize_response.to_h}",
28
+ initialize_response,
29
+ )
30
+ rescue SixSaferpay::Error => e
31
+ handle_error(e, initialize_response)
32
+ end
33
+
34
+ def authorize(amount, saferpay_payment, options = {})
35
+ raise NotImplementedError, "must be implemented in PaymentPageGateway or TransactionGateway"
36
+ end
37
+
38
+ def inquire(saferpay_payment, options = {})
39
+ raise NotImplementedError, "must be implemented in PaymentPageGateway or TransactionGateway"
40
+ end
41
+
42
+ def purchase(amount, saferpay_payment, options = {})
43
+ capture(amount, saferpay_payment.transaction_id, options)
44
+ end
45
+
46
+ def capture(amount, transaction_id, options={})
47
+ transaction_reference = SixSaferpay::TransactionReference.new(transaction_id: transaction_id)
48
+ payment_capture = SixSaferpay::SixTransaction::Capture.new(transaction_reference: transaction_reference)
49
+
50
+ capture_response = SixSaferpay::Client.post(payment_capture)
51
+
52
+ response(
53
+ true,
54
+ "Saferpay Payment Capture response: #{capture_response.to_h}",
55
+ capture_response,
56
+ { authorization: capture_response.capture_id }
57
+ )
58
+
59
+ rescue SixSaferpay::Error => e
60
+ handle_error(e, capture_response)
61
+ end
62
+
63
+ def void(transaction_id, options = {})
64
+ transaction_reference = SixSaferpay::TransactionReference.new(transaction_id: transaction_id)
65
+ payment_cancel = SixSaferpay::SixTransaction::Cancel.new(transaction_reference: transaction_reference)
66
+
67
+ cancel_response = SixSaferpay::Client.post(payment_cancel)
68
+
69
+ response(
70
+ true,
71
+ "Saferpay Payment Cancel response: #{cancel_response.to_h}",
72
+ cancel_response
73
+ )
74
+ rescue SixSaferpay::Error => e
75
+ handle_error(e, cancel_response)
76
+ end
77
+
78
+ def try_void(payment)
79
+ if payment.checkout? && payment.transaction_id
80
+ void(payment.transaction_id, originator: self)
81
+ end
82
+ end
83
+
84
+ # aliased to #refund for compatibility with solidus internals
85
+ def credit(amount, transaction_id, options = {})
86
+ refund(amount, transaction_id, options)
87
+ end
88
+
89
+ def refund(amount, transaction_id, options = {})
90
+ payment = Spree::Payment.find_by!(response_code: transaction_id)
91
+ refund_amount = Spree::Money.new(amount, currency: payment.currency)
92
+
93
+ saferpay_amount = SixSaferpay::Amount.new(value: refund_amount.cents, currency_code: payment.currency)
94
+ saferpay_refund = SixSaferpay::Refund.new(amount: saferpay_amount, order_id: payment.order.number)
95
+ capture_reference = SixSaferpay::CaptureReference.new(capture_id: payment.transaction_id)
96
+
97
+ payment_refund = SixSaferpay::SixTransaction::Refund.new(refund: saferpay_refund, capture_reference: capture_reference)
98
+
99
+ if refund_response = SixSaferpay::Client.post(payment_refund)
100
+
101
+ # actually capture the refund
102
+ capture(amount, refund_response.transaction.id, options)
103
+ end
104
+
105
+ rescue SixSaferpay::Error => e
106
+ handle_error(e, refund_response)
107
+ end
108
+
109
+ private
110
+
111
+ def interface_initialize_object(order, payment_method)
112
+ raise NotImplementedError, "Must be implemented in PaymentPageGateway or TransactionGateway"
113
+ end
114
+
115
+ def interface_initialize_params(order, payment_method)
116
+ amount = Spree::Money.new(order.total, currency: order.currency)
117
+ payment = SixSaferpay::Payment.new(
118
+ amount: SixSaferpay::Amount.new(value: amount.cents, currency_code: amount.currency.iso_code),
119
+ order_id: order.number,
120
+ description: order.number
121
+ )
122
+
123
+ billing_address = order.billing_address
124
+ billing_address = SixSaferpay::Address.new(
125
+ first_name: billing_address.first_name,
126
+ last_name: billing_address.last_name,
127
+ date_of_birth: nil,
128
+ company: nil,
129
+ gender: nil,
130
+ legal_form: nil,
131
+ street: billing_address.address1,
132
+ street2: billing_address.address2,
133
+ zip: billing_address.zipcode,
134
+ city: billing_address.city,
135
+ country_subdevision_code: nil,
136
+ country_code: billing_address.country.iso,
137
+ phone: nil,
138
+ email: nil,
139
+ )
140
+ shipping_address = order.shipping_address
141
+ delivery_address = SixSaferpay::Address.new(
142
+ first_name: shipping_address.first_name,
143
+ last_name: shipping_address.last_name,
144
+ date_of_birth: nil,
145
+ company: nil,
146
+ gender: nil,
147
+ legal_form: nil,
148
+ street: shipping_address.address1,
149
+ street2: shipping_address.address2,
150
+ zip: shipping_address.zipcode,
151
+ city: shipping_address.city,
152
+ country_subdevision_code: nil,
153
+ country_code: shipping_address.country.iso,
154
+ phone: nil,
155
+ email: nil,
156
+ )
157
+ payer = SixSaferpay::Payer.new(language_code: I18n.locale, billing_address: billing_address, delivery_address: delivery_address)
158
+
159
+ params = { payment: payment, payer: payer }
160
+
161
+ six_payment_methods = payment_method.enabled_payment_methods
162
+ params.merge!(payment_methods: six_payment_methods) unless six_payment_methods.blank?
163
+
164
+ params
165
+ end
166
+
167
+ def response(success, message, api_response, options = {})
168
+ GatewayResponse.new(success, message, api_response, options)
169
+ end
170
+
171
+ def handle_error(error, response)
172
+ # Call host error handler hook
173
+ SolidusSixSaferpay::ErrorHandler.handle(error, level: :error)
174
+
175
+ response(
176
+ false,
177
+ error.error_message,
178
+ response,
179
+ error_name: error.error_name
180
+ )
181
+ end
182
+ end
183
+ end