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,1612 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'digest'
|
3
|
+
|
4
|
+
module ActiveMerchant #:nodoc:
|
5
|
+
module Billing #:nodoc:
|
6
|
+
# ==== USA ePay Advanced SOAP Interface
|
7
|
+
#
|
8
|
+
# This class encapsulates USA ePay's Advanced SOAP Interface. The Advanced Soap Interface allows
|
9
|
+
# standard transactions, storing customer information, and recurring billing. Storing sensitive
|
10
|
+
# information on USA ePay's servers can help with PCI DSS compliance, since customer and card data
|
11
|
+
# do not need to be stored locally.
|
12
|
+
#
|
13
|
+
# Make sure you have enabled this functionality for your account with USA ePay.
|
14
|
+
#
|
15
|
+
# Information about the Advanced SOAP interface is available on the {USA ePay wiki}[http://wiki.usaepay.com/developer/soap].
|
16
|
+
#
|
17
|
+
# ==== Login, Password, and Software ID
|
18
|
+
#
|
19
|
+
# Please follow all of USA ePay's directions for acquiring all accounts and settings.
|
20
|
+
#
|
21
|
+
# The value used for <tt>:login</tt> is the Key value found in the Merchant Console under Settings > Source
|
22
|
+
# Key. You will have to add this key in the USA ePay Merchant Console.
|
23
|
+
#
|
24
|
+
# The value used for <tt>:password</tt> is the pin value also found and assigned in the Merchant Console under
|
25
|
+
# Settings > Source Key. The pin is required to use all but basic transactions in the SOAP interface.
|
26
|
+
# You will have to add the pin to your source key, as it defaults to none.
|
27
|
+
#
|
28
|
+
# The value used for the <tt>:software_id</tt> is found in the Developer's Login under the Developers Center
|
29
|
+
# in your WSDL. It is the 8 character value in <soap:address> tag. A masked example:
|
30
|
+
# <soap:address location="https://www.usaepay.com/soap/gate/XXXXXXXX"/>
|
31
|
+
# It is also found in the link to your WSDL. This is required as every account has a different path
|
32
|
+
# SOAP requests are submitted to. Optionally, you can provide the entire urls via <tt>:live_url</tt> and <tt>:test_url</tt>, if your prefer.
|
33
|
+
#
|
34
|
+
# ==== Responses
|
35
|
+
# * <tt>#success?</tt> -- +true+ if transmitted and returned correctly
|
36
|
+
# * <tt>#message</tt> -- response or fault message
|
37
|
+
# * <tt>#authorization</tt> -- reference_number or nil
|
38
|
+
# * <tt>#params</tt> -- hash of entire soap response contents
|
39
|
+
#
|
40
|
+
# ==== Address Options
|
41
|
+
# * <tt>:billing_address/:shipping_address</tt> -- contains some extra options
|
42
|
+
# * <tt>:name</tt> -- virtual attribute; will split to first and last name
|
43
|
+
# * <tt>:first_name</tt>
|
44
|
+
# * <tt>:last_name</tt>
|
45
|
+
# * <tt>:address1 </tt>
|
46
|
+
# * <tt>:address2 </tt>
|
47
|
+
# * <tt>:city </tt>
|
48
|
+
# * <tt>:state </tt>
|
49
|
+
# * <tt>:zip </tt>
|
50
|
+
# * <tt>:country </tt>
|
51
|
+
# * <tt>:phone</tt>
|
52
|
+
# * <tt>:email</tt>
|
53
|
+
# * <tt>:fax</tt>
|
54
|
+
# * <tt>:company</tt>
|
55
|
+
#
|
56
|
+
# ==== Support:
|
57
|
+
# * Questions: post to {active_merchant google group}[http://groups.google.com/group/activemerchant]
|
58
|
+
# * Feedback/fixes: matt (at) nearapogee (dot) com
|
59
|
+
#
|
60
|
+
# ==== Links:
|
61
|
+
# * {USA ePay Merchant Console}[https://sandbox.usaepay.com/login]
|
62
|
+
# * {USA ePay Developer Login}[https://www.usaepay.com/developer/login]
|
63
|
+
#
|
64
|
+
class UsaEpayAdvancedGateway < Gateway
|
65
|
+
API_VERSION = '1.4'
|
66
|
+
|
67
|
+
TEST_URL_BASE = 'https://sandbox.usaepay.com/soap/gate/' #:nodoc:
|
68
|
+
LIVE_URL_BASE = 'https://www.usaepay.com/soap/gate/' #:nodoc:
|
69
|
+
|
70
|
+
self.test_url = TEST_URL_BASE
|
71
|
+
self.live_url = LIVE_URL_BASE
|
72
|
+
|
73
|
+
FAILURE_MESSAGE = 'Default Failure' #:nodoc:
|
74
|
+
|
75
|
+
self.supported_countries = ['US']
|
76
|
+
self.supported_cardtypes = %i[visa master american_express discover diners_club jcb]
|
77
|
+
self.homepage_url = 'http://www.usaepay.com/'
|
78
|
+
self.display_name = 'USA ePay Advanced SOAP Interface'
|
79
|
+
|
80
|
+
CUSTOMER_PROFILE_OPTIONS = {
|
81
|
+
id: [:string, 'CustomerID'], # merchant assigned number
|
82
|
+
notes: [:string, 'Notes'],
|
83
|
+
data: [:string, 'CustomData'],
|
84
|
+
url: [:string, 'URL']
|
85
|
+
} #:nodoc:
|
86
|
+
|
87
|
+
CUSTOMER_RECURRING_BILLING_OPTIONS = {
|
88
|
+
enabled: [:boolean, 'Enabled'],
|
89
|
+
schedule: [:string, 'Schedule'],
|
90
|
+
number_left: [:integer, 'NumLeft'],
|
91
|
+
currency: [:string, 'Currency'],
|
92
|
+
description: [:string, 'Description'],
|
93
|
+
order_id: [:string, 'OrderID'],
|
94
|
+
user: [:string, 'User'],
|
95
|
+
source: [:string, 'Source'],
|
96
|
+
send_receipt: [:boolean, 'SendReceipt'],
|
97
|
+
receipt_note: [:string, 'ReceiptNote']
|
98
|
+
} #:nodoc:
|
99
|
+
|
100
|
+
CUSTOMER_POINT_OF_SALE_OPTIONS = {
|
101
|
+
price_tier: [:string, 'PriceTier'],
|
102
|
+
tax_class: [:string, 'TaxClass'],
|
103
|
+
lookup_code: [:string, 'LookupCode']
|
104
|
+
} #:nodoc:
|
105
|
+
|
106
|
+
CUSTOMER_OPTIONS = [
|
107
|
+
CUSTOMER_PROFILE_OPTIONS,
|
108
|
+
CUSTOMER_RECURRING_BILLING_OPTIONS,
|
109
|
+
CUSTOMER_POINT_OF_SALE_OPTIONS
|
110
|
+
].inject(:merge) #:nodoc:
|
111
|
+
|
112
|
+
COMMON_ADDRESS_OPTIONS = {
|
113
|
+
first_name: [:string, 'FirstName'],
|
114
|
+
last_name: [:string, 'LastName'],
|
115
|
+
city: [:string, 'City'],
|
116
|
+
state: [:string, 'State'],
|
117
|
+
zip: [:string, 'Zip'],
|
118
|
+
country: [:string, 'Country'],
|
119
|
+
phone: [:string, 'Phone'],
|
120
|
+
email: [:string, 'Email'],
|
121
|
+
fax: [:string, 'Fax'],
|
122
|
+
company: [:string, 'Company']
|
123
|
+
} #:nodoc:
|
124
|
+
|
125
|
+
ADDRESS_OPTIONS = [
|
126
|
+
COMMON_ADDRESS_OPTIONS,
|
127
|
+
{
|
128
|
+
address1: [:string, 'Street'],
|
129
|
+
address2: [:string, 'Street2']
|
130
|
+
}
|
131
|
+
].inject(:merge) #:nodoc
|
132
|
+
|
133
|
+
CUSTOMER_UPDATE_DATA_FIELDS = [
|
134
|
+
CUSTOMER_PROFILE_OPTIONS,
|
135
|
+
CUSTOMER_RECURRING_BILLING_OPTIONS,
|
136
|
+
COMMON_ADDRESS_OPTIONS,
|
137
|
+
{
|
138
|
+
address1: [:string, 'Address'],
|
139
|
+
address2: [:string, 'Address2']
|
140
|
+
},
|
141
|
+
{
|
142
|
+
card_number: [:string, 'CardNumber'],
|
143
|
+
card_exp: [:string, 'CardExp'],
|
144
|
+
account: [:string, 'Account'],
|
145
|
+
routing: [:string, 'Routing'],
|
146
|
+
check_format: [:string, 'CheckFormat'],
|
147
|
+
record_type: [:string, 'RecordType']
|
148
|
+
}
|
149
|
+
].inject(:merge) #:nodoc
|
150
|
+
|
151
|
+
CUSTOMER_TRANSACTION_REQUEST_OPTIONS = {
|
152
|
+
command: [:string, 'Command'],
|
153
|
+
ignore_duplicate: [:boolean, 'IgnoreDuplicate'],
|
154
|
+
client_ip: [:string, 'ClientIP'],
|
155
|
+
customer_receipt: [:boolean, 'CustReceipt'],
|
156
|
+
customer_email: [:boolean, 'CustReceiptEmail'],
|
157
|
+
customer_template: [:boolean, 'CustReceiptName'],
|
158
|
+
merchant_receipt: [:boolean, 'MerchReceipt'],
|
159
|
+
merchant_email: [:boolean, 'MerchReceiptEmail'],
|
160
|
+
merchant_template: [:boolean, 'MerchReceiptName'],
|
161
|
+
recurring: [:boolean, 'isRecurring'],
|
162
|
+
verification_value: [:string, 'CardCode'],
|
163
|
+
software: [:string, 'Software']
|
164
|
+
} #:nodoc:
|
165
|
+
|
166
|
+
TRANSACTION_REQUEST_OBJECT_OPTIONS = {
|
167
|
+
command: [:string, 'Command'],
|
168
|
+
ignore_duplicate: [:boolean, 'IgnoreDuplicate'],
|
169
|
+
authorization_code: [:string, 'AuthCode'],
|
170
|
+
reference_number: [:string, 'RefNum'],
|
171
|
+
account_holder: [:string, 'AccountHolder'],
|
172
|
+
client_ip: [:string, 'ClientIP'],
|
173
|
+
customer_id: [:string, 'CustomerID'],
|
174
|
+
customer_receipt: [:boolean, 'CustReceipt'],
|
175
|
+
customer_template: [:boolean, 'CustReceiptName'],
|
176
|
+
software: [:string, 'Software']
|
177
|
+
} #:nodoc:
|
178
|
+
|
179
|
+
TRANSACTION_DETAIL_OPTIONS = {
|
180
|
+
invoice: [:string, 'Invoice'],
|
181
|
+
po_number: [:string, 'PONum'],
|
182
|
+
order_id: [:string, 'OrderID'],
|
183
|
+
clerk: [:string, 'Clerk'],
|
184
|
+
terminal: [:string, 'Terminal'],
|
185
|
+
table: [:string, 'Table'],
|
186
|
+
description: [:string, 'Description'],
|
187
|
+
comments: [:string, 'Comments'],
|
188
|
+
allow_partial_auth: [:boolean, 'AllowPartialAuth'],
|
189
|
+
currency: [:string, 'Currency'],
|
190
|
+
non_tax: [:boolean, 'NonTax']
|
191
|
+
} #:nodoc:
|
192
|
+
|
193
|
+
TRANSACTION_DETAIL_MONEY_OPTIONS = {
|
194
|
+
amount: [:double, 'Amount'],
|
195
|
+
tax: [:double, 'Tax'],
|
196
|
+
tip: [:double, 'Tip'],
|
197
|
+
non_tax: [:boolean, 'NonTax'],
|
198
|
+
shipping: [:double, 'Shipping'],
|
199
|
+
discount: [:double, 'Discount'],
|
200
|
+
subtotal: [:double, 'Subtotal']
|
201
|
+
} #:nodoc:
|
202
|
+
|
203
|
+
CREDIT_CARD_DATA_OPTIONS = {
|
204
|
+
magnetic_stripe: [:string, 'MagStripe'],
|
205
|
+
dukpt: [:string, 'DUKPT'],
|
206
|
+
signature: [:string, 'Signature'],
|
207
|
+
terminal_type: [:string, 'TermType'],
|
208
|
+
magnetic_support: [:string, 'MagSupport'],
|
209
|
+
xid: [:string, 'XID'],
|
210
|
+
cavv: [:string, 'CAVV'],
|
211
|
+
eci: [:integer, 'ECI'],
|
212
|
+
internal_card_authorization: [:boolean, 'InternalCardAuth'],
|
213
|
+
pares: [:string, 'Pares']
|
214
|
+
} #:nodoc:
|
215
|
+
|
216
|
+
CHECK_DATA_OPTIONS = {
|
217
|
+
drivers_license: [:string, 'DriversLicense'],
|
218
|
+
drivers_license_state: [:string, 'DriversLicenseState'],
|
219
|
+
record_type: [:string, 'RecordType'],
|
220
|
+
aux_on_us: [:string, 'AuxOnUS'],
|
221
|
+
epc_code: [:string, 'EpcCode'],
|
222
|
+
front_image: [:string, 'FrontImage'],
|
223
|
+
back_image: [:string, 'BackImage']
|
224
|
+
} #:nodoc:
|
225
|
+
|
226
|
+
RECURRING_BILLING_OPTIONS = {
|
227
|
+
schedule: [:string, 'Schedule'],
|
228
|
+
number_left: [:integer, 'NumLeft'],
|
229
|
+
enabled: [:boolean, 'Enabled']
|
230
|
+
} #:nodoc:
|
231
|
+
|
232
|
+
AVS_RESULTS = {
|
233
|
+
'Y' => %w(YYY Y YYA YYD),
|
234
|
+
'Z' => %w(NYZ Z),
|
235
|
+
'A' => %w(YNA A YNY),
|
236
|
+
'N' => %w(NNN N NN),
|
237
|
+
'X' => %w(YYX X),
|
238
|
+
'W' => %w(NYW W),
|
239
|
+
'XXW' => %w(XXW),
|
240
|
+
'XXU' => %w(XXU),
|
241
|
+
'R' => %w(XXR R U E),
|
242
|
+
'S' => %w(XXS S),
|
243
|
+
'XXE' => %w(XXE),
|
244
|
+
'G' => %w(XXG G C I),
|
245
|
+
'B' => %w(YYG B M),
|
246
|
+
'D' => %w(GGG D),
|
247
|
+
'P' => %w(YGG P)
|
248
|
+
}.inject({}) do |map, (type, codes)|
|
249
|
+
codes.each { |code| map[code] = type }
|
250
|
+
map
|
251
|
+
end #:nodoc:
|
252
|
+
|
253
|
+
AVS_CUSTOM_MESSAGES = {
|
254
|
+
'XXW' => 'Card number not on file.',
|
255
|
+
'XXU' => 'Address information not verified for domestic transaction.',
|
256
|
+
'XXE' => 'Address verification not allowed for card type.'
|
257
|
+
} #:nodoc:
|
258
|
+
|
259
|
+
# Create a new gateway.
|
260
|
+
#
|
261
|
+
# ==== Required
|
262
|
+
# * At least the live_url OR the software_id must be present.
|
263
|
+
# * <tt>:software_id</tt> -- 8 character software id
|
264
|
+
# OR
|
265
|
+
# * <tt>:test_url</tt> -- full url for testing
|
266
|
+
# * <tt>:live_url</tt> -- full url for live/production
|
267
|
+
#
|
268
|
+
# ==== Optional
|
269
|
+
# * <tt>:soap_response</tt> -- set to +true+ to add :soap_response to the params hash containing the entire soap xml message
|
270
|
+
#
|
271
|
+
def initialize(options = {})
|
272
|
+
requires!(options, :login, :password)
|
273
|
+
|
274
|
+
if options[:software_id]
|
275
|
+
self.live_url = "#{LIVE_URL_BASE}#{options[:software_id]}"
|
276
|
+
self.test_url = "#{TEST_URL_BASE}#{options[:software_id]}"
|
277
|
+
else
|
278
|
+
self.live_url = options[:live_url].to_s
|
279
|
+
self.test_url = options[:test_url].to_s if options[:test_url]
|
280
|
+
end
|
281
|
+
|
282
|
+
super
|
283
|
+
end
|
284
|
+
|
285
|
+
# Standard Gateway Methods ======================================
|
286
|
+
|
287
|
+
# Make a purchase with a credit card. (Authorize and
|
288
|
+
# capture for settlement.)
|
289
|
+
#
|
290
|
+
# Note: See run_transaction for additional options.
|
291
|
+
#
|
292
|
+
def purchase(money, creditcard, options = {})
|
293
|
+
run_sale(options.merge!(amount: money, payment_method: creditcard))
|
294
|
+
end
|
295
|
+
|
296
|
+
# Authorize an amount on a credit card or account.
|
297
|
+
#
|
298
|
+
# Note: See run_transaction for additional options.
|
299
|
+
#
|
300
|
+
def authorize(money, creditcard, options = {})
|
301
|
+
run_auth_only(options.merge!(amount: money, payment_method: creditcard))
|
302
|
+
end
|
303
|
+
|
304
|
+
# Capture an authorized transaction.
|
305
|
+
#
|
306
|
+
# Note: See run_transaction for additional options.
|
307
|
+
#
|
308
|
+
def capture(money, identification, options = {})
|
309
|
+
capture_transaction(options.merge!(amount: money, reference_number: identification))
|
310
|
+
end
|
311
|
+
|
312
|
+
# Void a previous transaction that has not been settled.
|
313
|
+
#
|
314
|
+
# Note: See run_transaction for additional options.
|
315
|
+
#
|
316
|
+
def void(identification, options = {})
|
317
|
+
void_transaction(options.merge!(reference_number: identification))
|
318
|
+
end
|
319
|
+
|
320
|
+
# Refund a previous transaction.
|
321
|
+
#
|
322
|
+
# Note: See run_transaction for additional options.
|
323
|
+
#
|
324
|
+
def refund(money, identification, options = {})
|
325
|
+
refund_transaction(options.merge!(amount: money, reference_number: identification))
|
326
|
+
end
|
327
|
+
|
328
|
+
def credit(money, identification, options = {})
|
329
|
+
ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
|
330
|
+
refund(money, identification, options)
|
331
|
+
end
|
332
|
+
|
333
|
+
# Customer ======================================================
|
334
|
+
|
335
|
+
# Add a customer.
|
336
|
+
#
|
337
|
+
# ==== Options
|
338
|
+
# * <tt>:id</tt> -- merchant assigned id
|
339
|
+
# * <tt>:notes</tt> -- notes about customer
|
340
|
+
# * <tt>:data</tt> -- base64 data about customer
|
341
|
+
# * <tt>:url</tt> -- customer website
|
342
|
+
# * <tt>:billing_address</tt> -- usual options
|
343
|
+
# * <tt>:payment_methods</tt> -- array of payment method hashes.
|
344
|
+
# * <tt>:method</tt> -- credit_card or check
|
345
|
+
# * <tt>:name</tt> -- optional name/label for the method
|
346
|
+
# * <tt>:sort</tt> -- optional integer value specifying the backup sort order, 0 is default
|
347
|
+
#
|
348
|
+
# ==== Recurring Options
|
349
|
+
# * <tt>:enabled</tt> -- +true+ enables recurring
|
350
|
+
# * <tt>:schedule</tt> -- daily, weekly, bi-weekly (every two weeks), monthly, bi-monthly (every two months), quarterly, bi-annually (every six months), annually, first of month, last day of month
|
351
|
+
# * <tt>:number_left</tt> -- number of payments left; -1 for unlimited
|
352
|
+
# * <tt>:next</tt> -- date of next payment (Date/Time)
|
353
|
+
# * <tt>:amount</tt> -- amount of recurring payment
|
354
|
+
# * <tt>:tax</tt> -- tax portion of amount
|
355
|
+
# * <tt>:currency</tt> -- numeric currency code
|
356
|
+
# * <tt>:description</tt> -- description of transaction
|
357
|
+
# * <tt>:order_id</tt> -- transaction order id
|
358
|
+
# * <tt>:user</tt> -- merchant username assigned to transaction
|
359
|
+
# * <tt>:source</tt> -- name of source key assigned to billing
|
360
|
+
# * <tt>:send_receipt</tt> -- +true+ to send client a receipt
|
361
|
+
# * <tt>:receipt_note</tt> -- leave a note on the receipt
|
362
|
+
#
|
363
|
+
# ==== Point of Sale Options
|
364
|
+
# * <tt>:price_tier</tt> -- name of customer price tier
|
365
|
+
# * <tt>:tax_class</tt> -- tax class
|
366
|
+
# * <tt>:lookup_code</tt> -- lookup code from customer/member id card; barcode or magnetic stripe; can be assigned by merchant; defaults to system assigned if blank
|
367
|
+
#
|
368
|
+
# ==== Response
|
369
|
+
# * <tt>#message</tt> -- customer number assigned by gateway
|
370
|
+
#
|
371
|
+
def add_customer(options = {})
|
372
|
+
request = build_request(__method__, options)
|
373
|
+
commit(__method__, request)
|
374
|
+
end
|
375
|
+
|
376
|
+
# Update a customer by replacing all of the customer details.
|
377
|
+
#
|
378
|
+
# ==== Required
|
379
|
+
# * <tt>:customer_number</tt> -- customer to update
|
380
|
+
#
|
381
|
+
# ==== Options
|
382
|
+
# * Same as add_customer
|
383
|
+
#
|
384
|
+
def update_customer(options = {})
|
385
|
+
requires! options, :customer_number
|
386
|
+
|
387
|
+
request = build_request(__method__, options)
|
388
|
+
commit(__method__, request)
|
389
|
+
end
|
390
|
+
|
391
|
+
# Update a customer by replacing only the provided fields.
|
392
|
+
#
|
393
|
+
# ==== Required
|
394
|
+
# * <tt>:customer_number</tt> -- customer to update
|
395
|
+
# * <tt>:update_data</tt> -- FieldValue array of fields to retrieve
|
396
|
+
# * <tt>:first_name</tt>
|
397
|
+
# * <tt>:last_name</tt>
|
398
|
+
# * <tt>:id</tt>
|
399
|
+
# * <tt>:company</tt>
|
400
|
+
# * <tt>:address</tt>
|
401
|
+
# * <tt>:address2</tt>
|
402
|
+
# * <tt>:city</tt>
|
403
|
+
# * <tt>:state</tt>
|
404
|
+
# * <tt>:zip</tt>
|
405
|
+
# * <tt>:country</tt>
|
406
|
+
# * <tt>:phone</tt>
|
407
|
+
# * <tt>:fax</tt>
|
408
|
+
# * <tt>:email</tt>
|
409
|
+
# * <tt>:url</tt>
|
410
|
+
# * <tt>:receipt_note</tt>
|
411
|
+
# * <tt>:send_receipt</tt>
|
412
|
+
# * <tt>:notes</tt>
|
413
|
+
# * <tt>:description</tt>
|
414
|
+
# * <tt>:order_id</tt>
|
415
|
+
# * <tt>:enabled</tt>
|
416
|
+
# * <tt>:schedule</tt>
|
417
|
+
# * <tt>:next</tt>
|
418
|
+
# * <tt>:num_left</tt>
|
419
|
+
# * <tt>:amount</tt>
|
420
|
+
# * <tt>:custom_data</tt>
|
421
|
+
# * <tt>:source</tt>
|
422
|
+
# * <tt>:user</tt>
|
423
|
+
# * <tt>:card_number</tt>
|
424
|
+
# * <tt>:card_exp</tt>
|
425
|
+
# * <tt>:account</tt>
|
426
|
+
# * <tt>:routing</tt>
|
427
|
+
# * <tt>:check_format</tt> or <tt>:record_type</tt>
|
428
|
+
#
|
429
|
+
# ==== Response
|
430
|
+
# * <tt>#message</tt> -- boolean; Returns true if successful. Exception thrown all failures.
|
431
|
+
#
|
432
|
+
def quick_update_customer(options = {})
|
433
|
+
requires! options, :customer_number
|
434
|
+
requires! options, :update_data
|
435
|
+
|
436
|
+
request = build_request(__method__, options)
|
437
|
+
commit(__method__, request)
|
438
|
+
end
|
439
|
+
|
440
|
+
# Enable a customer for recurring billing.
|
441
|
+
#
|
442
|
+
# Note: Customer does not need to have all recurring parameters to succeed.
|
443
|
+
#
|
444
|
+
# ==== Required
|
445
|
+
# * <tt>:customer_number</tt>
|
446
|
+
#
|
447
|
+
def enable_customer(options = {})
|
448
|
+
requires! options, :customer_number
|
449
|
+
|
450
|
+
request = build_request(__method__, options)
|
451
|
+
commit(__method__, request)
|
452
|
+
end
|
453
|
+
|
454
|
+
# Disable a customer for recurring billing.
|
455
|
+
#
|
456
|
+
# ==== Required
|
457
|
+
# * <tt>:customer_number</tt>
|
458
|
+
#
|
459
|
+
def disable_customer(options = {})
|
460
|
+
requires! options, :customer_number
|
461
|
+
|
462
|
+
request = build_request(__method__, options)
|
463
|
+
commit(__method__, request)
|
464
|
+
end
|
465
|
+
|
466
|
+
# Add a payment method to a customer.
|
467
|
+
#
|
468
|
+
# ==== Required
|
469
|
+
# * <tt>:customer_number</tt> -- number returned by add_customer response.message
|
470
|
+
# * <tt>:payment_method</tt>
|
471
|
+
# * <tt>:method</tt> -- credit_card or check
|
472
|
+
# * <tt>:name</tt> -- optional name/label for the method
|
473
|
+
# * <tt>:sort</tt> -- an integer value specifying the backup sort order, 0 is default
|
474
|
+
#
|
475
|
+
# ==== Optional
|
476
|
+
# * <tt>:make_default</tt> -- set +true+ to make default
|
477
|
+
# * <tt>:verify</tt> -- set +true+ to run auth_only verification; throws fault if cannot verify
|
478
|
+
#
|
479
|
+
# ==== Response
|
480
|
+
# * <tt>#message</tt> -- method_id of new customer payment method
|
481
|
+
#
|
482
|
+
def add_customer_payment_method(options = {})
|
483
|
+
requires! options, :customer_number
|
484
|
+
|
485
|
+
request = build_request(__method__, options)
|
486
|
+
commit(__method__, request)
|
487
|
+
end
|
488
|
+
|
489
|
+
# Retrieve all of the payment methods belonging to a customer
|
490
|
+
#
|
491
|
+
# ==== Required
|
492
|
+
# * <tt>:customer_number</tt>
|
493
|
+
#
|
494
|
+
# ==== Response
|
495
|
+
# * <tt>#message</tt> -- either a single hash or an array of hashes of payment methods
|
496
|
+
#
|
497
|
+
def get_customer_payment_methods(options = {})
|
498
|
+
requires! options, :customer_number
|
499
|
+
|
500
|
+
request = build_request(__method__, options)
|
501
|
+
commit(__method__, request)
|
502
|
+
end
|
503
|
+
|
504
|
+
# Retrieve one of the payment methods belonging to a customer
|
505
|
+
#
|
506
|
+
# ==== Required
|
507
|
+
# * <tt>:customer_number</tt>
|
508
|
+
# * <tt>:method_id</tt>
|
509
|
+
#
|
510
|
+
# ==== Response
|
511
|
+
# * <tt>#message</tt> -- hash of payment method
|
512
|
+
#
|
513
|
+
def get_customer_payment_method(options = {})
|
514
|
+
requires! options, :customer_number, :method_id
|
515
|
+
|
516
|
+
request = build_request(__method__, options)
|
517
|
+
commit(__method__, request)
|
518
|
+
end
|
519
|
+
|
520
|
+
# Update a customer payment method.
|
521
|
+
#
|
522
|
+
# ==== Required
|
523
|
+
# * <tt>:method_id</tt> -- method_id to update
|
524
|
+
#
|
525
|
+
# ==== Options
|
526
|
+
# * <tt>:method</tt> -- credit_card or check
|
527
|
+
# * <tt>:name</tt> -- optional name/label for the method
|
528
|
+
# * <tt>:sort</tt> -- an integer value specifying the backup sort order, 0 is default
|
529
|
+
# * <tt>:verify</tt> -- set +true+ to run auth_only verification; throws fault if cannot verify
|
530
|
+
#
|
531
|
+
# ==== Response
|
532
|
+
# * <tt>#message</tt> -- hash of payment method
|
533
|
+
#
|
534
|
+
def update_customer_payment_method(options = {})
|
535
|
+
requires! options, :method_id
|
536
|
+
|
537
|
+
request = build_request(__method__, options)
|
538
|
+
commit(__method__, request)
|
539
|
+
end
|
540
|
+
|
541
|
+
# Delete one the payment methods belonging to a customer
|
542
|
+
#
|
543
|
+
# ==== Required
|
544
|
+
# * <tt>:customer_number</tt>
|
545
|
+
# * <tt>:method_id</tt>
|
546
|
+
#
|
547
|
+
def delete_customer_payment_method(options = {})
|
548
|
+
requires! options, :customer_number, :method_id
|
549
|
+
|
550
|
+
request = build_request(__method__, options)
|
551
|
+
commit(__method__, request)
|
552
|
+
end
|
553
|
+
|
554
|
+
# Delete a customer.
|
555
|
+
#
|
556
|
+
# ==== Required
|
557
|
+
# * <tt>:customer_number</tt>
|
558
|
+
#
|
559
|
+
def delete_customer(options = {})
|
560
|
+
requires! options, :customer_number
|
561
|
+
|
562
|
+
request = build_request(__method__, options)
|
563
|
+
commit(__method__, request)
|
564
|
+
end
|
565
|
+
|
566
|
+
# Run a transaction for an existing customer in the database.
|
567
|
+
#
|
568
|
+
# ==== Required Options
|
569
|
+
# * <tt>:customer_number</tt> -- gateway assigned identifier
|
570
|
+
# * <tt>:command</tt> -- Sale, AuthOnly, Credit, Check, CheckCredit
|
571
|
+
# * <tt>:amount</tt> -- total amount
|
572
|
+
#
|
573
|
+
# ==== Options
|
574
|
+
# * <tt>:method_id</tt> -- which payment method to use, 0/nil/omitted for default method
|
575
|
+
# * <tt>:ignore_duplicate</tt> -- +true+ overrides duplicate transaction
|
576
|
+
# * <tt>:client_ip</tt> -- client ip address
|
577
|
+
# * <tt>:customer_receipt</tt> -- +true+, sends receipt to customer. active_merchant defaults to +false+
|
578
|
+
# * <tt>:customer_email</tt> -- specify if different than customer record
|
579
|
+
# * <tt>:customer_template</tt> -- name of template
|
580
|
+
# * <tt>:merchant_receipt</tt> -- +true+, sends receipt to merchant. active_merchant defaults to +false+
|
581
|
+
# * <tt>:merchant_email</tt> -- required if :merchant_receipt set to +true+
|
582
|
+
# * <tt>:merchant_template</tt> -- name of template
|
583
|
+
# * <tt>:recurring</tt> -- defaults to +false+ *see documentation*
|
584
|
+
# * <tt>:verification_value</tt> -- pci forbids storage of this value, only required for CVV2 validation
|
585
|
+
# * <tt>:software</tt> -- active_merchant sets to required gateway option value
|
586
|
+
# * <tt>:line_items</tt> -- XXX not implemented yet
|
587
|
+
# * <tt>:custom_fields</tt> -- XXX not implemented yet
|
588
|
+
#
|
589
|
+
# ==== Transaction Options
|
590
|
+
# * <tt>:invoice</tt> -- transaction invoice number; truncated to 10 characters; defaults to reference_number
|
591
|
+
# * <tt>:po_number</tt> -- commercial purchase order number; upto 25 characters
|
592
|
+
# * <tt>:order_id</tt> -- should be used to assign a unique id; upto 64 characters
|
593
|
+
# * <tt>:clerk</tt> -- sales clerk
|
594
|
+
# * <tt>:terminal</tt> -- terminal name
|
595
|
+
# * <tt>:table</tt> -- table name/number
|
596
|
+
# * <tt>:description</tt> -- description
|
597
|
+
# * <tt>:comments</tt> -- comments
|
598
|
+
# * <tt>:allow_partial_auth</tt> -- allow partial authorization if full amount is not available; defaults +false+
|
599
|
+
# * <tt>:currency</tt> -- numeric currency code
|
600
|
+
# * <tt>:tax</tt> -- tax portion of amount
|
601
|
+
# * <tt>:tip</tt> -- tip portion of amount
|
602
|
+
# * <tt>:non_tax</tt> -- +true+ if transaction is non-taxable
|
603
|
+
# * <tt>:shipping</tt> -- shipping portion of amount
|
604
|
+
# * <tt>:discount</tt> -- amount of discount
|
605
|
+
# * <tt>:subtotal</tt> -- amount of transaction before tax, tip, shipping, and discount are applied
|
606
|
+
#
|
607
|
+
# ==== Response
|
608
|
+
# * <tt>#message</tt> -- transaction response hash
|
609
|
+
#
|
610
|
+
def run_customer_transaction(options = {})
|
611
|
+
requires! options, :customer_number, :command, :amount
|
612
|
+
|
613
|
+
request = build_request(__method__, options)
|
614
|
+
commit(__method__, request)
|
615
|
+
end
|
616
|
+
|
617
|
+
# Transactions ==================================================
|
618
|
+
|
619
|
+
# Run a transaction.
|
620
|
+
#
|
621
|
+
# Note: run_sale, run_auth_only, run_credit, run_check_sale, run_check_credit
|
622
|
+
# methods are also available. Each takes the same options as
|
623
|
+
# run_transaction, but the :command option is not required.
|
624
|
+
#
|
625
|
+
# Recurring Note: If recurring options are included USA ePay will create a
|
626
|
+
# new customer record with the supplied information. The customer number
|
627
|
+
# will be returned in the response.
|
628
|
+
#
|
629
|
+
# ==== Options
|
630
|
+
# * <tt>:payment_method</tt> -- credit_card or check
|
631
|
+
# * <tt>:command</tt> -- sale, credit, void, creditvoid, authonly, capture, postauth, check, checkcredit; defaults to sale; only required for run_transaction when other than sale
|
632
|
+
# * <tt>:reference_number</tt> -- for the original transaction; obtained by sale or authonly
|
633
|
+
# * <tt>:authorization_code</tt> -- required for postauth; obtained offline
|
634
|
+
# * <tt>:ignore_duplicate</tt> -- set +true+ if you want to override the duplicate transaction handling
|
635
|
+
# * <tt>:account_holder</tt> -- name of account holder
|
636
|
+
# * <tt>:customer_id</tt> -- merchant assigned id
|
637
|
+
# * <tt>:customer_receipt</tt> -- set +true+ to email receipt to billing email address
|
638
|
+
# * <tt>:customer_template</tt> -- name of template
|
639
|
+
# * <tt>:software</tt> -- stamp merchant software version for tracking
|
640
|
+
# * <tt>:billing_address</tt> -- see UsaEpayCimGateway documentation for all address fields
|
641
|
+
# * <tt>:shipping_address</tt> -- see UsaEpayCimGateway documentation for all address fields
|
642
|
+
# * <tt>:recurring</tt> -- used for recurring billing transactions
|
643
|
+
# * <tt>:schedule</tt> -- disabled, daily, weekly, bi-weekly (every two weeks), monthly, bi-monthly (every two months), quarterly, bi-annually (every six months), annually
|
644
|
+
# * <tt>:next</tt> -- date customer billed next (Date/Time)
|
645
|
+
# * <tt>:expire</tt> -- date the recurring transactions end (Date/Time)
|
646
|
+
# * <tt>:number_left</tt> -- transactions remaining in billing cycle
|
647
|
+
# * <tt>:amount</tt> -- amount to be billed each recurring transaction
|
648
|
+
# * <tt>:enabled</tt> -- states if currently active
|
649
|
+
# * <tt>:line_items</tt> -- XXX not implemented yet
|
650
|
+
# * <tt>:custom_fields</tt> -- XXX not implemented yet
|
651
|
+
#
|
652
|
+
# ==== Transaction Options
|
653
|
+
# * <tt>:amount</tt> -- total amount
|
654
|
+
# * <tt>:invoice</tt> -- transaction invoice number; truncated to 10 characters; defaults to reference_number
|
655
|
+
# * <tt>:po_number</tt> -- commercial purchase order number; upto 25 characters
|
656
|
+
# * <tt>:order_id</tt> -- should be used to assign a unique id; upto 64 characters
|
657
|
+
# * <tt>:clerk</tt> -- sales clerk
|
658
|
+
# * <tt>:terminal</tt> -- terminal name
|
659
|
+
# * <tt>:table</tt> -- table name/number
|
660
|
+
# * <tt>:description</tt> -- description
|
661
|
+
# * <tt>:comments</tt> -- comments
|
662
|
+
# * <tt>:allow_partial_auth</tt> -- allow partial authorization if full amount is not available; defaults +false+
|
663
|
+
# * <tt>:currency</tt> -- numeric currency code
|
664
|
+
# * <tt>:tax</tt> -- tax portion of amount
|
665
|
+
# * <tt>:tip</tt> -- tip portion of amount
|
666
|
+
# * <tt>:non_tax</tt> -- +true+ if transaction is non-taxable
|
667
|
+
# * <tt>:shipping</tt> -- shipping portion of amount
|
668
|
+
# * <tt>:discount</tt> -- amount of discount
|
669
|
+
# * <tt>:subtotal</tt> -- amount of transaction before tax, tip, shipping, and discount are applied
|
670
|
+
#
|
671
|
+
# ==== Response
|
672
|
+
# * <tt>#message</tt> -- transaction response hash
|
673
|
+
#
|
674
|
+
def run_transaction(options = {})
|
675
|
+
request = build_request(__method__, options)
|
676
|
+
commit(__method__, request)
|
677
|
+
end
|
678
|
+
|
679
|
+
TRANSACTION_METHODS = %i[
|
680
|
+
run_sale run_auth_only run_credit
|
681
|
+
run_check_sale run_check_credit
|
682
|
+
] #:nodoc:
|
683
|
+
|
684
|
+
TRANSACTION_METHODS.each do |method|
|
685
|
+
define_method method do |options|
|
686
|
+
request = build_request(method, options)
|
687
|
+
commit(method, request)
|
688
|
+
end
|
689
|
+
end
|
690
|
+
|
691
|
+
# Post an authorization code obtained offline.
|
692
|
+
#
|
693
|
+
# ==== Required
|
694
|
+
# * <tt>:authorization_code</tt> -- obtained offline
|
695
|
+
#
|
696
|
+
# ==== Options
|
697
|
+
# * Same as run_transaction
|
698
|
+
#
|
699
|
+
# ==== Response
|
700
|
+
# * <tt>#message</tt> -- transaction response hash
|
701
|
+
#
|
702
|
+
def post_auth(options = {})
|
703
|
+
requires! options, :authorization_code
|
704
|
+
|
705
|
+
request = build_request(__method__, options)
|
706
|
+
commit(__method__, request)
|
707
|
+
end
|
708
|
+
|
709
|
+
# Capture an authorized transaction and move it into the current batch
|
710
|
+
# for settlement.
|
711
|
+
#
|
712
|
+
# Note: Check with merchant bank for details/restrictions on differing
|
713
|
+
# amounts than the original authorization.
|
714
|
+
#
|
715
|
+
# ==== Required
|
716
|
+
# * <tt>:reference_number</tt>
|
717
|
+
#
|
718
|
+
# ==== Options
|
719
|
+
# * <tt>:amount</tt> -- may be different than original amount; 0 will void authorization
|
720
|
+
#
|
721
|
+
# ==== Response
|
722
|
+
# * <tt>#message</tt> -- transaction response hash
|
723
|
+
#
|
724
|
+
def capture_transaction(options = {})
|
725
|
+
requires! options, :reference_number
|
726
|
+
|
727
|
+
request = build_request(__method__, options)
|
728
|
+
commit(__method__, request)
|
729
|
+
end
|
730
|
+
|
731
|
+
# Void a transaction.
|
732
|
+
#
|
733
|
+
# Note: Can only be voided before being settled.
|
734
|
+
#
|
735
|
+
# ==== Required
|
736
|
+
# * <tt>:reference_number</tt>
|
737
|
+
#
|
738
|
+
# ==== Response
|
739
|
+
# * <tt>#message</tt> -- transaction response hash
|
740
|
+
#
|
741
|
+
def void_transaction(options = {})
|
742
|
+
requires! options, :reference_number
|
743
|
+
|
744
|
+
request = build_request(__method__, options)
|
745
|
+
commit(__method__, request)
|
746
|
+
end
|
747
|
+
|
748
|
+
# Refund transaction.
|
749
|
+
#
|
750
|
+
# Note: Required after a transaction has been settled. Refunds
|
751
|
+
# both credit card and check transactions.
|
752
|
+
#
|
753
|
+
# ==== Required
|
754
|
+
# * <tt>:reference_number</tt>
|
755
|
+
# * <tt>:amount</tt> -- amount to refund; 0 will refund original amount
|
756
|
+
#
|
757
|
+
# ==== Response
|
758
|
+
# * <tt>#message</tt> -- transaction response hash
|
759
|
+
#
|
760
|
+
def refund_transaction(options = {})
|
761
|
+
requires! options, :reference_number, :amount
|
762
|
+
|
763
|
+
request = build_request(__method__, options)
|
764
|
+
commit(__method__, request)
|
765
|
+
end
|
766
|
+
|
767
|
+
# Override transaction flagged for manager approval.
|
768
|
+
#
|
769
|
+
# Note: Checks only!
|
770
|
+
#
|
771
|
+
# ==== Required
|
772
|
+
# * <tt>:reference_number</tt>
|
773
|
+
#
|
774
|
+
# ==== Options
|
775
|
+
# * <tt>:reason</tt>
|
776
|
+
#
|
777
|
+
# ==== Response
|
778
|
+
# * <tt>#message</tt> -- transaction response hash
|
779
|
+
#
|
780
|
+
def override_transaction(options = {})
|
781
|
+
requires! options, :reference_number
|
782
|
+
|
783
|
+
request = build_request(__method__, options)
|
784
|
+
commit(__method__, request)
|
785
|
+
end
|
786
|
+
|
787
|
+
# Quick Transactions ============================================
|
788
|
+
|
789
|
+
# Run a sale transaction based off of a past transaction.
|
790
|
+
#
|
791
|
+
# Transfers referenced transaction's payment method to this
|
792
|
+
# transaction. As of 6/2011, USA ePay blocks credit card numbers
|
793
|
+
# at 3 years.
|
794
|
+
#
|
795
|
+
# ==== Required
|
796
|
+
# * <tt>:reference_number</tt> -- transaction to reference payment from
|
797
|
+
# * <tt>:amount</tt> -- total amount
|
798
|
+
#
|
799
|
+
# ==== Options
|
800
|
+
# * <tt>:authorize_only</tt> -- set +true+ if you just want to authorize
|
801
|
+
#
|
802
|
+
# ==== Transaction Options
|
803
|
+
# * <tt>:invoice</tt> -- transaction invoice number; truncated to 10 characters; defaults to reference_number
|
804
|
+
# * <tt>:po_number</tt> -- commercial purchase order number; upto 25 characters
|
805
|
+
# * <tt>:order_id</tt> -- should be used to assign a unique id; upto 64 characters
|
806
|
+
# * <tt>:clerk</tt> -- sales clerk
|
807
|
+
# * <tt>:terminal</tt> -- terminal name
|
808
|
+
# * <tt>:table</tt> -- table name/number
|
809
|
+
# * <tt>:description</tt> -- description
|
810
|
+
# * <tt>:comments</tt> -- comments
|
811
|
+
# * <tt>:allow_partial_auth</tt> -- allow partial authorization if full amount is not available; defaults +false+
|
812
|
+
# * <tt>:currency</tt> -- numeric currency code
|
813
|
+
# * <tt>:tax</tt> -- tax portion of amount
|
814
|
+
# * <tt>:tip</tt> -- tip portion of amount
|
815
|
+
# * <tt>:non_tax</tt> -- +true+ if transaction is non-taxable
|
816
|
+
# * <tt>:shipping</tt> -- shipping portion of amount
|
817
|
+
# * <tt>:discount</tt> -- amount of discount
|
818
|
+
# * <tt>:subtotal</tt> -- amount of transaction before tax, tip, shipping, and discount are applied
|
819
|
+
#
|
820
|
+
# ==== Response
|
821
|
+
# * <tt>#message</tt> -- transaction response hash
|
822
|
+
#
|
823
|
+
def run_quick_sale(options = {})
|
824
|
+
requires! options, :reference_number, :amount
|
825
|
+
|
826
|
+
request = build_request(__method__, options)
|
827
|
+
commit(__method__, request)
|
828
|
+
end
|
829
|
+
|
830
|
+
# Run a credit based off of a past transaction.
|
831
|
+
#
|
832
|
+
# Transfers referenced transaction's payment method to this
|
833
|
+
# transaction. As of 6/2011, USA ePay blocks credit card numbers
|
834
|
+
# at 3 years.
|
835
|
+
#
|
836
|
+
# ==== Required
|
837
|
+
# * <tt>:reference_number</tt> -- transaction to reference payment from
|
838
|
+
#
|
839
|
+
# ==== Transaction Options
|
840
|
+
# * <tt>:amount</tt> -- total amount
|
841
|
+
# * <tt>:invoice</tt> -- transaction invoice number; truncated to 10 characters; defaults to reference_number
|
842
|
+
# * <tt>:po_number</tt> -- commercial purchase order number; upto 25 characters
|
843
|
+
# * <tt>:order_id</tt> -- should be used to assign a unique id; upto 64 characters
|
844
|
+
# * <tt>:clerk</tt> -- sales clerk
|
845
|
+
# * <tt>:terminal</tt> -- terminal name
|
846
|
+
# * <tt>:table</tt> -- table name/number
|
847
|
+
# * <tt>:description</tt> -- description
|
848
|
+
# * <tt>:comments</tt> -- comments
|
849
|
+
# * <tt>:allow_partial_auth</tt> -- allow partial authorization if full amount is not available; defaults +false+
|
850
|
+
# * <tt>:currency</tt> -- numeric currency code
|
851
|
+
# * <tt>:tax</tt> -- tax portion of amount
|
852
|
+
# * <tt>:tip</tt> -- tip portion of amount
|
853
|
+
# * <tt>:non_tax</tt> -- +true+ if transaction is non-taxable
|
854
|
+
# * <tt>:shipping</tt> -- shipping portion of amount
|
855
|
+
# * <tt>:discount</tt> -- amount of discount
|
856
|
+
# * <tt>:subtotal</tt> -- amount of transaction before tax, tip, shipping, and discount are applied
|
857
|
+
#
|
858
|
+
# ==== Response
|
859
|
+
# * <tt>#message</tt> -- transaction response hash
|
860
|
+
#
|
861
|
+
def run_quick_credit(options = {})
|
862
|
+
requires! options, :reference_number
|
863
|
+
|
864
|
+
request = build_request(__method__, options)
|
865
|
+
commit(__method__, request)
|
866
|
+
end
|
867
|
+
|
868
|
+
# Transaction Status ============================================
|
869
|
+
|
870
|
+
# Retrieve details of a specified transaction.
|
871
|
+
#
|
872
|
+
# ==== Required
|
873
|
+
# * <tt>:reference_number</tt>
|
874
|
+
#
|
875
|
+
# ==== Response
|
876
|
+
# * <tt>#message</tt> -- transaction hash
|
877
|
+
#
|
878
|
+
def get_transaction(options = {})
|
879
|
+
requires! options, :reference_number
|
880
|
+
|
881
|
+
request = build_request(__method__, options)
|
882
|
+
commit(__method__, request)
|
883
|
+
end
|
884
|
+
|
885
|
+
# Check status of a transaction.
|
886
|
+
#
|
887
|
+
# ==== Required
|
888
|
+
# * <tt>:reference_number</tt>
|
889
|
+
#
|
890
|
+
# ==== Response
|
891
|
+
# * <tt>response.success</tt> -- success of the referenced transaction
|
892
|
+
# * <tt>response.message</tt> -- message of the referenced transaction
|
893
|
+
# * <tt>response.authorization</tt> -- same as :reference_number in options
|
894
|
+
#
|
895
|
+
def get_transaction_status(options = {})
|
896
|
+
requires! options, :reference_number
|
897
|
+
|
898
|
+
request = build_request(__method__, options)
|
899
|
+
commit(__method__, request)
|
900
|
+
end
|
901
|
+
|
902
|
+
# Check status of a transaction (custom).
|
903
|
+
#
|
904
|
+
# ==== Required
|
905
|
+
# * <tt>:reference_number</tt>
|
906
|
+
# * <tt>:fields</tt> -- string array of fields to retrieve
|
907
|
+
# * <tt>Response.AuthCode</tt>
|
908
|
+
# * <tt>Response.AvsResult</tt>
|
909
|
+
# * <tt>Response.AvsResultCode</tt>
|
910
|
+
# * <tt>Response.BatchNum</tt>
|
911
|
+
# * <tt>Response.CardCodeResult</tt>
|
912
|
+
# * <tt>Response.CardCodeResultCode</tt>
|
913
|
+
# * <tt>Response.ConversionRate</tt>
|
914
|
+
# * <tt>Response.ConvertedAmount</tt>
|
915
|
+
# * <tt>Response.ConvertedAmountCurrency</tt>
|
916
|
+
# * <tt>Response.Error</tt>
|
917
|
+
# * <tt>Response.ErrorCode</tt>
|
918
|
+
# * <tt>Response.RefNum</tt>
|
919
|
+
# * <tt>Response.Result</tt>
|
920
|
+
# * <tt>Response.ResultCode</tt>
|
921
|
+
# * <tt>Response.Status</tt>
|
922
|
+
# * <tt>Response.StatusCode</tt>
|
923
|
+
# * <tt>CheckTrace.TrackingNum</tt>
|
924
|
+
# * <tt>CheckTrace.Effective</tt>
|
925
|
+
# * <tt>CheckTrace.Processed</tt>
|
926
|
+
# * <tt>CheckTrace.Settled</tt>
|
927
|
+
# * <tt>CheckTrace.Returned</tt>
|
928
|
+
# * <tt>CheckTrace.BankNote</tt>
|
929
|
+
# * <tt>DateTime</tt>
|
930
|
+
# * <tt>AccountHolder</tt>
|
931
|
+
# * <tt>Details.Invoice</tt>
|
932
|
+
# * <tt>Details.PoNum</tt>
|
933
|
+
# * <tt>Details.OrderID</tt>
|
934
|
+
# * <tt>Details.Clerk</tt>
|
935
|
+
# * <tt>Details.Terminal</tt>
|
936
|
+
# * <tt>Details.Table</tt>
|
937
|
+
# * <tt>Details.Description</tt>
|
938
|
+
# * <tt>Details.Amount</tt>
|
939
|
+
# * <tt>Details.Currency</tt>
|
940
|
+
# * <tt>Details.Tax</tt>
|
941
|
+
# * <tt>Details.Tip</tt>
|
942
|
+
# * <tt>Details.NonTax</tt>
|
943
|
+
# * <tt>Details.Shipping</tt>
|
944
|
+
# * <tt>Details.Discount</tt>
|
945
|
+
# * <tt>Details.Subtotal</tt>
|
946
|
+
# * <tt>CreditCardData.CardType</tt>
|
947
|
+
# * <tt>CreditCardData.CardNumber</tt>
|
948
|
+
# * <tt>CreditCardData.CardExpiration</tt>
|
949
|
+
# * <tt>CreditCardData.CardCode</tt>
|
950
|
+
# * <tt>CreditCardData.AvsStreet</tt>
|
951
|
+
# * <tt>CreditCardData.AvsZip</tt>
|
952
|
+
# * <tt>CreditCardData.CardPresent</tt>
|
953
|
+
# * <tt>CheckData.CheckNumber</tt>
|
954
|
+
# * <tt>CheckData.Routing</tt>
|
955
|
+
# * <tt>CheckData.Account</tt>
|
956
|
+
# * <tt>CheckData.SSN</tt>
|
957
|
+
# * <tt>CheckData.DriversLicense</tt>
|
958
|
+
# * <tt>CheckData.DriversLicenseState</tt>
|
959
|
+
# * <tt>CheckData.RecordType</tt>
|
960
|
+
# * <tt>User</tt>
|
961
|
+
# * <tt>Source</tt>
|
962
|
+
# * <tt>ServerIP</tt>
|
963
|
+
# * <tt>ClientIP</tt>
|
964
|
+
# * <tt>CustomerID</tt>
|
965
|
+
# * <tt>BillingAddress.FirstName</tt>
|
966
|
+
# * <tt>BillingAddress.LastName</tt>
|
967
|
+
# * <tt>BillingAddress.Company</tt>
|
968
|
+
# * <tt>BillingAddress.Street</tt>
|
969
|
+
# * <tt>BillingAddress.Street2</tt>
|
970
|
+
# * <tt>BillingAddress.City</tt>
|
971
|
+
# * <tt>BillingAddress.State</tt>
|
972
|
+
# * <tt>BillingAddress.Zip</tt>
|
973
|
+
# * <tt>BillingAddress.Country</tt>
|
974
|
+
# * <tt>BillingAddress.Phone</tt>
|
975
|
+
# * <tt>BillingAddress.Fax</tt>
|
976
|
+
# * <tt>BillingAddress.Email</tt>
|
977
|
+
# * <tt>ShippingAddress.FirstName</tt>
|
978
|
+
# * <tt>ShippingAddress.LastName</tt>
|
979
|
+
# * <tt>ShippingAddress.Company</tt>
|
980
|
+
# * <tt>ShippingAddress.Street</tt>
|
981
|
+
# * <tt>ShippingAddress.Street2</tt>
|
982
|
+
# * <tt>ShippingAddress.City</tt>
|
983
|
+
# * <tt>ShippingAddress.State</tt>
|
984
|
+
# * <tt>ShippingAddress.Zip</tt>
|
985
|
+
# * <tt>ShippingAddress.Country</tt>
|
986
|
+
# * <tt>ShippingAddress.Phone</tt>
|
987
|
+
# * <tt>ShippingAddress.Fax</tt>
|
988
|
+
# * <tt>ShippingAddress.Email</tt>
|
989
|
+
#
|
990
|
+
# ==== Response
|
991
|
+
# * <tt>#message</tt> -- hash; keys are the field values
|
992
|
+
#
|
993
|
+
def get_transaction_custom(options = {})
|
994
|
+
requires! options, :reference_number, :fields
|
995
|
+
|
996
|
+
request = build_request(__method__, options)
|
997
|
+
commit(__method__, request)
|
998
|
+
end
|
999
|
+
|
1000
|
+
# Check status of a check transaction.
|
1001
|
+
#
|
1002
|
+
# ==== Required
|
1003
|
+
# * <tt>:reference_number</tt>
|
1004
|
+
#
|
1005
|
+
# ==== Response
|
1006
|
+
# * <tt>#message</tt> -- check trace hash
|
1007
|
+
#
|
1008
|
+
def get_check_trace(options = {})
|
1009
|
+
requires! options, :reference_number
|
1010
|
+
|
1011
|
+
request = build_request(__method__, options)
|
1012
|
+
commit(__method__, request)
|
1013
|
+
end
|
1014
|
+
|
1015
|
+
# Account =======================================================
|
1016
|
+
|
1017
|
+
# Retrieve merchant account details
|
1018
|
+
#
|
1019
|
+
# ==== Response
|
1020
|
+
# * <tt>#message</tt> -- account hash
|
1021
|
+
#
|
1022
|
+
def get_account_details
|
1023
|
+
request = build_request(__method__)
|
1024
|
+
commit(__method__, request)
|
1025
|
+
end
|
1026
|
+
|
1027
|
+
# Builders ======================================================
|
1028
|
+
|
1029
|
+
private
|
1030
|
+
|
1031
|
+
# Build soap header, etc.
|
1032
|
+
def build_request(action, options = {})
|
1033
|
+
soap = Builder::XmlMarkup.new
|
1034
|
+
soap.instruct!(:xml, version: '1.0', encoding: 'utf-8')
|
1035
|
+
soap.tag! 'SOAP-ENV:Envelope',
|
1036
|
+
'xmlns:SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
|
1037
|
+
'xmlns:ns1' => 'urn:usaepay',
|
1038
|
+
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
|
1039
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
1040
|
+
'xmlns:SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/',
|
1041
|
+
'SOAP-ENV:encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/' do
|
1042
|
+
soap.tag! 'SOAP-ENV:Body' do
|
1043
|
+
send("build_#{action}", soap, options)
|
1044
|
+
end
|
1045
|
+
end
|
1046
|
+
soap.target!
|
1047
|
+
end
|
1048
|
+
|
1049
|
+
# Build generic tag.
|
1050
|
+
def build_tag(soap, type, tag, value)
|
1051
|
+
soap.tag!(tag, value, 'xsi:type' => "xsd:#{type}") if value != nil
|
1052
|
+
end
|
1053
|
+
|
1054
|
+
# Build token.
|
1055
|
+
def build_token(soap, options)
|
1056
|
+
seed = SecureRandom.base64(32)
|
1057
|
+
hash = Digest::SHA1.hexdigest("#{@options[:login]}#{seed}#{@options[:password].to_s.strip}")
|
1058
|
+
soap.Token 'xsi:type' => 'ns1:ueSecurityToken' do
|
1059
|
+
build_tag soap, :string, 'ClientIP', options[:client_ip]
|
1060
|
+
soap.PinHash 'xsi:type' => 'ns1:ueHash' do
|
1061
|
+
build_tag soap, :string, 'HashValue', hash
|
1062
|
+
build_tag soap, :string, 'Seed', seed
|
1063
|
+
build_tag soap, :string, 'Type', 'sha1'
|
1064
|
+
end
|
1065
|
+
build_tag soap, :string, 'SourceKey', @options[:login]
|
1066
|
+
end
|
1067
|
+
end
|
1068
|
+
|
1069
|
+
# Customer ======================================================
|
1070
|
+
|
1071
|
+
def build_add_customer(soap, options)
|
1072
|
+
soap.tag! 'ns1:addCustomer' do
|
1073
|
+
build_token soap, options
|
1074
|
+
build_customer_data soap, options
|
1075
|
+
build_tag soap, :double, 'Amount', amount(options[:amount])
|
1076
|
+
build_tag soap, :double, 'Tax', amount(options[:tax])
|
1077
|
+
build_tag soap, :string, 'Next', options[:next].strftime('%Y-%m-%d') if options[:next]
|
1078
|
+
end
|
1079
|
+
end
|
1080
|
+
|
1081
|
+
def build_customer(soap, options, type, add_customer_data = false)
|
1082
|
+
soap.tag! "ns1:#{type}" do
|
1083
|
+
build_token soap, options
|
1084
|
+
build_tag soap, :integer, 'CustNum', options[:customer_number]
|
1085
|
+
build_customer_data soap, options if add_customer_data
|
1086
|
+
end
|
1087
|
+
end
|
1088
|
+
|
1089
|
+
def build_update_customer(soap, options)
|
1090
|
+
build_customer(soap, options, 'updateCustomer', true)
|
1091
|
+
end
|
1092
|
+
|
1093
|
+
def build_enable_customer(soap, options)
|
1094
|
+
build_customer(soap, options, 'enableCustomer')
|
1095
|
+
end
|
1096
|
+
|
1097
|
+
def build_disable_customer(soap, options)
|
1098
|
+
build_customer(soap, options, 'disableCustomer')
|
1099
|
+
end
|
1100
|
+
|
1101
|
+
def build_delete_customer(soap, options)
|
1102
|
+
build_customer(soap, options, 'deleteCustomer')
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
def build_quick_update_customer(soap, options)
|
1106
|
+
soap.tag! 'ns1:quickUpdateCustomer' do
|
1107
|
+
build_token soap, options
|
1108
|
+
build_tag soap, :integer, 'CustNum', options[:customer_number]
|
1109
|
+
build_field_value_array soap, 'UpdateData', 'FieldValue', options[:update_data], CUSTOMER_UPDATE_DATA_FIELDS
|
1110
|
+
end
|
1111
|
+
end
|
1112
|
+
|
1113
|
+
def build_add_customer_payment_method(soap, options)
|
1114
|
+
soap.tag! 'ns1:addCustomerPaymentMethod' do
|
1115
|
+
build_token soap, options
|
1116
|
+
build_tag soap, :integer, 'CustNum', options[:customer_number]
|
1117
|
+
build_customer_payment_methods soap, options
|
1118
|
+
build_tag soap, :boolean, 'MakeDefault', options[:make_default]
|
1119
|
+
build_tag soap, :boolean, 'Verify', options[:verify]
|
1120
|
+
end
|
1121
|
+
end
|
1122
|
+
|
1123
|
+
def build_get_customer_payment_method(soap, options)
|
1124
|
+
soap.tag! 'ns1:getCustomerPaymentMethod' do
|
1125
|
+
build_token soap, options
|
1126
|
+
build_tag soap, :integer, 'CustNum', options[:customer_number]
|
1127
|
+
build_tag soap, :integer, 'MethodID', options[:method_id]
|
1128
|
+
end
|
1129
|
+
end
|
1130
|
+
|
1131
|
+
def build_get_customer_payment_methods(soap, options)
|
1132
|
+
build_customer(soap, options, 'getCustomerPaymentMethods')
|
1133
|
+
end
|
1134
|
+
|
1135
|
+
def build_update_customer_payment_method(soap, options)
|
1136
|
+
soap.tag! 'ns1:updateCustomerPaymentMethod' do
|
1137
|
+
build_token soap, options
|
1138
|
+
build_customer_payment_methods soap, options
|
1139
|
+
build_tag soap, :boolean, 'Verify', options[:verify]
|
1140
|
+
end
|
1141
|
+
end
|
1142
|
+
|
1143
|
+
def build_delete_customer_payment_method(soap, options)
|
1144
|
+
soap.tag! 'ns1:deleteCustomerPaymentMethod' do
|
1145
|
+
build_token soap, options
|
1146
|
+
build_tag soap, :integer, 'Custnum', options[:customer_number]
|
1147
|
+
build_tag soap, :integer, 'PaymentMethodID', options[:method_id]
|
1148
|
+
end
|
1149
|
+
end
|
1150
|
+
|
1151
|
+
def build_run_customer_transaction(soap, options)
|
1152
|
+
soap.tag! 'ns1:runCustomerTransaction' do
|
1153
|
+
build_token soap, options
|
1154
|
+
build_tag soap, :integer, 'CustNum', options[:customer_number]
|
1155
|
+
build_tag soap, :integer, 'PaymentMethodID', options[:method_id] || 0
|
1156
|
+
build_customer_transaction soap, options
|
1157
|
+
end
|
1158
|
+
end
|
1159
|
+
|
1160
|
+
# Transactions ==================================================
|
1161
|
+
|
1162
|
+
def build_run_transaction(soap, options)
|
1163
|
+
soap.tag! 'ns1:runTransaction' do
|
1164
|
+
build_token soap, options
|
1165
|
+
build_transaction_request_object soap, options, 'Parameters'
|
1166
|
+
end
|
1167
|
+
end
|
1168
|
+
|
1169
|
+
def build_run_sale(soap, options)
|
1170
|
+
soap.tag! 'ns1:runSale' do
|
1171
|
+
build_token soap, options
|
1172
|
+
build_transaction_request_object soap, options
|
1173
|
+
end
|
1174
|
+
end
|
1175
|
+
|
1176
|
+
def build_run_auth_only(soap, options)
|
1177
|
+
soap.tag! 'ns1:runAuthOnly' do
|
1178
|
+
build_token soap, options
|
1179
|
+
build_transaction_request_object soap, options
|
1180
|
+
end
|
1181
|
+
end
|
1182
|
+
|
1183
|
+
def build_run_credit(soap, options)
|
1184
|
+
soap.tag! 'ns1:runCredit' do
|
1185
|
+
build_token soap, options
|
1186
|
+
build_transaction_request_object soap, options
|
1187
|
+
end
|
1188
|
+
end
|
1189
|
+
|
1190
|
+
def build_run_check_sale(soap, options)
|
1191
|
+
soap.tag! 'ns1:runCheckSale' do
|
1192
|
+
build_token soap, options
|
1193
|
+
build_transaction_request_object soap, options
|
1194
|
+
end
|
1195
|
+
end
|
1196
|
+
|
1197
|
+
def build_run_check_credit(soap, options)
|
1198
|
+
soap.tag! 'ns1:runCheckCredit' do
|
1199
|
+
build_token soap, options
|
1200
|
+
build_transaction_request_object soap, options
|
1201
|
+
end
|
1202
|
+
end
|
1203
|
+
|
1204
|
+
def build_post_auth(soap, options)
|
1205
|
+
soap.tag! 'ns1:postAuth' do
|
1206
|
+
build_token soap, options
|
1207
|
+
build_transaction_request_object soap, options
|
1208
|
+
end
|
1209
|
+
end
|
1210
|
+
|
1211
|
+
def build_run_quick_sale(soap, options)
|
1212
|
+
soap.tag! 'ns1:runQuickSale' do
|
1213
|
+
build_token soap, options
|
1214
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1215
|
+
build_transaction_detail soap, options
|
1216
|
+
build_tag soap, :boolean, 'AuthOnly', options[:authorize_only] || false
|
1217
|
+
end
|
1218
|
+
end
|
1219
|
+
|
1220
|
+
def build_run_quick_credit(soap, options)
|
1221
|
+
soap.tag! 'ns1:runQuickCredit' do
|
1222
|
+
build_token soap, options
|
1223
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1224
|
+
build_transaction_detail soap, options
|
1225
|
+
end
|
1226
|
+
end
|
1227
|
+
|
1228
|
+
def build_get_transaction(soap, options)
|
1229
|
+
soap.tag! 'ns1:getTransaction' do
|
1230
|
+
build_token soap, options
|
1231
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1232
|
+
end
|
1233
|
+
end
|
1234
|
+
|
1235
|
+
def build_get_transaction_status(soap, options)
|
1236
|
+
soap.tag! 'ns1:getTransactionStatus' do
|
1237
|
+
build_token soap, options
|
1238
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1239
|
+
end
|
1240
|
+
end
|
1241
|
+
|
1242
|
+
def build_get_transaction_custom(soap, options)
|
1243
|
+
soap.tag! 'ns1:getTransactionCustom' do
|
1244
|
+
build_token soap, options
|
1245
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1246
|
+
build_transaction_field_array soap, options
|
1247
|
+
end
|
1248
|
+
end
|
1249
|
+
|
1250
|
+
def build_get_check_trace(soap, options)
|
1251
|
+
soap.tag! 'ns1:getCheckTrace' do
|
1252
|
+
build_token soap, options
|
1253
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1254
|
+
end
|
1255
|
+
end
|
1256
|
+
|
1257
|
+
def build_capture_transaction(soap, options)
|
1258
|
+
soap.tag! 'ns1:captureTransaction' do
|
1259
|
+
build_token soap, options
|
1260
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1261
|
+
build_tag soap, :double, 'Amount', amount(options[:amount])
|
1262
|
+
end
|
1263
|
+
end
|
1264
|
+
|
1265
|
+
def build_void_transaction(soap, options)
|
1266
|
+
soap.tag! 'ns1:voidTransaction' do
|
1267
|
+
build_token soap, options
|
1268
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1269
|
+
end
|
1270
|
+
end
|
1271
|
+
|
1272
|
+
def build_refund_transaction(soap, options)
|
1273
|
+
soap.tag! 'ns1:refundTransaction' do
|
1274
|
+
build_token soap, options
|
1275
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1276
|
+
build_tag soap, :integer, 'Amount', amount(options[:amount])
|
1277
|
+
end
|
1278
|
+
end
|
1279
|
+
|
1280
|
+
def build_override_transaction(soap, options)
|
1281
|
+
soap.tag! 'ns1:overrideTransaction' do
|
1282
|
+
build_token soap, options
|
1283
|
+
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1284
|
+
build_tag soap, :string, 'Reason', options[:reason]
|
1285
|
+
end
|
1286
|
+
end
|
1287
|
+
|
1288
|
+
# Account =======================================================
|
1289
|
+
|
1290
|
+
def build_get_account_details(soap, options)
|
1291
|
+
soap.tag! 'ns1:getAccountDetails' do
|
1292
|
+
build_token soap, options
|
1293
|
+
end
|
1294
|
+
end
|
1295
|
+
|
1296
|
+
# Customer Helpers ==============================================
|
1297
|
+
|
1298
|
+
def build_customer_data(soap, options)
|
1299
|
+
soap.CustomerData 'xsi:type' => 'ns1:CustomerObject' do
|
1300
|
+
CUSTOMER_OPTIONS.each do |k, v|
|
1301
|
+
build_tag soap, v[0], v[1], options[k]
|
1302
|
+
end
|
1303
|
+
build_billing_address soap, options
|
1304
|
+
build_customer_payments soap, options
|
1305
|
+
build_custom_fields soap, options
|
1306
|
+
end
|
1307
|
+
end
|
1308
|
+
|
1309
|
+
def build_customer_payments(soap, options)
|
1310
|
+
if options[:payment_methods]
|
1311
|
+
length = options[:payment_methods].length
|
1312
|
+
soap.PaymentMethods 'SOAP-ENC:arrayType' => "ns1:PaymentMethod[#{length}]",
|
1313
|
+
'xsi:type' => 'ns1:PaymentMethodArray' do
|
1314
|
+
build_customer_payment_methods soap, options
|
1315
|
+
end
|
1316
|
+
end
|
1317
|
+
end
|
1318
|
+
|
1319
|
+
def extract_methods_and_tag(options)
|
1320
|
+
case
|
1321
|
+
when options[:payment_method] && !options[:payment_methods]
|
1322
|
+
payment_methods = [options[:payment_method]]
|
1323
|
+
tag_name = 'PaymentMethod'
|
1324
|
+
when options[:payment_methods] && !options[:payment_method]
|
1325
|
+
payment_methods = options[:payment_methods]
|
1326
|
+
tag_name = 'item'
|
1327
|
+
else
|
1328
|
+
payment_methods = [options]
|
1329
|
+
tag_name = 'PaymentMethod'
|
1330
|
+
end
|
1331
|
+
[payment_methods, tag_name]
|
1332
|
+
end
|
1333
|
+
|
1334
|
+
def build_credit_card_or_check(soap, payment_method)
|
1335
|
+
case
|
1336
|
+
when payment_method[:method].kind_of?(ActiveMerchant::Billing::CreditCard)
|
1337
|
+
build_tag soap, :string, 'CardNumber', payment_method[:method].number
|
1338
|
+
build_tag soap, :string, 'CardExpiration',
|
1339
|
+
"#{'%02d' % payment_method[:method].month}#{payment_method[:method].year.to_s[-2..-1]}"
|
1340
|
+
if options[:billing_address]
|
1341
|
+
build_tag soap, :string, 'AvsStreet', options[:billing_address][:address1]
|
1342
|
+
build_tag soap, :string, 'AvsZip', options[:billing_address][:zip]
|
1343
|
+
end
|
1344
|
+
build_tag soap, :string, 'CardCode', payment_method[:method].verification_value
|
1345
|
+
when payment_method[:method].kind_of?(ActiveMerchant::Billing::Check)
|
1346
|
+
build_tag soap, :string, 'Account', payment_method[:method].account_number
|
1347
|
+
build_tag soap, :string, 'Routing', payment_method[:method].routing_number
|
1348
|
+
build_tag soap, :string, 'AccountType', payment_method[:method].account_type.capitalize unless payment_method[:method].account_type.nil?
|
1349
|
+
build_tag soap, :string, 'DriversLicense', options[:drivers_license]
|
1350
|
+
build_tag soap, :string, 'DriversLicenseState', options[:drivers_license_state]
|
1351
|
+
build_tag soap, :string, 'RecordType', options[:record_type]
|
1352
|
+
end
|
1353
|
+
end
|
1354
|
+
|
1355
|
+
def build_customer_payment_methods(soap, options)
|
1356
|
+
payment_methods, tag_name = extract_methods_and_tag(options)
|
1357
|
+
payment_methods.each do |payment_method|
|
1358
|
+
soap.tag! tag_name, 'xsi:type' => 'ns1:PaymentMethod' do
|
1359
|
+
build_tag soap, :integer, 'MethodID', payment_method[:method_id]
|
1360
|
+
build_tag soap, :string, 'MethodType', payment_method[:type]
|
1361
|
+
build_tag soap, :string, 'MethodName', payment_method[:name]
|
1362
|
+
build_tag soap, :integer, 'SecondarySort', payment_method[:sort]
|
1363
|
+
build_credit_card_or_check(soap, payment_method)
|
1364
|
+
end
|
1365
|
+
end
|
1366
|
+
end
|
1367
|
+
|
1368
|
+
def build_customer_transaction(soap, options)
|
1369
|
+
soap.Parameters 'xsi:type' => 'ns1:CustomerTransactionRequest' do
|
1370
|
+
build_transaction_detail soap, options
|
1371
|
+
CUSTOMER_TRANSACTION_REQUEST_OPTIONS.each do |k, v|
|
1372
|
+
build_tag soap, v[0], v[1], options[k]
|
1373
|
+
end
|
1374
|
+
build_custom_fields soap, options
|
1375
|
+
build_line_items soap, options
|
1376
|
+
end
|
1377
|
+
end
|
1378
|
+
|
1379
|
+
# Transaction Helpers ===========================================
|
1380
|
+
|
1381
|
+
def build_transaction_request_object(soap, options, name = 'Params')
|
1382
|
+
soap.tag! name, 'xsi:type' => 'ns1:TransactionRequestObject' do
|
1383
|
+
TRANSACTION_REQUEST_OBJECT_OPTIONS.each do |k, v|
|
1384
|
+
build_tag soap, v[0], v[1], options[k]
|
1385
|
+
end
|
1386
|
+
case
|
1387
|
+
when options[:payment_method].nil?
|
1388
|
+
nil
|
1389
|
+
when options[:payment_method].kind_of?(ActiveMerchant::Billing::CreditCard)
|
1390
|
+
build_credit_card_data soap, options
|
1391
|
+
when options[:payment_method].kind_of?(ActiveMerchant::Billing::Check)
|
1392
|
+
build_check_data soap, options
|
1393
|
+
else
|
1394
|
+
raise ArgumentError, 'options[:payment_method] must be a CreditCard or Check'
|
1395
|
+
end
|
1396
|
+
build_transaction_detail soap, options
|
1397
|
+
build_billing_address soap, options
|
1398
|
+
build_shipping_address soap, options
|
1399
|
+
build_recurring_billing soap, options
|
1400
|
+
build_line_items soap, options
|
1401
|
+
build_custom_fields soap, options
|
1402
|
+
end
|
1403
|
+
end
|
1404
|
+
|
1405
|
+
def build_transaction_detail(soap, options)
|
1406
|
+
soap.Details 'xsi:type' => 'ns1:TransactionDetail' do
|
1407
|
+
TRANSACTION_DETAIL_OPTIONS.each do |k, v|
|
1408
|
+
build_tag soap, v[0], v[1], options[k]
|
1409
|
+
end
|
1410
|
+
TRANSACTION_DETAIL_MONEY_OPTIONS.each do |k, v|
|
1411
|
+
build_tag soap, v[0], v[1], amount(options[k])
|
1412
|
+
end
|
1413
|
+
end
|
1414
|
+
end
|
1415
|
+
|
1416
|
+
def build_credit_card_data(soap, options)
|
1417
|
+
soap.CreditCardData 'xsi:type' => 'ns1:CreditCardData' do
|
1418
|
+
build_tag soap, :string, 'CardNumber', options[:payment_method].number
|
1419
|
+
build_tag soap, :string, 'CardExpiration', build_card_expiration(options)
|
1420
|
+
if options[:billing_address]
|
1421
|
+
build_tag soap, :string, 'AvsStreet', options[:billing_address][:address1]
|
1422
|
+
build_tag soap, :string, 'AvsZip', options[:billing_address][:zip]
|
1423
|
+
end
|
1424
|
+
build_tag soap, :string, 'CardCode', options[:payment_method].verification_value
|
1425
|
+
build_tag soap, :boolean, 'CardPresent', options[:card_present] || false
|
1426
|
+
CREDIT_CARD_DATA_OPTIONS.each do |k, v|
|
1427
|
+
build_tag soap, v[0], v[1], options[k]
|
1428
|
+
end
|
1429
|
+
end
|
1430
|
+
end
|
1431
|
+
|
1432
|
+
def build_card_expiration(options)
|
1433
|
+
month = options[:payment_method].month
|
1434
|
+
year = options[:payment_method].year
|
1435
|
+
"#{'%02d' % month}#{year.to_s[-2..-1]}" unless month.nil? || year.nil?
|
1436
|
+
end
|
1437
|
+
|
1438
|
+
def build_check_data(soap, options)
|
1439
|
+
soap.CheckData 'xsi:type' => 'ns1:CheckData' do
|
1440
|
+
build_tag soap, :integer, 'CheckNumber', options[:payment_method].number
|
1441
|
+
build_tag soap, :string, 'Account', options[:payment_method].account_number
|
1442
|
+
build_tag soap, :string, 'Routing', options[:payment_method].routing_number
|
1443
|
+
build_tag soap, :string, 'AccountType', options[:payment_method].account_type.capitalize
|
1444
|
+
CHECK_DATA_OPTIONS.each do |k, v|
|
1445
|
+
build_tag soap, v[0], v[1], options[k]
|
1446
|
+
end
|
1447
|
+
end
|
1448
|
+
end
|
1449
|
+
|
1450
|
+
def build_recurring_billing(soap, options)
|
1451
|
+
if options[:recurring]
|
1452
|
+
soap.RecurringBilling 'xsi:type' => 'ns1:RecurringBilling' do
|
1453
|
+
build_tag soap, :double, 'Amount', amount(options[:recurring][:amount])
|
1454
|
+
build_tag soap, :string, 'Next', options[:recurring][:next].strftime('%Y-%m-%d') if options[:recurring][:next]
|
1455
|
+
build_tag soap, :string, 'Expire', options[:recurring][:expire].strftime('%Y-%m-%d') if options[:recurring][:expire]
|
1456
|
+
RECURRING_BILLING_OPTIONS.each do |k, v|
|
1457
|
+
build_tag soap, v[0], v[1], options[:recurring][k]
|
1458
|
+
end
|
1459
|
+
end
|
1460
|
+
end
|
1461
|
+
end
|
1462
|
+
|
1463
|
+
def build_transaction_field_array(soap, options)
|
1464
|
+
soap.Fields 'SOAP-ENC:arryType' => "xsd:string[#{options[:fields].length}]", 'xsi:type' => 'ns1:stringArray' do
|
1465
|
+
options[:fields].each do |field|
|
1466
|
+
build_tag soap, :string, 'item', field
|
1467
|
+
end
|
1468
|
+
end
|
1469
|
+
end
|
1470
|
+
|
1471
|
+
# General Helpers ===============================================
|
1472
|
+
|
1473
|
+
def build_billing_address(soap, options)
|
1474
|
+
if options[:billing_address]
|
1475
|
+
options[:billing_address][:first_name], options[:billing_address][:last_name] = split_names(options[:billing_address][:name]) if options[:billing_address][:name]
|
1476
|
+
soap.BillingAddress 'xsi:type' => 'ns1:Address' do
|
1477
|
+
ADDRESS_OPTIONS.each do |k, v|
|
1478
|
+
build_tag soap, v[0], v[1], options[:billing_address][k]
|
1479
|
+
end
|
1480
|
+
end
|
1481
|
+
end
|
1482
|
+
end
|
1483
|
+
|
1484
|
+
def build_shipping_address(soap, options)
|
1485
|
+
if options[:shipping_address]
|
1486
|
+
options[:shipping_address][:first_name], options[:shipping_address][:last_name] = split_names(options[:shipping_address][:name]) if options[:shipping_address][:name]
|
1487
|
+
soap.ShippingAddress 'xsi:type' => 'ns1:Address' do
|
1488
|
+
ADDRESS_OPTIONS.each do |k, v|
|
1489
|
+
build_tag soap, v[0], v[1], options[:shipping_address][k]
|
1490
|
+
end
|
1491
|
+
end
|
1492
|
+
end
|
1493
|
+
end
|
1494
|
+
|
1495
|
+
def build_field_value_array(soap, tag_name, type, custom_data, fields)
|
1496
|
+
soap.tag! tag_name, 'SOAP-ENC:arryType' => "xsd:#{type}[#{options.length}]", 'xsi:type' => "ns1:#{type}Array" do
|
1497
|
+
custom_data.each do |k, v|
|
1498
|
+
build_field_value soap, fields[k][1], v, fields[k][0] if fields.key?(k)
|
1499
|
+
end
|
1500
|
+
end
|
1501
|
+
end
|
1502
|
+
|
1503
|
+
def build_field_value(soap, field, value, value_type)
|
1504
|
+
soap.FieldValue 'xsi:type' => 'ns1:FieldValue' do
|
1505
|
+
build_tag soap, :string, 'Field', field
|
1506
|
+
build_tag soap, value_type, 'Value', value
|
1507
|
+
end
|
1508
|
+
end
|
1509
|
+
|
1510
|
+
def build_line_items(soap, options) # TODO
|
1511
|
+
end
|
1512
|
+
|
1513
|
+
def build_custom_fields(soap, options) # TODO
|
1514
|
+
end
|
1515
|
+
|
1516
|
+
# Request =======================================================
|
1517
|
+
|
1518
|
+
def commit(action, request)
|
1519
|
+
url = test? ? test_url : live_url
|
1520
|
+
|
1521
|
+
begin
|
1522
|
+
soap = ssl_post(url, request, 'Content-Type' => 'text/xml')
|
1523
|
+
rescue ActiveMerchant::ResponseError => error
|
1524
|
+
soap = error.response.body
|
1525
|
+
end
|
1526
|
+
|
1527
|
+
build_response(action, soap)
|
1528
|
+
end
|
1529
|
+
|
1530
|
+
def build_response(action, soap)
|
1531
|
+
response_params, success, message, authorization, avs, cvv = parse(action, soap)
|
1532
|
+
|
1533
|
+
response_params['soap_response'] = soap if @options[:soap_response]
|
1534
|
+
|
1535
|
+
Response.new(
|
1536
|
+
success,
|
1537
|
+
message,
|
1538
|
+
response_params,
|
1539
|
+
test: test?,
|
1540
|
+
authorization: authorization,
|
1541
|
+
avs_result: avs_from(avs),
|
1542
|
+
cvv_result: cvv
|
1543
|
+
)
|
1544
|
+
end
|
1545
|
+
|
1546
|
+
def avs_from(avs)
|
1547
|
+
avs_params = { code: avs }
|
1548
|
+
avs_params[:message] = AVS_CUSTOM_MESSAGES[avs] if AVS_CUSTOM_MESSAGES.key?(avs)
|
1549
|
+
avs_params
|
1550
|
+
end
|
1551
|
+
|
1552
|
+
def parse(action, soap)
|
1553
|
+
xml = REXML::Document.new(soap)
|
1554
|
+
root = REXML::XPath.first(xml, '//SOAP-ENV:Body')
|
1555
|
+
response = root ? parse_element(root[0]) : { response: soap }
|
1556
|
+
|
1557
|
+
success, message, authorization, avs, cvv = false, FAILURE_MESSAGE, nil, nil, nil
|
1558
|
+
|
1559
|
+
fault = !response || (response.length < 1) || response.has_key?('faultcode')
|
1560
|
+
return [response, success, response['faultstring'], authorization, avs, cvv] if fault
|
1561
|
+
|
1562
|
+
if response.respond_to?(:[]) && p = response["#{action}_return"]
|
1563
|
+
if p.respond_to?(:key?) && p.key?('result_code')
|
1564
|
+
success = p['result_code'] == 'A'
|
1565
|
+
authorization = p['ref_num']
|
1566
|
+
avs = AVS_RESULTS[p['avs_result_code']]
|
1567
|
+
cvv = p['card_code_result_code']
|
1568
|
+
else
|
1569
|
+
success = true
|
1570
|
+
end
|
1571
|
+
message =
|
1572
|
+
case action
|
1573
|
+
when :get_customer_payment_methods
|
1574
|
+
p['item']
|
1575
|
+
when :get_transaction_custom
|
1576
|
+
items = p['item'].kind_of?(Array) ? p['item'] : [p['item']]
|
1577
|
+
items.inject({}) { |hash, item| hash[item['field']] = item['value']; hash }
|
1578
|
+
else
|
1579
|
+
p
|
1580
|
+
end
|
1581
|
+
elsif response.respond_to?(:[]) && p = response[:response]
|
1582
|
+
message = p # when response is html
|
1583
|
+
end
|
1584
|
+
|
1585
|
+
[response, success, message, authorization, avs, cvv]
|
1586
|
+
end
|
1587
|
+
|
1588
|
+
def parse_element(node)
|
1589
|
+
if node.has_elements?
|
1590
|
+
response = {}
|
1591
|
+
node.elements.each do |e|
|
1592
|
+
key = e.name.underscore
|
1593
|
+
value = parse_element(e)
|
1594
|
+
if response.has_key?(key)
|
1595
|
+
if response[key].is_a?(Array)
|
1596
|
+
response[key].push(value)
|
1597
|
+
else
|
1598
|
+
response[key] = [response[key], value]
|
1599
|
+
end
|
1600
|
+
else
|
1601
|
+
response[key] = parse_element(e)
|
1602
|
+
end
|
1603
|
+
end
|
1604
|
+
else
|
1605
|
+
response = node.text
|
1606
|
+
end
|
1607
|
+
|
1608
|
+
response
|
1609
|
+
end
|
1610
|
+
end
|
1611
|
+
end
|
1612
|
+
end
|