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
@@ -43,12 +43,7 @@ module ActiveMerchant #:nodoc:
43
43
  xml.ssl_transaction_type self.actions[:purchase]
44
44
  xml.ssl_amount amount(money)
45
45
 
46
- if payment_method.is_a?(String)
47
- add_token(xml, payment_method)
48
- else
49
- add_creditcard(xml, payment_method)
50
- end
51
-
46
+ add_payment(xml, payment_method, options)
52
47
  add_invoice(xml, options)
53
48
  add_salestax(xml, options)
54
49
  add_currency(xml, money, options)
@@ -56,27 +51,26 @@ module ActiveMerchant #:nodoc:
56
51
  add_customer_email(xml, options)
57
52
  add_test_mode(xml, options)
58
53
  add_ip(xml, options)
59
- add_auth_purchase_params(xml, options)
54
+ add_auth_purchase_params(xml, payment_method, options)
60
55
  add_level_3_fields(xml, options) if options[:level_3_data]
61
56
  end
62
57
  commit(request)
63
58
  end
64
59
 
65
- def authorize(money, creditcard, options = {})
60
+ def authorize(money, payment_method, options = {})
66
61
  request = build_xml_request do |xml|
67
62
  xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
68
63
  xml.ssl_transaction_type self.actions[:authorize]
69
64
  xml.ssl_amount amount(money)
70
-
71
65
  add_salestax(xml, options)
72
66
  add_invoice(xml, options)
73
- add_creditcard(xml, creditcard)
67
+ add_payment(xml, payment_method, options)
74
68
  add_currency(xml, money, options)
75
69
  add_address(xml, options)
76
70
  add_customer_email(xml, options)
77
71
  add_test_mode(xml, options)
78
72
  add_ip(xml, options)
79
- add_auth_purchase_params(xml, options)
73
+ add_auth_purchase_params(xml, payment_method, options)
80
74
  add_level_3_fields(xml, options) if options[:level_3_data]
81
75
  end
82
76
  commit(request)
@@ -92,7 +86,7 @@ module ActiveMerchant #:nodoc:
92
86
  add_salestax(xml, options)
93
87
  add_approval_code(xml, authorization)
94
88
  add_invoice(xml, options)
95
- add_creditcard(xml, options[:credit_card])
89
+ add_creditcard(xml, options[:credit_card], options)
96
90
  add_currency(xml, money, options)
97
91
  add_address(xml, options)
98
92
  add_customer_email(xml, options)
@@ -139,7 +133,7 @@ module ActiveMerchant #:nodoc:
139
133
  xml.ssl_transaction_type self.actions[:credit]
140
134
  xml.ssl_amount amount(money)
141
135
  add_invoice(xml, options)
142
- add_creditcard(xml, creditcard)
136
+ add_creditcard(xml, creditcard, options)
143
137
  add_currency(xml, money, options)
144
138
  add_address(xml, options)
145
139
  add_customer_email(xml, options)
@@ -152,7 +146,7 @@ module ActiveMerchant #:nodoc:
152
146
  request = build_xml_request do |xml|
153
147
  xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
154
148
  xml.ssl_transaction_type self.actions[:verify]
155
- add_creditcard(xml, credit_card)
149
+ add_creditcard(xml, credit_card, options)
156
150
  add_address(xml, options)
157
151
  add_test_mode(xml, options)
158
152
  add_ip(xml, options)
@@ -165,7 +159,7 @@ module ActiveMerchant #:nodoc:
165
159
  xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
166
160
  xml.ssl_transaction_type self.actions[:store]
167
161
  xml.ssl_add_token 'Y'
168
- add_creditcard(xml, creditcard)
162
+ add_creditcard(xml, creditcard, options)
169
163
  add_address(xml, options)
170
164
  add_customer_email(xml, options)
171
165
  add_test_mode(xml, options)
@@ -178,8 +172,8 @@ module ActiveMerchant #:nodoc:
178
172
  request = build_xml_request do |xml|
179
173
  xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
180
174
  xml.ssl_transaction_type self.actions[:update]
181
- add_token(xml, token)
182
- add_creditcard(xml, creditcard)
175
+ xml.ssl_token token
176
+ add_creditcard(xml, creditcard, options)
183
177
  add_address(xml, options)
184
178
  add_customer_email(xml, options)
185
179
  add_test_mode(xml, options)
@@ -200,6 +194,16 @@ module ActiveMerchant #:nodoc:
200
194
 
201
195
  private
202
196
 
197
+ def add_payment(xml, payment, options)
198
+ if payment.is_a?(String) || options[:ssl_token]
199
+ xml.ssl_token options[:ssl_token] || payment
200
+ elsif payment.is_a?(NetworkTokenizationCreditCard)
201
+ add_network_token(xml, payment)
202
+ else
203
+ add_creditcard(xml, payment, options)
204
+ end
205
+ end
206
+
203
207
  def add_invoice(xml, options)
204
208
  xml.ssl_invoice_number url_encode_truncate((options[:order_id] || options[:invoice]), 25)
205
209
  xml.ssl_description url_encode_truncate(options[:description], 255)
@@ -213,11 +217,21 @@ module ActiveMerchant #:nodoc:
213
217
  xml.ssl_txn_id authorization.split(';').last
214
218
  end
215
219
 
216
- def add_creditcard(xml, creditcard)
220
+ def add_network_token(xml, payment_method)
221
+ payment = payment_method.payment_data&.gsub('=>', ':')
222
+ case payment_method.source
223
+ when :apple_pay
224
+ xml.ssl_applepay_web url_encode(payment)
225
+ when :google_pay
226
+ xml.ssl_google_pay url_encode(payment)
227
+ end
228
+ end
229
+
230
+ def add_creditcard(xml, creditcard, options)
217
231
  xml.ssl_card_number creditcard.number
218
232
  xml.ssl_exp_date expdate(creditcard)
219
233
 
220
- add_verification_value(xml, creditcard) if creditcard.verification_value?
234
+ add_verification_value(xml, creditcard, options)
221
235
 
222
236
  xml.ssl_first_name url_encode_truncate(creditcard.first_name, 20)
223
237
  xml.ssl_last_name url_encode_truncate(creditcard.last_name, 30)
@@ -230,12 +244,12 @@ module ActiveMerchant #:nodoc:
230
244
  xml.ssl_transaction_currency currency
231
245
  end
232
246
 
233
- def add_token(xml, token)
234
- xml.ssl_token token
235
- end
247
+ def add_verification_value(xml, credit_card, options)
248
+ return unless credit_card.verification_value?
249
+ # Don't add cvv if this is a non-initial stored credential transaction
250
+ return if options[:stored_credential] && !options.dig(:stored_credential, :initial_transaction) && options[:stored_cred_v2]
236
251
 
237
- def add_verification_value(xml, creditcard)
238
- xml.ssl_cvv2cvc2 creditcard.verification_value
252
+ xml.ssl_cvv2cvc2 credit_card.verification_value
239
253
  xml.ssl_cvv2cvc2_indicator 1
240
254
  end
241
255
 
@@ -294,16 +308,20 @@ module ActiveMerchant #:nodoc:
294
308
  end
295
309
 
296
310
  # add_recurring_token is a field that can be sent in to obtain a token from Elavon for use with their tokenization program
297
- def add_auth_purchase_params(xml, options)
311
+ def add_auth_purchase_params(xml, payment_method, options)
298
312
  xml.ssl_dynamic_dba options[:dba] if options.has_key?(:dba)
299
313
  xml.ssl_merchant_initiated_unscheduled merchant_initiated_unscheduled(options) if merchant_initiated_unscheduled(options)
300
314
  xml.ssl_add_token options[:add_recurring_token] if options.has_key?(:add_recurring_token)
301
- xml.ssl_token options[:ssl_token] if options[:ssl_token]
302
315
  xml.ssl_customer_code options[:customer] if options.has_key?(:customer)
303
316
  xml.ssl_customer_number options[:customer_number] if options.has_key?(:customer_number)
304
- xml.ssl_entry_mode entry_mode(options) if entry_mode(options)
317
+ xml.ssl_entry_mode entry_mode(payment_method, options) if entry_mode(payment_method, options)
305
318
  add_custom_fields(xml, options) if options[:custom_fields]
306
- add_stored_credential(xml, options) if options[:stored_credential]
319
+ if options[:stored_cred_v2]
320
+ add_stored_credential_v2(xml, payment_method, options)
321
+ add_installment_fields(xml, options)
322
+ else
323
+ add_stored_credential(xml, options)
324
+ end
307
325
  end
308
326
 
309
327
  def add_custom_fields(xml, options)
@@ -353,6 +371,8 @@ module ActiveMerchant #:nodoc:
353
371
  end
354
372
 
355
373
  def add_stored_credential(xml, options)
374
+ return unless options[:stored_credential]
375
+
356
376
  network_transaction_id = options.dig(:stored_credential, :network_transaction_id)
357
377
  case
358
378
  when network_transaction_id.nil?
@@ -368,14 +388,60 @@ module ActiveMerchant #:nodoc:
368
388
  end
369
389
  end
370
390
 
391
+ def add_stored_credential_v2(xml, payment_method, options)
392
+ return unless options[:stored_credential]
393
+
394
+ network_transaction_id = options.dig(:stored_credential, :network_transaction_id)
395
+ xml.ssl_recurring_flag recurring_flag(options) if recurring_flag(options)
396
+ xml.ssl_par_value options[:par_value] if options[:par_value]
397
+ xml.ssl_association_token_data options[:association_token_data] if options[:association_token_data]
398
+
399
+ unless payment_method.is_a?(String) || options[:ssl_token].present?
400
+ xml.ssl_approval_code options[:approval_code] if options[:approval_code]
401
+ if network_transaction_id.to_s.include?('|')
402
+ oar_data, ps2000_data = network_transaction_id.split('|')
403
+ xml.ssl_oar_data oar_data unless oar_data.blank?
404
+ xml.ssl_ps2000_data ps2000_data unless ps2000_data.blank?
405
+ elsif network_transaction_id.to_s.length > 22
406
+ xml.ssl_oar_data network_transaction_id
407
+ elsif network_transaction_id.present?
408
+ xml.ssl_ps2000_data network_transaction_id
409
+ end
410
+ end
411
+ end
412
+
413
+ def recurring_flag(options)
414
+ return unless reason = options.dig(:stored_credential, :reason_type)
415
+ return 1 if reason == 'recurring'
416
+ return 2 if reason == 'installment'
417
+ end
418
+
371
419
  def merchant_initiated_unscheduled(options)
372
420
  return options[:merchant_initiated_unscheduled] if options[:merchant_initiated_unscheduled]
373
- return 'Y' if options.dig(:stored_credential, :initiator) == 'merchant' && options.dig(:stored_credential, :reason_type) == 'unscheduled' || options.dig(:stored_credential, :reason_type) == 'recurring'
421
+ return 'Y' if options.dig(:stored_credential, :initiator) == 'merchant' && merchant_reason_type(options)
422
+ end
423
+
424
+ def merchant_reason_type(options)
425
+ if options[:stored_cred_v2]
426
+ options.dig(:stored_credential, :reason_type) == 'unscheduled'
427
+ else
428
+ options.dig(:stored_credential, :reason_type) == 'unscheduled' || options.dig(:stored_credential, :reason_type) == 'recurring'
429
+ end
430
+ end
431
+
432
+ def add_installment_fields(xml, options)
433
+ return unless options.dig(:stored_credential, :reason_type) == 'installment'
434
+
435
+ xml.ssl_payment_number options[:payment_number]
436
+ xml.ssl_payment_count options[:installments]
374
437
  end
375
438
 
376
- def entry_mode(options)
439
+ def entry_mode(payment_method, options)
377
440
  return options[:entry_mode] if options[:entry_mode]
378
- return 12 if options[:stored_credential]
441
+ return 12 if options[:stored_credential] && options[:stored_cred_v2] != true
442
+
443
+ return if payment_method.is_a?(String) || options[:ssl_token]
444
+ return 12 if options.dig(:stored_credential, :reason_type) == 'unscheduled'
379
445
  end
380
446
 
381
447
  def build_xml_request
@@ -451,8 +517,8 @@ module ActiveMerchant #:nodoc:
451
517
  if value.is_a?(String)
452
518
  encoded = CGI.escape(value)
453
519
  encoded = encoded.tr('+', ' ') # don't encode spaces
454
- encoded = encoded.gsub('%26', '%26amp;') # account for Elavon's weird '&' handling
455
- encoded
520
+ encoded.gsub('%26', '%26amp;') # account for Elavon's weird '&' handling
521
+
456
522
  else
457
523
  value.to_s
458
524
  end
@@ -37,6 +37,7 @@ module ActiveMerchant #:nodoc:
37
37
  add_transaction(xml, money, options)
38
38
  add_terminal(xml, options)
39
39
  add_address(xml, options)
40
+ add_lodging(xml, options)
40
41
  end
41
42
  end
42
43
 
@@ -51,6 +52,7 @@ module ActiveMerchant #:nodoc:
51
52
  add_transaction(xml, money, options)
52
53
  add_terminal(xml, options)
53
54
  add_address(xml, options)
55
+ add_lodging(xml, options)
54
56
  end
55
57
  end
56
58
 
@@ -222,16 +224,44 @@ module ActiveMerchant #:nodoc:
222
224
  options[:market_code] || 'Default'
223
225
  end
224
226
 
227
+ def add_lodging(xml, options)
228
+ if lodging = options[:lodging]
229
+ xml.extendedParameters do
230
+ xml.ExtendedParameters do
231
+ xml.Key 'Lodging'
232
+ xml.Value('xsi:type' => 'Lodging') do
233
+ xml.LodgingAgreementNumber lodging[:agreement_number] if lodging[:agreement_number]
234
+ xml.LodgingCheckInDate lodging[:check_in_date] if lodging[:check_in_date]
235
+ xml.LodgingCheckOutDate lodging[:check_out_date] if lodging[:check_out_date]
236
+ xml.LodgingRoomAmount lodging[:room_amount] if lodging[:room_amount]
237
+ xml.LodgingRoomTax lodging[:room_tax] if lodging[:room_tax]
238
+ xml.LodgingNoShowIndicator lodging[:no_show_indicator] if lodging[:no_show_indicator]
239
+ xml.LodgingDuration lodging[:duration] if lodging[:duration]
240
+ xml.LodgingCustomerName lodging[:customer_name] if lodging[:customer_name]
241
+ xml.LodgingClientCode lodging[:client_code] if lodging[:client_code]
242
+ xml.LodgingExtraChargesDetail lodging[:extra_charges_detail] if lodging[:extra_charges_detail]
243
+ xml.LodgingExtraChargesAmounts lodging[:extra_charges_amounts] if lodging[:extra_charges_amounts]
244
+ xml.LodgingPrestigiousPropertyCode lodging[:prestigious_property_code] if lodging[:prestigious_property_code]
245
+ xml.LodgingSpecialProgramCode lodging[:special_program_code] if lodging[:special_program_code]
246
+ xml.LodgingChargeType lodging[:charge_type] if lodging[:charge_type]
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end
252
+
225
253
  def add_terminal(xml, options)
226
254
  xml.terminal do
227
255
  xml.TerminalID options[:terminal_id] || '01'
256
+ xml.TerminalType options[:terminal_type] if options[:terminal_type]
228
257
  xml.CardPresentCode options[:card_present_code] || 'UseDefault'
229
- xml.CardholderPresentCode 'UseDefault'
230
- xml.CardInputCode 'UseDefault'
231
- xml.CVVPresenceCode 'UseDefault'
232
- xml.TerminalCapabilityCode 'UseDefault'
233
- xml.TerminalEnvironmentCode 'UseDefault'
258
+ xml.CardholderPresentCode options[:card_holder_present_code] || 'UseDefault'
259
+ xml.CardInputCode options[:card_input_code] || 'UseDefault'
260
+ xml.CVVPresenceCode options[:cvv_presence_code] || 'UseDefault'
261
+ xml.TerminalCapabilityCode options[:terminal_capability_code] || 'UseDefault'
262
+ xml.TerminalEnvironmentCode options[:terminal_environment_code] || 'UseDefault'
234
263
  xml.MotoECICode 'NonAuthenticatedSecureECommerceTransaction'
264
+ xml.PartialApprovedFlag options[:partial_approved_flag] if options[:partial_approved_flag]
235
265
  end
236
266
  end
237
267
 
@@ -240,7 +270,7 @@ module ActiveMerchant #:nodoc:
240
270
  xml.CardNumber payment.number
241
271
  xml.ExpirationMonth format(payment.month, :two_digits)
242
272
  xml.ExpirationYear format(payment.year, :two_digits)
243
- xml.CardholderName payment.first_name + ' ' + payment.last_name
273
+ xml.CardholderName "#{payment.first_name} #{payment.last_name}"
244
274
  xml.CVV payment.verification_value
245
275
  end
246
276
  end
@@ -363,7 +393,6 @@ module ActiveMerchant #:nodoc:
363
393
  xml['soap'].Envelope('xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
364
394
  'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
365
395
  'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/') do
366
-
367
396
  xml['soap'].Body do
368
397
  yield(xml)
369
398
  end
@@ -174,17 +174,21 @@ module ActiveMerchant #:nodoc:
174
174
  response = send("do_#{action}", params)
175
175
 
176
176
  if action == :authorize
177
- Response.new response['accept'].to_i == 1,
177
+ Response.new(
178
+ response['accept'].to_i == 1,
178
179
  response['errortext'],
179
180
  response,
180
181
  test: test?,
181
182
  authorization: response['tid']
183
+ )
182
184
  else
183
- Response.new response['result'] == 'true',
185
+ Response.new(
186
+ response['result'] == 'true',
184
187
  messages(response['epay'], response['pbs']),
185
188
  response,
186
189
  test: test?,
187
190
  authorization: params[:transaction]
191
+ )
188
192
  end
189
193
  end
190
194
 
@@ -279,11 +279,15 @@ module ActiveMerchant #:nodoc:
279
279
  response = parse(data)
280
280
  message = message_from(response)
281
281
 
282
- Response.new(success?(response), message, response,
282
+ Response.new(
283
+ success?(response),
284
+ message,
285
+ response,
283
286
  test: test?,
284
287
  authorization: response['transactionid'],
285
288
  avs_result: { code: response['avsresponse'] },
286
- cvv_result: response['cvvresponse'])
289
+ cvv_result: response['cvvresponse']
290
+ )
287
291
  end
288
292
 
289
293
  def message_from(response)
@@ -111,11 +111,13 @@ module ActiveMerchant #:nodoc:
111
111
  raw_response = ssl_post(url, post_data(parameters))
112
112
  response = parse(raw_response)
113
113
 
114
- Response.new(success?(response),
114
+ Response.new(
115
+ success?(response),
115
116
  message_from(response[:ewaytrxnerror]),
116
117
  response,
117
118
  authorization: response[:ewaytrxnnumber],
118
- test: test?)
119
+ test: test?
120
+ )
119
121
  end
120
122
 
121
123
  def success?(response)
@@ -222,9 +222,13 @@ module ActiveMerchant #:nodoc:
222
222
  end
223
223
  response = parse(raw)
224
224
 
225
- EwayResponse.new(response[:success], response[:message], response,
225
+ EwayResponse.new(
226
+ response[:success],
227
+ response[:message],
228
+ response,
226
229
  test: test?,
227
- authorization: response[:auth_code])
230
+ authorization: response[:auth_code]
231
+ )
228
232
  end
229
233
 
230
234
  # Where we build the full SOAP 1.2 request using builder
@@ -158,11 +158,15 @@ module ActiveMerchant #:nodoc:
158
158
  def commit(action, request)
159
159
  response = parse(ssl_post(self.live_url, build_request(action, request), POST_HEADERS))
160
160
 
161
- Response.new(successful?(response), message_from(response), response,
161
+ Response.new(
162
+ successful?(response),
163
+ message_from(response),
164
+ response,
162
165
  test: test?,
163
166
  authorization: authorization_from(response),
164
167
  avs_result: { code: response[:avs] },
165
- cvv_result: response[:cvv2])
168
+ cvv_result: response[:cvv2]
169
+ )
166
170
  rescue ResponseError => e
167
171
  case e.response.code
168
172
  when '401'
@@ -28,6 +28,7 @@ module ActiveMerchant #:nodoc:
28
28
  add_order_id(post, options)
29
29
  add_ip(post, options)
30
30
  add_metadata(post, options)
31
+ add_three_ds(post, options)
31
32
 
32
33
  commit(:post, 'purchases', post)
33
34
  end
@@ -41,6 +42,7 @@ module ActiveMerchant #:nodoc:
41
42
  add_order_id(post, options)
42
43
  add_ip(post, options)
43
44
  add_metadata(post, options)
45
+ add_three_ds(post, options)
44
46
 
45
47
  post[:capture] = false
46
48
 
@@ -125,16 +127,42 @@ module ActiveMerchant #:nodoc:
125
127
  def add_extra_options(post, options)
126
128
  extra = {}
127
129
  extra[:ecm] = '32' if options[:recurring]
128
- extra[:cavv] = options[:cavv] || options.dig(:three_d_secure, :cavv) if options[:cavv] || options.dig(:three_d_secure, :cavv)
129
- extra[:xid] = options[:xid] || options.dig(:three_d_secure, :xid) if options[:xid] || options.dig(:three_d_secure, :xid)
130
- extra[:sli] = options[:sli] || options.dig(:three_d_secure, :eci) if options[:sli] || options.dig(:three_d_secure, :eci)
131
130
  extra[:name] = options[:merchant] if options[:merchant]
132
131
  extra[:location] = options[:merchant_location] if options[:merchant_location]
133
132
  extra[:card_on_file] = options.dig(:extra, :card_on_file) if options.dig(:extra, :card_on_file)
134
133
  extra[:auth_reason] = options.dig(:extra, :auth_reason) if options.dig(:extra, :auth_reason)
134
+
135
+ unless options[:three_d_secure].present?
136
+ extra[:sli] = options[:sli] if options[:sli]
137
+ extra[:xid] = options[:xid] if options[:xid]
138
+ extra[:cavv] = options[:cavv] if options[:cavv]
139
+ end
140
+
135
141
  post[:extra] = extra if extra.any?
136
142
  end
137
143
 
144
+ def add_three_ds(post, options)
145
+ return unless three_d_secure = options[:three_d_secure]
146
+
147
+ post[:extra] = {
148
+ sli: three_d_secure[:eci],
149
+ xid: three_d_secure[:xid],
150
+ cavv: three_d_secure[:cavv],
151
+ par: three_d_secure[:authentication_response_status],
152
+ ver: formatted_enrollment(three_d_secure[:enrolled]),
153
+ threeds_version: three_d_secure[:version],
154
+ directory_server_txn_id: three_d_secure[:ds_transaction_id]
155
+ }.compact
156
+ end
157
+
158
+ def formatted_enrollment(val)
159
+ case val
160
+ when 'Y', 'N', 'U' then val
161
+ when true, 'true' then 'Y'
162
+ when false, 'false' then 'N'
163
+ end
164
+ end
165
+
138
166
  def add_order_id(post, options)
139
167
  post[:reference] = options[:order_id] || SecureRandom.hex(15)
140
168
  end
@@ -121,11 +121,15 @@ module ActiveMerchant #:nodoc:
121
121
  response = parse(data)
122
122
  message = message_from(response)
123
123
 
124
- Response.new(success?(response), message, response,
124
+ Response.new(
125
+ success?(response),
126
+ message,
127
+ response,
125
128
  test: test?,
126
129
  authorization: response['transactionid'],
127
130
  avs_result: { code: response['avsresponse'] },
128
- cvv_result: response['cvvresponse'])
131
+ cvv_result: response['cvvresponse']
132
+ )
129
133
  end
130
134
 
131
135
  def success?(response)
@@ -0,0 +1,15 @@
1
+ module FirstPayCommon
2
+ def self.included(base)
3
+ base.supported_countries = ['US']
4
+ base.default_currency = 'USD'
5
+ base.money_format = :dollars
6
+ base.supported_cardtypes = %i[visa master american_express discover]
7
+
8
+ base.homepage_url = 'http://1stpaygateway.net/'
9
+ base.display_name = '1stPayGateway.Net'
10
+ end
11
+
12
+ def supports_scrubbing?
13
+ true
14
+ end
15
+ end