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.
Files changed (287) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +4033 -0
  3. data/CONTRIBUTORS +568 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +252 -0
  6. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  7. data/lib/active_merchant/billing/avs_result.rb +95 -0
  8. data/lib/active_merchant/billing/base.rb +48 -0
  9. data/lib/active_merchant/billing/check.rb +112 -0
  10. data/lib/active_merchant/billing/compatibility.rb +118 -0
  11. data/lib/active_merchant/billing/credit_card.rb +451 -0
  12. data/lib/active_merchant/billing/credit_card_formatting.rb +24 -0
  13. data/lib/active_merchant/billing/credit_card_methods.rb +512 -0
  14. data/lib/active_merchant/billing/cvv_result.rb +37 -0
  15. data/lib/active_merchant/billing/gateway.rb +332 -0
  16. data/lib/active_merchant/billing/gateways/adyen.rb +774 -0
  17. data/lib/active_merchant/billing/gateways/airwallex.rb +370 -0
  18. data/lib/active_merchant/billing/gateways/alelo.rb +256 -0
  19. data/lib/active_merchant/billing/gateways/allied_wallet.rb +205 -0
  20. data/lib/active_merchant/billing/gateways/authorize_net.rb +1125 -0
  21. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +424 -0
  22. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +977 -0
  23. data/lib/active_merchant/billing/gateways/axcessms.rb +242 -0
  24. data/lib/active_merchant/billing/gateways/balanced.rb +263 -0
  25. data/lib/active_merchant/billing/gateways/bambora_apac.rb +222 -0
  26. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  27. data/lib/active_merchant/billing/gateways/banwire.rb +116 -0
  28. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +397 -0
  29. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +15 -0
  30. data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
  31. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +474 -0
  32. data/lib/active_merchant/billing/gateways/beanstream.rb +238 -0
  33. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +57 -0
  34. data/lib/active_merchant/billing/gateways/blue_pay.rb +549 -0
  35. data/lib/active_merchant/billing/gateways/blue_snap.rb +644 -0
  36. data/lib/active_merchant/billing/gateways/bogus.rb +190 -0
  37. data/lib/active_merchant/billing/gateways/borgun.rb +272 -0
  38. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  39. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +28 -0
  40. data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +113 -0
  41. data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
  42. data/lib/active_merchant/billing/gateways/braintree_blue.rb +952 -0
  43. data/lib/active_merchant/billing/gateways/braintree_orange.rb +19 -0
  44. data/lib/active_merchant/billing/gateways/bridge_pay.rb +244 -0
  45. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  46. data/lib/active_merchant/billing/gateways/card_connect.rb +338 -0
  47. data/lib/active_merchant/billing/gateways/card_save.rb +21 -0
  48. data/lib/active_merchant/billing/gateways/card_stream.rb +394 -0
  49. data/lib/active_merchant/billing/gateways/cardknox.rb +327 -0
  50. data/lib/active_merchant/billing/gateways/cardprocess.rb +256 -0
  51. data/lib/active_merchant/billing/gateways/cashnet.rb +235 -0
  52. data/lib/active_merchant/billing/gateways/cc5.rb +198 -0
  53. data/lib/active_merchant/billing/gateways/cecabank.rb +249 -0
  54. data/lib/active_merchant/billing/gateways/cenpos.rb +328 -0
  55. data/lib/active_merchant/billing/gateways/checkout.rb +212 -0
  56. data/lib/active_merchant/billing/gateways/checkout_v2.rb +587 -0
  57. data/lib/active_merchant/billing/gateways/citrus_pay.rb +21 -0
  58. data/lib/active_merchant/billing/gateways/clearhaus.rb +219 -0
  59. data/lib/active_merchant/billing/gateways/commerce_hub.rb +366 -0
  60. data/lib/active_merchant/billing/gateways/commercegate.rb +142 -0
  61. data/lib/active_merchant/billing/gateways/conekta.rb +230 -0
  62. data/lib/active_merchant/billing/gateways/creditcall.rb +272 -0
  63. data/lib/active_merchant/billing/gateways/credorax.rb +526 -0
  64. data/lib/active_merchant/billing/gateways/ct_payment.rb +269 -0
  65. data/lib/active_merchant/billing/gateways/culqi.rb +279 -0
  66. data/lib/active_merchant/billing/gateways/cyber_source/cyber_source_common.rb +36 -0
  67. data/lib/active_merchant/billing/gateways/cyber_source.rb +1148 -0
  68. data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +454 -0
  69. data/lib/active_merchant/billing/gateways/d_local.rb +343 -0
  70. data/lib/active_merchant/billing/gateways/data_cash.rb +302 -0
  71. data/lib/active_merchant/billing/gateways/decidir.rb +358 -0
  72. data/lib/active_merchant/billing/gateways/decidir_plus.rb +344 -0
  73. data/lib/active_merchant/billing/gateways/dibs.rb +199 -0
  74. data/lib/active_merchant/billing/gateways/digitzs.rb +295 -0
  75. data/lib/active_merchant/billing/gateways/ebanx.rb +346 -0
  76. data/lib/active_merchant/billing/gateways/efsnet.rb +215 -0
  77. data/lib/active_merchant/billing/gateways/elavon.rb +475 -0
  78. data/lib/active_merchant/billing/gateways/element.rb +406 -0
  79. data/lib/active_merchant/billing/gateways/epay.rb +296 -0
  80. data/lib/active_merchant/billing/gateways/evo_ca.rb +307 -0
  81. data/lib/active_merchant/billing/gateways/eway.rb +226 -0
  82. data/lib/active_merchant/billing/gateways/eway_managed.rb +289 -0
  83. data/lib/active_merchant/billing/gateways/eway_rapid.rb +578 -0
  84. data/lib/active_merchant/billing/gateways/exact.rb +219 -0
  85. data/lib/active_merchant/billing/gateways/ezic.rb +195 -0
  86. data/lib/active_merchant/billing/gateways/fat_zebra.rb +223 -0
  87. data/lib/active_merchant/billing/gateways/federated_canada.rb +158 -0
  88. data/lib/active_merchant/billing/gateways/finansbank.rb +22 -0
  89. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  90. data/lib/active_merchant/billing/gateways/first_pay.rb +182 -0
  91. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +452 -0
  92. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +505 -0
  93. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  94. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  95. data/lib/active_merchant/billing/gateways/fluidpay.rb +275 -0
  96. data/lib/active_merchant/billing/gateways/forte.rb +286 -0
  97. data/lib/active_merchant/billing/gateways/garanti.rb +256 -0
  98. data/lib/active_merchant/billing/gateways/global_collect.rb +580 -0
  99. data/lib/active_merchant/billing/gateways/global_transport.rb +193 -0
  100. data/lib/active_merchant/billing/gateways/hdfc.rb +205 -0
  101. data/lib/active_merchant/billing/gateways/hps.rb +472 -0
  102. data/lib/active_merchant/billing/gateways/iats_payments.rb +312 -0
  103. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  104. data/lib/active_merchant/billing/gateways/inspire.rb +213 -0
  105. data/lib/active_merchant/billing/gateways/instapay.rb +159 -0
  106. data/lib/active_merchant/billing/gateways/ipg.rb +420 -0
  107. data/lib/active_merchant/billing/gateways/ipp.rb +176 -0
  108. data/lib/active_merchant/billing/gateways/iridium.rb +467 -0
  109. data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
  110. data/lib/active_merchant/billing/gateways/iveri.rb +290 -0
  111. data/lib/active_merchant/billing/gateways/ixopay.rb +320 -0
  112. data/lib/active_merchant/billing/gateways/jetpay.rb +395 -0
  113. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +432 -0
  114. data/lib/active_merchant/billing/gateways/klarna.rb +317 -0
  115. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  116. data/lib/active_merchant/billing/gateways/kushki.rb +297 -0
  117. data/lib/active_merchant/billing/gateways/latitude19.rb +412 -0
  118. data/lib/active_merchant/billing/gateways/linkpoint.rb +448 -0
  119. data/lib/active_merchant/billing/gateways/litle.rb +643 -0
  120. data/lib/active_merchant/billing/gateways/mastercard.rb +286 -0
  121. data/lib/active_merchant/billing/gateways/maxipago.rb +220 -0
  122. data/lib/active_merchant/billing/gateways/mercado_pago.rb +348 -0
  123. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +228 -0
  124. data/lib/active_merchant/billing/gateways/merchant_one.rb +110 -0
  125. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  126. data/lib/active_merchant/billing/gateways/merchant_ware.rb +313 -0
  127. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +284 -0
  128. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +248 -0
  129. data/lib/active_merchant/billing/gateways/mercury.rb +352 -0
  130. data/lib/active_merchant/billing/gateways/metrics_global.rb +293 -0
  131. data/lib/active_merchant/billing/gateways/micropayment.rb +182 -0
  132. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
  133. data/lib/active_merchant/billing/gateways/migs.rb +329 -0
  134. data/lib/active_merchant/billing/gateways/mit.rb +260 -0
  135. data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
  136. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +215 -0
  137. data/lib/active_merchant/billing/gateways/moka.rb +290 -0
  138. data/lib/active_merchant/billing/gateways/monei.rb +424 -0
  139. data/lib/active_merchant/billing/gateways/moneris.rb +488 -0
  140. data/lib/active_merchant/billing/gateways/money_movers.rb +150 -0
  141. data/lib/active_merchant/billing/gateways/mundipagg.rb +366 -0
  142. data/lib/active_merchant/billing/gateways/nab_transact.rb +299 -0
  143. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +163 -0
  144. data/lib/active_merchant/billing/gateways/net_registry.rb +198 -0
  145. data/lib/active_merchant/billing/gateways/netaxept.rb +180 -0
  146. data/lib/active_merchant/billing/gateways/netbanx.rb +376 -0
  147. data/lib/active_merchant/billing/gateways/netbilling.rb +229 -0
  148. data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
  149. data/lib/active_merchant/billing/gateways/network_merchants.rb +238 -0
  150. data/lib/active_merchant/billing/gateways/nmi.rb +396 -0
  151. data/lib/active_merchant/billing/gateways/ogone.rb +509 -0
  152. data/lib/active_merchant/billing/gateways/omise.rb +323 -0
  153. data/lib/active_merchant/billing/gateways/openpay.rb +246 -0
  154. data/lib/active_merchant/billing/gateways/opp.rb +394 -0
  155. data/lib/active_merchant/billing/gateways/optimal_payment.rb +331 -0
  156. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +45 -0
  157. data/lib/active_merchant/billing/gateways/orbital.rb +1267 -0
  158. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +206 -0
  159. data/lib/active_merchant/billing/gateways/pagarme.rb +239 -0
  160. data/lib/active_merchant/billing/gateways/pago_facil.rb +120 -0
  161. data/lib/active_merchant/billing/gateways/pay_arc.rb +392 -0
  162. data/lib/active_merchant/billing/gateways/pay_conex.rb +245 -0
  163. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +277 -0
  164. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  165. data/lib/active_merchant/billing/gateways/pay_junction.rb +390 -0
  166. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +206 -0
  167. data/lib/active_merchant/billing/gateways/pay_secure.rb +110 -0
  168. data/lib/active_merchant/billing/gateways/pay_trace.rb +450 -0
  169. data/lib/active_merchant/billing/gateways/paybox_direct.rb +224 -0
  170. data/lib/active_merchant/billing/gateways/payeezy.rb +513 -0
  171. data/lib/active_merchant/billing/gateways/payex.rb +409 -0
  172. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +235 -0
  173. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +42 -0
  174. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  175. data/lib/active_merchant/billing/gateways/payflow.rb +473 -0
  176. data/lib/active_merchant/billing/gateways/payflow_express.rb +220 -0
  177. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +14 -0
  178. data/lib/active_merchant/billing/gateways/payflow_uk.rb +20 -0
  179. data/lib/active_merchant/billing/gateways/payment_express.rb +373 -0
  180. data/lib/active_merchant/billing/gateways/paymentez.rb +365 -0
  181. data/lib/active_merchant/billing/gateways/paymill.rb +369 -0
  182. data/lib/active_merchant/billing/gateways/paynetworx.rb +228 -0
  183. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +718 -0
  184. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +69 -0
  185. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +262 -0
  186. data/lib/active_merchant/billing/gateways/paypal.rb +136 -0
  187. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  188. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +44 -0
  189. data/lib/active_merchant/billing/gateways/paypal_express.rb +272 -0
  190. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
  191. data/lib/active_merchant/billing/gateways/paypal_standard.rb +281 -0
  192. data/lib/active_merchant/billing/gateways/paysafe.rb +420 -0
  193. data/lib/active_merchant/billing/gateways/payscout.rb +159 -0
  194. data/lib/active_merchant/billing/gateways/paystation.rb +204 -0
  195. data/lib/active_merchant/billing/gateways/payu_in.rb +249 -0
  196. data/lib/active_merchant/billing/gateways/payu_latam.rb +482 -0
  197. data/lib/active_merchant/billing/gateways/payway.rb +207 -0
  198. data/lib/active_merchant/billing/gateways/payway_dot_com.rb +253 -0
  199. data/lib/active_merchant/billing/gateways/pin.rb +273 -0
  200. data/lib/active_merchant/billing/gateways/pixxels.rb +263 -0
  201. data/lib/active_merchant/billing/gateways/plexo.rb +308 -0
  202. data/lib/active_merchant/billing/gateways/plugnpay.rb +283 -0
  203. data/lib/active_merchant/billing/gateways/priority.rb +392 -0
  204. data/lib/active_merchant/billing/gateways/pro_pay.rb +325 -0
  205. data/lib/active_merchant/billing/gateways/psigate.rb +227 -0
  206. data/lib/active_merchant/billing/gateways/psl_card.rb +295 -0
  207. data/lib/active_merchant/billing/gateways/qbms.rb +302 -0
  208. data/lib/active_merchant/billing/gateways/quantum.rb +274 -0
  209. data/lib/active_merchant/billing/gateways/quickbooks.rb +377 -0
  210. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +184 -0
  211. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +297 -0
  212. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +226 -0
  213. data/lib/active_merchant/billing/gateways/quickpay.rb +24 -0
  214. data/lib/active_merchant/billing/gateways/qvalent.rb +305 -0
  215. data/lib/active_merchant/billing/gateways/rapyd.rb +319 -0
  216. data/lib/active_merchant/billing/gateways/reach.rb +277 -0
  217. data/lib/active_merchant/billing/gateways/realex.rb +400 -0
  218. data/lib/active_merchant/billing/gateways/redsys.rb +723 -0
  219. data/lib/active_merchant/billing/gateways/s5.rb +247 -0
  220. data/lib/active_merchant/billing/gateways/safe_charge.rb +298 -0
  221. data/lib/active_merchant/billing/gateways/sage.rb +446 -0
  222. data/lib/active_merchant/billing/gateways/sage_pay.rb +434 -0
  223. data/lib/active_merchant/billing/gateways/sallie_mae.rb +141 -0
  224. data/lib/active_merchant/billing/gateways/secure_net.rb +260 -0
  225. data/lib/active_merchant/billing/gateways/secure_pay.rb +191 -0
  226. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +290 -0
  227. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +103 -0
  228. data/lib/active_merchant/billing/gateways/securion_pay.rb +305 -0
  229. data/lib/active_merchant/billing/gateways/shift4.rb +345 -0
  230. data/lib/active_merchant/billing/gateways/simetrik.rb +368 -0
  231. data/lib/active_merchant/billing/gateways/skip_jack.rb +450 -0
  232. data/lib/active_merchant/billing/gateways/smart_ps.rb +274 -0
  233. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  234. data/lib/active_merchant/billing/gateways/spreedly_core.rb +354 -0
  235. data/lib/active_merchant/billing/gateways/stripe.rb +866 -0
  236. data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +602 -0
  237. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +151 -0
  238. data/lib/active_merchant/billing/gateways/telr.rb +273 -0
  239. data/lib/active_merchant/billing/gateways/tns.rb +23 -0
  240. data/lib/active_merchant/billing/gateways/trans_first.rb +240 -0
  241. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +612 -0
  242. data/lib/active_merchant/billing/gateways/transact_pro.rb +222 -0
  243. data/lib/active_merchant/billing/gateways/transax.rb +21 -0
  244. data/lib/active_merchant/billing/gateways/transnational.rb +9 -0
  245. data/lib/active_merchant/billing/gateways/trexle.rb +221 -0
  246. data/lib/active_merchant/billing/gateways/trust_commerce.rb +500 -0
  247. data/lib/active_merchant/billing/gateways/usa_epay.rb +24 -0
  248. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1612 -0
  249. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +367 -0
  250. data/lib/active_merchant/billing/gateways/vanco.rb +303 -0
  251. data/lib/active_merchant/billing/gateways/verifi.rb +224 -0
  252. data/lib/active_merchant/billing/gateways/viaklix.rb +171 -0
  253. data/lib/active_merchant/billing/gateways/visanet_peru.rb +250 -0
  254. data/lib/active_merchant/billing/gateways/vpos.rb +223 -0
  255. data/lib/active_merchant/billing/gateways/webpay.rb +97 -0
  256. data/lib/active_merchant/billing/gateways/wepay.rb +235 -0
  257. data/lib/active_merchant/billing/gateways/wirecard.rb +430 -0
  258. data/lib/active_merchant/billing/gateways/wompi.rb +197 -0
  259. data/lib/active_merchant/billing/gateways/world_net.rb +345 -0
  260. data/lib/active_merchant/billing/gateways/worldpay.rb +1050 -0
  261. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +208 -0
  262. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  263. data/lib/active_merchant/billing/gateways.rb +14 -0
  264. data/lib/active_merchant/billing/model.rb +30 -0
  265. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  266. data/lib/active_merchant/billing/payment_token.rb +21 -0
  267. data/lib/active_merchant/billing/rails.rb +3 -0
  268. data/lib/active_merchant/billing/response.rb +121 -0
  269. data/lib/active_merchant/billing/three_d_secure_eci_mapper.rb +27 -0
  270. data/lib/active_merchant/billing.rb +16 -0
  271. data/lib/active_merchant/connection.rb +194 -0
  272. data/lib/active_merchant/country.rb +338 -0
  273. data/lib/active_merchant/empty.rb +20 -0
  274. data/lib/active_merchant/errors.rb +38 -0
  275. data/lib/active_merchant/net_http_ssl_connection.rb +11 -0
  276. data/lib/active_merchant/network_connection_retries.rb +78 -0
  277. data/lib/active_merchant/post_data.rb +26 -0
  278. data/lib/active_merchant/posts_data.rb +92 -0
  279. data/lib/active_merchant/version.rb +3 -0
  280. data/lib/active_merchant.rb +63 -0
  281. data/lib/activemerchant.rb +1 -0
  282. data/lib/certs/cacert.pem +3214 -0
  283. data/lib/support/gateway_support.rb +69 -0
  284. data/lib/support/outbound_hosts.rb +28 -0
  285. data/lib/support/ssl_verify.rb +88 -0
  286. data/lib/support/ssl_version.rb +86 -0
  287. 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;amp;', '&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