swiss-crm-activemerchant 1.0.12
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.
- checksums.yaml +7 -0
- data/CHANGELOG +4033 -0
- data/CONTRIBUTORS +568 -0
- data/MIT-LICENSE +20 -0
- data/README.md +252 -0
- data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
- data/lib/active_merchant/billing/avs_result.rb +95 -0
- data/lib/active_merchant/billing/base.rb +48 -0
- data/lib/active_merchant/billing/check.rb +112 -0
- data/lib/active_merchant/billing/compatibility.rb +118 -0
- data/lib/active_merchant/billing/credit_card.rb +451 -0
- data/lib/active_merchant/billing/credit_card_formatting.rb +24 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +512 -0
- data/lib/active_merchant/billing/cvv_result.rb +37 -0
- data/lib/active_merchant/billing/gateway.rb +332 -0
- data/lib/active_merchant/billing/gateways/adyen.rb +774 -0
- data/lib/active_merchant/billing/gateways/airwallex.rb +370 -0
- data/lib/active_merchant/billing/gateways/alelo.rb +256 -0
- data/lib/active_merchant/billing/gateways/allied_wallet.rb +205 -0
- data/lib/active_merchant/billing/gateways/authorize_net.rb +1125 -0
- data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +424 -0
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +977 -0
- data/lib/active_merchant/billing/gateways/axcessms.rb +242 -0
- data/lib/active_merchant/billing/gateways/balanced.rb +263 -0
- data/lib/active_merchant/billing/gateways/bambora_apac.rb +222 -0
- data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
- data/lib/active_merchant/billing/gateways/banwire.rb +116 -0
- data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +397 -0
- data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +15 -0
- data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +474 -0
- data/lib/active_merchant/billing/gateways/beanstream.rb +238 -0
- data/lib/active_merchant/billing/gateways/beanstream_interac.rb +57 -0
- data/lib/active_merchant/billing/gateways/blue_pay.rb +549 -0
- data/lib/active_merchant/billing/gateways/blue_snap.rb +644 -0
- data/lib/active_merchant/billing/gateways/bogus.rb +190 -0
- data/lib/active_merchant/billing/gateways/borgun.rb +272 -0
- data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
- data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +28 -0
- data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +113 -0
- data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +952 -0
- data/lib/active_merchant/billing/gateways/braintree_orange.rb +19 -0
- data/lib/active_merchant/billing/gateways/bridge_pay.rb +244 -0
- data/lib/active_merchant/billing/gateways/cams.rb +230 -0
- data/lib/active_merchant/billing/gateways/card_connect.rb +338 -0
- data/lib/active_merchant/billing/gateways/card_save.rb +21 -0
- data/lib/active_merchant/billing/gateways/card_stream.rb +394 -0
- data/lib/active_merchant/billing/gateways/cardknox.rb +327 -0
- data/lib/active_merchant/billing/gateways/cardprocess.rb +256 -0
- data/lib/active_merchant/billing/gateways/cashnet.rb +235 -0
- data/lib/active_merchant/billing/gateways/cc5.rb +198 -0
- data/lib/active_merchant/billing/gateways/cecabank.rb +249 -0
- data/lib/active_merchant/billing/gateways/cenpos.rb +328 -0
- data/lib/active_merchant/billing/gateways/checkout.rb +212 -0
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +587 -0
- data/lib/active_merchant/billing/gateways/citrus_pay.rb +21 -0
- data/lib/active_merchant/billing/gateways/clearhaus.rb +219 -0
- data/lib/active_merchant/billing/gateways/commerce_hub.rb +366 -0
- data/lib/active_merchant/billing/gateways/commercegate.rb +142 -0
- data/lib/active_merchant/billing/gateways/conekta.rb +230 -0
- data/lib/active_merchant/billing/gateways/creditcall.rb +272 -0
- data/lib/active_merchant/billing/gateways/credorax.rb +526 -0
- data/lib/active_merchant/billing/gateways/ct_payment.rb +269 -0
- data/lib/active_merchant/billing/gateways/culqi.rb +279 -0
- data/lib/active_merchant/billing/gateways/cyber_source/cyber_source_common.rb +36 -0
- data/lib/active_merchant/billing/gateways/cyber_source.rb +1148 -0
- data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +454 -0
- data/lib/active_merchant/billing/gateways/d_local.rb +343 -0
- data/lib/active_merchant/billing/gateways/data_cash.rb +302 -0
- data/lib/active_merchant/billing/gateways/decidir.rb +358 -0
- data/lib/active_merchant/billing/gateways/decidir_plus.rb +344 -0
- data/lib/active_merchant/billing/gateways/dibs.rb +199 -0
- data/lib/active_merchant/billing/gateways/digitzs.rb +295 -0
- data/lib/active_merchant/billing/gateways/ebanx.rb +346 -0
- data/lib/active_merchant/billing/gateways/efsnet.rb +215 -0
- data/lib/active_merchant/billing/gateways/elavon.rb +475 -0
- data/lib/active_merchant/billing/gateways/element.rb +406 -0
- data/lib/active_merchant/billing/gateways/epay.rb +296 -0
- data/lib/active_merchant/billing/gateways/evo_ca.rb +307 -0
- data/lib/active_merchant/billing/gateways/eway.rb +226 -0
- data/lib/active_merchant/billing/gateways/eway_managed.rb +289 -0
- data/lib/active_merchant/billing/gateways/eway_rapid.rb +578 -0
- data/lib/active_merchant/billing/gateways/exact.rb +219 -0
- data/lib/active_merchant/billing/gateways/ezic.rb +195 -0
- data/lib/active_merchant/billing/gateways/fat_zebra.rb +223 -0
- data/lib/active_merchant/billing/gateways/federated_canada.rb +158 -0
- data/lib/active_merchant/billing/gateways/finansbank.rb +22 -0
- data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
- data/lib/active_merchant/billing/gateways/first_pay.rb +182 -0
- data/lib/active_merchant/billing/gateways/firstdata_e4.rb +452 -0
- data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +505 -0
- data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
- data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
- data/lib/active_merchant/billing/gateways/fluidpay.rb +275 -0
- data/lib/active_merchant/billing/gateways/forte.rb +286 -0
- data/lib/active_merchant/billing/gateways/garanti.rb +256 -0
- data/lib/active_merchant/billing/gateways/global_collect.rb +580 -0
- data/lib/active_merchant/billing/gateways/global_transport.rb +193 -0
- data/lib/active_merchant/billing/gateways/hdfc.rb +205 -0
- data/lib/active_merchant/billing/gateways/hps.rb +472 -0
- data/lib/active_merchant/billing/gateways/iats_payments.rb +312 -0
- data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
- data/lib/active_merchant/billing/gateways/inspire.rb +213 -0
- data/lib/active_merchant/billing/gateways/instapay.rb +159 -0
- data/lib/active_merchant/billing/gateways/ipg.rb +420 -0
- data/lib/active_merchant/billing/gateways/ipp.rb +176 -0
- data/lib/active_merchant/billing/gateways/iridium.rb +467 -0
- data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
- data/lib/active_merchant/billing/gateways/iveri.rb +290 -0
- data/lib/active_merchant/billing/gateways/ixopay.rb +320 -0
- data/lib/active_merchant/billing/gateways/jetpay.rb +395 -0
- data/lib/active_merchant/billing/gateways/jetpay_v2.rb +432 -0
- data/lib/active_merchant/billing/gateways/klarna.rb +317 -0
- data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
- data/lib/active_merchant/billing/gateways/kushki.rb +297 -0
- data/lib/active_merchant/billing/gateways/latitude19.rb +412 -0
- data/lib/active_merchant/billing/gateways/linkpoint.rb +448 -0
- data/lib/active_merchant/billing/gateways/litle.rb +643 -0
- data/lib/active_merchant/billing/gateways/mastercard.rb +286 -0
- data/lib/active_merchant/billing/gateways/maxipago.rb +220 -0
- data/lib/active_merchant/billing/gateways/mercado_pago.rb +348 -0
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +228 -0
- data/lib/active_merchant/billing/gateways/merchant_one.rb +110 -0
- data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
- data/lib/active_merchant/billing/gateways/merchant_ware.rb +313 -0
- data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +284 -0
- data/lib/active_merchant/billing/gateways/merchant_warrior.rb +248 -0
- data/lib/active_merchant/billing/gateways/mercury.rb +352 -0
- data/lib/active_merchant/billing/gateways/metrics_global.rb +293 -0
- data/lib/active_merchant/billing/gateways/micropayment.rb +182 -0
- data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
- data/lib/active_merchant/billing/gateways/migs.rb +329 -0
- data/lib/active_merchant/billing/gateways/mit.rb +260 -0
- data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
- data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +215 -0
- data/lib/active_merchant/billing/gateways/moka.rb +290 -0
- data/lib/active_merchant/billing/gateways/monei.rb +424 -0
- data/lib/active_merchant/billing/gateways/moneris.rb +488 -0
- data/lib/active_merchant/billing/gateways/money_movers.rb +150 -0
- data/lib/active_merchant/billing/gateways/mundipagg.rb +366 -0
- data/lib/active_merchant/billing/gateways/nab_transact.rb +299 -0
- data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +163 -0
- data/lib/active_merchant/billing/gateways/net_registry.rb +198 -0
- data/lib/active_merchant/billing/gateways/netaxept.rb +180 -0
- data/lib/active_merchant/billing/gateways/netbanx.rb +376 -0
- data/lib/active_merchant/billing/gateways/netbilling.rb +229 -0
- data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
- data/lib/active_merchant/billing/gateways/network_merchants.rb +238 -0
- data/lib/active_merchant/billing/gateways/nmi.rb +396 -0
- data/lib/active_merchant/billing/gateways/ogone.rb +509 -0
- data/lib/active_merchant/billing/gateways/omise.rb +323 -0
- data/lib/active_merchant/billing/gateways/openpay.rb +246 -0
- data/lib/active_merchant/billing/gateways/opp.rb +394 -0
- data/lib/active_merchant/billing/gateways/optimal_payment.rb +331 -0
- data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +45 -0
- data/lib/active_merchant/billing/gateways/orbital.rb +1267 -0
- data/lib/active_merchant/billing/gateways/pac_net_raven.rb +206 -0
- data/lib/active_merchant/billing/gateways/pagarme.rb +239 -0
- data/lib/active_merchant/billing/gateways/pago_facil.rb +120 -0
- data/lib/active_merchant/billing/gateways/pay_arc.rb +392 -0
- data/lib/active_merchant/billing/gateways/pay_conex.rb +245 -0
- data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +277 -0
- data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
- data/lib/active_merchant/billing/gateways/pay_junction.rb +390 -0
- data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +206 -0
- data/lib/active_merchant/billing/gateways/pay_secure.rb +110 -0
- data/lib/active_merchant/billing/gateways/pay_trace.rb +450 -0
- data/lib/active_merchant/billing/gateways/paybox_direct.rb +224 -0
- data/lib/active_merchant/billing/gateways/payeezy.rb +513 -0
- data/lib/active_merchant/billing/gateways/payex.rb +409 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +235 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +42 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
- data/lib/active_merchant/billing/gateways/payflow.rb +473 -0
- data/lib/active_merchant/billing/gateways/payflow_express.rb +220 -0
- data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +14 -0
- data/lib/active_merchant/billing/gateways/payflow_uk.rb +20 -0
- data/lib/active_merchant/billing/gateways/payment_express.rb +373 -0
- data/lib/active_merchant/billing/gateways/paymentez.rb +365 -0
- data/lib/active_merchant/billing/gateways/paymill.rb +369 -0
- data/lib/active_merchant/billing/gateways/paynetworx.rb +228 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +718 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +69 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +262 -0
- data/lib/active_merchant/billing/gateways/paypal.rb +136 -0
- data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
- data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +44 -0
- data/lib/active_merchant/billing/gateways/paypal_express.rb +272 -0
- data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
- data/lib/active_merchant/billing/gateways/paypal_standard.rb +281 -0
- data/lib/active_merchant/billing/gateways/paysafe.rb +420 -0
- data/lib/active_merchant/billing/gateways/payscout.rb +159 -0
- data/lib/active_merchant/billing/gateways/paystation.rb +204 -0
- data/lib/active_merchant/billing/gateways/payu_in.rb +249 -0
- data/lib/active_merchant/billing/gateways/payu_latam.rb +482 -0
- data/lib/active_merchant/billing/gateways/payway.rb +207 -0
- data/lib/active_merchant/billing/gateways/payway_dot_com.rb +253 -0
- data/lib/active_merchant/billing/gateways/pin.rb +273 -0
- data/lib/active_merchant/billing/gateways/pixxels.rb +263 -0
- data/lib/active_merchant/billing/gateways/plexo.rb +308 -0
- data/lib/active_merchant/billing/gateways/plugnpay.rb +283 -0
- data/lib/active_merchant/billing/gateways/priority.rb +392 -0
- data/lib/active_merchant/billing/gateways/pro_pay.rb +325 -0
- data/lib/active_merchant/billing/gateways/psigate.rb +227 -0
- data/lib/active_merchant/billing/gateways/psl_card.rb +295 -0
- data/lib/active_merchant/billing/gateways/qbms.rb +302 -0
- data/lib/active_merchant/billing/gateways/quantum.rb +274 -0
- data/lib/active_merchant/billing/gateways/quickbooks.rb +377 -0
- data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +184 -0
- data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +297 -0
- data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +226 -0
- data/lib/active_merchant/billing/gateways/quickpay.rb +24 -0
- data/lib/active_merchant/billing/gateways/qvalent.rb +305 -0
- data/lib/active_merchant/billing/gateways/rapyd.rb +319 -0
- data/lib/active_merchant/billing/gateways/reach.rb +277 -0
- data/lib/active_merchant/billing/gateways/realex.rb +400 -0
- data/lib/active_merchant/billing/gateways/redsys.rb +723 -0
- data/lib/active_merchant/billing/gateways/s5.rb +247 -0
- data/lib/active_merchant/billing/gateways/safe_charge.rb +298 -0
- data/lib/active_merchant/billing/gateways/sage.rb +446 -0
- data/lib/active_merchant/billing/gateways/sage_pay.rb +434 -0
- data/lib/active_merchant/billing/gateways/sallie_mae.rb +141 -0
- data/lib/active_merchant/billing/gateways/secure_net.rb +260 -0
- data/lib/active_merchant/billing/gateways/secure_pay.rb +191 -0
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +290 -0
- data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +103 -0
- data/lib/active_merchant/billing/gateways/securion_pay.rb +305 -0
- data/lib/active_merchant/billing/gateways/shift4.rb +345 -0
- data/lib/active_merchant/billing/gateways/simetrik.rb +368 -0
- data/lib/active_merchant/billing/gateways/skip_jack.rb +450 -0
- data/lib/active_merchant/billing/gateways/smart_ps.rb +274 -0
- data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
- data/lib/active_merchant/billing/gateways/spreedly_core.rb +354 -0
- data/lib/active_merchant/billing/gateways/stripe.rb +866 -0
- data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +602 -0
- data/lib/active_merchant/billing/gateways/swipe_checkout.rb +151 -0
- data/lib/active_merchant/billing/gateways/telr.rb +273 -0
- data/lib/active_merchant/billing/gateways/tns.rb +23 -0
- data/lib/active_merchant/billing/gateways/trans_first.rb +240 -0
- data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +612 -0
- data/lib/active_merchant/billing/gateways/transact_pro.rb +222 -0
- data/lib/active_merchant/billing/gateways/transax.rb +21 -0
- data/lib/active_merchant/billing/gateways/transnational.rb +9 -0
- data/lib/active_merchant/billing/gateways/trexle.rb +221 -0
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +500 -0
- data/lib/active_merchant/billing/gateways/usa_epay.rb +24 -0
- data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1612 -0
- data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +367 -0
- data/lib/active_merchant/billing/gateways/vanco.rb +303 -0
- data/lib/active_merchant/billing/gateways/verifi.rb +224 -0
- data/lib/active_merchant/billing/gateways/viaklix.rb +171 -0
- data/lib/active_merchant/billing/gateways/visanet_peru.rb +250 -0
- data/lib/active_merchant/billing/gateways/vpos.rb +223 -0
- data/lib/active_merchant/billing/gateways/webpay.rb +97 -0
- data/lib/active_merchant/billing/gateways/wepay.rb +235 -0
- data/lib/active_merchant/billing/gateways/wirecard.rb +430 -0
- data/lib/active_merchant/billing/gateways/wompi.rb +197 -0
- data/lib/active_merchant/billing/gateways/world_net.rb +345 -0
- data/lib/active_merchant/billing/gateways/worldpay.rb +1050 -0
- data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +208 -0
- data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
- data/lib/active_merchant/billing/gateways.rb +14 -0
- data/lib/active_merchant/billing/model.rb +30 -0
- data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
- data/lib/active_merchant/billing/payment_token.rb +21 -0
- data/lib/active_merchant/billing/rails.rb +3 -0
- data/lib/active_merchant/billing/response.rb +121 -0
- data/lib/active_merchant/billing/three_d_secure_eci_mapper.rb +27 -0
- data/lib/active_merchant/billing.rb +16 -0
- data/lib/active_merchant/connection.rb +194 -0
- data/lib/active_merchant/country.rb +338 -0
- data/lib/active_merchant/empty.rb +20 -0
- data/lib/active_merchant/errors.rb +38 -0
- data/lib/active_merchant/net_http_ssl_connection.rb +11 -0
- data/lib/active_merchant/network_connection_retries.rb +78 -0
- data/lib/active_merchant/post_data.rb +26 -0
- data/lib/active_merchant/posts_data.rb +92 -0
- data/lib/active_merchant/version.rb +3 -0
- data/lib/active_merchant.rb +63 -0
- data/lib/activemerchant.rb +1 -0
- data/lib/certs/cacert.pem +3214 -0
- data/lib/support/gateway_support.rb +69 -0
- data/lib/support/outbound_hosts.rb +28 -0
- data/lib/support/ssl_verify.rb +88 -0
- data/lib/support/ssl_version.rb +86 -0
- metadata +506 -0
@@ -0,0 +1,475 @@
|
|
1
|
+
require 'active_merchant/billing/gateways/viaklix'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
module ActiveMerchant #:nodoc:
|
5
|
+
module Billing #:nodoc:
|
6
|
+
class ElavonGateway < Gateway
|
7
|
+
include Empty
|
8
|
+
|
9
|
+
class_attribute :test_url, :live_url, :delimiter, :actions
|
10
|
+
|
11
|
+
self.test_url = 'https://api.demo.convergepay.com/VirtualMerchantDemo/processxml.do'
|
12
|
+
self.live_url = 'https://api.convergepay.com/VirtualMerchant/processxml.do'
|
13
|
+
|
14
|
+
self.display_name = 'Elavon MyVirtualMerchant'
|
15
|
+
self.supported_countries = %w(US CA PR DE IE NO PL LU BE NL MX)
|
16
|
+
self.supported_cardtypes = %i[visa master american_express discover]
|
17
|
+
self.homepage_url = 'http://www.elavon.com/'
|
18
|
+
self.money_format = :dollars
|
19
|
+
self.default_currency = 'USD'
|
20
|
+
|
21
|
+
self.delimiter = "\n"
|
22
|
+
self.actions = {
|
23
|
+
purchase: 'CCSALE',
|
24
|
+
credit: 'CCCREDIT',
|
25
|
+
refund: 'CCRETURN',
|
26
|
+
authorize: 'CCAUTHONLY',
|
27
|
+
capture: 'CCFORCE',
|
28
|
+
capture_complete: 'CCCOMPLETE',
|
29
|
+
void: 'CCDELETE',
|
30
|
+
store: 'CCGETTOKEN',
|
31
|
+
update: 'CCUPDATETOKEN',
|
32
|
+
verify: 'CCVERIFY'
|
33
|
+
}
|
34
|
+
|
35
|
+
def initialize(options = {})
|
36
|
+
requires!(options, :login, :password)
|
37
|
+
super
|
38
|
+
end
|
39
|
+
|
40
|
+
def purchase(money, payment_method, options = {})
|
41
|
+
request = build_xml_request do |xml|
|
42
|
+
xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
|
43
|
+
xml.ssl_transaction_type self.actions[:purchase]
|
44
|
+
xml.ssl_amount amount(money)
|
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
|
+
|
52
|
+
add_invoice(xml, options)
|
53
|
+
add_salestax(xml, options)
|
54
|
+
add_currency(xml, money, options)
|
55
|
+
add_address(xml, options)
|
56
|
+
add_customer_email(xml, options)
|
57
|
+
add_test_mode(xml, options)
|
58
|
+
add_ip(xml, options)
|
59
|
+
add_auth_purchase_params(xml, options)
|
60
|
+
add_level_3_fields(xml, options) if options[:level_3_data]
|
61
|
+
end
|
62
|
+
commit(request)
|
63
|
+
end
|
64
|
+
|
65
|
+
def authorize(money, creditcard, options = {})
|
66
|
+
request = build_xml_request do |xml|
|
67
|
+
xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
|
68
|
+
xml.ssl_transaction_type self.actions[:authorize]
|
69
|
+
xml.ssl_amount amount(money)
|
70
|
+
|
71
|
+
add_salestax(xml, options)
|
72
|
+
add_invoice(xml, options)
|
73
|
+
add_creditcard(xml, creditcard)
|
74
|
+
add_currency(xml, money, options)
|
75
|
+
add_address(xml, options)
|
76
|
+
add_customer_email(xml, options)
|
77
|
+
add_test_mode(xml, options)
|
78
|
+
add_ip(xml, options)
|
79
|
+
add_auth_purchase_params(xml, options)
|
80
|
+
add_level_3_fields(xml, options) if options[:level_3_data]
|
81
|
+
end
|
82
|
+
commit(request)
|
83
|
+
end
|
84
|
+
|
85
|
+
def capture(money, authorization, options = {})
|
86
|
+
request = build_xml_request do |xml|
|
87
|
+
xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
|
88
|
+
|
89
|
+
if options[:credit_card]
|
90
|
+
xml.ssl_transaction_type self.actions[:capture]
|
91
|
+
xml.ssl_amount amount(money)
|
92
|
+
add_salestax(xml, options)
|
93
|
+
add_approval_code(xml, authorization)
|
94
|
+
add_invoice(xml, options)
|
95
|
+
add_creditcard(xml, options[:credit_card])
|
96
|
+
add_currency(xml, money, options)
|
97
|
+
add_address(xml, options)
|
98
|
+
add_customer_email(xml, options)
|
99
|
+
add_test_mode(xml, options)
|
100
|
+
else
|
101
|
+
xml.ssl_transaction_type self.actions[:capture_complete]
|
102
|
+
xml.ssl_amount amount(money)
|
103
|
+
add_currency(xml, money, options)
|
104
|
+
add_txn_id(xml, authorization)
|
105
|
+
add_partial_shipment_flag(xml, options)
|
106
|
+
add_test_mode(xml, options)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
commit(request)
|
110
|
+
end
|
111
|
+
|
112
|
+
def refund(money, identification, options = {})
|
113
|
+
request = build_xml_request do |xml|
|
114
|
+
xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
|
115
|
+
xml.ssl_transaction_type self.actions[:refund]
|
116
|
+
xml.ssl_amount amount(money)
|
117
|
+
add_txn_id(xml, identification)
|
118
|
+
add_test_mode(xml, options)
|
119
|
+
end
|
120
|
+
commit(request)
|
121
|
+
end
|
122
|
+
|
123
|
+
def void(identification, options = {})
|
124
|
+
request = build_xml_request do |xml|
|
125
|
+
xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
|
126
|
+
xml.ssl_transaction_type self.actions[:void]
|
127
|
+
|
128
|
+
add_txn_id(xml, identification)
|
129
|
+
add_test_mode(xml, options)
|
130
|
+
end
|
131
|
+
commit(request)
|
132
|
+
end
|
133
|
+
|
134
|
+
def credit(money, creditcard, options = {})
|
135
|
+
raise ArgumentError, 'Reference credits are not supported. Please supply the original credit card or use the #refund method.' if creditcard.is_a?(String)
|
136
|
+
|
137
|
+
request = build_xml_request do |xml|
|
138
|
+
xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
|
139
|
+
xml.ssl_transaction_type self.actions[:credit]
|
140
|
+
xml.ssl_amount amount(money)
|
141
|
+
add_invoice(xml, options)
|
142
|
+
add_creditcard(xml, creditcard)
|
143
|
+
add_currency(xml, money, options)
|
144
|
+
add_address(xml, options)
|
145
|
+
add_customer_email(xml, options)
|
146
|
+
add_test_mode(xml, options)
|
147
|
+
end
|
148
|
+
commit(request)
|
149
|
+
end
|
150
|
+
|
151
|
+
def verify(credit_card, options = {})
|
152
|
+
request = build_xml_request do |xml|
|
153
|
+
xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
|
154
|
+
xml.ssl_transaction_type self.actions[:verify]
|
155
|
+
add_creditcard(xml, credit_card)
|
156
|
+
add_address(xml, options)
|
157
|
+
add_test_mode(xml, options)
|
158
|
+
add_ip(xml, options)
|
159
|
+
end
|
160
|
+
commit(request)
|
161
|
+
end
|
162
|
+
|
163
|
+
def store(creditcard, options = {})
|
164
|
+
request = build_xml_request do |xml|
|
165
|
+
xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
|
166
|
+
xml.ssl_transaction_type self.actions[:store]
|
167
|
+
xml.ssl_add_token 'Y'
|
168
|
+
add_creditcard(xml, creditcard)
|
169
|
+
add_address(xml, options)
|
170
|
+
add_customer_email(xml, options)
|
171
|
+
add_test_mode(xml, options)
|
172
|
+
add_verification(xml, options)
|
173
|
+
end
|
174
|
+
commit(request)
|
175
|
+
end
|
176
|
+
|
177
|
+
def update(token, creditcard, options = {})
|
178
|
+
request = build_xml_request do |xml|
|
179
|
+
xml.ssl_vendor_id @options[:ssl_vendor_id] || options[:ssl_vendor_id]
|
180
|
+
xml.ssl_transaction_type self.actions[:update]
|
181
|
+
add_token(xml, token)
|
182
|
+
add_creditcard(xml, creditcard)
|
183
|
+
add_address(xml, options)
|
184
|
+
add_customer_email(xml, options)
|
185
|
+
add_test_mode(xml, options)
|
186
|
+
end
|
187
|
+
commit(request)
|
188
|
+
end
|
189
|
+
|
190
|
+
def supports_scrubbing?
|
191
|
+
true
|
192
|
+
end
|
193
|
+
|
194
|
+
def scrub(transcript)
|
195
|
+
transcript.
|
196
|
+
gsub(%r((<ssl_pin>)(.*)(</ssl_pin>)), '\1[FILTERED]\3').
|
197
|
+
gsub(%r((<ssl_card_number>)(.*)(</ssl_card_number>)), '\1[FILTERED]\3').
|
198
|
+
gsub(%r((<ssl_cvv2cvc2>)(.*)(</ssl_cvv2cvc2>)), '\1[FILTERED]\3')
|
199
|
+
end
|
200
|
+
|
201
|
+
private
|
202
|
+
|
203
|
+
def add_invoice(xml, options)
|
204
|
+
xml.ssl_invoice_number url_encode_truncate((options[:order_id] || options[:invoice]), 25)
|
205
|
+
xml.ssl_description url_encode_truncate(options[:description], 255)
|
206
|
+
end
|
207
|
+
|
208
|
+
def add_approval_code(xml, authorization)
|
209
|
+
xml.ssl_approval_code authorization.split(';').first
|
210
|
+
end
|
211
|
+
|
212
|
+
def add_txn_id(xml, authorization)
|
213
|
+
xml.ssl_txn_id authorization.split(';').last
|
214
|
+
end
|
215
|
+
|
216
|
+
def add_creditcard(xml, creditcard)
|
217
|
+
xml.ssl_card_number creditcard.number
|
218
|
+
xml.ssl_exp_date expdate(creditcard)
|
219
|
+
|
220
|
+
add_verification_value(xml, creditcard) if creditcard.verification_value?
|
221
|
+
|
222
|
+
xml.ssl_first_name url_encode_truncate(creditcard.first_name, 20)
|
223
|
+
xml.ssl_last_name url_encode_truncate(creditcard.last_name, 30)
|
224
|
+
end
|
225
|
+
|
226
|
+
def add_currency(xml, money, options)
|
227
|
+
currency = options[:currency] || currency(money)
|
228
|
+
return unless currency && (@options[:multi_currency] || options[:multi_currency])
|
229
|
+
|
230
|
+
xml.ssl_transaction_currency currency
|
231
|
+
end
|
232
|
+
|
233
|
+
def add_token(xml, token)
|
234
|
+
xml.ssl_token token
|
235
|
+
end
|
236
|
+
|
237
|
+
def add_verification_value(xml, creditcard)
|
238
|
+
xml.ssl_cvv2cvc2 creditcard.verification_value
|
239
|
+
xml.ssl_cvv2cvc2_indicator 1
|
240
|
+
end
|
241
|
+
|
242
|
+
def add_customer_email(xml, options)
|
243
|
+
xml.ssl_email url_encode_truncate(options[:email], 100) unless empty?(options[:email])
|
244
|
+
end
|
245
|
+
|
246
|
+
def add_salestax(xml, options)
|
247
|
+
return unless options[:tax].present?
|
248
|
+
|
249
|
+
xml.ssl_salestax options[:tax]
|
250
|
+
end
|
251
|
+
|
252
|
+
def add_address(xml, options)
|
253
|
+
billing_address = options[:billing_address] || options[:address]
|
254
|
+
|
255
|
+
if billing_address
|
256
|
+
xml.ssl_avs_address url_encode_truncate(billing_address[:address1], 30)
|
257
|
+
xml.ssl_address2 url_encode_truncate(billing_address[:address2], 30)
|
258
|
+
xml.ssl_avs_zip url_encode_truncate(billing_address[:zip].to_s.gsub(/[^a-zA-Z0-9]/, ''), 9)
|
259
|
+
xml.ssl_city url_encode_truncate(billing_address[:city], 30)
|
260
|
+
xml.ssl_state url_encode_truncate(billing_address[:state], 10)
|
261
|
+
xml.ssl_company url_encode_truncate(billing_address[:company], 50)
|
262
|
+
xml.ssl_phone url_encode_truncate(billing_address[:phone], 20)
|
263
|
+
xml.ssl_country url_encode_truncate(billing_address[:country], 50)
|
264
|
+
end
|
265
|
+
|
266
|
+
if shipping_address = options[:shipping_address]
|
267
|
+
xml.ssl_ship_to_address1 url_encode_truncate(shipping_address[:address1], 30)
|
268
|
+
xml.ssl_ship_to_address2 url_encode_truncate(shipping_address[:address2], 30)
|
269
|
+
xml.ssl_ship_to_city url_encode_truncate(shipping_address[:city], 30)
|
270
|
+
xml.ssl_ship_to_company url_encode_truncate(shipping_address[:company], 50)
|
271
|
+
xml.ssl_ship_to_country url_encode_truncate(shipping_address[:country], 50)
|
272
|
+
xml.ssl_ship_to_first_name url_encode_truncate(shipping_address[:first_name], 20)
|
273
|
+
xml.ssl_ship_to_last_name url_encode_truncate(shipping_address[:last_name], 30)
|
274
|
+
xml.ssl_ship_to_phone url_encode_truncate(shipping_address[:phone], 10)
|
275
|
+
xml.ssl_ship_to_state url_encode_truncate(shipping_address[:state], 2)
|
276
|
+
xml.ssl_ship_to_zip url_encode_truncate(shipping_address[:zip], 10)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
def add_verification(xml, options)
|
281
|
+
xml.ssl_verify 'Y' if options[:verify]
|
282
|
+
end
|
283
|
+
|
284
|
+
def add_test_mode(xml, options)
|
285
|
+
xml.ssl_test_mode 'TRUE' if options[:test_mode]
|
286
|
+
end
|
287
|
+
|
288
|
+
def add_partial_shipment_flag(xml, options)
|
289
|
+
xml.ssl_partial_shipment_flag 'Y' if options[:partial_shipment_flag]
|
290
|
+
end
|
291
|
+
|
292
|
+
def add_ip(xml, options)
|
293
|
+
xml.ssl_cardholder_ip options[:ip] if options.has_key?(:ip)
|
294
|
+
end
|
295
|
+
|
296
|
+
# 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)
|
298
|
+
xml.ssl_dynamic_dba options[:dba] if options.has_key?(:dba)
|
299
|
+
xml.ssl_merchant_initiated_unscheduled merchant_initiated_unscheduled(options) if merchant_initiated_unscheduled(options)
|
300
|
+
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
|
+
xml.ssl_customer_code options[:customer] if options.has_key?(:customer)
|
303
|
+
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)
|
305
|
+
add_custom_fields(xml, options) if options[:custom_fields]
|
306
|
+
add_stored_credential(xml, options) if options[:stored_credential]
|
307
|
+
end
|
308
|
+
|
309
|
+
def add_custom_fields(xml, options)
|
310
|
+
options[:custom_fields]&.each do |key, value|
|
311
|
+
xml.send(key.to_sym, value)
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
def add_level_3_fields(xml, options)
|
316
|
+
level_3_data = options[:level_3_data]
|
317
|
+
xml.ssl_customer_code level_3_data[:customer_code] if level_3_data[:customer_code]
|
318
|
+
xml.ssl_salestax level_3_data[:salestax] if level_3_data[:salestax]
|
319
|
+
xml.ssl_salestax_indicator level_3_data[:salestax_indicator] if level_3_data[:salestax_indicator]
|
320
|
+
xml.ssl_level3_indicator level_3_data[:level3_indicator] if level_3_data[:level3_indicator]
|
321
|
+
xml.ssl_ship_to_zip level_3_data[:ship_to_zip] if level_3_data[:ship_to_zip]
|
322
|
+
xml.ssl_ship_to_country level_3_data[:ship_to_country] if level_3_data[:ship_to_country]
|
323
|
+
xml.ssl_shipping_amount level_3_data[:shipping_amount] if level_3_data[:shipping_amount]
|
324
|
+
xml.ssl_ship_from_postal_code level_3_data[:ship_from_postal_code] if level_3_data[:ship_from_postal_code]
|
325
|
+
xml.ssl_discount_amount level_3_data[:discount_amount] if level_3_data[:discount_amount]
|
326
|
+
xml.ssl_duty_amount level_3_data[:duty_amount] if level_3_data[:duty_amount]
|
327
|
+
xml.ssl_national_tax_indicator level_3_data[:national_tax_indicator] if level_3_data[:national_tax_indicator]
|
328
|
+
xml.ssl_national_tax_amount level_3_data[:national_tax_amount] if level_3_data[:national_tax_amount]
|
329
|
+
xml.ssl_order_date level_3_data[:order_date] if level_3_data[:order_date]
|
330
|
+
xml.ssl_other_tax level_3_data[:other_tax] if level_3_data[:other_tax]
|
331
|
+
xml.ssl_summary_commodity_code level_3_data[:summary_commodity_code] if level_3_data[:summary_commodity_code]
|
332
|
+
xml.ssl_merchant_vat_number level_3_data[:merchant_vat_number] if level_3_data[:merchant_vat_number]
|
333
|
+
xml.ssl_customer_vat_number level_3_data[:customer_vat_number] if level_3_data[:customer_vat_number]
|
334
|
+
xml.ssl_freight_tax_amount level_3_data[:freight_tax_amount] if level_3_data[:freight_tax_amount]
|
335
|
+
xml.ssl_vat_invoice_number level_3_data[:vat_invoice_number] if level_3_data[:vat_invoice_number]
|
336
|
+
xml.ssl_tracking_number level_3_data[:tracking_number] if level_3_data[:tracking_number]
|
337
|
+
xml.ssl_shipping_company level_3_data[:shipping_company] if level_3_data[:shipping_company]
|
338
|
+
xml.ssl_other_fees level_3_data[:other_fees] if level_3_data[:other_fees]
|
339
|
+
add_line_items(xml, level_3_data) if level_3_data[:line_items]
|
340
|
+
end
|
341
|
+
|
342
|
+
def add_line_items(xml, level_3_data)
|
343
|
+
xml.LineItemProducts {
|
344
|
+
level_3_data[:line_items].each do |line_item|
|
345
|
+
xml.product {
|
346
|
+
line_item.each do |key, value|
|
347
|
+
prefixed_key = "ssl_line_Item_#{key}"
|
348
|
+
xml.send(prefixed_key, value)
|
349
|
+
end
|
350
|
+
}
|
351
|
+
end
|
352
|
+
}
|
353
|
+
end
|
354
|
+
|
355
|
+
def add_stored_credential(xml, options)
|
356
|
+
network_transaction_id = options.dig(:stored_credential, :network_transaction_id)
|
357
|
+
case
|
358
|
+
when network_transaction_id.nil?
|
359
|
+
return
|
360
|
+
when network_transaction_id.to_s.include?('|')
|
361
|
+
oar_data, ps2000_data = options[:stored_credential][:network_transaction_id].split('|')
|
362
|
+
xml.ssl_oar_data oar_data unless oar_data.nil? || oar_data.empty?
|
363
|
+
xml.ssl_ps2000_data ps2000_data unless ps2000_data.nil? || ps2000_data.empty?
|
364
|
+
when network_transaction_id.to_s.length > 22
|
365
|
+
xml.ssl_oar_data options.dig(:stored_credential, :network_transaction_id)
|
366
|
+
else
|
367
|
+
xml.ssl_ps2000_data options.dig(:stored_credential, :network_transaction_id)
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
def merchant_initiated_unscheduled(options)
|
372
|
+
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'
|
374
|
+
end
|
375
|
+
|
376
|
+
def entry_mode(options)
|
377
|
+
return options[:entry_mode] if options[:entry_mode]
|
378
|
+
return 12 if options[:stored_credential]
|
379
|
+
end
|
380
|
+
|
381
|
+
def build_xml_request
|
382
|
+
builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
|
383
|
+
xml.txn do
|
384
|
+
xml.ssl_merchant_id @options[:login]
|
385
|
+
xml.ssl_user_id @options[:user]
|
386
|
+
xml.ssl_pin @options[:password]
|
387
|
+
yield(xml)
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
builder.to_xml.gsub("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", '')
|
392
|
+
end
|
393
|
+
|
394
|
+
def commit(request)
|
395
|
+
request = "xmldata=#{request}".delete('&')
|
396
|
+
store_action = request.match?('CCGETTOKEN')
|
397
|
+
|
398
|
+
response = parse(ssl_post(test? ? self.test_url : self.live_url, request, headers))
|
399
|
+
response = hash_html_decode(response)
|
400
|
+
|
401
|
+
Response.new(
|
402
|
+
response[:result] == '0',
|
403
|
+
response[:result_message] || response[:errorMessage],
|
404
|
+
response,
|
405
|
+
test: @options[:test] || test?,
|
406
|
+
authorization: authorization_from(response, store_action),
|
407
|
+
error_code: response[:errorCode],
|
408
|
+
avs_result: { code: response[:avs_response] },
|
409
|
+
cvv_result: response[:cvv2_response],
|
410
|
+
network_transaction_id: build_network_transaction_id(response)
|
411
|
+
)
|
412
|
+
end
|
413
|
+
|
414
|
+
def build_network_transaction_id(response)
|
415
|
+
"#{response[:oar_data]}|#{response[:ps2000_data]}"
|
416
|
+
end
|
417
|
+
|
418
|
+
def headers
|
419
|
+
{
|
420
|
+
'Accept' => 'application/xml',
|
421
|
+
'Content-type' => 'application/x-www-form-urlencoded;charset=utf8'
|
422
|
+
}
|
423
|
+
end
|
424
|
+
|
425
|
+
def parse(body)
|
426
|
+
xml = Nokogiri::XML(body)
|
427
|
+
response = Hash.from_xml(xml.to_s)['txn']
|
428
|
+
|
429
|
+
response.deep_transform_keys { |key| key.gsub('ssl_', '').to_sym }
|
430
|
+
end
|
431
|
+
|
432
|
+
def authorization_from(response, store_action)
|
433
|
+
return response[:token] if store_action
|
434
|
+
|
435
|
+
[response[:approval_code], response[:txn_id]].join(';')
|
436
|
+
end
|
437
|
+
|
438
|
+
def url_encode_truncate(value, size)
|
439
|
+
return nil unless value
|
440
|
+
|
441
|
+
encoded = url_encode(value)
|
442
|
+
|
443
|
+
while encoded.length > size
|
444
|
+
value.chop!
|
445
|
+
encoded = url_encode(value)
|
446
|
+
end
|
447
|
+
encoded
|
448
|
+
end
|
449
|
+
|
450
|
+
def url_encode(value)
|
451
|
+
if value.is_a?(String)
|
452
|
+
encoded = CGI.escape(value)
|
453
|
+
encoded = encoded.tr('+', ' ') # don't encode spaces
|
454
|
+
encoded = encoded.gsub('%26', '%26amp;') # account for Elavon's weird '&' handling
|
455
|
+
encoded
|
456
|
+
else
|
457
|
+
value.to_s
|
458
|
+
end
|
459
|
+
end
|
460
|
+
|
461
|
+
def hash_html_decode(hash)
|
462
|
+
hash.each do |k, v|
|
463
|
+
if v.is_a?(String)
|
464
|
+
# decode all string params
|
465
|
+
v = v.gsub('&amp;', '&') # account for Elavon's weird '&' handling
|
466
|
+
hash[k] = CGI.unescape_html(v)
|
467
|
+
elsif v.is_a?(Hash)
|
468
|
+
hash_html_decode(v)
|
469
|
+
end
|
470
|
+
end
|
471
|
+
hash
|
472
|
+
end
|
473
|
+
end
|
474
|
+
end
|
475
|
+
end
|