activemerchant 1.106.0 → 1.108.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +79 -0
- data/README.md +2 -2
- data/lib/active_merchant/billing/gateways/adyen.rb +1 -1
- data/lib/active_merchant/billing/gateways/authorize_net.rb +1 -1
- data/lib/active_merchant/billing/gateways/blue_pay.rb +2 -2
- data/lib/active_merchant/billing/gateways/borgun.rb +15 -4
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +11 -9
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +20 -9
- data/lib/active_merchant/billing/gateways/clearhaus.rb +1 -1
- data/lib/active_merchant/billing/gateways/cyber_source.rb +74 -21
- data/lib/active_merchant/billing/gateways/d_local.rb +17 -5
- data/lib/active_merchant/billing/gateways/decidir.rb +29 -0
- data/lib/active_merchant/billing/gateways/ebanx.rb +13 -1
- data/lib/active_merchant/billing/gateways/elavon.rb +58 -5
- data/lib/active_merchant/billing/gateways/element.rb +13 -5
- data/lib/active_merchant/billing/gateways/firstdata_e4.rb +2 -2
- data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +2 -2
- data/lib/active_merchant/billing/gateways/forte.rb +7 -6
- data/lib/active_merchant/billing/gateways/global_collect.rb +30 -24
- data/lib/active_merchant/billing/gateways/hps.rb +4 -2
- data/lib/active_merchant/billing/gateways/iats_payments.rb +31 -14
- data/lib/active_merchant/billing/gateways/iridium.rb +4 -2
- data/lib/active_merchant/billing/gateways/iveri.rb +4 -1
- data/lib/active_merchant/billing/gateways/ixopay.rb +1 -0
- data/lib/active_merchant/billing/gateways/kushki.rb +34 -5
- data/lib/active_merchant/billing/gateways/litle.rb +6 -1
- data/lib/active_merchant/billing/gateways/mercado_pago.rb +1 -0
- data/lib/active_merchant/billing/gateways/netaxept.rb +1 -1
- data/lib/active_merchant/billing/gateways/netbanx.rb +1 -1
- data/lib/active_merchant/billing/gateways/opp.rb +13 -7
- data/lib/active_merchant/billing/gateways/optimal_payment.rb +4 -0
- data/lib/active_merchant/billing/gateways/orbital.rb +44 -2
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +1 -1
- data/lib/active_merchant/billing/gateways/payment_express.rb +2 -2
- data/lib/active_merchant/billing/gateways/payu_latam.rb +1 -1
- data/lib/active_merchant/billing/gateways/pin.rb +1 -1
- data/lib/active_merchant/billing/gateways/quantum.rb +1 -1
- data/lib/active_merchant/billing/gateways/realex.rb +10 -3
- data/lib/active_merchant/billing/gateways/redsys.rb +1 -1
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +1 -1
- data/lib/active_merchant/billing/gateways/so_easy_pay.rb +1 -1
- data/lib/active_merchant/billing/gateways/stripe.rb +7 -2
- data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +40 -6
- data/lib/active_merchant/billing/gateways/transact_pro.rb +2 -2
- data/lib/active_merchant/billing/gateways/trexle.rb +1 -1
- data/lib/active_merchant/billing/gateways/worldpay.rb +8 -6
- data/lib/active_merchant/billing/network_tokenization_credit_card.rb +1 -1
- data/lib/active_merchant/connection.rb +40 -42
- data/lib/active_merchant/network_connection_retries.rb +10 -12
- data/lib/active_merchant/version.rb +1 -1
- metadata +5 -4
@@ -93,8 +93,10 @@ module ActiveMerchant #:nodoc:
|
|
93
93
|
post[:country] = lookup_country_code(address[:country])
|
94
94
|
end
|
95
95
|
|
96
|
-
def lookup_country_code(
|
97
|
-
Country.find(
|
96
|
+
def lookup_country_code(country_field)
|
97
|
+
Country.find(country_field).code(:alpha2).value
|
98
|
+
rescue InvalidCountryCodeError
|
99
|
+
nil
|
98
100
|
end
|
99
101
|
|
100
102
|
def add_payer(post, card, options)
|
@@ -116,12 +118,22 @@ module ActiveMerchant #:nodoc:
|
|
116
118
|
address_object = {}
|
117
119
|
address_object[:state] = address[:state] if address[:state]
|
118
120
|
address_object[:city] = address[:city] if address[:city]
|
119
|
-
address_object[:zip_code] = address[:
|
120
|
-
address_object[:street] = address[:street] if address
|
121
|
-
address_object[:number] = address[:number] if address
|
121
|
+
address_object[:zip_code] = address[:zip] if address[:zip]
|
122
|
+
address_object[:street] = address[:street] || parse_street(address) if parse_street(address)
|
123
|
+
address_object[:number] = address[:number] || parse_house_number(address) if parse_house_number(address)
|
122
124
|
address_object
|
123
125
|
end
|
124
126
|
|
127
|
+
def parse_street(address)
|
128
|
+
street = address[:address1].split(/\s+/).keep_if { |x| x !~ /\d/ }.join(' ')
|
129
|
+
street.empty? ? nil : street
|
130
|
+
end
|
131
|
+
|
132
|
+
def parse_house_number(address)
|
133
|
+
house = address[:address1].split(/\s+/).keep_if { |x| x =~ /\d/ }.join(' ')
|
134
|
+
house.empty? ? nil : house
|
135
|
+
end
|
136
|
+
|
125
137
|
def add_card(post, card, action, options={})
|
126
138
|
post[:card] = {}
|
127
139
|
post[:card][:holder_name] = card.name
|
@@ -121,6 +121,7 @@ module ActiveMerchant #:nodoc:
|
|
121
121
|
|
122
122
|
add_invoice(post, money, options)
|
123
123
|
add_payment(post, credit_card, options)
|
124
|
+
add_aggregate_data(post, options) if options[:aggregate_data]
|
124
125
|
end
|
125
126
|
|
126
127
|
def add_payment_method_id(credit_card, options)
|
@@ -180,6 +181,29 @@ module ActiveMerchant #:nodoc:
|
|
180
181
|
post[:card_data] = card_data
|
181
182
|
end
|
182
183
|
|
184
|
+
def add_aggregate_data(post, options)
|
185
|
+
aggregate_data = {}
|
186
|
+
data = options[:aggregate_data]
|
187
|
+
aggregate_data[:indicator] = data[:indicator] if data[:indicator]
|
188
|
+
aggregate_data[:identification_number] = data[:identification_number] if data[:identification_number]
|
189
|
+
aggregate_data[:bill_to_pay] = data[:bill_to_pay] if data[:bill_to_pay]
|
190
|
+
aggregate_data[:bill_to_refund] = data[:bill_to_refund] if data[:bill_to_refund]
|
191
|
+
aggregate_data[:merchant_name] = data[:merchant_name] if data[:merchant_name]
|
192
|
+
aggregate_data[:street] = data[:street] if data[:street]
|
193
|
+
aggregate_data[:number] = data[:number] if data[:number]
|
194
|
+
aggregate_data[:postal_code] = data[:postal_code] if data[:postal_code]
|
195
|
+
aggregate_data[:category] = data[:category] if data[:category]
|
196
|
+
aggregate_data[:channel] = data[:channel] if data[:channel]
|
197
|
+
aggregate_data[:geographic_code] = data[:geographic_code] if data[:geographic_code]
|
198
|
+
aggregate_data[:city] = data[:city] if data[:city]
|
199
|
+
aggregate_data[:merchant_id] = data[:merchant_id] if data[:merchant_id]
|
200
|
+
aggregate_data[:province] = data[:province] if data[:province]
|
201
|
+
aggregate_data[:country] = data[:country] if data[:country]
|
202
|
+
aggregate_data[:merchant_email] = data[:merchant_email] if data[:merchant_email]
|
203
|
+
aggregate_data[:merchant_phone] = data[:merchant_phone] if data[:merchant_phone]
|
204
|
+
post[:aggregate_data] = aggregate_data
|
205
|
+
end
|
206
|
+
|
183
207
|
def add_fraud_detection(options = {})
|
184
208
|
{}.tap do |hsh|
|
185
209
|
hsh[:send_to_cs] = options[:send_to_cs] if valid_fraud_detection_option?(options[:send_to_cs]) # true/false
|
@@ -266,6 +290,11 @@ module ActiveMerchant #:nodoc:
|
|
266
290
|
error_code ||= error['type']
|
267
291
|
elsif response['error_type']
|
268
292
|
error_code = response['error_type'] if response['validation_errors']
|
293
|
+
elsif error = response.dig('error')
|
294
|
+
validation_errors = error.dig('validation_errors', 0)
|
295
|
+
code = validation_errors['code'] if validation_errors && validation_errors['code']
|
296
|
+
param = validation_errors['param'] if validation_errors && validation_errors['param']
|
297
|
+
error_code = "#{error['error_type']} | #{code} | #{param}" if error['error_type']
|
269
298
|
end
|
270
299
|
|
271
300
|
error_code || STANDARD_ERROR_CODE[:processing_error]
|
@@ -37,6 +37,15 @@ module ActiveMerchant #:nodoc:
|
|
37
37
|
store: :post
|
38
38
|
}
|
39
39
|
|
40
|
+
VERIFY_AMOUNT_PER_COUNTRY = {
|
41
|
+
'br' => 100,
|
42
|
+
'ar' => 100,
|
43
|
+
'co' => 100,
|
44
|
+
'pe' => 300,
|
45
|
+
'mx' => 300,
|
46
|
+
'cl' => 5000
|
47
|
+
}
|
48
|
+
|
40
49
|
def initialize(options={})
|
41
50
|
requires!(options, :integration_key)
|
42
51
|
super
|
@@ -65,6 +74,7 @@ module ActiveMerchant #:nodoc:
|
|
65
74
|
add_card_or_token(post, payment)
|
66
75
|
add_address(post, options)
|
67
76
|
add_customer_responsible_person(post, payment, options)
|
77
|
+
add_additional_data(post, options)
|
68
78
|
post[:payment][:creditcard][:auto_capture] = false
|
69
79
|
|
70
80
|
commit(:authorize, post)
|
@@ -109,7 +119,7 @@ module ActiveMerchant #:nodoc:
|
|
109
119
|
|
110
120
|
def verify(credit_card, options={})
|
111
121
|
MultiResponse.run(:use_first_response) do |r|
|
112
|
-
r.process { authorize(
|
122
|
+
r.process { authorize(VERIFY_AMOUNT_PER_COUNTRY[customer_country(options)], credit_card, options) }
|
113
123
|
r.process(:ignore_result) { void(r.authorization, options) }
|
114
124
|
end
|
115
125
|
end
|
@@ -202,6 +212,8 @@ module ActiveMerchant #:nodoc:
|
|
202
212
|
def add_additional_data(post, options)
|
203
213
|
post[:device_id] = options[:device_id] if options[:device_id]
|
204
214
|
post[:metadata] = options[:metadata] if options[:metadata]
|
215
|
+
post[:metadata] = {} if post[:metadata].nil?
|
216
|
+
post[:metadata][:merchant_payment_code] = options[:order_id] if options[:order_id]
|
205
217
|
end
|
206
218
|
|
207
219
|
def parse(body)
|
@@ -26,6 +26,7 @@ module ActiveMerchant #:nodoc:
|
|
26
26
|
void: 'CCDELETE',
|
27
27
|
store: 'CCGETTOKEN',
|
28
28
|
update: 'CCUPDATETOKEN',
|
29
|
+
verify: 'CCVERIFY'
|
29
30
|
}
|
30
31
|
|
31
32
|
def initialize(options = {})
|
@@ -47,6 +48,8 @@ module ActiveMerchant #:nodoc:
|
|
47
48
|
add_customer_data(form, options)
|
48
49
|
add_test_mode(form, options)
|
49
50
|
add_ip(form, options)
|
51
|
+
add_auth_purchase_params(form, options)
|
52
|
+
add_level_3_fields(form, options) if options[:level_3_data]
|
50
53
|
commit(:purchase, money, form, options)
|
51
54
|
end
|
52
55
|
|
@@ -60,6 +63,8 @@ module ActiveMerchant #:nodoc:
|
|
60
63
|
add_customer_data(form, options)
|
61
64
|
add_test_mode(form, options)
|
62
65
|
add_ip(form, options)
|
66
|
+
add_auth_purchase_params(form, options)
|
67
|
+
add_level_3_fields(form, options) if options[:level_3_data]
|
63
68
|
commit(:authorize, money, form, options)
|
64
69
|
end
|
65
70
|
|
@@ -72,6 +77,7 @@ module ActiveMerchant #:nodoc:
|
|
72
77
|
add_invoice(form, options)
|
73
78
|
add_creditcard(form, options[:credit_card])
|
74
79
|
add_currency(form, money, options)
|
80
|
+
add_address(form, options)
|
75
81
|
add_customer_data(form, options)
|
76
82
|
add_test_mode(form, options)
|
77
83
|
else
|
@@ -111,10 +117,12 @@ module ActiveMerchant #:nodoc:
|
|
111
117
|
end
|
112
118
|
|
113
119
|
def verify(credit_card, options = {})
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
120
|
+
form = {}
|
121
|
+
add_creditcard(form, credit_card)
|
122
|
+
add_address(form, options)
|
123
|
+
add_test_mode(form, options)
|
124
|
+
add_ip(form, options)
|
125
|
+
commit(:verify, 0, form, options)
|
118
126
|
end
|
119
127
|
|
120
128
|
def store(creditcard, options = {})
|
@@ -249,6 +257,51 @@ module ActiveMerchant #:nodoc:
|
|
249
257
|
form[:cardholder_ip] = options[:ip] if options.has_key?(:ip)
|
250
258
|
end
|
251
259
|
|
260
|
+
def add_auth_purchase_params(form, options)
|
261
|
+
form[:dynamic_dba] = options[:dba] if options.has_key?(:dba)
|
262
|
+
form[:merchant_initiated_unscheduled] = options[:merchant_initiated_unscheduled] if options.has_key?(:merchant_initiated_unscheduled)
|
263
|
+
end
|
264
|
+
|
265
|
+
def add_level_3_fields(form, options)
|
266
|
+
level_3_data = options[:level_3_data]
|
267
|
+
form[:customer_code] = level_3_data[:customer_code] if level_3_data[:customer_code]
|
268
|
+
form[:salestax] = level_3_data[:salestax] if level_3_data[:salestax]
|
269
|
+
form[:salestax_indicator] = level_3_data[:salestax_indicator] if level_3_data[:salestax_indicator]
|
270
|
+
form[:level3_indicator] = level_3_data[:level3_indicator] if level_3_data[:level3_indicator]
|
271
|
+
form[:ship_to_zip] = level_3_data[:ship_to_zip] if level_3_data[:ship_to_zip]
|
272
|
+
form[:ship_to_country] = level_3_data[:ship_to_country] if level_3_data[:ship_to_country]
|
273
|
+
form[:shipping_amount] = level_3_data[:shipping_amount] if level_3_data[:shipping_amount]
|
274
|
+
form[:ship_from_postal_code] = level_3_data[:ship_from_postal_code] if level_3_data[:ship_from_postal_code]
|
275
|
+
form[:discount_amount] = level_3_data[:discount_amount] if level_3_data[:discount_amount]
|
276
|
+
form[:duty_amount] = level_3_data[:duty_amount] if level_3_data[:duty_amount]
|
277
|
+
form[:national_tax_indicator] = level_3_data[:national_tax_indicator] if level_3_data[:national_tax_indicator]
|
278
|
+
form[:national_tax_amount] = level_3_data[:national_tax_amount] if level_3_data[:national_tax_amount]
|
279
|
+
form[:order_date] = level_3_data[:order_date] if level_3_data[:order_date]
|
280
|
+
form[:other_tax] = level_3_data[:other_tax] if level_3_data[:other_tax]
|
281
|
+
form[:summary_commodity_code] = level_3_data[:summary_commodity_code] if level_3_data[:summary_commodity_code]
|
282
|
+
form[:merchant_vat_number] = level_3_data[:merchant_vat_number] if level_3_data[:merchant_vat_number]
|
283
|
+
form[:customer_vat_number] = level_3_data[:customer_vat_number] if level_3_data[:customer_vat_number]
|
284
|
+
form[:freight_tax_amount] = level_3_data[:freight_tax_amount] if level_3_data[:freight_tax_amount]
|
285
|
+
form[:vat_invoice_number] = level_3_data[:vat_invoice_number] if level_3_data[:vat_invoice_number]
|
286
|
+
form[:tracking_number] = level_3_data[:tracking_number] if level_3_data[:tracking_number]
|
287
|
+
form[:shipping_company] = level_3_data[:shipping_company] if level_3_data[:shipping_company]
|
288
|
+
form[:other_fees] = level_3_data[:other_fees] if level_3_data[:other_fees]
|
289
|
+
add_line_items(form, level_3_data) if level_3_data[:line_items]
|
290
|
+
end
|
291
|
+
|
292
|
+
def add_line_items(form, level_3_data)
|
293
|
+
items = []
|
294
|
+
level_3_data[:line_items].each do |line_item|
|
295
|
+
item = {}
|
296
|
+
line_item.each do |key, value|
|
297
|
+
prefixed_key = "ssl_line_Item_#{key}"
|
298
|
+
item[prefixed_key.to_sym] = value
|
299
|
+
end
|
300
|
+
items << item
|
301
|
+
end
|
302
|
+
form[:LineItemProducts] = { product: items }
|
303
|
+
end
|
304
|
+
|
252
305
|
def message_from(response)
|
253
306
|
success?(response) ? response['result_message'] : response['errorMessage']
|
254
307
|
end
|
@@ -278,7 +331,7 @@ module ActiveMerchant #:nodoc:
|
|
278
331
|
end
|
279
332
|
|
280
333
|
def post_data_string(key, value, options)
|
281
|
-
if custom_field?(key, options)
|
334
|
+
if custom_field?(key, options) || key == :LineItemProducts
|
282
335
|
"#{key}=#{CGI.escape(value.to_s)}"
|
283
336
|
else
|
284
337
|
"ssl_#{key}=#{CGI.escape(value.to_s)}"
|
@@ -111,10 +111,18 @@ module ActiveMerchant #:nodoc:
|
|
111
111
|
end
|
112
112
|
|
113
113
|
def verify(credit_card, options={})
|
114
|
-
|
115
|
-
|
116
|
-
|
114
|
+
request = build_soap_request do |xml|
|
115
|
+
xml.CreditCardAVSOnly(xmlns: 'https://transaction.elementexpress.com') do
|
116
|
+
add_credentials(xml)
|
117
|
+
add_payment_method(xml, credit_card)
|
118
|
+
add_transaction(xml, 0, options)
|
119
|
+
add_terminal(xml, options)
|
120
|
+
add_address(xml, options)
|
121
|
+
end
|
117
122
|
end
|
123
|
+
|
124
|
+
# send request with the transaction amount set to 0
|
125
|
+
commit('CreditCardAVSOnly', request, 0)
|
118
126
|
end
|
119
127
|
|
120
128
|
def supports_scrubbing?
|
@@ -185,8 +193,8 @@ module ActiveMerchant #:nodoc:
|
|
185
193
|
|
186
194
|
def add_terminal(xml, options)
|
187
195
|
xml.terminal do
|
188
|
-
xml.TerminalID '01'
|
189
|
-
xml.CardPresentCode 'UseDefault'
|
196
|
+
xml.TerminalID options[:terminal_id] || '01'
|
197
|
+
xml.CardPresentCode options[:card_present_code] || 'UseDefault'
|
190
198
|
xml.CardholderPresentCode 'UseDefault'
|
191
199
|
xml.CardInputCode 'UseDefault'
|
192
200
|
xml.CVVPresenceCode 'UseDefault'
|
@@ -255,14 +255,14 @@ module ActiveMerchant #:nodoc:
|
|
255
255
|
(credit_card.respond_to?(:eci) ? credit_card.eci : nil) || options[:eci] || DEFAULT_ECI
|
256
256
|
end
|
257
257
|
|
258
|
-
xml.tag! 'Ecommerce_Flag',
|
258
|
+
xml.tag! 'Ecommerce_Flag', /^[0-9]+$/.match?(eci.to_s) ? eci.to_s.rjust(2, '0') : eci
|
259
259
|
end
|
260
260
|
|
261
261
|
def add_credit_card_verification_strings(xml, credit_card, options)
|
262
262
|
address = options[:billing_address] || options[:address]
|
263
263
|
if address
|
264
264
|
address_values = []
|
265
|
-
[:address1, :zip, :city, :state, :country].each { |part| address_values << address[part].to_s }
|
265
|
+
[:address1, :zip, :city, :state, :country].each { |part| address_values << address[part].to_s.tr("\r\n", ' ').strip }
|
266
266
|
xml.tag! 'VerificationStr1', address_values.join('|')
|
267
267
|
end
|
268
268
|
|
@@ -229,7 +229,7 @@ module ActiveMerchant #:nodoc:
|
|
229
229
|
(credit_card.respond_to?(:eci) ? credit_card.eci : nil) || options[:eci] || DEFAULT_ECI
|
230
230
|
end
|
231
231
|
|
232
|
-
xml.tag! 'Ecommerce_Flag',
|
232
|
+
xml.tag! 'Ecommerce_Flag', /^[0-9]+$/.match?(eci.to_s) ? eci.to_s.rjust(2, '0') : eci
|
233
233
|
end
|
234
234
|
|
235
235
|
def add_credit_card_verification_strings(xml, credit_card, options)
|
@@ -319,7 +319,7 @@ module ActiveMerchant #:nodoc:
|
|
319
319
|
xml.tag! 'StoredCredentials' do
|
320
320
|
xml.tag! 'Indicator', stored_credential_indicator(xml, card, options)
|
321
321
|
if initiator = options.dig(:stored_credential, :initiator)
|
322
|
-
xml.tag! initiator == 'merchant' ? 'M' : 'C'
|
322
|
+
xml.tag! 'Initiation', initiator == 'merchant' ? 'M' : 'C'
|
323
323
|
end
|
324
324
|
if reason_type = options.dig(:stored_credential, :reason_type)
|
325
325
|
xml.tag! 'Schedule', reason_type == 'unscheduled' ? 'U' : 'S'
|
@@ -24,7 +24,7 @@ module ActiveMerchant #:nodoc:
|
|
24
24
|
post = {}
|
25
25
|
add_amount(post, money, options)
|
26
26
|
add_invoice(post, options)
|
27
|
-
add_payment_method(post, payment_method)
|
27
|
+
add_payment_method(post, payment_method, options)
|
28
28
|
add_billing_address(post, payment_method, options)
|
29
29
|
add_shipping_address(post, options)
|
30
30
|
post[:action] = 'sale'
|
@@ -36,7 +36,7 @@ module ActiveMerchant #:nodoc:
|
|
36
36
|
post = {}
|
37
37
|
add_amount(post, money, options)
|
38
38
|
add_invoice(post, options)
|
39
|
-
add_payment_method(post, payment_method)
|
39
|
+
add_payment_method(post, payment_method, options)
|
40
40
|
add_billing_address(post, payment_method, options)
|
41
41
|
add_shipping_address(post, options)
|
42
42
|
post[:action] = 'authorize'
|
@@ -57,7 +57,7 @@ module ActiveMerchant #:nodoc:
|
|
57
57
|
post = {}
|
58
58
|
add_amount(post, money, options)
|
59
59
|
add_invoice(post, options)
|
60
|
-
add_payment_method(post, payment_method)
|
60
|
+
add_payment_method(post, payment_method, options)
|
61
61
|
add_billing_address(post, payment_method, options)
|
62
62
|
post[:action] = 'disburse'
|
63
63
|
|
@@ -151,21 +151,22 @@ module ActiveMerchant #:nodoc:
|
|
151
151
|
post[:shipping_address][:physical_address][:locality] = address[:city] if address[:city]
|
152
152
|
end
|
153
153
|
|
154
|
-
def add_payment_method(post, payment_method)
|
154
|
+
def add_payment_method(post, payment_method, options)
|
155
155
|
if payment_method.respond_to?(:brand)
|
156
156
|
add_credit_card(post, payment_method)
|
157
157
|
else
|
158
|
-
add_echeck(post, payment_method)
|
158
|
+
add_echeck(post, payment_method, options)
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
162
|
-
def add_echeck(post, payment)
|
162
|
+
def add_echeck(post, payment, options)
|
163
163
|
post[:echeck] = {}
|
164
164
|
post[:echeck][:account_holder] = payment.name
|
165
165
|
post[:echeck][:account_number] = payment.account_number
|
166
166
|
post[:echeck][:routing_number] = payment.routing_number
|
167
167
|
post[:echeck][:account_type] = payment.account_type
|
168
168
|
post[:echeck][:check_number] = payment.number
|
169
|
+
post[:echeck][:sec_code] = options[:sec_code] || 'PPD'
|
169
170
|
end
|
170
171
|
|
171
172
|
def add_credit_card(post, payment)
|
@@ -7,10 +7,10 @@ module ActiveMerchant #:nodoc:
|
|
7
7
|
self.test_url = 'https://eu.sandbox.api-ingenico.com'
|
8
8
|
self.live_url = 'https://api.globalcollect.com'
|
9
9
|
|
10
|
-
self.supported_countries = [
|
10
|
+
self.supported_countries = %w[AD AE AG AI AL AM AO AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI BJ BL BM BN BO BQ BR BS BT BW BY BZ CA CC CD CF CH CI CK CL CM CN CO CR CU CV CW CX CY CZ DE DJ DK DM DO DZ EC EE EG ER ES ET FI FJ FK FM FO FR GA GB GD GE GF GH GI GL GM GN GP GQ GR GS GT GU GW GY HK HN HR HT HU ID IE IL IM IN IS IT JM JO JP KE KG KH KI KM KN KR KW KY KZ LA LB LC LI LK LR LS LT LU LV MA MC MD ME MF MG MH MK MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NC NE NG NI NL NO NP NR NU NZ OM PA PE PF PG PH PL PN PS PT PW QA RE RO RS RU RW SA SB SC SE SG SH SI SJ SK SL SM SN SR ST SV SZ TC TD TG TH TJ TL TM TN TO TR TT TV TW TZ UA UG US UY UZ VC VE VG VI VN WF WS ZA ZM ZW]
|
11
11
|
self.default_currency = 'USD'
|
12
12
|
self.money_format = :cents
|
13
|
-
self.supported_cardtypes = [
|
13
|
+
self.supported_cardtypes = %i[visa master american_express discover naranja cabal]
|
14
14
|
|
15
15
|
def initialize(options={})
|
16
16
|
requires!(options, :merchant_id, :api_key_id, :secret_api_key)
|
@@ -20,7 +20,7 @@ module ActiveMerchant #:nodoc:
|
|
20
20
|
def purchase(money, payment, options={})
|
21
21
|
MultiResponse.run do |r|
|
22
22
|
r.process { authorize(money, payment, options) }
|
23
|
-
r.process { capture(money, r.authorization, options) }
|
23
|
+
r.process { capture(money, r.authorization, options) } if should_request_capture?(r, options[:requires_approval])
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -32,7 +32,6 @@ module ActiveMerchant #:nodoc:
|
|
32
32
|
add_address(post, payment, options)
|
33
33
|
add_creator_info(post, options)
|
34
34
|
add_fraud_fields(post, options)
|
35
|
-
|
36
35
|
commit(:authorize, post)
|
37
36
|
end
|
38
37
|
|
@@ -161,6 +160,8 @@ module ActiveMerchant #:nodoc:
|
|
161
160
|
'skipFraudService' => 'true',
|
162
161
|
'authorizationMode' => pre_authorization
|
163
162
|
}
|
163
|
+
post['cardPaymentMethodSpecificInput']['requiresApproval'] = options[:requires_approval] unless options[:requires_approval].nil?
|
164
|
+
|
164
165
|
post['cardPaymentMethodSpecificInput']['card'] = {
|
165
166
|
'cvv' => payment.verification_value,
|
166
167
|
'cardNumber' => payment.number,
|
@@ -283,7 +284,7 @@ module ActiveMerchant #:nodoc:
|
|
283
284
|
|
284
285
|
def headers(action, post, authorization = nil)
|
285
286
|
{
|
286
|
-
'Content-Type'
|
287
|
+
'Content-Type' => content_type,
|
287
288
|
'Authorization' => auth_digest(action, post, authorization),
|
288
289
|
'Date' => date
|
289
290
|
}
|
@@ -314,18 +315,16 @@ POST
|
|
314
315
|
end
|
315
316
|
|
316
317
|
def message_from(succeeded, response)
|
317
|
-
if succeeded
|
318
|
-
|
318
|
+
return 'Succeeded' if succeeded
|
319
|
+
|
320
|
+
if errors = response['errors']
|
321
|
+
errors.first.try(:[], 'message')
|
322
|
+
elsif response['error_message']
|
323
|
+
response['error_message']
|
324
|
+
elsif response['status']
|
325
|
+
'Status: ' + response['status']
|
319
326
|
else
|
320
|
-
|
321
|
-
errors.first.try(:[], 'message')
|
322
|
-
elsif response['error_message']
|
323
|
-
response['error_message']
|
324
|
-
elsif response['status']
|
325
|
-
'Status: ' + response['status']
|
326
|
-
else
|
327
|
-
'No message available'
|
328
|
-
end
|
327
|
+
'No message available'
|
329
328
|
end
|
330
329
|
end
|
331
330
|
|
@@ -340,14 +339,14 @@ POST
|
|
340
339
|
end
|
341
340
|
|
342
341
|
def error_code_from(succeeded, response)
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
342
|
+
return if succeeded
|
343
|
+
|
344
|
+
if errors = response['errors']
|
345
|
+
errors.first.try(:[], 'code')
|
346
|
+
elsif status = response.try(:[], 'statusOutput').try(:[], 'statusCode')
|
347
|
+
status.to_s
|
348
|
+
else
|
349
|
+
'No error code available'
|
351
350
|
end
|
352
351
|
end
|
353
352
|
|
@@ -355,6 +354,13 @@ POST
|
|
355
354
|
Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
|
356
355
|
end
|
357
356
|
|
357
|
+
# Capture hasn't already been requested,
|
358
|
+
# and
|
359
|
+
# `requires_approval` is not false
|
360
|
+
def should_request_capture?(response, requires_approval)
|
361
|
+
!capture_requested?(response) && requires_approval != false
|
362
|
+
end
|
363
|
+
|
358
364
|
def capture_requested?(response)
|
359
365
|
response.params.try(:[], 'payment').try(:[], 'status') == 'CAPTURE_REQUESTED'
|
360
366
|
end
|