activemerchant 1.103.0 → 1.104.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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +41 -0
  3. data/lib/active_merchant.rb +1 -1
  4. data/lib/active_merchant/billing/avs_result.rb +8 -8
  5. data/lib/active_merchant/billing/compatibility.rb +2 -1
  6. data/lib/active_merchant/billing/credit_card.rb +3 -1
  7. data/lib/active_merchant/billing/credit_card_methods.rb +12 -0
  8. data/lib/active_merchant/billing/cvv_result.rb +0 -1
  9. data/lib/active_merchant/billing/gateway.rb +3 -0
  10. data/lib/active_merchant/billing/gateways/adyen.rb +32 -9
  11. data/lib/active_merchant/billing/gateways/allied_wallet.rb +2 -2
  12. data/lib/active_merchant/billing/gateways/authorize_net.rb +10 -9
  13. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +10 -0
  14. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +1 -0
  15. data/lib/active_merchant/billing/gateways/axcessms.rb +1 -0
  16. data/lib/active_merchant/billing/gateways/balanced.rb +18 -15
  17. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +4 -0
  18. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +3 -1
  19. data/lib/active_merchant/billing/gateways/blue_pay.rb +6 -5
  20. data/lib/active_merchant/billing/gateways/blue_snap.rb +31 -3
  21. data/lib/active_merchant/billing/gateways/borgun.rb +1 -1
  22. data/lib/active_merchant/billing/gateways/bpoint.rb +0 -2
  23. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +1 -0
  24. data/lib/active_merchant/billing/gateways/braintree_blue.rb +11 -4
  25. data/lib/active_merchant/billing/gateways/bridge_pay.rb +1 -1
  26. data/lib/active_merchant/billing/gateways/card_connect.rb +2 -1
  27. data/lib/active_merchant/billing/gateways/card_save.rb +2 -3
  28. data/lib/active_merchant/billing/gateways/card_stream.rb +6 -6
  29. data/lib/active_merchant/billing/gateways/cardprocess.rb +2 -0
  30. data/lib/active_merchant/billing/gateways/cashnet.rb +1 -0
  31. data/lib/active_merchant/billing/gateways/cc5.rb +1 -1
  32. data/lib/active_merchant/billing/gateways/cecabank.rb +1 -0
  33. data/lib/active_merchant/billing/gateways/cenpos.rb +4 -3
  34. data/lib/active_merchant/billing/gateways/checkout_v2.rb +2 -0
  35. data/lib/active_merchant/billing/gateways/citrus_pay.rb +0 -1
  36. data/lib/active_merchant/billing/gateways/clearhaus.rb +3 -2
  37. data/lib/active_merchant/billing/gateways/conekta.rb +5 -3
  38. data/lib/active_merchant/billing/gateways/creditcall.rb +1 -0
  39. data/lib/active_merchant/billing/gateways/credorax.rb +17 -10
  40. data/lib/active_merchant/billing/gateways/ct_payment.rb +1 -0
  41. data/lib/active_merchant/billing/gateways/cyber_source.rb +38 -0
  42. data/lib/active_merchant/billing/gateways/d_local.rb +6 -0
  43. data/lib/active_merchant/billing/gateways/data_cash.rb +1 -1
  44. data/lib/active_merchant/billing/gateways/decidir.rb +18 -2
  45. data/lib/active_merchant/billing/gateways/digitzs.rb +3 -0
  46. data/lib/active_merchant/billing/gateways/ebanx.rb +13 -2
  47. data/lib/active_merchant/billing/gateways/efsnet.rb +3 -2
  48. data/lib/active_merchant/billing/gateways/elavon.rb +1 -1
  49. data/lib/active_merchant/billing/gateways/eway.rb +2 -1
  50. data/lib/active_merchant/billing/gateways/eway_managed.rb +2 -3
  51. data/lib/active_merchant/billing/gateways/eway_rapid.rb +1 -0
  52. data/lib/active_merchant/billing/gateways/exact.rb +3 -3
  53. data/lib/active_merchant/billing/gateways/fat_zebra.rb +2 -1
  54. data/lib/active_merchant/billing/gateways/first_giving.rb +2 -1
  55. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +2 -2
  56. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +1 -0
  57. data/lib/active_merchant/billing/gateways/flo2cash.rb +2 -2
  58. data/lib/active_merchant/billing/gateways/forte.rb +1 -0
  59. data/lib/active_merchant/billing/gateways/garanti.rb +0 -1
  60. data/lib/active_merchant/billing/gateways/global_collect.rb +29 -0
  61. data/lib/active_merchant/billing/gateways/global_transport.rb +0 -1
  62. data/lib/active_merchant/billing/gateways/hdfc.rb +1 -0
  63. data/lib/active_merchant/billing/gateways/hps.rb +9 -7
  64. data/lib/active_merchant/billing/gateways/iats_payments.rb +4 -4
  65. data/lib/active_merchant/billing/gateways/iridium.rb +1 -1
  66. data/lib/active_merchant/billing/gateways/itransact.rb +3 -2
  67. data/lib/active_merchant/billing/gateways/iveri.rb +1 -0
  68. data/lib/active_merchant/billing/gateways/jetpay.rb +1 -1
  69. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +1 -1
  70. data/lib/active_merchant/billing/gateways/latitude19.rb +2 -1
  71. data/lib/active_merchant/billing/gateways/litle.rb +3 -0
  72. data/lib/active_merchant/billing/gateways/mastercard.rb +1 -0
  73. data/lib/active_merchant/billing/gateways/mercado_pago.rb +45 -0
  74. data/lib/active_merchant/billing/gateways/merchant_one.rb +0 -1
  75. data/lib/active_merchant/billing/gateways/merchant_partners.rb +3 -3
  76. data/lib/active_merchant/billing/gateways/merchant_ware.rb +1 -1
  77. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +16 -1
  78. data/lib/active_merchant/billing/gateways/mercury.rb +2 -2
  79. data/lib/active_merchant/billing/gateways/metrics_global.rb +2 -2
  80. data/lib/active_merchant/billing/gateways/micropayment.rb +0 -1
  81. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +7 -7
  82. data/lib/active_merchant/billing/gateways/moneris.rb +36 -8
  83. data/lib/active_merchant/billing/gateways/moneris_us.rb +2 -0
  84. data/lib/active_merchant/billing/gateways/mundipagg.rb +6 -1
  85. data/lib/active_merchant/billing/gateways/nab_transact.rb +2 -2
  86. data/lib/active_merchant/billing/gateways/net_registry.rb +1 -1
  87. data/lib/active_merchant/billing/gateways/netbanx.rb +3 -1
  88. data/lib/active_merchant/billing/gateways/netbilling.rb +3 -3
  89. data/lib/active_merchant/billing/gateways/netpay.rb +1 -0
  90. data/lib/active_merchant/billing/gateways/nmi.rb +5 -6
  91. data/lib/active_merchant/billing/gateways/ogone.rb +4 -2
  92. data/lib/active_merchant/billing/gateways/omise.rb +1 -2
  93. data/lib/active_merchant/billing/gateways/openpay.rb +3 -1
  94. data/lib/active_merchant/billing/gateways/opp.rb +1 -0
  95. data/lib/active_merchant/billing/gateways/optimal_payment.rb +4 -5
  96. data/lib/active_merchant/billing/gateways/orbital.rb +17 -13
  97. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +1 -1
  98. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +1 -1
  99. data/lib/active_merchant/billing/gateways/pagarme.rb +1 -0
  100. data/lib/active_merchant/billing/gateways/pay_conex.rb +1 -1
  101. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +1 -1
  102. data/lib/active_merchant/billing/gateways/pay_hub.rb +1 -0
  103. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +1 -0
  104. data/lib/active_merchant/billing/gateways/pay_secure.rb +1 -1
  105. data/lib/active_merchant/billing/gateways/paybox_direct.rb +4 -2
  106. data/lib/active_merchant/billing/gateways/payeezy.rb +2 -0
  107. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +1 -0
  108. data/lib/active_merchant/billing/gateways/payment_express.rb +2 -2
  109. data/lib/active_merchant/billing/gateways/paymentez.rb +4 -0
  110. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +1 -1
  111. data/lib/active_merchant/billing/gateways/paystation.rb +1 -3
  112. data/lib/active_merchant/billing/gateways/payu_in.rb +1 -1
  113. data/lib/active_merchant/billing/gateways/payu_latam.rb +6 -0
  114. data/lib/active_merchant/billing/gateways/payway.rb +3 -2
  115. data/lib/active_merchant/billing/gateways/pin.rb +1 -0
  116. data/lib/active_merchant/billing/gateways/plugnpay.rb +4 -4
  117. data/lib/active_merchant/billing/gateways/pro_pay.rb +1 -0
  118. data/lib/active_merchant/billing/gateways/psigate.rb +2 -1
  119. data/lib/active_merchant/billing/gateways/psl_card.rb +1 -1
  120. data/lib/active_merchant/billing/gateways/qbms.rb +2 -2
  121. data/lib/active_merchant/billing/gateways/quantum.rb +0 -1
  122. data/lib/active_merchant/billing/gateways/quickbooks.rb +2 -0
  123. data/lib/active_merchant/billing/gateways/quickpay.rb +0 -1
  124. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +5 -5
  125. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +1 -0
  126. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +1 -0
  127. data/lib/active_merchant/billing/gateways/qvalent.rb +2 -0
  128. data/lib/active_merchant/billing/gateways/realex.rb +3 -1
  129. data/lib/active_merchant/billing/gateways/redsys.rb +3 -2
  130. data/lib/active_merchant/billing/gateways/s5.rb +1 -0
  131. data/lib/active_merchant/billing/gateways/safe_charge.rb +2 -0
  132. data/lib/active_merchant/billing/gateways/sage.rb +1 -1
  133. data/lib/active_merchant/billing/gateways/sage_pay.rb +8 -6
  134. data/lib/active_merchant/billing/gateways/secure_net.rb +2 -4
  135. data/lib/active_merchant/billing/gateways/secure_pay.rb +2 -2
  136. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +1 -1
  137. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +1 -1
  138. data/lib/active_merchant/billing/gateways/securion_pay.rb +2 -0
  139. data/lib/active_merchant/billing/gateways/skip_jack.rb +6 -5
  140. data/lib/active_merchant/billing/gateways/smart_ps.rb +0 -1
  141. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +0 -1
  142. data/lib/active_merchant/billing/gateways/spreedly_core.rb +1 -0
  143. data/lib/active_merchant/billing/gateways/stripe.rb +7 -0
  144. data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +9 -4
  145. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +1 -1
  146. data/lib/active_merchant/billing/gateways/telr.rb +3 -0
  147. data/lib/active_merchant/billing/gateways/tns.rb +0 -1
  148. data/lib/active_merchant/billing/gateways/trans_first.rb +1 -0
  149. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +4 -2
  150. data/lib/active_merchant/billing/gateways/transax.rb +0 -1
  151. data/lib/active_merchant/billing/gateways/trexle.rb +3 -0
  152. data/lib/active_merchant/billing/gateways/usa_epay.rb +0 -1
  153. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +15 -16
  154. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +5 -0
  155. data/lib/active_merchant/billing/gateways/vanco.rb +1 -1
  156. data/lib/active_merchant/billing/gateways/visanet_peru.rb +1 -0
  157. data/lib/active_merchant/billing/gateways/wepay.rb +7 -6
  158. data/lib/active_merchant/billing/gateways/wirecard.rb +6 -3
  159. data/lib/active_merchant/billing/gateways/world_net.rb +1 -0
  160. data/lib/active_merchant/billing/gateways/worldpay.rb +4 -0
  161. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +0 -1
  162. data/lib/active_merchant/billing/gateways/worldpay_us.rb +2 -2
  163. data/lib/active_merchant/billing/response.rb +1 -1
  164. data/lib/active_merchant/connection.rb +2 -0
  165. data/lib/active_merchant/country.rb +1 -0
  166. data/lib/active_merchant/net_http_ssl_connection.rb +1 -0
  167. data/lib/active_merchant/post_data.rb +1 -0
  168. data/lib/active_merchant/version.rb +1 -1
  169. data/lib/support/ssl_verify.rb +0 -2
  170. data/lib/support/ssl_version.rb +0 -1
  171. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a51e307707d9ffa9cd0d32779623b7095ea9af27f16078de9736be65fc8c0090
4
- data.tar.gz: 27b16b69f6bb974795ddc1fae4d924257bee5c0620d0ab009b771b107d59be24
3
+ metadata.gz: e9ceb4b2da9006abdfcab980341c407f7b718ae35a424fc1e597c3cf2b189271
4
+ data.tar.gz: 19fe8973c00605d460cd56bcc8d0148cfa8ad7af9a33d07c9f2759da56dc5684
5
5
  SHA512:
6
- metadata.gz: 6d0e03c0a615dabf2ef0299baaac647eabe906f08bfbb3343e545d3a7ee1390678a963a4a1433b24cb478264b7ad260a30c947d827e91e835f6892ca31644399
7
- data.tar.gz: db9a355a166614c1ebe4b018ba1a5634448bd5be14aa34e9db55837d529b1aad4f10994cf476793e38619fb7d8c7785ab014b5dac4d2a33bcea3720da8a98689
6
+ metadata.gz: 94d123473e989145c5d9a34294718cc8913d231c72b415bd0398e88cfefdc81b1cd9070eaf14648be6c723de201785920de8479b8ef997454df194cfaa4f7734
7
+ data.tar.gz: 9567e118dd21f0779d5a8bd228ab385f2378c338f838fe027ed6ad6a245a86362fd786d91aa53cbaa65b31d3817efdc8ca299ff84f44f182140ff43018cd6f7c
data/CHANGELOG CHANGED
@@ -2,6 +2,46 @@
2
2
 
3
3
  == HEAD
4
4
 
5
+ == Version 1.104.0 (Jan 29, 2020)
6
+ * Adyen: add `recurring_contract_type` GSF [therufs] #3460
7
+ * Credorax: Only pass `3ds_version` parameter when required [britth] #3458
8
+ * EBANX: Include Peru in supported countries [Ruanito] #3443
9
+ * Bluesnap: include fraud data in response message [therufs] #3459
10
+ * Ingenico GlobalCollect: support `airline_data` and related GSFs [therufs] #3461
11
+ * Add UnionPay card type [leila-alderman] #3464
12
+ * Braintree: Fix add_credit_card_to_customer in Store [molbrown] #3466
13
+ * EBANX: Default to not send amount on capture [chinhle23] #3463
14
+ * Latitude19: Convert money format to dollars [molbrown] #3468
15
+ * Adyen: Fix response success for unstore [kheang] #3470
16
+ * CyberSource: add several GSFs [therufs] #3465
17
+ * Adyen: add `recurring_contract_type` GSF to auth [therufs] #3471
18
+ * Stripe Payment Intents: Use localized_amount on capture [molbrown] #3475
19
+ * dLocal: Add support for installments [kdelemme] #3456
20
+ * Merchant Warrior: Add void operation [leila-alderman] #3474
21
+ * Decidir: Update payment method IDs [leila-alderman] #3476
22
+ * Adyen: Add delivery address [leila-alderman] #3477
23
+ * Authorize.net: Correctly parse direct_response field with quotation marks [britth] #3479
24
+ * Decidir: Add debit card payment method IDs [leila-alderman] #3480
25
+ * CyberSource: Add issuer data+MDD to credit & void [leila-alderman] #3481
26
+ * Credorax: add `authorization_type` and `multiple_capture_count` GSFs [therufs] #3478
27
+ * CardStream: use localized_amount to correctly support zero-decimal currencies [britth] #3473
28
+ * EBANX: Add additional data in post [Ruanito] #3482
29
+ * Credorax: Omit phone when nil [leila-alderman] #3490
30
+ * TransFirst TrExp: Remove hyphens from zip [leila-alderman] #3483
31
+ * Mundipagg: Return acquirer code as the error code [leila-alderman] #3492
32
+ * Braintree Blue: Remove customer hash when using a payment_method_nonce #3495
33
+ * Credorax: Update non-standard currencies list [chinhle23] #3499
34
+ * Redsys: Update production URL [britth] #3505
35
+ * Moneris: include AVS and CoF fields when storing vault records [alexdunae] #3446
36
+ * Moneris: Add support for temporary vault storage [alexdunae] #3446
37
+ * Clearhaus: Update currencies without fractions list [chinhle23] #3506
38
+ * Merchant Warrior: Add recurringFlag to purchase & authorize [carrigan] #3504
39
+ * CardConnect: Remove domain port validation [leila-alderman] #3494
40
+ * Paymentez: Correct refund and void message parsing [carrigan] #3509
41
+ * Mercado Pago: Add taxes and net_amount gateway specific fields [carrigan] #3512
42
+ * Moneris: use dedicated card_verification methods [alexdunae] #3428
43
+ * Authorize.net: Trim down supported countries [fatcatt316] #3511
44
+
5
45
  == Version 1.103.0 (Dec 2, 2019)
6
46
  * Quickbooks: Mark transactions that returned `AuthorizationFailed` as failures [britth] #3447
7
47
  * Credorax: Add referral CFT transactions [leila-alderman] #3432
@@ -56,6 +96,7 @@
56
96
  * Rubocop: Layout/MultilineHashBraceLayout [nfarve] #3385
57
97
  * CardConnect: Always include additional_data in purchase [therufs] #3387
58
98
  * CardConnect: Add user_fields GSF [therufs] #3388
99
+ * Moneris: Add support for stored credentials [chinhle23] #3384
59
100
 
60
101
  == Version 1.99.0 (Sep 26, 2019)
61
102
  * Adyen: Add functionality to set 3DS exemptions via API [britth] #3331
@@ -52,7 +52,7 @@ require 'active_merchant/country'
52
52
  module ActiveMerchant
53
53
  def self.deprecated(message, caller=Kernel.caller[1])
54
54
  warning = caller + ': ' + message
55
- if(respond_to?(:logger) && logger.present?)
55
+ if respond_to?(:logger) && logger.present?
56
56
  logger.warn(warning)
57
57
  else
58
58
  warn(warning)
@@ -39,10 +39,10 @@ module ActiveMerchant
39
39
 
40
40
  # Map vendor's AVS result code to a postal match code
41
41
  POSTAL_MATCH_CODE = {
42
- 'Y' => %w( D H F H J L M P Q V W X Y Z ),
43
- 'N' => %w( A C K N O ),
44
- 'X' => %w( G S ),
45
- nil => %w( B E I R T U )
42
+ 'Y' => %w(D H F H J L M P Q V W X Y Z),
43
+ 'N' => %w(A C K N O),
44
+ 'X' => %w(G S),
45
+ nil => %w(B E I R T U)
46
46
  }.inject({}) do |map, (type, codes)|
47
47
  codes.each { |code| map[code] = type }
48
48
  map
@@ -50,10 +50,10 @@ module ActiveMerchant
50
50
 
51
51
  # Map vendor's AVS result code to a street match code
52
52
  STREET_MATCH_CODE = {
53
- 'Y' => %w( A B D H J M O Q T V X Y ),
54
- 'N' => %w( C K L N W Z ),
55
- 'X' => %w( G S ),
56
- nil => %w( E F I P R U )
53
+ 'Y' => %w(A B D H J M O Q T V X Y),
54
+ 'N' => %w(C K L N W Z),
55
+ 'X' => %w(G S),
56
+ nil => %w(E F I P R U)
57
57
  }.inject({}) do |map, (type, codes)|
58
58
  codes.each { |code| map[code] = type }
59
59
  map
@@ -98,7 +98,8 @@ module ActiveMerchant
98
98
  result = []
99
99
 
100
100
  self.each do |key, messages|
101
- next unless(messages && !messages.empty?)
101
+ next unless messages && !messages.empty?
102
+
102
103
  if key == 'base'
103
104
  result << messages.first.to_s
104
105
  else
@@ -22,6 +22,7 @@ module ActiveMerchant #:nodoc:
22
22
  # * Alelo
23
23
  # * Cabal
24
24
  # * Naranja
25
+ # * UnionPay
25
26
  #
26
27
  # For testing purposes, use the 'bogus' credit card brand. This skips the vast majority of
27
28
  # validations, allowing you to focus on your core concerns until you're ready to be more concerned
@@ -96,6 +97,7 @@ module ActiveMerchant #:nodoc:
96
97
  # * +'alelo'+
97
98
  # * +'cabal'+
98
99
  # * +'naranja'+
100
+ # * +'union_pay'+
99
101
  #
100
102
  # Or, if you wish to test your implementation, +'bogus'+.
101
103
  #
@@ -327,7 +329,7 @@ module ActiveMerchant #:nodoc:
327
329
  errors << [:last_name, 'cannot be empty'] if last_name.blank?
328
330
  end
329
331
 
330
- if(empty?(month) || empty?(year))
332
+ if empty?(month) || empty?(year)
331
333
  errors << [:month, 'is required'] if empty?(month)
332
334
  errors << [:year, 'is required'] if empty?(year)
333
335
  else
@@ -18,6 +18,7 @@ module ActiveMerchant #:nodoc:
18
18
  'sodexo' => ->(num) { num =~ /^(606071|603389|606070|606069|606068|600818)\d{10}$/ },
19
19
  'vr' => ->(num) { num =~ /^(627416|637036)\d{10}$/ },
20
20
  'cabal' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 8), CABAL_RANGES) },
21
+ 'unionpay' => ->(num) { (16..19).cover?(num&.size) && in_bin_range?(num.slice(0, 8), UNIONPAY_RANGES) },
21
22
  'carnet' => lambda { |num|
22
23
  num&.size == 16 && (
23
24
  in_bin_range?(num.slice(0, 6), CARNET_RANGES) ||
@@ -123,6 +124,14 @@ module ActiveMerchant #:nodoc:
123
124
  589562..589562
124
125
  ]
125
126
 
127
+ # In addition to the BIN ranges listed here that all begin with 81, UnionPay cards
128
+ # include many ranges that start with 62.
129
+ # Prior to adding UnionPay, cards that start with 62 were all classified as Discover.
130
+ # Because UnionPay cards are able to run on Discover rails, this was kept the same.
131
+ UNIONPAY_RANGES = [
132
+ 81000000..81099999, 81100000..81319999, 81320000..81519999, 81520000..81639999, 81640000..81719999
133
+ ]
134
+
126
135
  def self.included(base)
127
136
  base.extend(ClassMethods)
128
137
  end
@@ -238,6 +247,7 @@ module ActiveMerchant #:nodoc:
238
247
 
239
248
  def last_digits(number)
240
249
  return '' if number.nil?
250
+
241
251
  number.length <= 4 ? number : number.slice(-4..-1)
242
252
  end
243
253
 
@@ -259,11 +269,13 @@ module ActiveMerchant #:nodoc:
259
269
 
260
270
  def valid_card_number_length?(number) #:nodoc:
261
271
  return false if number.nil?
272
+
262
273
  number.length >= 12
263
274
  end
264
275
 
265
276
  def valid_card_number_characters?(number) #:nodoc:
266
277
  return false if number.nil?
278
+
267
279
  !number.match(/\D/)
268
280
  end
269
281
 
@@ -4,7 +4,6 @@ module ActiveMerchant
4
4
  # http://www.bbbonline.org/eExport/doc/MerchantGuide_cvv2.pdf
5
5
  # Check additional codes from cybersource website
6
6
  class CVVResult
7
-
8
7
  MESSAGES = {
9
8
  'D' => 'CVV check flagged transaction as suspicious',
10
9
  'I' => 'CVV failed data validation check',
@@ -249,6 +249,7 @@ module ActiveMerchant #:nodoc:
249
249
 
250
250
  def amount(money)
251
251
  return nil if money.nil?
252
+
252
253
  cents =
253
254
  if money.respond_to?(:cents)
254
255
  ActiveMerchant.deprecated 'Support for Money objects is deprecated and will be removed from a future release of ActiveMerchant. Please use an Integer value in cents'
@@ -278,6 +279,7 @@ module ActiveMerchant #:nodoc:
278
279
  amount = amount(money)
279
280
 
280
281
  return amount unless non_fractional_currency?(currency) || three_decimal_currency?(currency)
282
+
281
283
  if non_fractional_currency?(currency)
282
284
  if self.money_format == :cents
283
285
  sprintf('%.0f', amount.to_f / 100)
@@ -299,6 +301,7 @@ module ActiveMerchant #:nodoc:
299
301
 
300
302
  def truncate(value, max_size)
301
303
  return nil unless value
304
+
302
305
  value.to_s[0, max_size]
303
306
  end
304
307
 
@@ -1,7 +1,6 @@
1
1
  module ActiveMerchant #:nodoc:
2
2
  module Billing #:nodoc:
3
3
  class AdyenGateway < Gateway
4
-
5
4
  # we recommend setting up merchant-specific endpoints.
6
5
  # https://docs.adyen.com/developers/api-manual#apiendpoints
7
6
  self.test_url = 'https://pal-test.adyen.com/pal/servlet/'
@@ -10,7 +9,7 @@ module ActiveMerchant #:nodoc:
10
9
  self.supported_countries = %w(AT AU BE BG BR CH CY CZ DE DK EE ES FI FR GB GI GR HK HU IE IS IT LI LT LU LV MC MT MX NL NO PL PT RO SE SG SK SI US)
11
10
  self.default_currency = 'USD'
12
11
  self.currencies_without_fractions = %w(CVE DJF GNF IDR JPY KMF KRW PYG RWF UGX VND VUV XAF XOF XPF)
13
- self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :jcb, :dankort, :maestro, :discover, :elo, :naranja, :cabal]
12
+ self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :jcb, :dankort, :maestro, :discover, :elo, :naranja, :cabal, :unionpay]
14
13
 
15
14
  self.money_format = :cents
16
15
 
@@ -51,7 +50,7 @@ module ActiveMerchant #:nodoc:
51
50
  requires!(options, :order_id)
52
51
  post = init_post(options)
53
52
  add_invoice(post, money, options)
54
- add_payment(post, payment)
53
+ add_payment(post, payment, options)
55
54
  add_extra_data(post, payment, options)
56
55
  add_stored_credentials(post, payment, options)
57
56
  add_address(post, options)
@@ -59,6 +58,7 @@ module ActiveMerchant #:nodoc:
59
58
  add_3ds(post, options)
60
59
  add_3ds_authenticated_data(post, options)
61
60
  add_splits(post, options)
61
+ add_recurring_contract(post, options)
62
62
  commit('authorise', post, options)
63
63
  end
64
64
 
@@ -96,12 +96,14 @@ module ActiveMerchant #:nodoc:
96
96
  requires!(options, :order_id)
97
97
  post = init_post(options)
98
98
  add_invoice(post, 0, options)
99
- add_payment(post, credit_card)
99
+ add_payment(post, credit_card, options)
100
100
  add_extra_data(post, credit_card, options)
101
101
  add_stored_credentials(post, credit_card, options)
102
- add_recurring_contract(post, options)
103
102
  add_address(post, options)
104
103
 
104
+ options[:recurring_contract_type] ||= 'RECURRING'
105
+ add_recurring_contract(post, options)
106
+
105
107
  action = options[:tokenize_only] ? 'storeToken' : 'authorise'
106
108
 
107
109
  initial_response = commit(action, post, options)
@@ -226,6 +228,7 @@ module ActiveMerchant #:nodoc:
226
228
 
227
229
  def add_splits(post, options)
228
230
  return unless split_data = options[:splits]
231
+
229
232
  splits = []
230
233
  split_data.each do |split|
231
234
  amount = {
@@ -269,6 +272,7 @@ module ActiveMerchant #:nodoc:
269
272
 
270
273
  def add_recurring_processing_model(post, options)
271
274
  return unless options.dig(:stored_credential, :reason_type) || options[:recurring_processing_model]
275
+
272
276
  if options.dig(:stored_credential, :reason_type) && options[:stored_credential][:reason_type] == 'unscheduled'
273
277
  recurring_processing_model = 'CardOnFile'
274
278
  else
@@ -279,7 +283,17 @@ module ActiveMerchant #:nodoc:
279
283
  end
280
284
 
281
285
  def add_address(post, options)
286
+ if address = options[:shipping_address]
287
+ post[:deliveryAddress] = {}
288
+ post[:deliveryAddress][:street] = address[:address1] || 'NA'
289
+ post[:deliveryAddress][:houseNumberOrName] = address[:address2] || 'NA'
290
+ post[:deliveryAddress][:postalCode] = address[:zip] if address[:zip]
291
+ post[:deliveryAddress][:city] = address[:city] || 'NA'
292
+ post[:deliveryAddress][:stateOrProvince] = get_state(address)
293
+ post[:deliveryAddress][:country] = address[:country] if address[:country]
294
+ end
282
295
  return unless post[:card]&.kind_of?(Hash)
296
+
283
297
  if (address = options[:billing_address] || options[:address]) && address[:country]
284
298
  post[:billingAddress] = {}
285
299
  post[:billingAddress][:street] = address[:address1] || 'NA'
@@ -313,11 +327,11 @@ module ActiveMerchant #:nodoc:
313
327
  post[:modificationAmount] = amount
314
328
  end
315
329
 
316
- def add_payment(post, payment)
330
+ def add_payment(post, payment, options)
317
331
  if payment.is_a?(String)
318
332
  _, _, recurring_detail_reference = payment.split('#')
319
333
  post[:selectedRecurringDetailReference] = recurring_detail_reference
320
- add_recurring_contract(post, options)
334
+ options[:recurring_contract_type] ||= 'RECURRING'
321
335
  else
322
336
  add_mpi_data_for_network_tokenization_card(post, payment) if payment.is_a?(NetworkTokenizationCreditCard)
323
337
  add_card(post, payment)
@@ -341,6 +355,7 @@ module ActiveMerchant #:nodoc:
341
355
 
342
356
  def capture_options(options)
343
357
  return options.merge(idempotency_key: "#{options[:idempotency_key]}-cap") if options[:idempotency_key]
358
+
344
359
  options
345
360
  end
346
361
 
@@ -367,8 +382,10 @@ module ActiveMerchant #:nodoc:
367
382
  end
368
383
 
369
384
  def add_recurring_contract(post, options = {})
385
+ return unless options[:recurring_contract_type]
386
+
370
387
  recurring = {
371
- contract: 'RECURRING'
388
+ contract: options[:recurring_contract_type]
372
389
  }
373
390
 
374
391
  post[:recurring] = recurring
@@ -396,6 +413,7 @@ module ActiveMerchant #:nodoc:
396
413
  end
397
414
  else
398
415
  return unless options[:execute_threed] || options[:threed_dynamic]
416
+
399
417
  post[:browserInfo] = { userAgent: options[:user_agent], acceptHeader: options[:accept_header] }
400
418
  post[:additionalData] = { executeThreeD: 'true' } if options[:execute_threed]
401
419
  end
@@ -424,7 +442,7 @@ module ActiveMerchant #:nodoc:
424
442
  def add_3ds2_authenticated_data(post, options)
425
443
  three_d_secure_options = options[:three_d_secure]
426
444
  # If the transaction was authenticated in a frictionless flow, send the transStatus from the ARes.
427
- if(three_d_secure_options[:authentication_response_status].nil?)
445
+ if three_d_secure_options[:authentication_response_status].nil?
428
446
  authentication_response = three_d_secure_options[:directory_response_status]
429
447
  else
430
448
  authentication_response = three_d_secure_options[:authentication_response_status]
@@ -441,6 +459,7 @@ module ActiveMerchant #:nodoc:
441
459
 
442
460
  def parse(body)
443
461
  return {} if body.blank?
462
+
444
463
  JSON.parse(body)
445
464
  end
446
465
 
@@ -511,6 +530,8 @@ module ActiveMerchant #:nodoc:
511
530
  response['response'] == 'Authorised' || response['response'] == '[adjustAuthorisation-received]'
512
531
  when 'storeToken'
513
532
  response['result'] == 'Success'
533
+ when 'disable'
534
+ response['response'] == '[detail-successfully-disabled]'
514
535
  else
515
536
  false
516
537
  end
@@ -518,6 +539,7 @@ module ActiveMerchant #:nodoc:
518
539
 
519
540
  def message_from(action, response)
520
541
  return authorize_message_from(response) if action.to_s == 'authorise' || action.to_s == 'authorise3d'
542
+
521
543
  response['response'] || response['message'] || response['result']
522
544
  end
523
545
 
@@ -555,6 +577,7 @@ module ActiveMerchant #:nodoc:
555
577
 
556
578
  def add_browser_info(browser_info, post)
557
579
  return unless browser_info
580
+
558
581
  post[:browserInfo] = {
559
582
  acceptHeader: browser_info[:accept_header],
560
583
  colorDepth: browser_info[:depth],
@@ -141,7 +141,8 @@ module ActiveMerchant #:nodoc:
141
141
  raw_response = ssl_post(url(action), post.to_json, headers)
142
142
  response = parse(raw_response)
143
143
  rescue ResponseError => e
144
- raise unless(e.response.code.to_s =~ /4\d\d/)
144
+ raise unless e.response.code.to_s =~ /4\d\d/
145
+
145
146
  response = parse(e.response.body)
146
147
  end
147
148
 
@@ -199,7 +200,6 @@ module ActiveMerchant #:nodoc:
199
200
  response['message'] || 'Unable to read error message'
200
201
  end
201
202
  end
202
-
203
203
  end
204
204
  end
205
205
  end
@@ -8,7 +8,7 @@ module ActiveMerchant
8
8
  self.test_url = 'https://apitest.authorize.net/xml/v1/request.api'
9
9
  self.live_url = 'https://api2.authorize.net/xml/v1/request.api'
10
10
 
11
- self.supported_countries = %w(AD AT AU BE BG CA CH CY CZ DE DK EE ES FI FR GB GI GR HU IE IL IS IT LI LT LU LV MC MT NL NO PL PT RO SE SI SK SM TR US VA)
11
+ self.supported_countries = %w(AU CA US)
12
12
  self.default_currency = 'USD'
13
13
  self.money_format = :dollars
14
14
  self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb, :maestro]
@@ -390,6 +390,7 @@ module ActiveMerchant
390
390
 
391
391
  def add_payment_source(xml, source, options, action = nil)
392
392
  return unless source
393
+
393
394
  if source.is_a?(String)
394
395
  add_token_payment_method(xml, source, options)
395
396
  elsif card_brand(source) == 'check'
@@ -517,6 +518,7 @@ module ActiveMerchant
517
518
 
518
519
  def add_market_type_device_type(xml, payment, options)
519
520
  return if payment.is_a?(String) || card_brand(payment) == 'check' || card_brand(payment) == 'apple_pay'
521
+
520
522
  if valid_track_data
521
523
  xml.retail do
522
524
  xml.marketType(options[:market_type] || MARKET_TYPE[:retail])
@@ -841,17 +843,17 @@ module ActiveMerchant
841
843
 
842
844
  response = {action: action}
843
845
 
844
- response[:response_code] = if(element = doc.at_xpath('//transactionResponse/responseCode'))
846
+ response[:response_code] = if (element = doc.at_xpath('//transactionResponse/responseCode'))
845
847
  empty?(element.content) ? nil : element.content.to_i
846
848
  end
847
849
 
848
- if(element = doc.at_xpath('//errors/error'))
850
+ if (element = doc.at_xpath('//errors/error'))
849
851
  response[:response_reason_code] = element.at_xpath('errorCode').content[/0*(\d+)$/, 1]
850
852
  response[:response_reason_text] = element.at_xpath('errorText').content.chomp('.')
851
- elsif(element = doc.at_xpath('//transactionResponse/messages/message'))
853
+ elsif (element = doc.at_xpath('//transactionResponse/messages/message'))
852
854
  response[:response_reason_code] = element.at_xpath('code').content[/0*(\d+)$/, 1]
853
855
  response[:response_reason_text] = element.at_xpath('description').content.chomp('.')
854
- elsif(element = doc.at_xpath('//messages/message'))
856
+ elsif (element = doc.at_xpath('//messages/message'))
855
857
  response[:response_reason_code] = element.at_xpath('code').content[/0*(\d+)$/, 1]
856
858
  response[:response_reason_text] = element.at_xpath('text').content.chomp('.')
857
859
  else
@@ -860,7 +862,7 @@ module ActiveMerchant
860
862
  end
861
863
 
862
864
  response[:avs_result_code] =
863
- if(element = doc.at_xpath('//avsResultCode'))
865
+ if (element = doc.at_xpath('//avsResultCode'))
864
866
  empty?(element.content) ? nil : element.content
865
867
  end
866
868
 
@@ -960,7 +962,7 @@ module ActiveMerchant
960
962
  if response[:response_code] == DECLINED
961
963
  if CARD_CODE_ERRORS.include?(cvv_result.code)
962
964
  return cvv_result.message
963
- elsif(AVS_REASON_CODES.include?(response[:response_reason_code]) && AVS_ERRORS.include?(avs_result.code))
965
+ elsif AVS_REASON_CODES.include?(response[:response_reason_code]) && AVS_ERRORS.include?(avs_result.code)
964
966
  return avs_result.message
965
967
  end
966
968
  end
@@ -1007,7 +1009,7 @@ module ActiveMerchant
1007
1009
  end
1008
1010
 
1009
1011
  def parse_direct_response_elements(response, options)
1010
- params = response[:direct_response]
1012
+ params = response[:direct_response]&.tr('"', '')
1011
1013
  return {} unless params
1012
1014
 
1013
1015
  parts = params.split(options[:delimiter] || ',')
@@ -1059,7 +1061,6 @@ module ActiveMerchant
1059
1061
  balance_on_card: parts[54] || '',
1060
1062
  }
1061
1063
  end
1062
-
1063
1064
  end
1064
1065
  end
1065
1066
  end