activemerchant 1.86.0 → 1.87.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 (164) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +22 -0
  3. data/lib/active_merchant/billing/avs_result.rb +0 -1
  4. data/lib/active_merchant/billing/check.rb +1 -1
  5. data/lib/active_merchant/billing/compatibility.rb +3 -3
  6. data/lib/active_merchant/billing/credit_card.rb +1 -1
  7. data/lib/active_merchant/billing/credit_card_formatting.rb +3 -3
  8. data/lib/active_merchant/billing/credit_card_methods.rb +6 -4
  9. data/lib/active_merchant/billing/gateway.rb +9 -9
  10. data/lib/active_merchant/billing/gateways/adyen.rb +48 -7
  11. data/lib/active_merchant/billing/gateways/allied_wallet.rb +1 -1
  12. data/lib/active_merchant/billing/gateways/authorize_net.rb +8 -8
  13. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +1 -1
  14. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +15 -15
  15. data/lib/active_merchant/billing/gateways/axcessms.rb +2 -2
  16. data/lib/active_merchant/billing/gateways/balanced.rb +11 -11
  17. data/lib/active_merchant/billing/gateways/bank_frick.rb +1 -1
  18. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +5 -5
  19. data/lib/active_merchant/billing/gateways/beanstream.rb +3 -2
  20. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +5 -5
  21. data/lib/active_merchant/billing/gateways/blue_pay.rb +5 -5
  22. data/lib/active_merchant/billing/gateways/blue_snap.rb +5 -5
  23. data/lib/active_merchant/billing/gateways/bogus.rb +3 -3
  24. data/lib/active_merchant/billing/gateways/borgun.rb +5 -6
  25. data/lib/active_merchant/billing/gateways/braintree_blue.rb +18 -12
  26. data/lib/active_merchant/billing/gateways/bridge_pay.rb +1 -1
  27. data/lib/active_merchant/billing/gateways/cams.rb +12 -12
  28. data/lib/active_merchant/billing/gateways/card_stream.rb +9 -9
  29. data/lib/active_merchant/billing/gateways/cardknox.rb +4 -4
  30. data/lib/active_merchant/billing/gateways/cardprocess.rb +1 -1
  31. data/lib/active_merchant/billing/gateways/cashnet.rb +2 -2
  32. data/lib/active_merchant/billing/gateways/cc5.rb +2 -2
  33. data/lib/active_merchant/billing/gateways/cenpos.rb +2 -2
  34. data/lib/active_merchant/billing/gateways/checkout.rb +1 -1
  35. data/lib/active_merchant/billing/gateways/clearhaus.rb +12 -12
  36. data/lib/active_merchant/billing/gateways/commercegate.rb +3 -3
  37. data/lib/active_merchant/billing/gateways/creditcall.rb +2 -2
  38. data/lib/active_merchant/billing/gateways/credorax.rb +13 -3
  39. data/lib/active_merchant/billing/gateways/ct_payment.rb +6 -6
  40. data/lib/active_merchant/billing/gateways/culqi.rb +1 -1
  41. data/lib/active_merchant/billing/gateways/cyber_source.rb +8 -8
  42. data/lib/active_merchant/billing/gateways/data_cash.rb +2 -2
  43. data/lib/active_merchant/billing/gateways/dibs.rb +2 -2
  44. data/lib/active_merchant/billing/gateways/digitzs.rb +5 -5
  45. data/lib/active_merchant/billing/gateways/ebanx.rb +1 -1
  46. data/lib/active_merchant/billing/gateways/efsnet.rb +4 -4
  47. data/lib/active_merchant/billing/gateways/elavon.rb +3 -3
  48. data/lib/active_merchant/billing/gateways/element.rb +4 -4
  49. data/lib/active_merchant/billing/gateways/epay.rb +1 -1
  50. data/lib/active_merchant/billing/gateways/eway.rb +2 -2
  51. data/lib/active_merchant/billing/gateways/eway_managed.rb +5 -5
  52. data/lib/active_merchant/billing/gateways/eway_rapid.rb +1 -1
  53. data/lib/active_merchant/billing/gateways/exact.rb +1 -1
  54. data/lib/active_merchant/billing/gateways/federated_canada.rb +1 -1
  55. data/lib/active_merchant/billing/gateways/first_giving.rb +1 -1
  56. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +7 -7
  57. data/lib/active_merchant/billing/gateways/flo2cash.rb +2 -2
  58. data/lib/active_merchant/billing/gateways/forte.rb +11 -7
  59. data/lib/active_merchant/billing/gateways/garanti.rb +5 -5
  60. data/lib/active_merchant/billing/gateways/global_collect.rb +2 -3
  61. data/lib/active_merchant/billing/gateways/hdfc.rb +2 -2
  62. data/lib/active_merchant/billing/gateways/hps.rb +3 -3
  63. data/lib/active_merchant/billing/gateways/inspire.rb +7 -7
  64. data/lib/active_merchant/billing/gateways/iridium.rb +14 -14
  65. data/lib/active_merchant/billing/gateways/itransact.rb +4 -4
  66. data/lib/active_merchant/billing/gateways/iveri.rb +3 -3
  67. data/lib/active_merchant/billing/gateways/jetpay.rb +2 -2
  68. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +2 -2
  69. data/lib/active_merchant/billing/gateways/latitude19.rb +1 -1
  70. data/lib/active_merchant/billing/gateways/linkpoint.rb +3 -3
  71. data/lib/active_merchant/billing/gateways/litle.rb +2 -2
  72. data/lib/active_merchant/billing/gateways/maxipago.rb +1 -1
  73. data/lib/active_merchant/billing/gateways/mercado_pago.rb +7 -13
  74. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +3 -3
  75. data/lib/active_merchant/billing/gateways/merchant_one.rb +4 -4
  76. data/lib/active_merchant/billing/gateways/merchant_partners.rb +1 -1
  77. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +3 -3
  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 +1 -1
  81. data/lib/active_merchant/billing/gateways/migs.rb +4 -6
  82. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +2 -2
  83. data/lib/active_merchant/billing/gateways/moneris.rb +85 -56
  84. data/lib/active_merchant/billing/gateways/moneris_us.rb +9 -9
  85. data/lib/active_merchant/billing/gateways/money_movers.rb +1 -1
  86. data/lib/active_merchant/billing/gateways/mundipagg.rb +1 -1
  87. data/lib/active_merchant/billing/gateways/nab_transact.rb +1 -1
  88. data/lib/active_merchant/billing/gateways/net_registry.rb +2 -2
  89. data/lib/active_merchant/billing/gateways/netaxept.rb +6 -6
  90. data/lib/active_merchant/billing/gateways/netbanx.rb +36 -36
  91. data/lib/active_merchant/billing/gateways/netbilling.rb +2 -2
  92. data/lib/active_merchant/billing/gateways/netpay.rb +1 -1
  93. data/lib/active_merchant/billing/gateways/nmi.rb +2 -2
  94. data/lib/active_merchant/billing/gateways/ogone.rb +7 -7
  95. data/lib/active_merchant/billing/gateways/omise.rb +6 -6
  96. data/lib/active_merchant/billing/gateways/opp.rb +1 -1
  97. data/lib/active_merchant/billing/gateways/optimal_payment.rb +5 -0
  98. data/lib/active_merchant/billing/gateways/orbital.rb +9 -7
  99. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +6 -6
  100. data/lib/active_merchant/billing/gateways/pagarme.rb +1 -1
  101. data/lib/active_merchant/billing/gateways/pay_conex.rb +1 -1
  102. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +8 -5
  103. data/lib/active_merchant/billing/gateways/pay_hub.rb +2 -2
  104. data/lib/active_merchant/billing/gateways/pay_junction.rb +2 -2
  105. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +2 -2
  106. data/lib/active_merchant/billing/gateways/pay_secure.rb +3 -3
  107. data/lib/active_merchant/billing/gateways/paybox_direct.rb +8 -8
  108. data/lib/active_merchant/billing/gateways/payeezy.rb +1 -1
  109. data/lib/active_merchant/billing/gateways/payex.rb +8 -8
  110. data/lib/active_merchant/billing/gateways/payflow.rb +13 -13
  111. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +4 -4
  112. data/lib/active_merchant/billing/gateways/payflow_express.rb +1 -1
  113. data/lib/active_merchant/billing/gateways/payment_express.rb +10 -10
  114. data/lib/active_merchant/billing/gateways/paymentez.rb +3 -0
  115. data/lib/active_merchant/billing/gateways/paymill.rb +4 -4
  116. data/lib/active_merchant/billing/gateways/payscout.rb +1 -1
  117. data/lib/active_merchant/billing/gateways/paystation.rb +1 -1
  118. data/lib/active_merchant/billing/gateways/payu_in.rb +3 -3
  119. data/lib/active_merchant/billing/gateways/payu_latam.rb +1 -1
  120. data/lib/active_merchant/billing/gateways/payway.rb +2 -2
  121. data/lib/active_merchant/billing/gateways/plugnpay.rb +2 -2
  122. data/lib/active_merchant/billing/gateways/pro_pay.rb +2 -2
  123. data/lib/active_merchant/billing/gateways/psigate.rb +1 -1
  124. data/lib/active_merchant/billing/gateways/psl_card.rb +3 -3
  125. data/lib/active_merchant/billing/gateways/qbms.rb +1 -1
  126. data/lib/active_merchant/billing/gateways/quantum.rb +7 -7
  127. data/lib/active_merchant/billing/gateways/quickbooks.rb +6 -6
  128. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +1 -1
  129. data/lib/active_merchant/billing/gateways/qvalent.rb +2 -2
  130. data/lib/active_merchant/billing/gateways/realex.rb +33 -13
  131. data/lib/active_merchant/billing/gateways/redsys.rb +2 -2
  132. data/lib/active_merchant/billing/gateways/safe_charge.rb +2 -2
  133. data/lib/active_merchant/billing/gateways/sage.rb +6 -6
  134. data/lib/active_merchant/billing/gateways/sage_pay.rb +7 -7
  135. data/lib/active_merchant/billing/gateways/secure_net.rb +1 -1
  136. data/lib/active_merchant/billing/gateways/secure_pay.rb +2 -2
  137. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +1 -1
  138. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +1 -1
  139. data/lib/active_merchant/billing/gateways/skip_jack.rb +5 -6
  140. data/lib/active_merchant/billing/gateways/smart_ps.rb +7 -7
  141. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +1 -1
  142. data/lib/active_merchant/billing/gateways/stripe.rb +5 -5
  143. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +2 -2
  144. data/lib/active_merchant/billing/gateways/telr.rb +1 -1
  145. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +2 -2
  146. data/lib/active_merchant/billing/gateways/transact_pro.rb +5 -5
  147. data/lib/active_merchant/billing/gateways/transax.rb +1 -1
  148. data/lib/active_merchant/billing/gateways/trust_commerce.rb +7 -7
  149. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +17 -16
  150. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +2 -2
  151. data/lib/active_merchant/billing/gateways/vanco.rb +2 -2
  152. data/lib/active_merchant/billing/gateways/verifi.rb +1 -1
  153. data/lib/active_merchant/billing/gateways/viaklix.rb +4 -4
  154. data/lib/active_merchant/billing/gateways/visanet_peru.rb +4 -4
  155. data/lib/active_merchant/billing/gateways/wirecard.rb +2 -2
  156. data/lib/active_merchant/billing/gateways/worldpay.rb +24 -13
  157. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +2 -2
  158. data/lib/active_merchant/billing/response.rb +7 -7
  159. data/lib/active_merchant/country.rb +4 -4
  160. data/lib/active_merchant/network_connection_retries.rb +7 -9
  161. data/lib/active_merchant/version.rb +1 -1
  162. data/lib/support/gateway_support.rb +3 -3
  163. data/lib/support/ssl_verify.rb +1 -1
  164. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8651e675cc5726ec8424c3023a81307c0d03f66b
4
- data.tar.gz: cc00a987adb4cbcd89ac106d07e8cd86d7046052
2
+ SHA256:
3
+ metadata.gz: 6c6735efd6b43a6792c15f372218c58388a7481e907f221b8ca401dcee3c9fc2
4
+ data.tar.gz: eaecbc6f7dfcae07746717eb79208ec5911f80bd15d73ed859fab38164f08d63
5
5
  SHA512:
6
- metadata.gz: 53533aee5d0cb713eb89cdf53ac2d7e71f5ffa0e0ff46a06a6d69effd36e54f76f7f4e18acda564b7392963c586388e55df8e8fdf8f65bb36d090917b3d32df5
7
- data.tar.gz: 815a578f9421bb5b5c316c9ee79bf8043dd20cea4fabf8e19885587bf07b9418d2944b218b121b32cbc6ac481a52635ae2c22e6e66a7399b77e1cef90789f117
6
+ metadata.gz: 5c37662376465c08da0eafa7ca7a801efb37316b254ac81c234b52c6e780b204763b2c0fdef035a38a6a28e6b5377e2d384e621770719a7497f8e27a008518ca
7
+ data.tar.gz: 4d8ff4e910d7b93c9f21476be94acdcf25123db575c39614303a5b10ee7c5bf50b050ea1b7c1cb4e6a158c909f76bd82b83327904b8fd7b73f1093ad138e6d19
data/CHANGELOG CHANGED
@@ -1,6 +1,28 @@
1
1
  = ActiveMerchant CHANGELOG
2
2
 
3
3
  == HEAD
4
+ * Barclaycard Smartpay: Improves Error Handling [deedeelavinder] #3026
5
+ * Braintree: Fix passing phone-only billing address [curiousepic] #3025
6
+ * Litle: Capitalize check account type [curiousepic] #3028
7
+ * Braintree: Account for nil billing address fields [curiousepic] #3029
8
+ * Realex: Add verify [kheang] #3030
9
+ * Braintree: Actually account for nil address fields [curiousepic] #3032
10
+ * Mercado Pago: do not infer card type [bpollack] #3038
11
+ * Credorax: allow sending submerchant ID (h3 parameter) [bpollack] #3040
12
+ * Worldpay: Pass stored credential option fields [curiousepic] #3041
13
+ * Make behavior of nil CC numbers more consistent [guaguasi] #3010
14
+ * Moneris: Adds Credential on File logic [deedeelavinder] #3042
15
+ * Adyen: Return AVS and CVC Result [nfarve] #3044
16
+ * Paymentez: Supports phone field, does not send if empty [molbrown] #3043
17
+ * Braintree: Account for nil address with existing customer [curiousepic] #3047
18
+ * Optimal Payment: Add verify capabilities #3052
19
+ * Moneris: Allows cof_enabled gateway to process non-cof transactions [deedeelavinder] #3051
20
+ * Cenpos: update supported countries [bpollack] #3055
21
+ * CyberSource: update supported countries [bpollack] #3055
22
+ * MiGS: update supported countries [bpollack] #3055
23
+ * Clearhaus: update submission data format [bpollack] #3053
24
+ * Forte: Allow void on capture #3059
25
+
4
26
  == Version 1.86.0 (October 26, 2018)
5
27
  * UsaEpayTransaction: Support UMcheckformat option for echecks [dtykocki] #3002
6
28
  * Global Collect: handle internal server errors [molbrown] #3005
@@ -1,4 +1,3 @@
1
- #!ruby19
2
1
  # encoding: utf-8
3
2
 
4
3
  module ActiveMerchant
@@ -59,7 +59,7 @@ module ActiveMerchant #:nodoc:
59
59
  # (3(d1 + d4 + d7) + 7(d2 + d5 + d8) + 1(d3 + d6 + d9))mod 10 = 0
60
60
  # See http://en.wikipedia.org/wiki/Routing_transit_number#Internal_checksums
61
61
  def valid_routing_number?
62
- digits = routing_number.to_s.split('').map(&:to_i).select{|d| (0..9).include?(d)}
62
+ digits = routing_number.to_s.split('').map(&:to_i).select { |d| (0..9).cover?(d) }
63
63
  case digits.size
64
64
  when 9
65
65
  checksum = ((3 * (digits[0] + digits[3] + digits[6])) +
@@ -61,7 +61,7 @@ module ActiveMerchant
61
61
 
62
62
  class Errors < Hash
63
63
  def initialize
64
- super(){|h, k| h[k] = []}
64
+ super() { |h, k| h[k] = [] }
65
65
  end
66
66
 
67
67
  alias count size
@@ -75,7 +75,7 @@ module ActiveMerchant
75
75
  end
76
76
 
77
77
  def empty?
78
- all?{|k, v| v&.empty?}
78
+ all? { |k, v| v&.empty? }
79
79
  end
80
80
 
81
81
  def on(field)
@@ -91,7 +91,7 @@ module ActiveMerchant
91
91
  end
92
92
 
93
93
  def each_full
94
- full_messages.each{|msg| yield msg}
94
+ full_messages.each { |msg| yield msg }
95
95
  end
96
96
 
97
97
  def full_messages
@@ -388,7 +388,7 @@ module ActiveMerchant #:nodoc:
388
388
  private
389
389
 
390
390
  def month_days
391
- mdays = [nil,31,28,31,30,31,30,31,31,30,31,30,31]
391
+ mdays = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
392
392
  mdays[2] = 29 if Date.leap?(year)
393
393
  mdays[month]
394
394
  end
@@ -13,9 +13,9 @@ module ActiveMerchant #:nodoc:
13
13
  return '' if number.blank?
14
14
 
15
15
  case option
16
- when :two_digits then sprintf('%.2i', number.to_i)[-2..-1]
17
- when :four_digits then sprintf('%.4i', number.to_i)[-4..-1]
18
- else number
16
+ when :two_digits then sprintf('%.2i', number.to_i)[-2..-1]
17
+ when :four_digits then sprintf('%.4i', number.to_i)[-4..-1]
18
+ else number
19
19
  end
20
20
  end
21
21
  end
@@ -10,7 +10,7 @@ module ActiveMerchant #:nodoc:
10
10
  'diners_club' => ->(num) { num =~ /^3(0[0-5]|[68]\d)\d{11}$/ },
11
11
  'jcb' => ->(num) { num =~ /^35(28|29|[3-8]\d)\d{12}$/ },
12
12
  'dankort' => ->(num) { num =~ /^5019\d{12}$/ },
13
- 'maestro' => ->(num) { (12..19).include?(num&.size) && in_bin_range?(num.slice(0, 6), MAESTRO_RANGES) },
13
+ 'maestro' => ->(num) { (12..19).cover?(num&.size) && in_bin_range?(num.slice(0, 6), MAESTRO_RANGES) },
14
14
  'forbrugsforeningen' => ->(num) { num =~ /^600722\d{10}$/ },
15
15
  'sodexo' => ->(num) { num =~ /^(606071|603389|606070|606069|606068|600818)\d{8}$/ },
16
16
  'vr' => ->(num) { num =~ /^(627416|637036)\d{8}$/ },
@@ -86,7 +86,7 @@ module ActiveMerchant #:nodoc:
86
86
  end
87
87
 
88
88
  def valid_expiry_year?(year)
89
- (Time.now.year..Time.now.year + 20).include?(year.to_i)
89
+ (Time.now.year..Time.now.year + 20).cover?(year.to_i)
90
90
  end
91
91
 
92
92
  def valid_start_year?(year)
@@ -160,7 +160,7 @@ module ActiveMerchant #:nodoc:
160
160
  end
161
161
 
162
162
  def electron?(number)
163
- return false unless [16, 19].include?(number.length)
163
+ return false unless [16, 19].include?(number&.length)
164
164
 
165
165
  # don't recalculate for each range
166
166
  bank_identification_number = first_digits(number).to_i
@@ -176,7 +176,7 @@ module ActiveMerchant #:nodoc:
176
176
  end
177
177
 
178
178
  def first_digits(number)
179
- number.slice(0,6)
179
+ number&.slice(0, 6) || ''
180
180
  end
181
181
 
182
182
  def last_digits(number)
@@ -201,10 +201,12 @@ module ActiveMerchant #:nodoc:
201
201
  private
202
202
 
203
203
  def valid_card_number_length?(number) #:nodoc:
204
+ return false if number.nil?
204
205
  number.length >= 12
205
206
  end
206
207
 
207
208
  def valid_card_number_characters?(number) #:nodoc:
209
+ return false if number.nil?
208
210
  !number.match(/\D/)
209
211
  end
210
212
 
@@ -204,11 +204,11 @@ module ActiveMerchant #:nodoc:
204
204
 
205
205
  def normalize(field)
206
206
  case field
207
- when 'true' then true
208
- when 'false' then false
209
- when '' then nil
210
- when 'null' then nil
211
- else field
207
+ when 'true' then true
208
+ when 'false' then false
209
+ when '' then nil
210
+ when 'null' then nil
211
+ else field
212
212
  end
213
213
  end
214
214
 
@@ -241,10 +241,10 @@ module ActiveMerchant #:nodoc:
241
241
  def amount(money)
242
242
  return nil if money.nil?
243
243
  cents = if money.respond_to?(:cents)
244
- 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'
245
- money.cents
246
- else
247
- money
244
+ 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'
245
+ money.cents
246
+ else
247
+ money
248
248
  end
249
249
 
250
250
  if money.is_a?(String)
@@ -7,7 +7,7 @@ module ActiveMerchant #:nodoc:
7
7
  self.test_url = 'https://pal-test.adyen.com/pal/servlet/Payment/v18'
8
8
  self.live_url = 'https://pal-live.adyen.com/pal/servlet/Payment/v18'
9
9
 
10
- self.supported_countries = ['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']
10
+ self.supported_countries = ['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
11
  self.default_currency = 'USD'
12
12
  self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :jcb, :dankort, :maestro, :discover]
13
13
 
@@ -34,8 +34,8 @@ module ActiveMerchant #:nodoc:
34
34
 
35
35
  def purchase(money, payment, options={})
36
36
  MultiResponse.run do |r|
37
- r.process{authorize(money, payment, options)}
38
- r.process{capture(money, r.authorization, options)}
37
+ r.process { authorize(money, payment, options) }
38
+ r.process { capture(money, r.authorization, options) }
39
39
  end
40
40
  end
41
41
 
@@ -103,6 +103,38 @@ module ActiveMerchant #:nodoc:
103
103
 
104
104
  private
105
105
 
106
+ AVS_MAPPING = {
107
+ '0' => 'R', # Unknown
108
+ '1' => 'A', # Address matches, postal code doesn't
109
+ '2' => 'N', # Neither postal code nor address match
110
+ '3' => 'R', # AVS unavailable
111
+ '4' => 'E', # AVS not supported for this card type
112
+ '5' => 'U', # No AVS data provided
113
+ '6' => 'Z', # Postal code matches, address doesn't match
114
+ '7' => 'D', # Both postal code and address match
115
+ '8' => 'U', # Address not checked, postal code unknown
116
+ '9' => 'B', # Address matches, postal code unknown
117
+ '10' => 'N', # Address doesn't match, postal code unknown
118
+ '11' => 'U', # Postal code not checked, address unknown
119
+ '12' => 'B', # Address matches, postal code not checked
120
+ '13' => 'U', # Address doesn't match, postal code not checked
121
+ '14' => 'P', # Postal code matches, address unknown
122
+ '15' => 'P', # Postal code matches, address not checked
123
+ '16' => 'N', # Postal code doesn't match, address unknown
124
+ '17' => 'U', # Postal code doesn't match, address not checked
125
+ '18' => 'I' # Neither postal code nor address were checked
126
+ }
127
+
128
+ CVC_MAPPING = {
129
+ '0' => 'P', # Unknown
130
+ '1' => 'M', # Matches
131
+ '2' => 'N', # Does not match
132
+ '3' => 'P', # Not checked
133
+ '4' => 'S', # No CVC/CVV provided, but was required
134
+ '5' => 'U', # Issuer not certifed by CVC/CVV
135
+ '6' => 'P' # No CVC/CVV provided
136
+ }
137
+
106
138
  NETWORK_TOKENIZATION_CARD_SOURCE = {
107
139
  'apple_pay' => 'applepay',
108
140
  'android_pay' => 'androidpay',
@@ -184,7 +216,7 @@ module ActiveMerchant #:nodoc:
184
216
  cvc: credit_card.verification_value
185
217
  }
186
218
 
187
- card.delete_if{|k,v| v.blank? }
219
+ card.delete_if { |k, v| v.blank? }
188
220
  card[:holderName] ||= 'Not Provided' if credit_card.is_a?(NetworkTokenizationCreditCard)
189
221
  requires!(card, :expiryMonth, :expiryYear, :holderName, :number)
190
222
  post[:card] = card
@@ -233,13 +265,12 @@ module ActiveMerchant #:nodoc:
233
265
 
234
266
  def commit(action, parameters)
235
267
  begin
236
- raw_response = ssl_post("#{url}/#{action.to_s}", post_data(action, parameters), request_headers)
268
+ raw_response = ssl_post("#{url}/#{action}", post_data(action, parameters), request_headers)
237
269
  response = parse(raw_response)
238
270
  rescue ResponseError => e
239
271
  raw_response = e.response.body
240
272
  response = parse(raw_response)
241
273
  end
242
-
243
274
  success = success_from(action, response)
244
275
  Response.new(
245
276
  success,
@@ -247,10 +278,20 @@ module ActiveMerchant #:nodoc:
247
278
  response,
248
279
  authorization: authorization_from(action, parameters, response),
249
280
  test: test?,
250
- error_code: success ? nil : error_code_from(response)
281
+ error_code: success ? nil : error_code_from(response),
282
+ avs_result: AVSResult.new(:code => avs_code_from(response)),
283
+ cvv_result: CVVResult.new(cvv_result_from(response))
251
284
  )
252
285
  end
253
286
 
287
+ def avs_code_from(response)
288
+ AVS_MAPPING[response['additionalData']['avsResult'][0..1].strip] if response.dig('additionalData', 'avsResult')
289
+ end
290
+
291
+ def cvv_result_from(response)
292
+ CVC_MAPPING[response['additionalData']['cvcResult'][0]] if response.dig('additionalData', 'cvcResult')
293
+ end
294
+
254
295
  def url
255
296
  if test?
256
297
  test_url
@@ -182,7 +182,7 @@ module ActiveMerchant #:nodoc:
182
182
 
183
183
  def parse_element(response, node)
184
184
  if node.has_elements?
185
- node.elements.each{|element| parse_element(response, element) }
185
+ node.elements.each { |element| parse_element(response, element) }
186
186
  else
187
187
  response[node.name.underscore.to_sym] = node.text
188
188
  end
@@ -133,9 +133,9 @@ module ActiveMerchant
133
133
 
134
134
  def refund(amount, authorization, options={})
135
135
  response = if auth_was_for_cim?(authorization)
136
- cim_refund(amount, authorization, options)
137
- else
138
- normal_refund(amount, authorization, options)
136
+ cim_refund(amount, authorization, options)
137
+ else
138
+ normal_refund(amount, authorization, options)
139
139
  end
140
140
 
141
141
  return response if response.success?
@@ -199,7 +199,7 @@ module ActiveMerchant
199
199
  end
200
200
 
201
201
  def verify_credentials
202
- response = commit(:verify_credentials) { }
202
+ response = commit(:verify_credentials) {}
203
203
  response.success?
204
204
  end
205
205
 
@@ -394,7 +394,7 @@ module ActiveMerchant
394
394
  end
395
395
 
396
396
  def camel_case_lower(key)
397
- String(key).split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
397
+ String(key).split('_').inject([]) { |buffer, e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
398
398
  end
399
399
 
400
400
  def add_settings(xml, source, options)
@@ -594,9 +594,9 @@ module ActiveMerchant
594
594
 
595
595
  xml.send(root_node) do
596
596
  first_name, last_name = if address[:name]
597
- split_names(address[:name])
598
- else
599
- [address[:first_name], address[:last_name]]
597
+ split_names(address[:name])
598
+ else
599
+ [address[:first_name], address[:last_name]]
600
600
  end
601
601
  full_address = "#{address[:address1]} #{address[:address2]}".strip
602
602
 
@@ -407,7 +407,7 @@ module ActiveMerchant #:nodoc:
407
407
 
408
408
  def recurring_parse_element(response, node)
409
409
  if node.has_elements?
410
- node.elements.each{|e| recurring_parse_element(response, e) }
410
+ node.elements.each { |e| recurring_parse_element(response, e) }
411
411
  else
412
412
  response[node.name.underscore.to_sym] = node.text
413
413
  end
@@ -379,18 +379,18 @@ module ActiveMerchant #:nodoc:
379
379
  requires!(options, :transaction)
380
380
  requires!(options[:transaction], :type)
381
381
  case options[:transaction][:type]
382
- when :void
382
+ when :void
383
383
  requires!(options[:transaction], :trans_id)
384
- when :refund
384
+ when :refund
385
385
  requires!(options[:transaction], :trans_id) &&
386
386
  (
387
387
  (options[:transaction][:customer_profile_id] && options[:transaction][:customer_payment_profile_id]) ||
388
388
  options[:transaction][:credit_card_number_masked] ||
389
389
  (options[:transaction][:bank_routing_number_masked] && options[:transaction][:bank_account_number_masked])
390
390
  )
391
- when :prior_auth_capture
391
+ when :prior_auth_capture
392
392
  requires!(options[:transaction], :amount, :trans_id)
393
- else
393
+ else
394
394
  requires!(options[:transaction], :amount, :customer_profile_id, :customer_payment_profile_id)
395
395
  end
396
396
  request = build_request(:create_customer_profile_transaction, options)
@@ -614,7 +614,7 @@ module ActiveMerchant #:nodoc:
614
614
 
615
615
  def build_create_customer_profile_transaction_request(xml, options)
616
616
  options[:extra_options] ||= {}
617
- options[:extra_options].merge!('x_delim_char' => @options[:delimiter]) if @options[:delimiter]
617
+ options[:extra_options]['x_delim_char'] = @options[:delimiter] if @options[:delimiter]
618
618
 
619
619
  add_transaction(xml, options[:transaction])
620
620
  xml.tag!('extraOptions') do
@@ -665,12 +665,12 @@ module ActiveMerchant #:nodoc:
665
665
  xml.tag!(CIM_TRANSACTION_TYPES[transaction[:type]]) do
666
666
  # The amount to be billed to the customer
667
667
  case transaction[:type]
668
- when :void
669
- tag_unless_blank(xml,'customerProfileId', transaction[:customer_profile_id])
670
- tag_unless_blank(xml,'customerPaymentProfileId', transaction[:customer_payment_profile_id])
671
- tag_unless_blank(xml,'customerShippingAddressId', transaction[:customer_shipping_address_id])
668
+ when :void
669
+ tag_unless_blank(xml, 'customerProfileId', transaction[:customer_profile_id])
670
+ tag_unless_blank(xml, 'customerPaymentProfileId', transaction[:customer_payment_profile_id])
671
+ tag_unless_blank(xml, 'customerShippingAddressId', transaction[:customer_shipping_address_id])
672
672
  xml.tag!('transId', transaction[:trans_id])
673
- when :refund
673
+ when :refund
674
674
  xml.tag!('amount', transaction[:amount])
675
675
  tag_unless_blank(xml, 'customerProfileId', transaction[:customer_profile_id])
676
676
  tag_unless_blank(xml, 'customerPaymentProfileId', transaction[:customer_payment_profile_id])
@@ -683,11 +683,11 @@ module ActiveMerchant #:nodoc:
683
683
  add_tax(xml, transaction[:tax]) if transaction[:tax]
684
684
  add_duty(xml, transaction[:duty]) if transaction[:duty]
685
685
  add_shipping(xml, transaction[:shipping]) if transaction[:shipping]
686
- when :prior_auth_capture
686
+ when :prior_auth_capture
687
687
  xml.tag!('amount', transaction[:amount])
688
688
  add_order(xml, transaction[:order]) if transaction[:order].present?
689
689
  xml.tag!('transId', transaction[:trans_id])
690
- else
690
+ else
691
691
  xml.tag!('amount', transaction[:amount])
692
692
  xml.tag!('customerProfileId', transaction[:customer_profile_id])
693
693
  xml.tag!('customerPaymentProfileId', transaction[:customer_payment_profile_id])
@@ -698,7 +698,7 @@ module ActiveMerchant #:nodoc:
698
698
  if [:auth_capture, :auth_only, :capture_only].include?(transaction[:type])
699
699
  xml.tag!('recurringBilling', transaction[:recurring_billing]) if transaction.has_key?(:recurring_billing)
700
700
  end
701
- unless [:void,:refund,:prior_auth_capture].include?(transaction[:type])
701
+ unless [:void, :refund, :prior_auth_capture].include?(transaction[:type])
702
702
  tag_unless_blank(xml, 'cardCode', transaction[:card_code])
703
703
  end
704
704
  end
@@ -878,7 +878,7 @@ module ActiveMerchant #:nodoc:
878
878
  end
879
879
 
880
880
  def format_extra_options(options)
881
- options&.map{ |k, v| "#{k}=#{v}" }&.join('&')
881
+ options&.map { |k, v| "#{k}=#{v}" }&.join('&')
882
882
  end
883
883
 
884
884
  def parse_direct_response(params)
@@ -952,7 +952,7 @@ module ActiveMerchant #:nodoc:
952
952
  def parse_element(node)
953
953
  if node.has_elements?
954
954
  response = {}
955
- node.elements.each{ |e|
955
+ node.elements.each { |e|
956
956
  key = e.name.underscore
957
957
  value = parse_element(e)
958
958
  if response.has_key?(key)
@@ -94,11 +94,11 @@ module ActiveMerchant #:nodoc:
94
94
 
95
95
  def parse_element(response, node)
96
96
  if node.has_attributes?
97
- node.attributes.each{|name, value| response["#{node.name}_#{name}".underscore.to_sym] = value }
97
+ node.attributes.each { |name, value| response["#{node.name}_#{name}".underscore.to_sym] = value }
98
98
  end
99
99
 
100
100
  if node.has_elements?
101
- node.elements.each{|element| parse_element(response, element) }
101
+ node.elements.each { |element| parse_element(response, element) }
102
102
  else
103
103
  response[node.name.underscore.to_sym] = node.text
104
104
  end