activemerchant 1.79.2 → 1.80.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +33 -0
- data/README.md +10 -2
- data/lib/active_merchant.rb +1 -1
- data/lib/active_merchant/billing/check.rb +4 -4
- data/lib/active_merchant/billing/compatibility.rb +1 -1
- data/lib/active_merchant/billing/credit_card.rb +21 -21
- data/lib/active_merchant/billing/credit_card_formatting.rb +2 -2
- data/lib/active_merchant/billing/credit_card_methods.rb +2 -2
- data/lib/active_merchant/billing/gateway.rb +13 -13
- data/lib/active_merchant/billing/gateways/adyen.rb +31 -15
- data/lib/active_merchant/billing/gateways/allied_wallet.rb +22 -22
- data/lib/active_merchant/billing/gateways/authorize_net.rb +72 -72
- data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +3 -3
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +3 -3
- data/lib/active_merchant/billing/gateways/axcessms.rb +51 -51
- data/lib/active_merchant/billing/gateways/balanced.rb +29 -29
- data/lib/active_merchant/billing/gateways/bank_frick.rb +3 -3
- data/lib/active_merchant/billing/gateways/banwire.rb +8 -8
- data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +5 -5
- data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +6 -6
- data/lib/active_merchant/billing/gateways/be2bill.rb +2 -2
- data/lib/active_merchant/billing/gateways/beanstream.rb +1 -1
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +69 -69
- data/lib/active_merchant/billing/gateways/blue_pay.rb +19 -19
- data/lib/active_merchant/billing/gateways/blue_snap.rb +42 -42
- data/lib/active_merchant/billing/gateways/bogus.rb +10 -10
- data/lib/active_merchant/billing/gateways/borgun.rb +10 -10
- data/lib/active_merchant/billing/gateways/bpoint.rb +1 -1
- data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +2 -2
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +94 -94
- data/lib/active_merchant/billing/gateways/braintree_orange.rb +1 -1
- data/lib/active_merchant/billing/gateways/bridge_pay.rb +39 -39
- data/lib/active_merchant/billing/gateways/cams.rb +12 -12
- data/lib/active_merchant/billing/gateways/card_connect.rb +38 -13
- data/lib/active_merchant/billing/gateways/card_stream.rb +116 -116
- data/lib/active_merchant/billing/gateways/cardknox.rb +7 -7
- data/lib/active_merchant/billing/gateways/cardprocess.rb +1 -1
- data/lib/active_merchant/billing/gateways/cashnet.rb +10 -10
- data/lib/active_merchant/billing/gateways/cc5.rb +3 -5
- data/lib/active_merchant/billing/gateways/cecabank.rb +6 -6
- data/lib/active_merchant/billing/gateways/cenpos.rb +36 -36
- data/lib/active_merchant/billing/gateways/checkout.rb +5 -5
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +31 -31
- data/lib/active_merchant/billing/gateways/clearhaus.rb +5 -5
- data/lib/active_merchant/billing/gateways/commercegate.rb +6 -6
- data/lib/active_merchant/billing/gateways/conekta.rb +24 -19
- data/lib/active_merchant/billing/gateways/creditcall.rb +41 -41
- data/lib/active_merchant/billing/gateways/credorax.rb +104 -103
- data/lib/active_merchant/billing/gateways/culqi.rb +25 -25
- data/lib/active_merchant/billing/gateways/cyber_source.rb +65 -65
- data/lib/active_merchant/billing/gateways/data_cash.rb +4 -4
- data/lib/active_merchant/billing/gateways/dibs.rb +24 -24
- data/lib/active_merchant/billing/gateways/digitzs.rb +35 -35
- data/lib/active_merchant/billing/gateways/ebanx.rb +26 -26
- data/lib/active_merchant/billing/gateways/efsnet.rb +10 -10
- data/lib/active_merchant/billing/gateways/elavon.rb +5 -5
- data/lib/active_merchant/billing/gateways/element.rb +35 -35
- data/lib/active_merchant/billing/gateways/epay.rb +4 -4
- data/lib/active_merchant/billing/gateways/evo_ca.rb +1 -1
- data/lib/active_merchant/billing/gateways/eway.rb +65 -65
- data/lib/active_merchant/billing/gateways/eway_managed.rb +11 -11
- data/lib/active_merchant/billing/gateways/eway_rapid.rb +31 -31
- data/lib/active_merchant/billing/gateways/exact.rb +12 -12
- data/lib/active_merchant/billing/gateways/ezic.rb +13 -13
- data/lib/active_merchant/billing/gateways/fat_zebra.rb +24 -24
- data/lib/active_merchant/billing/gateways/federated_canada.rb +3 -3
- data/lib/active_merchant/billing/gateways/first_giving.rb +16 -16
- data/lib/active_merchant/billing/gateways/first_pay.rb +7 -4
- data/lib/active_merchant/billing/gateways/firstdata_e4.rb +71 -71
- data/lib/active_merchant/billing/gateways/flo2cash.rb +12 -12
- data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +1 -1
- data/lib/active_merchant/billing/gateways/forte.rb +26 -16
- data/lib/active_merchant/billing/gateways/garanti.rb +10 -12
- data/lib/active_merchant/billing/gateways/global_collect.rb +88 -88
- data/lib/active_merchant/billing/gateways/global_transport.rb +4 -4
- data/lib/active_merchant/billing/gateways/hdfc.rb +33 -33
- data/lib/active_merchant/billing/gateways/hps.rb +28 -28
- data/lib/active_merchant/billing/gateways/iats_payments.rb +26 -26
- data/lib/active_merchant/billing/gateways/inspire.rb +15 -15
- data/lib/active_merchant/billing/gateways/instapay.rb +4 -4
- data/lib/active_merchant/billing/gateways/ipp.rb +17 -17
- data/lib/active_merchant/billing/gateways/iridium.rb +207 -207
- data/lib/active_merchant/billing/gateways/iveri.rb +8 -8
- data/lib/active_merchant/billing/gateways/jetpay.rb +134 -134
- data/lib/active_merchant/billing/gateways/jetpay_v2.rb +141 -141
- data/lib/active_merchant/billing/gateways/komoju.rb +15 -15
- data/lib/active_merchant/billing/gateways/kushki.rb +31 -37
- data/lib/active_merchant/billing/gateways/latitude19.rb +64 -64
- data/lib/active_merchant/billing/gateways/linkpoint.rb +22 -22
- data/lib/active_merchant/billing/gateways/litle.rb +4 -4
- data/lib/active_merchant/billing/gateways/mastercard.rb +3 -3
- data/lib/active_merchant/billing/gateways/maxipago.rb +2 -2
- data/lib/active_merchant/billing/gateways/mercado_pago.rb +28 -28
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +9 -9
- data/lib/active_merchant/billing/gateways/merchant_one.rb +6 -6
- data/lib/active_merchant/billing/gateways/merchant_partners.rb +24 -24
- data/lib/active_merchant/billing/gateways/merchant_ware.rb +49 -49
- data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +36 -36
- data/lib/active_merchant/billing/gateways/merchant_warrior.rb +4 -4
- data/lib/active_merchant/billing/gateways/mercury.rb +28 -28
- data/lib/active_merchant/billing/gateways/metrics_global.rb +7 -7
- data/lib/active_merchant/billing/gateways/micropayment.rb +31 -31
- data/lib/active_merchant/billing/gateways/migs.rb +11 -9
- data/lib/active_merchant/billing/gateways/modern_payments.rb +1 -1
- data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +16 -16
- data/lib/active_merchant/billing/gateways/monei.rb +5 -5
- data/lib/active_merchant/billing/gateways/moneris.rb +26 -26
- data/lib/active_merchant/billing/gateways/moneris_us.rb +81 -37
- data/lib/active_merchant/billing/gateways/money_movers.rb +3 -3
- data/lib/active_merchant/billing/gateways/mundipagg.rb +1 -1
- data/lib/active_merchant/billing/gateways/nab_transact.rb +6 -6
- data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +3 -3
- data/lib/active_merchant/billing/gateways/netaxept.rb +15 -15
- data/lib/active_merchant/billing/gateways/netbanx.rb +2 -2
- data/lib/active_merchant/billing/gateways/netbilling.rb +1 -1
- data/lib/active_merchant/billing/gateways/netpay.rb +5 -5
- data/lib/active_merchant/billing/gateways/nmi.rb +18 -18
- data/lib/active_merchant/billing/gateways/ogone.rb +22 -22
- data/lib/active_merchant/billing/gateways/omise.rb +3 -3
- data/lib/active_merchant/billing/gateways/openpay.rb +6 -4
- data/lib/active_merchant/billing/gateways/opp.rb +4 -4
- data/lib/active_merchant/billing/gateways/optimal_payment.rb +2 -2
- data/lib/active_merchant/billing/gateways/orbital.rb +61 -61
- data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +4 -4
- data/lib/active_merchant/billing/gateways/pac_net_raven.rb +5 -5
- data/lib/active_merchant/billing/gateways/pagarme.rb +27 -27
- data/lib/active_merchant/billing/gateways/pago_facil.rb +8 -8
- data/lib/active_merchant/billing/gateways/pay_conex.rb +25 -25
- data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +32 -32
- data/lib/active_merchant/billing/gateways/pay_hub.rb +29 -29
- data/lib/active_merchant/billing/gateways/pay_junction.rb +7 -7
- data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +30 -30
- data/lib/active_merchant/billing/gateways/pay_secure.rb +4 -4
- data/lib/active_merchant/billing/gateways/paybox_direct.rb +15 -15
- data/lib/active_merchant/billing/gateways/payeezy.rb +5 -5
- data/lib/active_merchant/billing/gateways/payex.rb +4 -4
- data/lib/active_merchant/billing/gateways/payflow.rb +7 -7
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +23 -22
- data/lib/active_merchant/billing/gateways/payflow_express.rb +2 -2
- data/lib/active_merchant/billing/gateways/payment_express.rb +40 -37
- data/lib/active_merchant/billing/gateways/paymentez.rb +11 -3
- data/lib/active_merchant/billing/gateways/paymill.rb +115 -115
- data/lib/active_merchant/billing/gateways/paypal.rb +1 -1
- data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +1 -1
- data/lib/active_merchant/billing/gateways/payscout.rb +1 -1
- data/lib/active_merchant/billing/gateways/paystation.rb +14 -14
- data/lib/active_merchant/billing/gateways/payu_in.rb +43 -43
- data/lib/active_merchant/billing/gateways/payu_latam.rb +41 -41
- data/lib/active_merchant/billing/gateways/payway.rb +6 -6
- data/lib/active_merchant/billing/gateways/pin.rb +7 -7
- data/lib/active_merchant/billing/gateways/plugnpay.rb +62 -62
- data/lib/active_merchant/billing/gateways/pro_pay.rb +123 -123
- data/lib/active_merchant/billing/gateways/psigate.rb +16 -16
- data/lib/active_merchant/billing/gateways/psl_card.rb +13 -13
- data/lib/active_merchant/billing/gateways/qbms.rb +52 -52
- data/lib/active_merchant/billing/gateways/quantum.rb +5 -5
- data/lib/active_merchant/billing/gateways/quickbooks.rb +10 -10
- data/lib/active_merchant/billing/gateways/quickpay.rb +1 -1
- data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +11 -11
- data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +3 -3
- data/lib/active_merchant/billing/gateways/qvalent.rb +55 -55
- data/lib/active_merchant/billing/gateways/realex.rb +16 -15
- data/lib/active_merchant/billing/gateways/redsys.rb +128 -121
- data/lib/active_merchant/billing/gateways/s5.rb +5 -5
- data/lib/active_merchant/billing/gateways/safe_charge.rb +16 -16
- data/lib/active_merchant/billing/gateways/sage.rb +20 -20
- data/lib/active_merchant/billing/gateways/sage_pay.rb +32 -32
- data/lib/active_merchant/billing/gateways/sallie_mae.rb +11 -11
- data/lib/active_merchant/billing/gateways/secure_net.rb +19 -19
- data/lib/active_merchant/billing/gateways/secure_pay.rb +5 -5
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +7 -7
- data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +9 -9
- data/lib/active_merchant/billing/gateways/securion_pay.rb +12 -12
- data/lib/active_merchant/billing/gateways/skip_jack.rb +28 -28
- data/lib/active_merchant/billing/gateways/smart_ps.rb +31 -31
- data/lib/active_merchant/billing/gateways/so_easy_pay.rb +3 -3
- data/lib/active_merchant/billing/gateways/spreedly_core.rb +1 -1
- data/lib/active_merchant/billing/gateways/stripe.rb +63 -63
- data/lib/active_merchant/billing/gateways/swipe_checkout.rb +5 -5
- data/lib/active_merchant/billing/gateways/telr.rb +26 -26
- data/lib/active_merchant/billing/gateways/trans_first.rb +28 -28
- data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +224 -224
- data/lib/active_merchant/billing/gateways/transact_pro.rb +7 -7
- data/lib/active_merchant/billing/gateways/transnational.rb +1 -1
- data/lib/active_merchant/billing/gateways/trexle.rb +5 -5
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +38 -38
- data/lib/active_merchant/billing/gateways/usa_epay.rb +3 -3
- data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +37 -37
- data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +3 -3
- data/lib/active_merchant/billing/gateways/vanco.rb +25 -25
- data/lib/active_merchant/billing/gateways/verifi.rb +40 -40
- data/lib/active_merchant/billing/gateways/viaklix.rb +5 -5
- data/lib/active_merchant/billing/gateways/visanet_peru.rb +64 -36
- data/lib/active_merchant/billing/gateways/webpay.rb +8 -8
- data/lib/active_merchant/billing/gateways/wepay.rb +25 -25
- data/lib/active_merchant/billing/gateways/wirecard.rb +26 -26
- data/lib/active_merchant/billing/gateways/worldpay.rb +15 -15
- data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +42 -42
- data/lib/active_merchant/billing/gateways/worldpay_us.rb +17 -17
- data/lib/active_merchant/billing/model.rb +2 -2
- data/lib/active_merchant/billing/network_tokenization_credit_card.rb +1 -1
- data/lib/active_merchant/billing/rails.rb +1 -1
- data/lib/active_merchant/connection.rb +10 -8
- data/lib/active_merchant/country.rb +1 -1
- data/lib/active_merchant/net_http_ssl_connection.rb +1 -0
- data/lib/active_merchant/network_connection_retries.rb +12 -12
- data/lib/active_merchant/post_data.rb +1 -1
- data/lib/active_merchant/posts_data.rb +1 -1
- data/lib/active_merchant/version.rb +1 -1
- data/lib/certs/cacert.pem +37 -0
- data/lib/support/gateway_support.rb +2 -2
- data/lib/support/ssl_verify.rb +5 -5
- data/lib/support/ssl_version.rb +7 -7
- metadata +3 -7
- data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +0 -246
- data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +0 -13
- data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +0 -29
- data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +0 -66
@@ -21,21 +21,21 @@ module ActiveMerchant #:nodoc:
|
|
21
21
|
|
22
22
|
def purchase(money, payment, options={})
|
23
23
|
MultiResponse.run do |r|
|
24
|
-
r.process { commit(
|
24
|
+
r.process { commit('auth/token', app_token_request(options)) }
|
25
25
|
r.process { commit('payments', purchase_request(money, payment, options), options.merge({ app_token: app_token_from(r) })) }
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
def refund(money, authorization, options={})
|
30
30
|
MultiResponse.run do |r|
|
31
|
-
r.process { commit(
|
31
|
+
r.process { commit('auth/token', app_token_request(options)) }
|
32
32
|
r.process { commit('payments', refund_request(money, authorization, options), options.merge({ app_token: app_token_from(r) })) }
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
def store(payment, options = {})
|
37
37
|
MultiResponse.run do |r|
|
38
|
-
r.process { commit(
|
38
|
+
r.process { commit('auth/token', app_token_request(options)) }
|
39
39
|
options.merge!({ app_token: app_token_from(r) })
|
40
40
|
|
41
41
|
if options[:customer_id].present?
|
@@ -78,7 +78,7 @@ module ActiveMerchant #:nodoc:
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def add_split(post, options)
|
81
|
-
return unless options[:payment_type] ==
|
81
|
+
return unless options[:payment_type] == 'card_split' || options[:payment_type] == 'token_split'
|
82
82
|
|
83
83
|
post[:data][:attributes][:split] = {
|
84
84
|
merchantId: options[:split_merchant_id],
|
@@ -115,19 +115,19 @@ module ActiveMerchant #:nodoc:
|
|
115
115
|
def add_address(post, options)
|
116
116
|
if address = options[:billing_address] || options[:address]
|
117
117
|
post[:data][:attributes][:billingAddress] = {
|
118
|
-
line1: address[:address1] ||
|
119
|
-
line2: address[:address2] ||
|
120
|
-
city: address[:city] ||
|
121
|
-
state: address[:state] ||
|
122
|
-
zip: address[:zip] ||
|
123
|
-
country: address[
|
118
|
+
line1: address[:address1] || '',
|
119
|
+
line2: address[:address2] || '',
|
120
|
+
city: address[:city] || '',
|
121
|
+
state: address[:state] || '',
|
122
|
+
zip: address[:zip] || '',
|
123
|
+
country: address['country'] || 'USA'
|
124
124
|
}
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
128
|
def app_token_request(options)
|
129
129
|
post = new_post
|
130
|
-
post[:data][:type] =
|
130
|
+
post[:data][:type] = 'auth'
|
131
131
|
post[:data][:attributes] = { appKey: @options[:app_key] }
|
132
132
|
|
133
133
|
post
|
@@ -135,7 +135,7 @@ module ActiveMerchant #:nodoc:
|
|
135
135
|
|
136
136
|
def purchase_request(money, payment, options)
|
137
137
|
post = new_post
|
138
|
-
post[:data][:type] =
|
138
|
+
post[:data][:type] = 'payments'
|
139
139
|
post[:data][:attributes][:merchantId] = options[:merchant_id]
|
140
140
|
post[:data][:attributes][:paymentType] = determine_payment_type(payment, options)
|
141
141
|
add_split(post, options)
|
@@ -148,9 +148,9 @@ module ActiveMerchant #:nodoc:
|
|
148
148
|
|
149
149
|
def refund_request(money, authorization, options)
|
150
150
|
post = new_post
|
151
|
-
post[:data][:type] =
|
151
|
+
post[:data][:type] = 'payments'
|
152
152
|
post[:data][:attributes][:merchantId] = options[:merchant_id]
|
153
|
-
post[:data][:attributes][:paymentType] =
|
153
|
+
post[:data][:attributes][:paymentType] = 'cardRefund'
|
154
154
|
post[:data][:attributes][:originalTransaction] = {id: authorization}
|
155
155
|
add_transaction(post, money, options)
|
156
156
|
|
@@ -159,7 +159,7 @@ module ActiveMerchant #:nodoc:
|
|
159
159
|
|
160
160
|
def create_customer_request(payment, options)
|
161
161
|
post = new_post
|
162
|
-
post[:data][:type] =
|
162
|
+
post[:data][:type] = 'customers'
|
163
163
|
post[:data][:attributes] = {
|
164
164
|
merchantId: options[:merchant_id],
|
165
165
|
name: payment.name,
|
@@ -171,11 +171,11 @@ module ActiveMerchant #:nodoc:
|
|
171
171
|
|
172
172
|
def create_token_request(payment, options)
|
173
173
|
post = new_post
|
174
|
-
post[:data][:type] =
|
174
|
+
post[:data][:type] = 'tokens'
|
175
175
|
post[:data][:attributes] = {
|
176
|
-
tokenType:
|
176
|
+
tokenType: 'card',
|
177
177
|
customerId: options[:customer_id],
|
178
|
-
label:
|
178
|
+
label: 'Credit Card',
|
179
179
|
}
|
180
180
|
add_payment(post, payment, options)
|
181
181
|
add_address(post, options)
|
@@ -187,7 +187,7 @@ module ActiveMerchant #:nodoc:
|
|
187
187
|
url = (test? ? test_url : live_url)
|
188
188
|
response = parse(ssl_get(url + "/customers/#{options[:customer_id]}", headers(options)))
|
189
189
|
|
190
|
-
return response.try(:[],
|
190
|
+
return response.try(:[], 'data').try(:[], 'customerId') if success_from(response)
|
191
191
|
return nil
|
192
192
|
end
|
193
193
|
|
@@ -222,33 +222,33 @@ module ActiveMerchant #:nodoc:
|
|
222
222
|
end
|
223
223
|
|
224
224
|
def success_from(response)
|
225
|
-
response[
|
225
|
+
response['errors'].nil? && response['message'].nil?
|
226
226
|
end
|
227
227
|
|
228
228
|
def message_from(response)
|
229
|
-
return response[
|
230
|
-
return
|
231
|
-
response[
|
229
|
+
return response['message'] if response['message']
|
230
|
+
return 'Success' if success_from(response)
|
231
|
+
response['errors'].map {|error_hash| error_hash['detail'] }.join(', ')
|
232
232
|
end
|
233
233
|
|
234
234
|
def authorization_from(response)
|
235
|
-
if customer_id = response.try(:[],
|
235
|
+
if customer_id = response.try(:[], 'data').try(:[], 'attributes').try(:[], 'customerId')
|
236
236
|
"#{customer_id}|#{response.try(:[], "data").try(:[], "id")}"
|
237
237
|
else
|
238
|
-
response.try(:[],
|
238
|
+
response.try(:[], 'data').try(:[], 'id')
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
242
242
|
def avs_result_from(response)
|
243
|
-
response.try(:[],
|
243
|
+
response.try(:[], 'data').try(:[], 'attributes').try(:[], 'transaction').try(:[], 'avsResult')
|
244
244
|
end
|
245
245
|
|
246
246
|
def cvv_result_from(response)
|
247
|
-
response.try(:[],
|
247
|
+
response.try(:[], 'data').try(:[], 'attributes').try(:[], 'transaction').try(:[], 'codeResult')
|
248
248
|
end
|
249
249
|
|
250
250
|
def app_token_from(response)
|
251
|
-
response.params.try(:[],
|
251
|
+
response.params.try(:[], 'data').try(:[], 'attributes').try(:[], 'appToken')
|
252
252
|
end
|
253
253
|
|
254
254
|
def headers(options)
|
@@ -257,26 +257,26 @@ module ActiveMerchant #:nodoc:
|
|
257
257
|
'x-api-key' => @options[:api_key]
|
258
258
|
}
|
259
259
|
|
260
|
-
headers.merge!({
|
260
|
+
headers.merge!({'Authorization' => "Bearer #{options[:app_token]}"}) if options[:app_token]
|
261
261
|
headers
|
262
262
|
end
|
263
263
|
|
264
264
|
def error_code_from(response)
|
265
265
|
unless success_from(response)
|
266
|
-
response[
|
266
|
+
response['errors'].nil? ? response['message'] : response['errors'].map {|error_hash| error_hash['code'] }.join(', ')
|
267
267
|
end
|
268
268
|
end
|
269
269
|
|
270
270
|
def split_authorization(authorization)
|
271
|
-
customer_id, token = authorization.split(
|
271
|
+
customer_id, token = authorization.split('|')
|
272
272
|
[customer_id, token]
|
273
273
|
end
|
274
274
|
|
275
275
|
def determine_payment_type(payment, options)
|
276
|
-
return
|
277
|
-
return
|
278
|
-
return
|
279
|
-
|
276
|
+
return 'cardSplit' if options[:payment_type] == 'card_split'
|
277
|
+
return 'tokenSplit' if options[:payment_type] == 'token_split'
|
278
|
+
return 'token' if payment.is_a? String
|
279
|
+
'card'
|
280
280
|
end
|
281
281
|
|
282
282
|
def handle_response(response)
|
@@ -12,20 +12,20 @@ module ActiveMerchant #:nodoc:
|
|
12
12
|
self.display_name = 'Ebanx'
|
13
13
|
|
14
14
|
CARD_BRAND = {
|
15
|
-
visa:
|
16
|
-
master:
|
17
|
-
american_express:
|
18
|
-
discover:
|
19
|
-
diners_club:
|
15
|
+
visa: 'visa',
|
16
|
+
master: 'master_card',
|
17
|
+
american_express: 'amex',
|
18
|
+
discover: 'discover',
|
19
|
+
diners_club: 'diners'
|
20
20
|
}
|
21
21
|
|
22
22
|
URL_MAP = {
|
23
|
-
purchase:
|
24
|
-
authorize:
|
25
|
-
capture:
|
26
|
-
refund:
|
27
|
-
void:
|
28
|
-
store:
|
23
|
+
purchase: 'direct',
|
24
|
+
authorize: 'direct',
|
25
|
+
capture: 'capture',
|
26
|
+
refund: 'refund',
|
27
|
+
void: 'cancel',
|
28
|
+
store: 'token'
|
29
29
|
}
|
30
30
|
|
31
31
|
HTTP_METHOD = {
|
@@ -131,7 +131,7 @@ module ActiveMerchant #:nodoc:
|
|
131
131
|
end
|
132
132
|
|
133
133
|
def add_operation(post)
|
134
|
-
post[:operation] =
|
134
|
+
post[:operation] = 'request'
|
135
135
|
end
|
136
136
|
|
137
137
|
def add_authorization(post, authorization)
|
@@ -140,7 +140,7 @@ module ActiveMerchant #:nodoc:
|
|
140
140
|
|
141
141
|
def add_customer_data(post, payment, options)
|
142
142
|
post[:payment][:name] = customer_name(payment, options)
|
143
|
-
post[:payment][:email] = options[:email] ||
|
143
|
+
post[:payment][:email] = options[:email] || 'unspecified@example.com'
|
144
144
|
post[:payment][:document] = options[:document]
|
145
145
|
post[:payment][:birth_date] = options[:birth_date] if options[:birth_date]
|
146
146
|
end
|
@@ -157,7 +157,7 @@ module ActiveMerchant #:nodoc:
|
|
157
157
|
|
158
158
|
def add_address(post, options)
|
159
159
|
if address = options[:billing_address] || options[:address]
|
160
|
-
post[:payment][:address] = address[:address1].split[1..-1].join(
|
160
|
+
post[:payment][:address] = address[:address1].split[1..-1].join(' ') if address[:address1]
|
161
161
|
post[:payment][:street_number] = address[:address1].split.first if address[:address1]
|
162
162
|
post[:payment][:city] = address[:city]
|
163
163
|
post[:payment][:state] = address[:state]
|
@@ -176,7 +176,7 @@ module ActiveMerchant #:nodoc:
|
|
176
176
|
|
177
177
|
def add_card_or_token(post, payment)
|
178
178
|
if payment.is_a?(String)
|
179
|
-
payment, brand = payment.split(
|
179
|
+
payment, brand = payment.split('|')
|
180
180
|
end
|
181
181
|
post[:payment][:payment_type_code] = payment.is_a?(String) ? brand : CARD_BRAND[payment.brand.to_sym]
|
182
182
|
post[:payment][:creditcard] = payment_details(payment)
|
@@ -222,28 +222,28 @@ module ActiveMerchant #:nodoc:
|
|
222
222
|
|
223
223
|
def success_from(action, response)
|
224
224
|
if [:purchase, :capture, :refund].include?(action)
|
225
|
-
response.try(:[],
|
225
|
+
response.try(:[], 'payment').try(:[], 'status') == 'CO'
|
226
226
|
elsif action == :authorize
|
227
|
-
response.try(:[],
|
227
|
+
response.try(:[], 'payment').try(:[], 'status') == 'PE'
|
228
228
|
elsif action == :void
|
229
|
-
response.try(:[],
|
229
|
+
response.try(:[], 'payment').try(:[], 'status') == 'CA'
|
230
230
|
elsif action == :store
|
231
|
-
response.try(:[],
|
231
|
+
response.try(:[], 'status') == 'SUCCESS'
|
232
232
|
else
|
233
233
|
false
|
234
234
|
end
|
235
235
|
end
|
236
236
|
|
237
237
|
def message_from(response)
|
238
|
-
return response[
|
239
|
-
response.try(:[],
|
238
|
+
return response['status_message'] if response['status'] == 'ERROR'
|
239
|
+
response.try(:[], 'payment').try(:[], 'transaction_status').try(:[], 'description')
|
240
240
|
end
|
241
241
|
|
242
242
|
def authorization_from(action, parameters, response)
|
243
243
|
if action == :store
|
244
244
|
"#{response.try(:[], "token")}|#{CARD_BRAND[parameters[:payment_type_code].to_sym]}"
|
245
245
|
else
|
246
|
-
response.try(:[],
|
246
|
+
response.try(:[], 'payment').try(:[], 'hash')
|
247
247
|
end
|
248
248
|
end
|
249
249
|
|
@@ -267,13 +267,13 @@ module ActiveMerchant #:nodoc:
|
|
267
267
|
parameters.map do |key, value|
|
268
268
|
next if value != false && value.blank?
|
269
269
|
"#{key}=#{value}"
|
270
|
-
end.compact.join(
|
270
|
+
end.compact.join('&')
|
271
271
|
end
|
272
272
|
|
273
273
|
def error_code_from(response, success)
|
274
274
|
unless success
|
275
|
-
return response[
|
276
|
-
response.try(:[],
|
275
|
+
return response['status_code'] if response['status'] == 'ERROR'
|
276
|
+
response.try(:[], 'payment').try(:[], 'transaction_status').try(:[], 'code')
|
277
277
|
end
|
278
278
|
end
|
279
279
|
|
@@ -286,7 +286,7 @@ module ActiveMerchant #:nodoc:
|
|
286
286
|
def customer_name(payment, options)
|
287
287
|
address_name = options[:billing_address][:name] if options[:billing_address] && options[:billing_address][:name]
|
288
288
|
if payment.is_a?(String)
|
289
|
-
address_name ||
|
289
|
+
address_name || 'Not Provided'
|
290
290
|
else
|
291
291
|
payment.name
|
292
292
|
end
|
@@ -54,7 +54,7 @@ module ActiveMerchant #:nodoc:
|
|
54
54
|
|
55
55
|
def void(identification, options = {})
|
56
56
|
requires!(options, :order_id)
|
57
|
-
original_transaction_id, _ = identification.split(
|
57
|
+
original_transaction_id, _ = identification.split(';')
|
58
58
|
commit(:void_transaction, {:reference_number => format_reference_number(options[:order_id]), :transaction_id => original_transaction_id})
|
59
59
|
end
|
60
60
|
|
@@ -77,7 +77,7 @@ module ActiveMerchant #:nodoc:
|
|
77
77
|
private
|
78
78
|
|
79
79
|
def build_refund_or_settle_request(money, identification, options = {})
|
80
|
-
original_transaction_id, original_transaction_amount = identification.split(
|
80
|
+
original_transaction_id, original_transaction_amount = identification.split(';')
|
81
81
|
|
82
82
|
requires!(options, :order_id)
|
83
83
|
|
@@ -139,8 +139,8 @@ module ActiveMerchant #:nodoc:
|
|
139
139
|
post[:billing_name] = creditcard.name if creditcard.name
|
140
140
|
post[:account_number] = creditcard.number
|
141
141
|
post[:card_verification_value] = creditcard.verification_value if creditcard.verification_value?
|
142
|
-
post[:expiration_month] = sprintf(
|
143
|
-
post[:expiration_year] = sprintf(
|
142
|
+
post[:expiration_month] = sprintf('%.2i', creditcard.month)
|
143
|
+
post[:expiration_year] = sprintf('%.4i', creditcard.year)[-2..-1]
|
144
144
|
end
|
145
145
|
|
146
146
|
|
@@ -179,10 +179,10 @@ module ActiveMerchant #:nodoc:
|
|
179
179
|
|
180
180
|
def post_data(action, parameters = {})
|
181
181
|
xml = REXML::Document.new("<?xml version='1.0' encoding='UTF-8'?>")
|
182
|
-
root = xml.add_element(
|
183
|
-
root.attributes[
|
184
|
-
root.attributes[
|
185
|
-
root.attributes[
|
182
|
+
root = xml.add_element('Request')
|
183
|
+
root.attributes['StoreID'] = options[:login]
|
184
|
+
root.attributes['StoreKey'] = options[:password]
|
185
|
+
root.attributes['ApplicationID'] = 'ot 1.0'
|
186
186
|
transaction = root.add_element(action.to_s.camelize)
|
187
187
|
|
188
188
|
actions[action].each do |key|
|
@@ -194,7 +194,7 @@ module ActiveMerchant #:nodoc:
|
|
194
194
|
|
195
195
|
def message_from(message)
|
196
196
|
return 'Unspecified error' if message.blank?
|
197
|
-
message.gsub(/[^\w]/, ' ').split.join(
|
197
|
+
message.gsub(/[^\w]/, ' ').split.join(' ').capitalize
|
198
198
|
end
|
199
199
|
|
200
200
|
def actions
|
@@ -208,7 +208,7 @@ module ActiveMerchant #:nodoc:
|
|
208
208
|
:credit_card_charge => CREDIT_CARD_FIELDS,
|
209
209
|
:credit_card_voice_authorize => CREDIT_CARD_FIELDS,
|
210
210
|
:credit_card_capture => CREDIT_CARD_FIELDS,
|
211
|
-
:credit_card_credit => CREDIT_CARD_FIELDS + [
|
211
|
+
:credit_card_credit => CREDIT_CARD_FIELDS + ['OriginalTransactionAmount'],
|
212
212
|
:credit_card_refund => %w(ReferenceNumber TransactionAmount OriginalTransactionAmount OriginalTransactionID ClientIpAddress),
|
213
213
|
:void_transaction => %w(ReferenceNumber TransactionID),
|
214
214
|
:credit_card_settle => %w(ReferenceNumber TransactionAmount OriginalTransactionAmount OriginalTransactionID ClientIpAddress),
|
@@ -96,7 +96,7 @@ module ActiveMerchant #:nodoc:
|
|
96
96
|
|
97
97
|
def credit(money, creditcard, options = {})
|
98
98
|
if creditcard.is_a?(String)
|
99
|
-
raise ArgumentError,
|
99
|
+
raise ArgumentError, 'Reference credits are not supported. Please supply the original credit card or use the #refund method.'
|
100
100
|
end
|
101
101
|
|
102
102
|
form = {}
|
@@ -271,7 +271,7 @@ module ActiveMerchant #:nodoc:
|
|
271
271
|
def post_data(parameters, options)
|
272
272
|
result = preamble
|
273
273
|
result.merge!(parameters)
|
274
|
-
result.collect { |key, value| post_data_string(key, value, options) }.join(
|
274
|
+
result.collect { |key, value| post_data_string(key, value, options) }.join('&')
|
275
275
|
end
|
276
276
|
|
277
277
|
def post_data_string(key, value, options)
|
@@ -302,9 +302,9 @@ module ActiveMerchant #:nodoc:
|
|
302
302
|
def parse(msg)
|
303
303
|
resp = {}
|
304
304
|
msg.split(self.delimiter).collect{|li|
|
305
|
-
|
306
|
-
|
307
|
-
|
305
|
+
key, value = li.split('=')
|
306
|
+
resp[key.to_s.strip.gsub(/^ssl_/, '')] = value.to_s.strip
|
307
|
+
}
|
308
308
|
resp
|
309
309
|
end
|
310
310
|
|
@@ -23,10 +23,10 @@ module ActiveMerchant #:nodoc:
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def purchase(money, payment, options={})
|
26
|
-
action = payment.is_a?(Check) ?
|
26
|
+
action = payment.is_a?(Check) ? 'CheckSale' : 'CreditCardSale'
|
27
27
|
|
28
28
|
request = build_soap_request do |xml|
|
29
|
-
xml.send(action, xmlns:
|
29
|
+
xml.send(action, xmlns: 'https://transaction.elementexpress.com') do
|
30
30
|
add_credentials(xml)
|
31
31
|
add_payment_method(xml, payment)
|
32
32
|
add_transaction(xml, money, options)
|
@@ -40,7 +40,7 @@ module ActiveMerchant #:nodoc:
|
|
40
40
|
|
41
41
|
def authorize(money, payment, options={})
|
42
42
|
request = build_soap_request do |xml|
|
43
|
-
xml.CreditCardAuthorization(xmlns:
|
43
|
+
xml.CreditCardAuthorization(xmlns: 'https://transaction.elementexpress.com') do
|
44
44
|
add_credentials(xml)
|
45
45
|
add_payment_method(xml, payment)
|
46
46
|
add_transaction(xml, money, options)
|
@@ -57,7 +57,7 @@ module ActiveMerchant #:nodoc:
|
|
57
57
|
options.merge!({trans_id: trans_id})
|
58
58
|
|
59
59
|
request = build_soap_request do |xml|
|
60
|
-
xml.CreditCardAuthorizationCompletion(xmlns:
|
60
|
+
xml.CreditCardAuthorizationCompletion(xmlns: 'https://transaction.elementexpress.com') do
|
61
61
|
add_credentials(xml)
|
62
62
|
add_transaction(xml, money, options)
|
63
63
|
add_terminal(xml, options)
|
@@ -72,7 +72,7 @@ module ActiveMerchant #:nodoc:
|
|
72
72
|
options.merge!({trans_id: trans_id})
|
73
73
|
|
74
74
|
request = build_soap_request do |xml|
|
75
|
-
xml.CreditCardReturn(xmlns:
|
75
|
+
xml.CreditCardReturn(xmlns: 'https://transaction.elementexpress.com') do
|
76
76
|
add_credentials(xml)
|
77
77
|
add_transaction(xml, money, options)
|
78
78
|
add_terminal(xml, options)
|
@@ -84,10 +84,10 @@ module ActiveMerchant #:nodoc:
|
|
84
84
|
|
85
85
|
def void(authorization, options={})
|
86
86
|
trans_id, trans_amount = split_authorization(authorization)
|
87
|
-
options.merge!({trans_id: trans_id, trans_amount: trans_amount, reversal_type:
|
87
|
+
options.merge!({trans_id: trans_id, trans_amount: trans_amount, reversal_type: 'Full'})
|
88
88
|
|
89
89
|
request = build_soap_request do |xml|
|
90
|
-
xml.CreditCardReversal(xmlns:
|
90
|
+
xml.CreditCardReversal(xmlns: 'https://transaction.elementexpress.com') do
|
91
91
|
add_credentials(xml)
|
92
92
|
add_transaction(xml, trans_amount, options)
|
93
93
|
add_terminal(xml, options)
|
@@ -99,7 +99,7 @@ module ActiveMerchant #:nodoc:
|
|
99
99
|
|
100
100
|
def store(payment, options = {})
|
101
101
|
request = build_soap_request do |xml|
|
102
|
-
xml.PaymentAccountCreate(xmlns:
|
102
|
+
xml.PaymentAccountCreate(xmlns: 'https://services.elementexpress.com') do
|
103
103
|
add_credentials(xml)
|
104
104
|
add_payment_method(xml, payment)
|
105
105
|
add_payment_account(xml, payment, options[:payment_account_reference_number] || SecureRandom.hex(20))
|
@@ -165,8 +165,8 @@ module ActiveMerchant #:nodoc:
|
|
165
165
|
def add_payment_account_id(xml, payment)
|
166
166
|
xml.extendedParameters do
|
167
167
|
xml.ExtendedParameters do
|
168
|
-
xml.Key
|
169
|
-
xml.Value(
|
168
|
+
xml.Key 'PaymentAccount'
|
169
|
+
xml.Value('xsi:type' => 'PaymentAccount') do
|
170
170
|
xml.PaymentAccountID payment
|
171
171
|
end
|
172
172
|
end
|
@@ -178,21 +178,21 @@ module ActiveMerchant #:nodoc:
|
|
178
178
|
xml.ReversalType options[:reversal_type] if options[:reversal_type]
|
179
179
|
xml.TransactionID options[:trans_id] if options[:trans_id]
|
180
180
|
xml.TransactionAmount amount(money.to_i) if money
|
181
|
-
xml.MarketCode
|
181
|
+
xml.MarketCode 'Default' if money
|
182
182
|
xml.ReferenceNumber options[:order_id] || SecureRandom.hex(20)
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
186
|
def add_terminal(xml, options)
|
187
187
|
xml.terminal do
|
188
|
-
xml.TerminalID
|
189
|
-
xml.CardPresentCode
|
190
|
-
xml.CardholderPresentCode
|
191
|
-
xml.CardInputCode
|
192
|
-
xml.CVVPresenceCode
|
193
|
-
xml.TerminalCapabilityCode
|
194
|
-
xml.TerminalEnvironmentCode
|
195
|
-
xml.MotoECICode
|
188
|
+
xml.TerminalID '01'
|
189
|
+
xml.CardPresentCode 'UseDefault'
|
190
|
+
xml.CardholderPresentCode 'UseDefault'
|
191
|
+
xml.CardInputCode 'UseDefault'
|
192
|
+
xml.CVVPresenceCode 'UseDefault'
|
193
|
+
xml.TerminalCapabilityCode 'UseDefault'
|
194
|
+
xml.TerminalEnvironmentCode 'UseDefault'
|
195
|
+
xml.MotoECICode 'NonAuthenticatedSecureECommerceTransaction'
|
196
196
|
end
|
197
197
|
end
|
198
198
|
|
@@ -201,7 +201,7 @@ module ActiveMerchant #:nodoc:
|
|
201
201
|
xml.CardNumber payment.number
|
202
202
|
xml.ExpirationMonth format(payment.month, :two_digits)
|
203
203
|
xml.ExpirationYear format(payment.year, :two_digits)
|
204
|
-
xml.CardholderName payment.first_name +
|
204
|
+
xml.CardholderName payment.first_name + ' ' + payment.last_name
|
205
205
|
xml.CVV payment.verification_value
|
206
206
|
end
|
207
207
|
end
|
@@ -244,10 +244,10 @@ module ActiveMerchant #:nodoc:
|
|
244
244
|
|
245
245
|
doc = Nokogiri::XML(xml)
|
246
246
|
doc.remove_namespaces!
|
247
|
-
root = doc.root.xpath(
|
247
|
+
root = doc.root.xpath('//response/*')
|
248
248
|
|
249
249
|
if root.empty?
|
250
|
-
root = doc.root.xpath(
|
250
|
+
root = doc.root.xpath('//Response/*')
|
251
251
|
end
|
252
252
|
|
253
253
|
root.each do |node|
|
@@ -281,31 +281,31 @@ module ActiveMerchant #:nodoc:
|
|
281
281
|
end
|
282
282
|
|
283
283
|
def authorization_from(action, response, amount)
|
284
|
-
if action ==
|
285
|
-
response[
|
284
|
+
if action == 'PaymentAccountCreate'
|
285
|
+
response['paymentaccount']['paymentaccountid']
|
286
286
|
else
|
287
287
|
"#{response['transaction']['transactionid']}|#{amount}" if response['transaction']
|
288
288
|
end
|
289
289
|
end
|
290
290
|
|
291
291
|
def success_from(response)
|
292
|
-
response[
|
292
|
+
response['expressresponsecode'] == '0'
|
293
293
|
end
|
294
294
|
|
295
295
|
def message_from(response)
|
296
|
-
response[
|
296
|
+
response['expressresponsemessage']
|
297
297
|
end
|
298
298
|
|
299
299
|
def avs_from(response)
|
300
|
-
AVSResult.new(code: response[
|
300
|
+
AVSResult.new(code: response['card']['avsresponsecode']) if response['card']
|
301
301
|
end
|
302
302
|
|
303
303
|
def cvv_from(response)
|
304
|
-
CVVResult.new(response[
|
304
|
+
CVVResult.new(response['card']['cvvresponsecode']) if response['card']
|
305
305
|
end
|
306
306
|
|
307
307
|
def split_authorization(authorization)
|
308
|
-
authorization.split(
|
308
|
+
authorization.split('|')
|
309
309
|
end
|
310
310
|
|
311
311
|
def build_soap_request
|
@@ -327,13 +327,13 @@ module ActiveMerchant #:nodoc:
|
|
327
327
|
if payment.is_a?(Check)
|
328
328
|
payment_account_type = payment.account_type
|
329
329
|
else
|
330
|
-
payment_account_type =
|
330
|
+
payment_account_type = 'CreditCard'
|
331
331
|
end
|
332
332
|
payment_account_type
|
333
333
|
end
|
334
334
|
|
335
335
|
def url(action)
|
336
|
-
if action ==
|
336
|
+
if action == 'PaymentAccountCreate'
|
337
337
|
url = (test? ? SERVICE_TEST_URL : SERVICE_LIVE_URL)
|
338
338
|
else
|
339
339
|
url = (test? ? test_url : live_url)
|
@@ -341,14 +341,14 @@ module ActiveMerchant #:nodoc:
|
|
341
341
|
end
|
342
342
|
|
343
343
|
def interface(action)
|
344
|
-
return
|
345
|
-
return
|
344
|
+
return 'transaction' if action != 'PaymentAccountCreate'
|
345
|
+
return 'services' if action == 'PaymentAccountCreate'
|
346
346
|
end
|
347
347
|
|
348
348
|
def headers(action)
|
349
349
|
{
|
350
|
-
|
351
|
-
|
350
|
+
'Content-Type' => 'text/xml; charset=utf-8',
|
351
|
+
'SOAPAction' => "https://#{interface(action)}.elementexpress.com/#{action}"
|
352
352
|
}
|
353
353
|
end
|
354
354
|
end
|