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,643 @@
1
+ require 'nokogiri'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class LitleGateway < Gateway
6
+ SCHEMA_VERSION = '9.14'
7
+
8
+ class_attribute :postlive_url, :prelive_url
9
+
10
+ self.test_url = 'https://www.testvantivcnp.com/sandbox/communicator/online'
11
+ self.prelive_url = 'https://payments.vantivprelive.com/vap/communicator/online'
12
+ self.postlive_url = 'https://payments.vantivpostlive.com/vap/communicator/online'
13
+ self.live_url = 'https://payments.vantivcnp.com/vap/communicator/online'
14
+
15
+ self.supported_countries = ['US']
16
+ self.default_currency = 'USD'
17
+ self.supported_cardtypes = %i[visa master american_express discover diners_club jcb]
18
+
19
+ self.homepage_url = 'https://www.fisglobal.com/'
20
+ self.display_name = 'Vantiv eCommerce'
21
+
22
+ def initialize(options = {})
23
+ requires!(options, :login, :password, :merchant_id)
24
+ super
25
+ end
26
+
27
+ def purchase(money, payment_method, options = {})
28
+ request = build_xml_request do |doc|
29
+ add_authentication(doc)
30
+ if check?(payment_method)
31
+ doc.echeckSale(transaction_attributes(options)) do
32
+ add_echeck_purchase_params(doc, money, payment_method, options)
33
+ end
34
+ else
35
+ doc.sale(transaction_attributes(options)) do
36
+ add_auth_purchase_params(doc, money, payment_method, options)
37
+ end
38
+ end
39
+ end
40
+ check?(payment_method) ? commit(:echeckSales, request, money) : commit(:sale, request, money)
41
+ end
42
+
43
+ def add_level_two_data(doc, payment_method, options = {})
44
+ level_2_data = options[:level_2_data]
45
+ if level_2_data
46
+ doc.enhancedData do
47
+ case payment_method.brand
48
+ when 'visa'
49
+ doc.salesTax(level_2_data[:sales_tax]) if level_2_data[:sales_tax]
50
+ when 'master'
51
+ doc.customerReference(level_2_data[:customer_code]) if level_2_data[:customer_code]
52
+ doc.salesTax(level_2_data[:total_tax_amount]) if level_2_data[:total_tax_amount]
53
+ doc.detailTax do
54
+ doc.taxIncludedInTotal(level_2_data[:tax_included_in_total]) if level_2_data[:tax_included_in_total]
55
+ doc.taxAmount(level_2_data[:tax_amount]) if level_2_data[:tax_amount]
56
+ doc.cardAcceptorTaxId(level_2_data[:card_acceptor_tax_id]) if level_2_data[:card_acceptor_tax_id]
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ def add_level_three_data(doc, payment_method, options = {})
64
+ level_3_data = options[:level_3_data]
65
+ if level_3_data
66
+ doc.enhancedData do
67
+ case payment_method.brand
68
+ when 'visa'
69
+ add_level_three_information_tags_visa(doc, payment_method, level_3_data)
70
+ when 'master'
71
+ add_level_three_information_tags_master(doc, payment_method, level_3_data)
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ def add_level_three_information_tags_visa(doc, payment_method, level_3_data)
78
+ doc.discountAmount(level_3_data[:discount_amount]) if level_3_data[:discount_amount]
79
+ doc.shippingAmount(level_3_data[:shipping_amount]) if level_3_data[:shipping_amount]
80
+ doc.dutyAmount(level_3_data[:duty_amount]) if level_3_data[:duty_amount]
81
+ doc.detailTax do
82
+ doc.taxIncludedInTotal(level_3_data[:tax_included_in_total]) if level_3_data[:tax_included_in_total]
83
+ doc.taxAmount(level_3_data[:tax_amount]) if level_3_data[:tax_amount]
84
+ doc.taxRate(level_3_data[:tax_rate]) if level_3_data[:tax_rate]
85
+ doc.taxTypeIdentifier(level_3_data[:tax_type_identifier]) if level_3_data[:tax_type_identifier]
86
+ doc.cardAcceptorTaxId(level_3_data[:card_acceptor_tax_id]) if level_3_data[:card_acceptor_tax_id]
87
+ end
88
+ add_line_item_information_for_level_three_visa(doc, payment_method, level_3_data)
89
+ end
90
+
91
+ def add_level_three_information_tags_master(doc, payment_method, level_3_data)
92
+ doc.customerReference :customerReference, level_3_data[:customer_code] if level_3_data[:customer_code]
93
+ doc.salesTax(level_3_data[:total_tax_amount]) if level_3_data[:total_tax_amount]
94
+ doc.detailTax do
95
+ doc.taxIncludedInTotal(level_3_data[:tax_included_in_total]) if level_3_data[:tax_included_in_total]
96
+ doc.taxAmount(level_3_data[:tax_amount]) if level_3_data[:tax_amount]
97
+ doc.cardAcceptorTaxId :cardAcceptorTaxId, level_3_data[:card_acceptor_tax_id] if level_3_data[:card_acceptor_tax_id]
98
+ end
99
+ doc.lineItemData do
100
+ level_3_data[:line_items].each do |line_item|
101
+ doc.itemDescription(line_item[:item_description]) if line_item[:item_description]
102
+ doc.productCode(line_item[:product_code]) if line_item[:product_code]
103
+ doc.quantity(line_item[:quantity]) if line_item[:quantity]
104
+ doc.unitOfMeasure(line_item[:unit_of_measure]) if line_item[:unit_of_measure]
105
+ doc.lineItemTotal(line_item[:line_item_total]) if line_item[:line_item_total]
106
+ end
107
+ end
108
+ end
109
+
110
+ def add_line_item_information_for_level_three_visa(doc, payment_method, level_3_data)
111
+ doc.lineItemData do
112
+ level_3_data[:line_items].each do |line_item|
113
+ doc.itemSequenceNumber(line_item[:item_sequence_number]) if line_item[:item_sequence_number]
114
+ doc.commodityCode(line_item[:commodity_code]) if line_item[:commodity_code]
115
+ doc.itemDescription(line_item[:item_description]) if line_item[:item_description]
116
+ doc.productCode(line_item[:product_code]) if line_item[:product_code]
117
+ doc.quantity(line_item[:quantity]) if line_item[:quantity]
118
+ doc.unitOfMeasure(line_item[:unit_of_measure]) if line_item[:unit_of_measure]
119
+ doc.taxAmount(line_item[:tax_amount]) if line_item[:tax_amount]
120
+ doc.itemDiscountAmount(line_item[:discount_per_line_item]) unless line_item[:discount_per_line_item] < 0
121
+ doc.unitCost(line_item[:unit_cost]) unless line_item[:unit_cost] < 0
122
+ doc.detailTax do
123
+ doc.taxIncludedInTotal(line_item[:tax_included_in_total]) if line_item[:tax_included_in_total]
124
+ doc.taxAmount(line_item[:tax_amount]) if line_item[:tax_amount]
125
+ doc.taxRate(line_item[:tax_rate]) if line_item[:tax_rate]
126
+ doc.taxTypeIdentifier(line_item[:tax_type_identifier]) if line_item[:tax_type_identifier]
127
+ doc.cardAcceptorTaxId(line_item[:card_acceptor_tax_id]) if line_item[:card_acceptor_tax_id]
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ def authorize(money, payment_method, options = {})
134
+ request = build_xml_request do |doc|
135
+ add_authentication(doc)
136
+ if check?(payment_method)
137
+ doc.echeckVerification(transaction_attributes(options)) do
138
+ add_echeck_purchase_params(doc, money, payment_method, options)
139
+ end
140
+ else
141
+ doc.authorization(transaction_attributes(options)) do
142
+ add_auth_purchase_params(doc, money, payment_method, options)
143
+ end
144
+ end
145
+ end
146
+ check?(payment_method) ? commit(:echeckVerification, request, money) : commit(:authorization, request, money)
147
+ end
148
+
149
+ def capture(money, authorization, options = {})
150
+ transaction_id, = split_authorization(authorization)
151
+
152
+ request = build_xml_request do |doc|
153
+ add_authentication(doc)
154
+ add_descriptor(doc, options)
155
+ doc.capture_(transaction_attributes(options)) do
156
+ doc.litleTxnId(transaction_id)
157
+ doc.amount(money) if money
158
+ end
159
+ end
160
+
161
+ commit(:capture, request, money)
162
+ end
163
+
164
+ def credit(money, authorization, options = {})
165
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
166
+ refund(money, authorization, options)
167
+ end
168
+
169
+ def refund(money, payment, options = {})
170
+ request = build_xml_request do |doc|
171
+ add_authentication(doc)
172
+ add_descriptor(doc, options)
173
+ doc.send(refund_type(payment), transaction_attributes(options)) do
174
+ if payment.is_a?(String)
175
+ transaction_id, = split_authorization(payment)
176
+ doc.litleTxnId(transaction_id)
177
+ doc.amount(money) if money
178
+ elsif check?(payment)
179
+ add_echeck_purchase_params(doc, money, payment, options)
180
+ else
181
+ add_credit_params(doc, money, payment, options)
182
+ end
183
+ end
184
+ end
185
+
186
+ commit(refund_type(payment), request)
187
+ end
188
+
189
+ def verify(creditcard, options = {})
190
+ MultiResponse.run(:use_first_response) do |r|
191
+ r.process { authorize(0, creditcard, options) }
192
+ r.process(:ignore_result) { void(r.authorization, options) }
193
+ end
194
+ end
195
+
196
+ def void(authorization, options = {})
197
+ transaction_id, kind, money = split_authorization(authorization)
198
+
199
+ request = build_xml_request do |doc|
200
+ add_authentication(doc)
201
+ doc.send(void_type(kind), transaction_attributes(options)) do
202
+ doc.litleTxnId(transaction_id)
203
+ doc.amount(money) if void_type(kind) == :authReversal
204
+ end
205
+ end
206
+
207
+ commit(void_type(kind), request)
208
+ end
209
+
210
+ def store(payment_method, options = {})
211
+ request = build_xml_request do |doc|
212
+ add_authentication(doc)
213
+ doc.registerTokenRequest(transaction_attributes(options)) do
214
+ doc.orderId(truncate(options[:order_id], 24))
215
+ if payment_method.is_a?(String)
216
+ doc.paypageRegistrationId(payment_method)
217
+ elsif check?(payment_method)
218
+ doc.echeckForToken do
219
+ doc.accNum(payment_method.account_number)
220
+ doc.routingNum(payment_method.routing_number)
221
+ end
222
+ else
223
+ doc.accountNumber(payment_method.number)
224
+ doc.cardValidationNum(payment_method.verification_value) if payment_method.verification_value
225
+ end
226
+ end
227
+ end
228
+
229
+ commit(:registerToken, request)
230
+ end
231
+
232
+ def supports_scrubbing?
233
+ true
234
+ end
235
+
236
+ def scrub(transcript)
237
+ transcript.
238
+ gsub(%r((<user>).+(</user>)), '\1[FILTERED]\2').
239
+ gsub(%r((<password>).+(</password>)), '\1[FILTERED]\2').
240
+ gsub(%r((<number>).+(</number>)), '\1[FILTERED]\2').
241
+ gsub(%r((<accNum>).+(</accNum>)), '\1[FILTERED]\2').
242
+ gsub(%r((<routingNum>).+(</routingNum>)), '\1[FILTERED]\2').
243
+ gsub(%r((<cardValidationNum>).+(</cardValidationNum>)), '\1[FILTERED]\2').
244
+ gsub(%r((<accountNumber>).+(</accountNumber>)), '\1[FILTERED]\2').
245
+ gsub(%r((<paypageRegistrationId>).+(</paypageRegistrationId>)), '\1[FILTERED]\2').
246
+ gsub(%r((<authenticationValue>).+(</authenticationValue>)), '\1[FILTERED]\2')
247
+ end
248
+
249
+ private
250
+
251
+ CARD_TYPE = {
252
+ 'visa' => 'VI',
253
+ 'master' => 'MC',
254
+ 'american_express' => 'AX',
255
+ 'discover' => 'DI',
256
+ 'jcb' => 'JC',
257
+ 'diners_club' => 'DC'
258
+ }
259
+
260
+ AVS_RESPONSE_CODE = {
261
+ '00' => 'Y',
262
+ '01' => 'X',
263
+ '02' => 'D',
264
+ '10' => 'Z',
265
+ '11' => 'W',
266
+ '12' => 'A',
267
+ '13' => 'A',
268
+ '14' => 'P',
269
+ '20' => 'N',
270
+ '30' => 'S',
271
+ '31' => 'R',
272
+ '32' => 'U',
273
+ '33' => 'R',
274
+ '34' => 'I',
275
+ '40' => 'E'
276
+ }
277
+
278
+ def void_type(kind)
279
+ if kind == 'authorization'
280
+ :authReversal
281
+ elsif kind == 'echeckSales'
282
+ :echeckVoid
283
+ else
284
+ :void
285
+ end
286
+ end
287
+
288
+ def refund_type(payment)
289
+ _, kind, = split_authorization(payment)
290
+ if check?(payment) || kind == 'echeckSales'
291
+ :echeckCredit
292
+ else
293
+ :credit
294
+ end
295
+ end
296
+
297
+ def check?(payment_method)
298
+ return false if payment_method.is_a?(String)
299
+
300
+ card_brand(payment_method) == 'check'
301
+ end
302
+
303
+ def add_authentication(doc)
304
+ doc.authentication do
305
+ doc.user(@options[:login])
306
+ doc.password(@options[:password])
307
+ end
308
+ end
309
+
310
+ def add_auth_purchase_params(doc, money, payment_method, options)
311
+ doc.orderId(truncate(options[:order_id], 24))
312
+ doc.amount(money)
313
+ add_order_source(doc, payment_method, options)
314
+ add_billing_address(doc, payment_method, options)
315
+ add_shipping_address(doc, payment_method, options)
316
+ add_payment_method(doc, payment_method, options)
317
+ add_pos(doc, payment_method)
318
+ add_descriptor(doc, options)
319
+ add_level_two_data(doc, payment_method, options)
320
+ add_level_three_data(doc, payment_method, options)
321
+ add_merchant_data(doc, options)
322
+ add_debt_repayment(doc, options)
323
+ add_stored_credential_params(doc, options)
324
+ add_fraud_filter_override(doc, options)
325
+ end
326
+
327
+ def add_credit_params(doc, money, payment_method, options)
328
+ doc.orderId(truncate(options[:order_id], 24))
329
+ doc.amount(money)
330
+ add_order_source(doc, payment_method, options)
331
+ add_billing_address(doc, payment_method, options)
332
+ add_payment_method(doc, payment_method, options)
333
+ add_pos(doc, payment_method)
334
+ add_descriptor(doc, options)
335
+ add_merchant_data(doc, options)
336
+ end
337
+
338
+ def add_merchant_data(doc, options = {})
339
+ if options[:affiliate] || options[:campaign] || options[:merchant_grouping_id]
340
+ doc.merchantData do
341
+ doc.affiliate(options[:affiliate]) if options[:affiliate]
342
+ doc.campaign(options[:campaign]) if options[:campaign]
343
+ doc.merchantGroupingId(options[:merchant_grouping_id]) if options[:merchant_grouping_id]
344
+ end
345
+ end
346
+ end
347
+
348
+ def add_echeck_purchase_params(doc, money, payment_method, options)
349
+ doc.orderId(truncate(options[:order_id], 24))
350
+ doc.amount(money)
351
+ add_order_source(doc, payment_method, options)
352
+ add_billing_address(doc, payment_method, options)
353
+ add_payment_method(doc, payment_method, options)
354
+ add_descriptor(doc, options)
355
+ end
356
+
357
+ def add_descriptor(doc, options)
358
+ if options[:descriptor_name] || options[:descriptor_phone]
359
+ doc.customBilling do
360
+ doc.phone(options[:descriptor_phone]) if options[:descriptor_phone]
361
+ doc.descriptor(options[:descriptor_name]) if options[:descriptor_name]
362
+ end
363
+ end
364
+ end
365
+
366
+ def add_debt_repayment(doc, options)
367
+ doc.debtRepayment(true) if options[:debt_repayment] == true
368
+ end
369
+
370
+ def add_fraud_filter_override(doc, options)
371
+ doc.fraudFilterOverride(options[:fraud_filter_override]) if options[:fraud_filter_override]
372
+ end
373
+
374
+ def add_payment_method(doc, payment_method, options)
375
+ if payment_method.is_a?(String)
376
+ doc.token do
377
+ doc.litleToken(payment_method)
378
+ doc.expDate(format_exp_date(options[:basis_expiration_month], options[:basis_expiration_year])) if options[:basis_expiration_month] && options[:basis_expiration_year]
379
+ end
380
+ elsif payment_method.respond_to?(:track_data) && payment_method.track_data.present?
381
+ doc.card do
382
+ doc.track(payment_method.track_data)
383
+ end
384
+ elsif check?(payment_method)
385
+ doc.echeck do
386
+ doc.accType(payment_method.account_type.capitalize)
387
+ doc.accNum(payment_method.account_number)
388
+ doc.routingNum(payment_method.routing_number)
389
+ doc.checkNum(payment_method.number) if payment_method.number
390
+ end
391
+ else
392
+ doc.card do
393
+ doc.type_(CARD_TYPE[payment_method.brand])
394
+ doc.number(payment_method.number)
395
+ doc.expDate(exp_date(payment_method))
396
+ doc.cardValidationNum(payment_method.verification_value)
397
+ end
398
+ if payment_method.is_a?(NetworkTokenizationCreditCard)
399
+ doc.cardholderAuthentication do
400
+ doc.authenticationValue(payment_method.payment_cryptogram)
401
+ end
402
+ elsif options[:order_source]&.start_with?('3ds')
403
+ doc.cardholderAuthentication do
404
+ doc.authenticationValue(options[:cavv]) if options[:cavv]
405
+ doc.authenticationTransactionId(options[:xid]) if options[:xid]
406
+ end
407
+ end
408
+ end
409
+ end
410
+
411
+ def add_stored_credential_params(doc, options = {})
412
+ return unless options[:stored_credential]
413
+
414
+ if options[:stored_credential][:initial_transaction]
415
+ add_stored_credential_params_initial(doc, options)
416
+ else
417
+ add_stored_credential_params_used(doc, options)
418
+ end
419
+ end
420
+
421
+ def add_stored_credential_params_initial(doc, options)
422
+ case options[:stored_credential][:reason_type]
423
+ when 'unscheduled'
424
+ doc.processingType('initialCOF')
425
+ when 'installment'
426
+ doc.processingType('initialInstallment')
427
+ when 'recurring'
428
+ doc.processingType('initialRecurring')
429
+ end
430
+ end
431
+
432
+ def add_stored_credential_params_used(doc, options)
433
+ if options[:stored_credential][:reason_type] == 'unscheduled'
434
+ if options[:stored_credential][:initiator] == 'merchant'
435
+ doc.processingType('merchantInitiatedCOF')
436
+ else
437
+ doc.processingType('cardholderInitiatedCOF')
438
+ end
439
+ end
440
+ doc.originalNetworkTransactionId(options[:stored_credential][:network_transaction_id])
441
+ end
442
+
443
+ def add_billing_address(doc, payment_method, options)
444
+ return if payment_method.is_a?(String)
445
+
446
+ doc.billToAddress do
447
+ if check?(payment_method)
448
+ doc.name(payment_method.name)
449
+ doc.firstName(payment_method.first_name)
450
+ doc.lastName(payment_method.last_name)
451
+ else
452
+ doc.name(payment_method.name)
453
+ end
454
+ doc.email(options[:email]) if options[:email]
455
+
456
+ add_address(doc, options[:billing_address])
457
+ end
458
+ end
459
+
460
+ def add_shipping_address(doc, payment_method, options)
461
+ return if payment_method.is_a?(String)
462
+
463
+ doc.shipToAddress do
464
+ add_address(doc, options[:shipping_address])
465
+ end
466
+ end
467
+
468
+ def add_address(doc, address)
469
+ return unless address
470
+
471
+ doc.companyName(address[:company]) unless address[:company].blank?
472
+ doc.addressLine1(truncate(address[:address1], 35)) unless address[:address1].blank?
473
+ doc.addressLine2(truncate(address[:address2], 35)) unless address[:address2].blank?
474
+ doc.city(truncate(address[:city], 35)) unless address[:city].blank?
475
+ doc.state(address[:state]) unless address[:state].blank?
476
+ doc.zip(address[:zip]) unless address[:zip].blank?
477
+ doc.country(address[:country]) unless address[:country].blank?
478
+ doc.phone(address[:phone]) unless address[:phone].blank?
479
+ end
480
+
481
+ def add_order_source(doc, payment_method, options)
482
+ order_source = order_source(options)
483
+ if order_source
484
+ doc.orderSource(order_source)
485
+ elsif payment_method.is_a?(NetworkTokenizationCreditCard) && payment_method.source == :apple_pay
486
+ doc.orderSource('applepay')
487
+ elsif payment_method.is_a?(NetworkTokenizationCreditCard) && %i[google_pay android_pay].include?(payment_method.source)
488
+ doc.orderSource('androidpay')
489
+ elsif payment_method.respond_to?(:track_data) && payment_method.track_data.present?
490
+ doc.orderSource('retail')
491
+ else
492
+ doc.orderSource('ecommerce')
493
+ end
494
+ end
495
+
496
+ def order_source(options = {})
497
+ return options[:order_source] unless options[:stored_credential]
498
+
499
+ order_source = nil
500
+
501
+ case options[:stored_credential][:reason_type]
502
+ when 'unscheduled'
503
+ if options[:stored_credential][:initiator] == 'merchant'
504
+ # For merchant-initiated, we should always set order source to
505
+ # 'ecommerce'
506
+ order_source = 'ecommerce'
507
+ else
508
+ # For cardholder-initiated, we rely on #add_order_source's
509
+ # default logic to set orderSource appropriately
510
+ order_source = options[:order_source]
511
+ end
512
+ when 'installment'
513
+ order_source = 'installment'
514
+ when 'recurring'
515
+ order_source = 'recurring'
516
+ end
517
+
518
+ order_source
519
+ end
520
+
521
+ def add_pos(doc, payment_method)
522
+ return unless payment_method.respond_to?(:track_data) && payment_method.track_data.present?
523
+
524
+ doc.pos do
525
+ doc.capability('magstripe')
526
+ doc.entryMode('completeread')
527
+ doc.cardholderId('signature')
528
+ end
529
+ end
530
+
531
+ def exp_date(payment_method)
532
+ format_exp_date(payment_method.month, payment_method.year)
533
+ end
534
+
535
+ def format_exp_date(month, year)
536
+ "#{format(month, :two_digits)}#{format(year, :two_digits)}"
537
+ end
538
+
539
+ def parse(kind, xml)
540
+ parsed = {}
541
+ doc = Nokogiri::XML(xml).remove_namespaces!
542
+
543
+ parsed['duplicate'] = doc.at_xpath('//saleResponse').try(:[], 'duplicate') == 'true' if kind == :sale
544
+
545
+ doc.xpath("//litleOnlineResponse/#{kind}Response/*").each do |node|
546
+ if node.elements.empty?
547
+ parsed[node.name.to_sym] = node.text
548
+ else
549
+ node.elements.each do |childnode|
550
+ name = "#{node.name}_#{childnode.name}"
551
+ parsed[name.to_sym] = childnode.text
552
+ end
553
+ end
554
+ end
555
+
556
+ if parsed.empty?
557
+ %w(response message).each do |attribute|
558
+ parsed[attribute.to_sym] = doc.xpath('//litleOnlineResponse').attribute(attribute).value
559
+ end
560
+ end
561
+
562
+ parsed
563
+ end
564
+
565
+ def commit(kind, request, money = nil)
566
+ parsed = parse(kind, ssl_post(url, request, headers))
567
+
568
+ options = {
569
+ authorization: authorization_from(kind, parsed, money),
570
+ test: test?,
571
+ avs_result: { code: AVS_RESPONSE_CODE[parsed[:fraudResult_avsResult]] },
572
+ cvv_result: parsed[:fraudResult_cardValidationResult]
573
+ }
574
+
575
+ Response.new(success_from(kind, parsed), message_from(parsed), parsed, options)
576
+ end
577
+
578
+ def success_from(kind, parsed)
579
+ return %w(000 001 010).any?(parsed[:response]) unless kind == :registerToken
580
+
581
+ %w(000 801 802).include?(parsed[:response])
582
+ end
583
+
584
+ def message_from(parsed)
585
+ case parsed[:response]
586
+ when '010'
587
+ return "#{parsed[:message]}: The authorized amount is less than the requested amount."
588
+ when '001'
589
+ return "#{parsed[:message]}: This is sent to acknowledge that the submitted transaction has been received."
590
+ else
591
+ parsed[:message]
592
+ end
593
+ end
594
+
595
+ def authorization_from(kind, parsed, money)
596
+ kind == :registerToken ? parsed[:litleToken] : "#{parsed[:litleTxnId]};#{kind};#{money}"
597
+ end
598
+
599
+ def split_authorization(authorization)
600
+ transaction_id, kind, money = authorization.to_s.split(';')
601
+ [transaction_id, kind, money]
602
+ end
603
+
604
+ def transaction_attributes(options)
605
+ attributes = {}
606
+ attributes[:id] = truncate(options[:id] || options[:order_id], 24)
607
+ attributes[:reportGroup] = options[:merchant] || 'Default Report Group'
608
+ attributes[:customerId] = options[:customer_id]
609
+ attributes.delete_if { |_key, value| value == nil }
610
+ attributes
611
+ end
612
+
613
+ def root_attributes
614
+ {
615
+ merchantId: @options[:merchant_id],
616
+ version: SCHEMA_VERSION,
617
+ xmlns: 'http://www.litle.com/schema'
618
+ }
619
+ end
620
+
621
+ def build_xml_request
622
+ builder = Nokogiri::XML::Builder.new
623
+ builder.__send__('litleOnlineRequest', root_attributes) do |doc|
624
+ yield(doc)
625
+ end
626
+ builder.doc.root.to_xml
627
+ end
628
+
629
+ def url
630
+ return postlive_url if @options[:url_override].to_s == 'postlive'
631
+ return prelive_url if @options[:url_override].to_s == 'prelive'
632
+
633
+ test? ? test_url : live_url
634
+ end
635
+
636
+ def headers
637
+ {
638
+ 'Content-Type' => 'text/xml'
639
+ }
640
+ end
641
+ end
642
+ end
643
+ end