activemerchant 1.133.0 → 1.137.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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +240 -0
  3. data/lib/active_merchant/billing/check.rb +2 -2
  4. data/lib/active_merchant/billing/compatibility.rb +4 -4
  5. data/lib/active_merchant/billing/credit_card.rb +11 -8
  6. data/lib/active_merchant/billing/credit_card_formatting.rb +4 -0
  7. data/lib/active_merchant/billing/credit_card_methods.rb +59 -6
  8. data/lib/active_merchant/billing/gateway.rb +9 -0
  9. data/lib/active_merchant/billing/gateways/adyen.rb +162 -43
  10. data/lib/active_merchant/billing/gateways/airwallex.rb +26 -12
  11. data/lib/active_merchant/billing/gateways/alelo.rb +23 -5
  12. data/lib/active_merchant/billing/gateways/authorize_net.rb +43 -35
  13. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +10 -6
  14. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +1 -3
  15. data/lib/active_merchant/billing/gateways/axcessms.rb +6 -2
  16. data/lib/active_merchant/billing/gateways/banwire.rb +4 -2
  17. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +7 -3
  18. data/lib/active_merchant/billing/gateways/blue_pay.rb +13 -5
  19. data/lib/active_merchant/billing/gateways/blue_snap.rb +5 -5
  20. data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +65 -20
  21. data/lib/active_merchant/billing/gateways/braintree_blue.rb +226 -73
  22. data/lib/active_merchant/billing/gateways/braintree_orange.rb +1 -1
  23. data/lib/active_merchant/billing/gateways/card_connect.rb +5 -2
  24. data/lib/active_merchant/billing/gateways/card_stream.rb +4 -6
  25. data/lib/active_merchant/billing/gateways/cashnet.rb +1 -1
  26. data/lib/active_merchant/billing/gateways/cecabank/cecabank_common.rb +36 -0
  27. data/lib/active_merchant/billing/gateways/cecabank/cecabank_json.rb +316 -0
  28. data/lib/active_merchant/billing/gateways/cecabank/cecabank_xml.rb +220 -0
  29. data/lib/active_merchant/billing/gateways/cecabank.rb +7 -240
  30. data/lib/active_merchant/billing/gateways/checkout_v2.rb +238 -34
  31. data/lib/active_merchant/billing/gateways/commerce_hub.rb +63 -6
  32. data/lib/active_merchant/billing/gateways/credorax.rb +3 -5
  33. data/lib/active_merchant/billing/gateways/cyber_source.rb +185 -47
  34. data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +102 -58
  35. data/lib/active_merchant/billing/gateways/d_local.rb +26 -15
  36. data/lib/active_merchant/billing/gateways/data_cash.rb +21 -17
  37. data/lib/active_merchant/billing/gateways/datatrans.rb +279 -0
  38. data/lib/active_merchant/billing/gateways/decidir.rb +53 -18
  39. data/lib/active_merchant/billing/gateways/decidir_plus.rb +4 -1
  40. data/lib/active_merchant/billing/gateways/deepstack.rb +382 -0
  41. data/lib/active_merchant/billing/gateways/ebanx.rb +40 -36
  42. data/lib/active_merchant/billing/gateways/efsnet.rb +6 -2
  43. data/lib/active_merchant/billing/gateways/elavon.rb +99 -33
  44. data/lib/active_merchant/billing/gateways/element.rb +36 -7
  45. data/lib/active_merchant/billing/gateways/epay.rb +6 -2
  46. data/lib/active_merchant/billing/gateways/evo_ca.rb +6 -2
  47. data/lib/active_merchant/billing/gateways/eway.rb +4 -2
  48. data/lib/active_merchant/billing/gateways/eway_managed.rb +6 -2
  49. data/lib/active_merchant/billing/gateways/exact.rb +6 -2
  50. data/lib/active_merchant/billing/gateways/fat_zebra.rb +31 -3
  51. data/lib/active_merchant/billing/gateways/federated_canada.rb +6 -2
  52. data/lib/active_merchant/billing/gateways/first_pay/first_pay_common.rb +15 -0
  53. data/lib/active_merchant/billing/gateways/first_pay/first_pay_json.rb +190 -0
  54. data/lib/active_merchant/billing/gateways/first_pay/first_pay_xml.rb +183 -0
  55. data/lib/active_merchant/billing/gateways/first_pay.rb +6 -172
  56. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +6 -2
  57. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +7 -3
  58. data/lib/active_merchant/billing/gateways/flex_charge.rb +347 -0
  59. data/lib/active_merchant/billing/gateways/garanti.rb +4 -2
  60. data/lib/active_merchant/billing/gateways/global_collect.rb +45 -37
  61. data/lib/active_merchant/billing/gateways/hi_pay.rb +286 -0
  62. data/lib/active_merchant/billing/gateways/hps.rb +1 -1
  63. data/lib/active_merchant/billing/gateways/iats_payments.rb +7 -2
  64. data/lib/active_merchant/billing/gateways/inspire.rb +6 -4
  65. data/lib/active_merchant/billing/gateways/instapay.rb +7 -4
  66. data/lib/active_merchant/billing/gateways/ipg.rb +9 -5
  67. data/lib/active_merchant/billing/gateways/iridium.rb +15 -5
  68. data/lib/active_merchant/billing/gateways/itransact.rb +6 -2
  69. data/lib/active_merchant/billing/gateways/iveri.rb +3 -3
  70. data/lib/active_merchant/billing/gateways/ixopay.rb +2 -2
  71. data/lib/active_merchant/billing/gateways/jetpay.rb +4 -2
  72. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +4 -2
  73. data/lib/active_merchant/billing/gateways/kushki.rb +72 -12
  74. data/lib/active_merchant/billing/gateways/linkpoint.rb +6 -2
  75. data/lib/active_merchant/billing/gateways/litle.rb +33 -50
  76. data/lib/active_merchant/billing/gateways/mastercard.rb +4 -4
  77. data/lib/active_merchant/billing/gateways/maxipago.rb +2 -2
  78. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +8 -5
  79. data/lib/active_merchant/billing/gateways/merchant_ware.rb +11 -4
  80. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +11 -4
  81. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +19 -3
  82. data/lib/active_merchant/billing/gateways/mercury.rb +6 -2
  83. data/lib/active_merchant/billing/gateways/metrics_global.rb +8 -6
  84. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +1 -0
  85. data/lib/active_merchant/billing/gateways/migs.rb +6 -2
  86. data/lib/active_merchant/billing/gateways/mit.rb +8 -3
  87. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +18 -10
  88. data/lib/active_merchant/billing/gateways/monei.rb +1 -1
  89. data/lib/active_merchant/billing/gateways/moneris.rb +9 -3
  90. data/lib/active_merchant/billing/gateways/money_movers.rb +6 -2
  91. data/lib/active_merchant/billing/gateways/nab_transact.rb +12 -4
  92. data/lib/active_merchant/billing/gateways/net_registry.rb +6 -2
  93. data/lib/active_merchant/billing/gateways/netbanx.rb +1 -3
  94. data/lib/active_merchant/billing/gateways/netbilling.rb +6 -2
  95. data/lib/active_merchant/billing/gateways/network_merchants.rb +6 -2
  96. data/lib/active_merchant/billing/gateways/nmi.rb +18 -6
  97. data/lib/active_merchant/billing/gateways/ogone.rb +6 -2
  98. data/lib/active_merchant/billing/gateways/openpay.rb +4 -2
  99. data/lib/active_merchant/billing/gateways/opp.rb +1 -2
  100. data/lib/active_merchant/billing/gateways/optimal_payment.rb +6 -2
  101. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +1 -3
  102. data/lib/active_merchant/billing/gateways/orbital.rb +83 -24
  103. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +7 -4
  104. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +6 -2
  105. data/lib/active_merchant/billing/gateways/pay_hub.rb +4 -2
  106. data/lib/active_merchant/billing/gateways/pay_junction.rb +6 -2
  107. data/lib/active_merchant/billing/gateways/pay_secure.rb +6 -2
  108. data/lib/active_merchant/billing/gateways/pay_trace.rb +31 -18
  109. data/lib/active_merchant/billing/gateways/payeezy.rb +19 -8
  110. data/lib/active_merchant/billing/gateways/payex.rb +4 -2
  111. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +1 -1
  112. data/lib/active_merchant/billing/gateways/payflow.rb +1 -3
  113. data/lib/active_merchant/billing/gateways/payment_express.rb +8 -4
  114. data/lib/active_merchant/billing/gateways/paymentez.rb +23 -11
  115. data/lib/active_merchant/billing/gateways/paysafe.rb +12 -11
  116. data/lib/active_merchant/billing/gateways/payscout.rb +7 -4
  117. data/lib/active_merchant/billing/gateways/paystation.rb +7 -3
  118. data/lib/active_merchant/billing/gateways/payway.rb +6 -2
  119. data/lib/active_merchant/billing/gateways/payway_dot_com.rb +2 -2
  120. data/lib/active_merchant/billing/gateways/pin.rb +22 -4
  121. data/lib/active_merchant/billing/gateways/plexo.rb +49 -10
  122. data/lib/active_merchant/billing/gateways/plugnpay.rb +6 -2
  123. data/lib/active_merchant/billing/gateways/priority.rb +6 -5
  124. data/lib/active_merchant/billing/gateways/psigate.rb +6 -2
  125. data/lib/active_merchant/billing/gateways/psl_card.rb +6 -2
  126. data/lib/active_merchant/billing/gateways/qbms.rb +6 -2
  127. data/lib/active_merchant/billing/gateways/quantum.rb +6 -2
  128. data/lib/active_merchant/billing/gateways/quickbooks.rb +6 -5
  129. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +7 -4
  130. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +6 -2
  131. data/lib/active_merchant/billing/gateways/rapyd.rb +148 -46
  132. data/lib/active_merchant/billing/gateways/reach.rb +11 -4
  133. data/lib/active_merchant/billing/gateways/redsys.rb +2 -10
  134. data/lib/active_merchant/billing/gateways/redsys_rest.rb +507 -0
  135. data/lib/active_merchant/billing/gateways/s5.rb +3 -3
  136. data/lib/active_merchant/billing/gateways/safe_charge.rb +36 -16
  137. data/lib/active_merchant/billing/gateways/sage.rb +12 -4
  138. data/lib/active_merchant/billing/gateways/sage_pay.rb +79 -5
  139. data/lib/active_merchant/billing/gateways/sallie_mae.rb +6 -2
  140. data/lib/active_merchant/billing/gateways/secure_net.rb +6 -2
  141. data/lib/active_merchant/billing/gateways/secure_pay.rb +8 -6
  142. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +12 -4
  143. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +6 -2
  144. data/lib/active_merchant/billing/gateways/securion_pay.rb +24 -10
  145. data/lib/active_merchant/billing/gateways/shift4.rb +17 -20
  146. data/lib/active_merchant/billing/gateways/shift4_v2.rb +117 -0
  147. data/lib/active_merchant/billing/gateways/simetrik.rb +17 -11
  148. data/lib/active_merchant/billing/gateways/skip_jack.rb +6 -2
  149. data/lib/active_merchant/billing/gateways/smart_ps.rb +7 -4
  150. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +4 -2
  151. data/lib/active_merchant/billing/gateways/spreedly_core.rb +2 -4
  152. data/lib/active_merchant/billing/gateways/stripe.rb +53 -21
  153. data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +199 -50
  154. data/lib/active_merchant/billing/gateways/sum_up.rb +223 -0
  155. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +4 -2
  156. data/lib/active_merchant/billing/gateways/telr.rb +3 -4
  157. data/lib/active_merchant/billing/gateways/trans_first.rb +1 -2
  158. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +8 -16
  159. data/lib/active_merchant/billing/gateways/transact_pro.rb +1 -1
  160. data/lib/active_merchant/billing/gateways/trust_commerce.rb +6 -2
  161. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +9 -8
  162. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +6 -2
  163. data/lib/active_merchant/billing/gateways/vanco.rb +2 -4
  164. data/lib/active_merchant/billing/gateways/vantiv_express.rb +587 -0
  165. data/lib/active_merchant/billing/gateways/verifi.rb +6 -2
  166. data/lib/active_merchant/billing/gateways/viaklix.rb +6 -2
  167. data/lib/active_merchant/billing/gateways/visanet_peru.rb +2 -2
  168. data/lib/active_merchant/billing/gateways/vpos.rb +3 -3
  169. data/lib/active_merchant/billing/gateways/wirecard.rb +7 -3
  170. data/lib/active_merchant/billing/gateways/wompi.rb +5 -0
  171. data/lib/active_merchant/billing/gateways/worldpay.rb +140 -73
  172. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +13 -10
  173. data/lib/active_merchant/billing/gateways/xpay.rb +242 -0
  174. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +1 -1
  175. data/lib/active_merchant/billing/response.rb +2 -2
  176. data/lib/active_merchant/connection.rb +3 -17
  177. data/lib/active_merchant/country.rb +1 -0
  178. data/lib/active_merchant/errors.rb +10 -0
  179. data/lib/active_merchant/version.rb +1 -1
  180. data/lib/support/gateway_support.rb +2 -2
  181. data/lib/support/ssl_verify.rb +4 -4
  182. data/lib/support/ssl_version.rb +6 -6
  183. metadata +30 -9
@@ -75,9 +75,12 @@ module ActiveMerchant #:nodoc:
75
75
  @braintree_gateway = Braintree::Gateway.new(@configuration)
76
76
  end
77
77
 
78
- def setup_purchase
78
+ def setup_purchase(options = {})
79
+ post = {}
80
+ add_merchant_account_id(post, options)
81
+
79
82
  commit do
80
- Response.new(true, 'Client token created', { client_token: @braintree_gateway.client_token.generate })
83
+ Response.new(true, 'Client token created', { client_token: @braintree_gateway.client_token.generate(post) })
81
84
  end
82
85
  end
83
86
 
@@ -106,6 +109,8 @@ module ActiveMerchant #:nodoc:
106
109
  end
107
110
 
108
111
  def credit(money, credit_card_or_vault_id, options = {})
112
+ return Response.new(false, DIRECT_BANK_ERROR) if credit_card_or_vault_id.is_a? Check
113
+
109
114
  create_transaction(:credit, money, credit_card_or_vault_id, options)
110
115
  end
111
116
 
@@ -139,16 +144,25 @@ module ActiveMerchant #:nodoc:
139
144
  exp_month = creditcard.month.to_s
140
145
  exp_year = creditcard.year.to_s
141
146
  expiration = "#{exp_month}/#{exp_year}"
147
+ zip = options[:billing_address].try(:[], :zip)
148
+ address1 = options[:billing_address].try(:[], :address1)
142
149
  payload = {
143
150
  credit_card: {
144
151
  number: creditcard.number,
145
152
  expiration_date: expiration,
146
- cvv: creditcard.verification_value,
147
- billing_address: {
148
- postal_code: options[:billing_address][:zip]
149
- }
153
+ cvv: creditcard.verification_value
150
154
  }
151
155
  }
156
+ if zip || address1
157
+ payload[:credit_card][:billing_address] = {}
158
+ payload[:credit_card][:billing_address][:postal_code] = zip if zip
159
+ payload[:credit_card][:billing_address][:street_address] = address1 if address1
160
+ end
161
+
162
+ if merchant_account_id = (options[:merchant_account_id] || @merchant_account_id)
163
+ payload[:options] = { merchant_account_id: merchant_account_id }
164
+ end
165
+
152
166
  commit do
153
167
  result = @braintree_gateway.verification.create(payload)
154
168
  response = Response.new(result.success?, message_from_transaction_result(result), response_options(result))
@@ -193,15 +207,20 @@ module ActiveMerchant #:nodoc:
193
207
  }
194
208
  }, options)[:credit_card]
195
209
 
196
- result = @braintree_gateway.customer.update(vault_id,
210
+ result = @braintree_gateway.customer.update(
211
+ vault_id,
197
212
  first_name: creditcard.first_name,
198
213
  last_name: creditcard.last_name,
199
214
  email: scrub_email(options[:email]),
200
215
  phone: phone_from(options),
201
- credit_card: credit_card_params)
202
- Response.new(result.success?, message_from_result(result),
216
+ credit_card: credit_card_params
217
+ )
218
+ Response.new(
219
+ result.success?,
220
+ message_from_result(result),
203
221
  braintree_customer: (customer_hash(@braintree_gateway.customer.find(vault_id), :include_credit_cards) if result.success?),
204
- customer_vault_id: (result.customer.id if result.success?))
222
+ customer_vault_id: (result.customer.id if result.success?)
223
+ )
205
224
  end
206
225
  end
207
226
 
@@ -271,13 +290,16 @@ module ActiveMerchant #:nodoc:
271
290
  device_data: options[:device_data]
272
291
  }.merge credit_card_params
273
292
  result = @braintree_gateway.customer.create(merge_credit_card_options(parameters, options))
274
- Response.new(result.success?, message_from_result(result),
293
+ Response.new(
294
+ result.success?,
295
+ message_from_result(result),
275
296
  {
276
297
  braintree_customer: (customer_hash(result.customer, :include_credit_cards) if result.success?),
277
298
  customer_vault_id: (result.customer.id if result.success?),
278
299
  credit_card_token: (result.customer.credit_cards[0].token if result.success?)
279
300
  },
280
- authorization: (result.customer.id if result.success?))
301
+ authorization: (result.customer.id if result.success?)
302
+ )
281
303
  end
282
304
  end
283
305
 
@@ -371,8 +393,8 @@ module ActiveMerchant #:nodoc:
371
393
 
372
394
  def commit(&block)
373
395
  yield
374
- rescue Braintree::BraintreeError => ex
375
- Response.new(false, ex.class.to_s)
396
+ rescue Braintree::BraintreeError => e
397
+ Response.new(false, e.class.to_s)
376
398
  end
377
399
 
378
400
  def message_from_result(result)
@@ -422,6 +444,8 @@ module ActiveMerchant #:nodoc:
422
444
  end
423
445
 
424
446
  def avs_code_from(transaction)
447
+ return unless transaction
448
+
425
449
  transaction.avs_error_response_code ||
426
450
  avs_mapping["street: #{transaction.avs_street_address_response_code}, zip: #{transaction.avs_postal_code_response_code}"]
427
451
  end
@@ -486,6 +510,55 @@ module ActiveMerchant #:nodoc:
486
510
  result.transaction&.additional_processor_response
487
511
  end
488
512
 
513
+ def payment_instrument_type(result)
514
+ result&.payment_instrument_type
515
+ end
516
+
517
+ def credit_card_details(result)
518
+ if result
519
+ {
520
+ 'masked_number' => result.credit_card_details&.masked_number,
521
+ 'bin' => result.credit_card_details&.bin,
522
+ 'last_4' => result.credit_card_details&.last_4,
523
+ 'card_type' => result.credit_card_details&.card_type,
524
+ 'token' => result.credit_card_details&.token,
525
+ 'debit' => result.credit_card_details&.debit,
526
+ 'prepaid' => result.credit_card_details&.prepaid,
527
+ 'issuing_bank' => result.credit_card_details&.issuing_bank,
528
+ 'country_of_issuance' => result.credit_card_details&.country_of_issuance
529
+ }
530
+ end
531
+ end
532
+
533
+ def network_token_details(result)
534
+ if result
535
+ {
536
+ 'debit' => result.network_token_details&.debit,
537
+ 'prepaid' => result.network_token_details&.prepaid,
538
+ 'issuing_bank' => result.network_token_details&.issuing_bank
539
+ }
540
+ end
541
+ end
542
+
543
+ def google_pay_details(result)
544
+ if result
545
+ {
546
+ 'debit' => result.google_pay_details&.debit,
547
+ 'prepaid' => result.google_pay_details&.prepaid
548
+ }
549
+ end
550
+ end
551
+
552
+ def apple_pay_details(result)
553
+ if result
554
+ {
555
+ 'debit' => result.apple_pay_details&.debit,
556
+ 'prepaid' => result.apple_pay_details&.prepaid,
557
+ 'issuing_bank' => result.apple_pay_details&.issuing_bank
558
+ }
559
+ end
560
+ end
561
+
489
562
  def create_transaction(transaction_type, money, credit_card_or_vault_id, options)
490
563
  transaction_params = create_transaction_parameters(money, credit_card_or_vault_id, options)
491
564
  commit do
@@ -545,7 +618,15 @@ module ActiveMerchant #:nodoc:
545
618
  def transaction_hash(result)
546
619
  unless result.success?
547
620
  return { 'processor_response_code' => response_code_from_result(result),
548
- 'additional_processor_response' => additional_processor_response_from_result(result) }
621
+ 'additional_processor_response' => additional_processor_response_from_result(result),
622
+ 'payment_instrument_type' => payment_instrument_type(result.transaction),
623
+ 'credit_card_details' => credit_card_details(result.transaction),
624
+ 'network_token_details' => network_token_details(result.transaction),
625
+ 'google_pay_details' => google_pay_details(result.transaction),
626
+ 'apple_pay_details' => apple_pay_details(result.transaction),
627
+ 'avs_response_code' => avs_code_from(result.transaction),
628
+ 'cvv_response_code' => result.transaction&.cvv_response_code,
629
+ 'gateway_message' => result.message }
549
630
  end
550
631
 
551
632
  transaction = result.transaction
@@ -561,6 +642,14 @@ module ActiveMerchant #:nodoc:
561
642
  vault_customer = nil
562
643
  end
563
644
 
645
+ credit_card_details = credit_card_details(transaction)
646
+
647
+ network_token_details = network_token_details(transaction)
648
+
649
+ google_pay_details = google_pay_details(transaction)
650
+
651
+ apple_pay_details = apple_pay_details(transaction)
652
+
564
653
  customer_details = {
565
654
  'id' => transaction.customer_details.id,
566
655
  'email' => transaction.customer_details.email,
@@ -586,12 +675,10 @@ module ActiveMerchant #:nodoc:
586
675
  'postal_code' => transaction.shipping_details.postal_code,
587
676
  'country_name' => transaction.shipping_details.country_name
588
677
  }
589
- credit_card_details = {
590
- 'masked_number' => transaction.credit_card_details.masked_number,
591
- 'bin' => transaction.credit_card_details.bin,
592
- 'last_4' => transaction.credit_card_details.last_4,
593
- 'card_type' => transaction.credit_card_details.card_type,
594
- 'token' => transaction.credit_card_details.token
678
+
679
+ paypal_details = {
680
+ 'payer_id' => transaction.paypal_details.payer_id,
681
+ 'payer_email' => transaction.paypal_details.payer_email
595
682
  }
596
683
 
597
684
  if transaction.risk_data
@@ -605,11 +692,23 @@ module ActiveMerchant #:nodoc:
605
692
  risk_data = nil
606
693
  end
607
694
 
695
+ if transaction.payment_receipt
696
+ payment_receipt = {
697
+ 'global_id' => transaction.payment_receipt.global_id
698
+ }
699
+ else
700
+ payment_receipt = nil
701
+ end
702
+
608
703
  {
609
704
  'order_id' => transaction.order_id,
610
705
  'amount' => transaction.amount.to_s,
611
706
  'status' => transaction.status,
612
707
  'credit_card_details' => credit_card_details,
708
+ 'network_token_details' => network_token_details,
709
+ 'apple_pay_details' => apple_pay_details,
710
+ 'google_pay_details' => google_pay_details,
711
+ 'paypal_details' => paypal_details,
613
712
  'customer_details' => customer_details,
614
713
  'billing_details' => billing_details,
615
714
  'shipping_details' => shipping_details,
@@ -619,7 +718,9 @@ module ActiveMerchant #:nodoc:
619
718
  'network_transaction_id' => transaction.network_transaction_id || nil,
620
719
  'processor_response_code' => response_code_from_result(result),
621
720
  'processor_authorization_code' => transaction.processor_authorization_code,
622
- 'recurring' => transaction.recurring
721
+ 'recurring' => transaction.recurring,
722
+ 'payment_receipt' => payment_receipt,
723
+ 'payment_instrument_type' => payment_instrument_type(transaction)
623
724
  }
624
725
  end
625
726
 
@@ -665,6 +766,8 @@ module ActiveMerchant #:nodoc:
665
766
 
666
767
  add_3ds_info(parameters, options[:three_d_secure])
667
768
 
769
+ parameters[:sca_exemption] = options[:three_ds_exemption_type] if options[:three_ds_exemption_type]
770
+
668
771
  if options[:payment_method_nonce].is_a?(String)
669
772
  parameters.delete(:customer)
670
773
  parameters[:payment_method_nonce] = options[:payment_method_nonce]
@@ -803,78 +906,125 @@ module ActiveMerchant #:nodoc:
803
906
  end
804
907
 
805
908
  def add_stored_credential_data(parameters, credit_card_or_vault_id, options)
909
+ # Braintree has informed us that the stored_credential mapping may be incorrect
910
+ # In order to prevent possible breaking changes we will only apply the new logic if
911
+ # specifically requested. This will be the default behavior in a future release.
806
912
  return unless (stored_credential = options[:stored_credential])
807
913
 
808
- parameters[:external_vault] = {}
809
- if stored_credential[:initial_transaction]
810
- parameters[:external_vault][:status] = 'will_vault'
811
- else
812
- parameters[:external_vault][:status] = 'vaulted'
813
- parameters[:external_vault][:previous_network_transaction_id] = stored_credential[:network_transaction_id]
814
- end
815
- if stored_credential[:initiator] == 'merchant'
816
- if stored_credential[:reason_type] == 'installment'
817
- parameters[:transaction_source] = 'recurring'
914
+ add_external_vault(parameters, options)
915
+ stored_credentials(parameters, stored_credential)
916
+ end
917
+
918
+ def stored_credentials(parameters, stored_credential)
919
+ case stored_credential[:reason_type]
920
+ when 'recurring', 'installment'
921
+ if stored_credential[:initial_transaction]
922
+ parameters[:transaction_source] = "#{stored_credential[:reason_type]}_first"
818
923
  else
819
924
  parameters[:transaction_source] = stored_credential[:reason_type]
820
925
  end
821
- elsif %w(recurring_first moto).include?(stored_credential[:reason_type])
926
+ when 'recurring_first', 'moto'
822
927
  parameters[:transaction_source] = stored_credential[:reason_type]
928
+ when 'unscheduled'
929
+ parameters[:transaction_source] = stored_credential[:initiator] == 'merchant' ? stored_credential[:reason_type] : ''
823
930
  else
824
931
  parameters[:transaction_source] = ''
825
932
  end
826
933
  end
827
934
 
935
+ def add_external_vault(parameters, options = {})
936
+ stored_credential = options[:stored_credential]
937
+ parameters[:external_vault] = {}
938
+ if stored_credential[:initial_transaction]
939
+ parameters[:external_vault][:status] = 'will_vault'
940
+ else
941
+ parameters[:external_vault][:status] = 'vaulted'
942
+ parameters[:external_vault][:previous_network_transaction_id] = options[:network_transaction_id] || stored_credential[:network_transaction_id]
943
+ end
944
+ end
945
+
828
946
  def add_payment_method(parameters, credit_card_or_vault_id, options)
829
947
  if credit_card_or_vault_id.is_a?(String) || credit_card_or_vault_id.is_a?(Integer)
830
- if options[:payment_method_token]
831
- parameters[:payment_method_token] = credit_card_or_vault_id
832
- options.delete(:billing_address)
833
- elsif options[:payment_method_nonce]
834
- parameters[:payment_method_nonce] = credit_card_or_vault_id
835
- else
836
- parameters[:customer_id] = credit_card_or_vault_id
837
- end
948
+ add_third_party_token(parameters, credit_card_or_vault_id, options)
838
949
  else
839
950
  parameters[:customer].merge!(
840
951
  first_name: credit_card_or_vault_id.first_name,
841
952
  last_name: credit_card_or_vault_id.last_name
842
953
  )
843
954
  if credit_card_or_vault_id.is_a?(NetworkTokenizationCreditCard)
844
- if credit_card_or_vault_id.source == :apple_pay
845
- parameters[:apple_pay_card] = {
846
- number: credit_card_or_vault_id.number,
847
- expiration_month: credit_card_or_vault_id.month.to_s.rjust(2, '0'),
848
- expiration_year: credit_card_or_vault_id.year.to_s,
849
- cardholder_name: credit_card_or_vault_id.name,
850
- cryptogram: credit_card_or_vault_id.payment_cryptogram,
851
- eci_indicator: credit_card_or_vault_id.eci
852
- }
853
- elsif credit_card_or_vault_id.source == :android_pay || credit_card_or_vault_id.source == :google_pay
854
- Braintree::Version::Major < 3 ? pay_card = :android_pay_card : pay_card = :google_pay_card
855
- parameters[pay_card] = {
856
- number: credit_card_or_vault_id.number,
857
- cryptogram: credit_card_or_vault_id.payment_cryptogram,
858
- expiration_month: credit_card_or_vault_id.month.to_s.rjust(2, '0'),
859
- expiration_year: credit_card_or_vault_id.year.to_s,
860
- google_transaction_id: credit_card_or_vault_id.transaction_id,
861
- source_card_type: credit_card_or_vault_id.brand,
862
- source_card_last_four: credit_card_or_vault_id.last_digits,
863
- eci_indicator: credit_card_or_vault_id.eci
864
- }
955
+ case credit_card_or_vault_id.source
956
+ when :apple_pay
957
+ add_apple_pay(parameters, credit_card_or_vault_id)
958
+ when :google_pay
959
+ add_google_pay(parameters, credit_card_or_vault_id)
960
+ else
961
+ add_network_tokenization_card(parameters, credit_card_or_vault_id)
865
962
  end
866
963
  else
867
- parameters[:credit_card] = {
868
- number: credit_card_or_vault_id.number,
869
- cvv: credit_card_or_vault_id.verification_value,
870
- expiration_month: credit_card_or_vault_id.month.to_s.rjust(2, '0'),
871
- expiration_year: credit_card_or_vault_id.year.to_s,
872
- cardholder_name: credit_card_or_vault_id.name
873
- }
964
+ add_credit_card(parameters, credit_card_or_vault_id)
874
965
  end
875
966
  end
876
967
  end
877
968
 
969
+ def add_third_party_token(parameters, payment_method, options)
970
+ if options[:payment_method_token]
971
+ parameters[:payment_method_token] = payment_method
972
+ options.delete(:billing_address)
973
+ elsif options[:payment_method_nonce]
974
+ parameters[:payment_method_nonce] = payment_method
975
+ else
976
+ parameters[:customer_id] = payment_method
977
+ end
978
+ end
979
+
980
+ def add_credit_card(parameters, payment_method)
981
+ parameters[:credit_card] = {
982
+ number: payment_method.number,
983
+ cvv: payment_method.verification_value,
984
+ expiration_month: payment_method.month.to_s.rjust(2, '0'),
985
+ expiration_year: payment_method.year.to_s,
986
+ cardholder_name: payment_method.name
987
+ }
988
+ end
989
+
990
+ def add_apple_pay(parameters, payment_method)
991
+ parameters[:apple_pay_card] = {
992
+ number: payment_method.number,
993
+ expiration_month: payment_method.month.to_s.rjust(2, '0'),
994
+ expiration_year: payment_method.year.to_s,
995
+ cardholder_name: payment_method.name,
996
+ cryptogram: payment_method.payment_cryptogram,
997
+ eci_indicator: payment_method.eci
998
+ }
999
+ end
1000
+
1001
+ def add_google_pay(parameters, payment_method)
1002
+ Braintree::Version::Major < 3 ? pay_card = :android_pay_card : pay_card = :google_pay_card
1003
+ parameters[pay_card] = {
1004
+ number: payment_method.number,
1005
+ cryptogram: payment_method.payment_cryptogram,
1006
+ expiration_month: payment_method.month.to_s.rjust(2, '0'),
1007
+ expiration_year: payment_method.year.to_s,
1008
+ google_transaction_id: payment_method.transaction_id,
1009
+ source_card_type: payment_method.brand,
1010
+ source_card_last_four: payment_method.last_digits,
1011
+ eci_indicator: payment_method.eci
1012
+ }
1013
+ end
1014
+
1015
+ def add_network_tokenization_card(parameters, payment_method)
1016
+ parameters[:credit_card] = {
1017
+ number: payment_method.number,
1018
+ expiration_month: payment_method.month.to_s.rjust(2, '0'),
1019
+ expiration_year: payment_method.year.to_s,
1020
+ cardholder_name: payment_method.name,
1021
+ network_tokenization_attributes: {
1022
+ cryptogram: payment_method.payment_cryptogram,
1023
+ ecommerce_indicator: payment_method.eci
1024
+ }
1025
+ }
1026
+ end
1027
+
878
1028
  def bank_account_errors(payment_method, options)
879
1029
  if payment_method.validate.present?
880
1030
  payment_method.validate
@@ -886,7 +1036,7 @@ module ActiveMerchant #:nodoc:
886
1036
  end
887
1037
 
888
1038
  def add_bank_account_to_customer(payment_method, options)
889
- bank_account_nonce, error_message = TokenNonce.new(@braintree_gateway, options).create_token_nonce_for_payment_method payment_method
1039
+ bank_account_nonce, error_message = TokenNonce.new(@braintree_gateway, options).create_token_nonce_for_payment_method(payment_method, options)
890
1040
  return Response.new(false, error_message) unless bank_account_nonce.present?
891
1041
 
892
1042
  result = @braintree_gateway.payment_method.create(
@@ -901,13 +1051,16 @@ module ActiveMerchant #:nodoc:
901
1051
  message = message_from_result(result)
902
1052
  message = not_verified_reason(result.payment_method) unless verified
903
1053
 
904
- Response.new(verified, message,
1054
+ Response.new(
1055
+ verified,
1056
+ message,
905
1057
  {
906
1058
  customer_vault_id: options[:customer],
907
1059
  bank_account_token: result.payment_method&.token,
908
1060
  verified: verified
909
1061
  },
910
- authorization: result.payment_method&.token)
1062
+ authorization: result.payment_method&.token
1063
+ )
911
1064
  end
912
1065
 
913
1066
  def not_verified_reason(bank_account)
@@ -944,7 +1097,7 @@ module ActiveMerchant #:nodoc:
944
1097
  Response.new(
945
1098
  result.success?,
946
1099
  message_from_result(result),
947
- { customer_vault_id: customer_id, 'exists': true }
1100
+ { customer_vault_id: customer_id, exists: true }
948
1101
  )
949
1102
  end
950
1103
  end
@@ -1,4 +1,4 @@
1
- require 'active_merchant/billing/gateways/smart_ps.rb'
1
+ require 'active_merchant/billing/gateways/smart_ps'
2
2
  require 'active_merchant/billing/gateways/braintree/braintree_common'
3
3
 
4
4
  module ActiveMerchant #:nodoc:
@@ -146,9 +146,12 @@ module ActiveMerchant #:nodoc:
146
146
 
147
147
  def unstore(authorization, options = {})
148
148
  account_id, profile_id = authorization.split('|')
149
- commit('profile', {},
149
+ commit(
150
+ 'profile',
151
+ {},
150
152
  verb: :delete,
151
- path: "/#{profile_id}/#{account_id}/#{@options[:merchant_id]}")
153
+ path: "/#{profile_id}/#{account_id}/#{@options[:merchant_id]}"
154
+ )
152
155
  end
153
156
 
154
157
  def supports_scrubbing?
@@ -248,12 +248,10 @@ module ActiveMerchant #:nodoc:
248
248
  add_pair(post, :orderRef, options[:description] || options[:order_id], required: true)
249
249
  add_pair(post, :statementNarrative1, options[:merchant_name]) if options[:merchant_name]
250
250
  add_pair(post, :statementNarrative2, options[:dynamic_descriptor]) if options[:dynamic_descriptor]
251
- if credit_card_or_reference.respond_to?(:number)
252
- if %w[american_express diners_club].include?(card_brand(credit_card_or_reference).to_s)
253
- add_pair(post, :item1Quantity, 1)
254
- add_pair(post, :item1Description, (options[:description] || options[:order_id]).slice(0, 15))
255
- add_pair(post, :item1GrossValue, localized_amount(money, options[:currency] || currency(money)))
256
- end
251
+ if credit_card_or_reference.respond_to?(:number) && %w[american_express diners_club].include?(card_brand(credit_card_or_reference).to_s)
252
+ add_pair(post, :item1Quantity, 1)
253
+ add_pair(post, :item1Description, (options[:description] || options[:order_id]).slice(0, 15))
254
+ add_pair(post, :item1GrossValue, localized_amount(money, options[:currency] || currency(money)))
257
255
  end
258
256
 
259
257
  add_pair(post, :type, options[:type] || '1')
@@ -150,7 +150,7 @@ module ActiveMerchant #:nodoc:
150
150
  match = body.match(/<cngateway>(.*)<\/cngateway>/)
151
151
  return nil unless match
152
152
 
153
- Hash[CGI::parse(match[1]).map { |k, v| [k.to_sym, v.first] }]
153
+ CGI::parse(match[1]).map { |k, v| [k.to_sym, v.first] }.to_h
154
154
  end
155
155
 
156
156
  def handle_response(response)
@@ -0,0 +1,36 @@
1
+ module CecabankCommon
2
+ #### CECA's MAGIC NUMBERS
3
+ CECA_ENCRIPTION = 'SHA2'
4
+ CECA_CURRENCIES_DICTIONARY = { 'EUR' => 978, 'USD' => 840, 'GBP' => 826 }
5
+
6
+ def self.included(base)
7
+ base.supported_countries = ['ES']
8
+ base.supported_cardtypes = %i[visa master american_express]
9
+ base.homepage_url = 'http://www.ceca.es/es/'
10
+ base.display_name = 'Cecabank'
11
+ base.default_currency = 'EUR'
12
+ base.money_format = :cents
13
+ end
14
+
15
+ # Creates a new CecabankGateway
16
+ #
17
+ # The gateway requires four values for connection to be passed
18
+ # in the +options+ hash.
19
+ #
20
+ # ==== Options
21
+ #
22
+ # * <tt>:merchant_id</tt> -- Cecabank's merchant_id (REQUIRED)
23
+ # * <tt>:acquirer_bin</tt> -- Cecabank's acquirer_bin (REQUIRED)
24
+ # * <tt>:terminal_id</tt> -- Cecabank's terminal_id (REQUIRED)
25
+ # * <tt>:cypher_key</tt> -- Cecabank's cypher key (REQUIRED)
26
+ # * <tt>:test</tt> -- +true+ or +false+. If true, perform transactions against the test server.
27
+ # Otherwise, perform transactions against the production server.
28
+ def initialize(options = {})
29
+ requires!(options, :merchant_id, :acquirer_bin, :terminal_id, :cypher_key)
30
+ super
31
+ end
32
+
33
+ def supports_scrubbing?
34
+ true
35
+ end
36
+ end