activemerchant 1.42.6 → 1.90.0

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 (450) hide show
  1. checksums.yaml +5 -13
  2. data/CHANGELOG +1420 -2
  3. data/CONTRIBUTORS +106 -0
  4. data/README.md +107 -103
  5. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  6. data/lib/active_merchant/billing/avs_result.rb +12 -13
  7. data/lib/active_merchant/billing/base.rb +13 -16
  8. data/lib/active_merchant/billing/check.rb +35 -24
  9. data/lib/active_merchant/billing/compatibility.rb +117 -0
  10. data/lib/active_merchant/billing/credit_card.rb +196 -81
  11. data/lib/active_merchant/billing/credit_card_formatting.rb +6 -4
  12. data/lib/active_merchant/billing/credit_card_methods.rb +199 -75
  13. data/lib/active_merchant/billing/cvv_result.rb +15 -15
  14. data/lib/active_merchant/billing/gateway.rb +171 -39
  15. data/lib/active_merchant/billing/gateways/adyen.rb +380 -0
  16. data/lib/active_merchant/billing/gateways/allied_wallet.rb +205 -0
  17. data/lib/active_merchant/billing/gateways/authorize_net.rb +933 -604
  18. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +417 -0
  19. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +74 -54
  20. data/lib/active_merchant/billing/gateways/axcessms.rb +181 -0
  21. data/lib/active_merchant/billing/gateways/balanced.rb +130 -370
  22. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  23. data/lib/active_merchant/billing/gateways/banwire.rb +23 -12
  24. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +351 -0
  25. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +6 -6
  26. data/lib/active_merchant/billing/gateways/be2bill.rb +2 -2
  27. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +109 -32
  28. data/lib/active_merchant/billing/gateways/beanstream.rb +59 -13
  29. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +12 -9
  30. data/lib/active_merchant/billing/gateways/blue_pay.rb +520 -498
  31. data/lib/active_merchant/billing/gateways/blue_snap.rb +347 -0
  32. data/lib/active_merchant/billing/gateways/bogus.rb +80 -46
  33. data/lib/active_merchant/billing/gateways/borgun.rb +220 -0
  34. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  35. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +15 -2
  36. data/lib/active_merchant/billing/gateways/braintree.rb +2 -2
  37. data/lib/active_merchant/billing/gateways/braintree_blue.rb +311 -121
  38. data/lib/active_merchant/billing/gateways/braintree_orange.rb +4 -4
  39. data/lib/active_merchant/billing/gateways/bridge_pay.rb +244 -0
  40. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  41. data/lib/active_merchant/billing/gateways/card_connect.rb +311 -0
  42. data/lib/active_merchant/billing/gateways/card_save.rb +6 -7
  43. data/lib/active_merchant/billing/gateways/card_stream.rb +235 -89
  44. data/lib/active_merchant/billing/gateways/cardknox.rb +327 -0
  45. data/lib/active_merchant/billing/gateways/cardprocess.rb +254 -0
  46. data/lib/active_merchant/billing/gateways/cashnet.rb +219 -0
  47. data/lib/active_merchant/billing/gateways/cc5.rb +50 -8
  48. data/lib/active_merchant/billing/gateways/cecabank.rb +27 -14
  49. data/lib/active_merchant/billing/gateways/cenpos.rb +327 -0
  50. data/lib/active_merchant/billing/gateways/checkout.rb +214 -0
  51. data/lib/active_merchant/billing/gateways/checkout_v2.rb +233 -0
  52. data/lib/active_merchant/billing/gateways/citrus_pay.rb +22 -0
  53. data/lib/active_merchant/billing/gateways/clearhaus.rb +220 -0
  54. data/lib/active_merchant/billing/gateways/commercegate.rb +142 -0
  55. data/lib/active_merchant/billing/gateways/conekta.rb +91 -97
  56. data/lib/active_merchant/billing/gateways/creditcall.rb +271 -0
  57. data/lib/active_merchant/billing/gateways/credorax.rb +356 -0
  58. data/lib/active_merchant/billing/gateways/ct_payment.rb +268 -0
  59. data/lib/active_merchant/billing/gateways/culqi.rb +277 -0
  60. data/lib/active_merchant/billing/gateways/cyber_source.rb +294 -158
  61. data/lib/active_merchant/billing/gateways/d_local.rb +226 -0
  62. data/lib/active_merchant/billing/gateways/data_cash.rb +59 -347
  63. data/lib/active_merchant/billing/gateways/dibs.rb +199 -0
  64. data/lib/active_merchant/billing/gateways/digitzs.rb +292 -0
  65. data/lib/active_merchant/billing/gateways/ebanx.rb +296 -0
  66. data/lib/active_merchant/billing/gateways/efsnet.rb +24 -39
  67. data/lib/active_merchant/billing/gateways/elavon.rb +146 -147
  68. data/lib/active_merchant/billing/gateways/element.rb +356 -0
  69. data/lib/active_merchant/billing/gateways/epay.rb +41 -31
  70. data/lib/active_merchant/billing/gateways/evo_ca.rb +1 -1
  71. data/lib/active_merchant/billing/gateways/eway.rb +79 -78
  72. data/lib/active_merchant/billing/gateways/eway_managed.rb +35 -36
  73. data/lib/active_merchant/billing/gateways/eway_rapid.rb +369 -228
  74. data/lib/active_merchant/billing/gateways/exact.rb +32 -26
  75. data/lib/active_merchant/billing/gateways/ezic.rb +195 -0
  76. data/lib/active_merchant/billing/gateways/fat_zebra.rb +90 -64
  77. data/lib/active_merchant/billing/gateways/federated_canada.rb +6 -14
  78. data/lib/active_merchant/billing/gateways/finansbank.rb +3 -3
  79. data/lib/active_merchant/billing/gateways/first_giving.rb +142 -0
  80. data/lib/active_merchant/billing/gateways/first_pay.rb +128 -122
  81. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +190 -64
  82. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +446 -0
  83. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  84. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  85. data/lib/active_merchant/billing/gateways/forte.rb +270 -0
  86. data/lib/active_merchant/billing/gateways/garanti.rb +29 -27
  87. data/lib/active_merchant/billing/gateways/global_collect.rb +340 -0
  88. data/lib/active_merchant/billing/gateways/global_transport.rb +194 -0
  89. data/lib/active_merchant/billing/gateways/hdfc.rb +35 -36
  90. data/lib/active_merchant/billing/gateways/hps.rb +305 -0
  91. data/lib/active_merchant/billing/gateways/iats_payments.rb +271 -16
  92. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  93. data/lib/active_merchant/billing/gateways/inspire.rb +29 -32
  94. data/lib/active_merchant/billing/gateways/instapay.rb +5 -6
  95. data/lib/active_merchant/billing/gateways/ipp.rb +175 -0
  96. data/lib/active_merchant/billing/gateways/iridium.rb +247 -41
  97. data/lib/active_merchant/billing/gateways/itransact.rb +4 -5
  98. data/lib/active_merchant/billing/gateways/iveri.rb +251 -0
  99. data/lib/active_merchant/billing/gateways/jetpay.rb +198 -71
  100. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +437 -0
  101. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  102. data/lib/active_merchant/billing/gateways/kushki.rb +219 -0
  103. data/lib/active_merchant/billing/gateways/latitude19.rb +411 -0
  104. data/lib/active_merchant/billing/gateways/linkpoint.rb +45 -43
  105. data/lib/active_merchant/billing/gateways/litle.rb +328 -444
  106. data/lib/active_merchant/billing/gateways/mastercard.rb +267 -0
  107. data/lib/active_merchant/billing/gateways/maxipago.rb +145 -115
  108. data/lib/active_merchant/billing/gateways/mercado_pago.rb +277 -0
  109. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +37 -19
  110. data/lib/active_merchant/billing/gateways/merchant_one.rb +13 -15
  111. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  112. data/lib/active_merchant/billing/gateways/merchant_ware.rb +57 -60
  113. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +59 -48
  114. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +38 -19
  115. data/lib/active_merchant/billing/gateways/mercury.rb +77 -54
  116. data/lib/active_merchant/billing/gateways/metrics_global.rb +11 -30
  117. data/lib/active_merchant/billing/gateways/micropayment.rb +183 -0
  118. data/lib/active_merchant/billing/gateways/migs.rb +81 -22
  119. data/lib/active_merchant/billing/gateways/modern_payments.rb +3 -3
  120. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +23 -25
  121. data/lib/active_merchant/billing/gateways/monei.rb +307 -0
  122. data/lib/active_merchant/billing/gateways/moneris.rb +146 -64
  123. data/lib/active_merchant/billing/gateways/moneris_us.rb +197 -53
  124. data/lib/active_merchant/billing/gateways/money_movers.rb +6 -15
  125. data/lib/active_merchant/billing/gateways/mundipagg.rb +292 -0
  126. data/lib/active_merchant/billing/gateways/nab_transact.rb +86 -64
  127. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +165 -0
  128. data/lib/active_merchant/billing/gateways/net_registry.rb +11 -5
  129. data/lib/active_merchant/billing/gateways/netaxept.rb +21 -22
  130. data/lib/active_merchant/billing/gateways/netbanx.rb +290 -0
  131. data/lib/active_merchant/billing/gateways/netbilling.rb +70 -35
  132. data/lib/active_merchant/billing/gateways/netpay.rb +5 -6
  133. data/lib/active_merchant/billing/gateways/network_merchants.rb +241 -0
  134. data/lib/active_merchant/billing/gateways/nmi.rb +274 -10
  135. data/lib/active_merchant/billing/gateways/ogone.rb +90 -47
  136. data/lib/active_merchant/billing/gateways/omise.rb +324 -0
  137. data/lib/active_merchant/billing/gateways/openpay.rb +48 -20
  138. data/lib/active_merchant/billing/gateways/opp.rb +369 -0
  139. data/lib/active_merchant/billing/gateways/optimal_payment.rb +79 -44
  140. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +22 -21
  141. data/lib/active_merchant/billing/gateways/orbital.rb +346 -102
  142. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +48 -29
  143. data/lib/active_merchant/billing/gateways/pagarme.rb +246 -0
  144. data/lib/active_merchant/billing/gateways/pago_facil.rb +122 -0
  145. data/lib/active_merchant/billing/gateways/pay_conex.rb +245 -0
  146. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +67 -48
  147. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  148. data/lib/active_merchant/billing/gateways/pay_junction.rb +20 -26
  149. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +188 -0
  150. data/lib/active_merchant/billing/gateways/pay_secure.rb +7 -15
  151. data/lib/active_merchant/billing/gateways/paybox_direct.rb +40 -36
  152. data/lib/active_merchant/billing/gateways/payeezy.rb +410 -0
  153. data/lib/active_merchant/billing/gateways/payex.rb +38 -30
  154. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +62 -36
  155. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +11 -7
  156. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +3 -3
  157. data/lib/active_merchant/billing/gateways/payflow.rb +74 -27
  158. data/lib/active_merchant/billing/gateways/payflow_express.rb +77 -81
  159. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +2 -3
  160. data/lib/active_merchant/billing/gateways/payflow_uk.rb +5 -6
  161. data/lib/active_merchant/billing/gateways/payment_express.rb +54 -45
  162. data/lib/active_merchant/billing/gateways/paymentez.rb +304 -0
  163. data/lib/active_merchant/billing/gateways/paymill.rb +160 -66
  164. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +54 -7
  165. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +4 -0
  166. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +17 -3
  167. data/lib/active_merchant/billing/gateways/paypal.rb +36 -27
  168. data/lib/active_merchant/billing/gateways/paypal_ca.rb +1 -1
  169. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +7 -6
  170. data/lib/active_merchant/billing/gateways/paypal_express.rb +32 -4
  171. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +3 -3
  172. data/lib/active_merchant/billing/gateways/payscout.rb +2 -13
  173. data/lib/active_merchant/billing/gateways/paystation.rb +96 -88
  174. data/lib/active_merchant/billing/gateways/payu_in.rb +248 -0
  175. data/lib/active_merchant/billing/gateways/payu_latam.rb +445 -0
  176. data/lib/active_merchant/billing/gateways/payway.rb +8 -8
  177. data/lib/active_merchant/billing/gateways/pin.rb +74 -18
  178. data/lib/active_merchant/billing/gateways/plugnpay.rb +66 -76
  179. data/lib/active_merchant/billing/gateways/pro_pay.rb +326 -0
  180. data/lib/active_merchant/billing/gateways/psigate.rb +30 -30
  181. data/lib/active_merchant/billing/gateways/psl_card.rb +27 -34
  182. data/lib/active_merchant/billing/gateways/qbms.rb +65 -54
  183. data/lib/active_merchant/billing/gateways/quantum.rb +18 -18
  184. data/lib/active_merchant/billing/gateways/quickbooks.rb +290 -0
  185. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +184 -0
  186. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +295 -0
  187. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +226 -0
  188. data/lib/active_merchant/billing/gateways/quickpay.rb +10 -350
  189. data/lib/active_merchant/billing/gateways/qvalent.rb +236 -0
  190. data/lib/active_merchant/billing/gateways/realex.rb +78 -48
  191. data/lib/active_merchant/billing/gateways/redsys.rb +310 -170
  192. data/lib/active_merchant/billing/gateways/s5.rb +246 -0
  193. data/lib/active_merchant/billing/gateways/safe_charge.rb +262 -0
  194. data/lib/active_merchant/billing/gateways/sage.rb +415 -119
  195. data/lib/active_merchant/billing/gateways/sage_pay.rb +195 -90
  196. data/lib/active_merchant/billing/gateways/sallie_mae.rb +11 -12
  197. data/lib/active_merchant/billing/gateways/secure_net.rb +51 -43
  198. data/lib/active_merchant/billing/gateways/secure_pay.rb +182 -10
  199. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +25 -14
  200. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +10 -18
  201. data/lib/active_merchant/billing/gateways/securion_pay.rb +264 -0
  202. data/lib/active_merchant/billing/gateways/skip_jack.rb +35 -38
  203. data/lib/active_merchant/billing/gateways/smart_ps.rb +50 -42
  204. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +9 -9
  205. data/lib/active_merchant/billing/gateways/spreedly_core.rb +62 -12
  206. data/lib/active_merchant/billing/gateways/stripe.rb +536 -103
  207. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +12 -18
  208. data/lib/active_merchant/billing/gateways/telr.rb +274 -0
  209. data/lib/active_merchant/billing/gateways/tns.rb +22 -0
  210. data/lib/active_merchant/billing/gateways/trans_first.rb +143 -30
  211. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +608 -0
  212. data/lib/active_merchant/billing/gateways/transact_pro.rb +224 -0
  213. data/lib/active_merchant/billing/gateways/transax.rb +5 -6
  214. data/lib/active_merchant/billing/gateways/transnational.rb +2 -232
  215. data/lib/active_merchant/billing/gateways/trexle.rb +218 -0
  216. data/lib/active_merchant/billing/gateways/trust_commerce.rb +86 -57
  217. data/lib/active_merchant/billing/gateways/usa_epay.rb +4 -4
  218. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +196 -89
  219. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +157 -32
  220. data/lib/active_merchant/billing/gateways/vanco.rb +294 -0
  221. data/lib/active_merchant/billing/gateways/verifi.rb +42 -49
  222. data/lib/active_merchant/billing/gateways/viaklix.rb +11 -24
  223. data/lib/active_merchant/billing/gateways/visanet_peru.rb +233 -0
  224. data/lib/active_merchant/billing/gateways/webpay.rb +26 -28
  225. data/lib/active_merchant/billing/gateways/wepay.rb +237 -0
  226. data/lib/active_merchant/billing/gateways/wirecard.rb +153 -31
  227. data/lib/active_merchant/billing/gateways/world_net.rb +344 -0
  228. data/lib/active_merchant/billing/gateways/worldpay.rb +207 -63
  229. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +215 -0
  230. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  231. data/lib/active_merchant/billing/gateways.rb +8 -11
  232. data/lib/active_merchant/billing/model.rb +30 -0
  233. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  234. data/lib/active_merchant/billing/payment_token.rb +21 -0
  235. data/lib/active_merchant/billing/rails.rb +3 -0
  236. data/lib/active_merchant/billing/response.rb +31 -24
  237. data/lib/active_merchant/billing.rb +7 -1
  238. data/lib/active_merchant/connection.rb +195 -0
  239. data/lib/active_merchant/country.rb +335 -0
  240. data/lib/active_merchant/empty.rb +20 -0
  241. data/lib/active_merchant/errors.rb +35 -0
  242. data/lib/active_merchant/net_http_ssl_connection.rb +10 -0
  243. data/lib/active_merchant/network_connection_retries.rb +80 -0
  244. data/lib/active_merchant/post_data.rb +25 -0
  245. data/lib/active_merchant/posts_data.rb +92 -0
  246. data/lib/active_merchant/version.rb +1 -1
  247. data/lib/active_merchant.rb +23 -27
  248. data/lib/activemerchant.rb +1 -1
  249. data/lib/certs/cacert.pem +3988 -0
  250. data/lib/support/gateway_support.rb +7 -9
  251. data/lib/support/outbound_hosts.rb +13 -10
  252. data/lib/support/ssl_verify.rb +6 -7
  253. data/lib/support/ssl_version.rb +87 -0
  254. metadata +148 -323
  255. checksums.yaml.gz.sig +0 -0
  256. data/gem-public_cert.pem +0 -21
  257. data/lib/active_merchant/billing/expiry_date.rb +0 -34
  258. data/lib/active_merchant/billing/gateways/app55.rb +0 -185
  259. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +0 -314
  260. data/lib/active_merchant/billing/gateways/certo_direct.rb +0 -277
  261. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +0 -249
  262. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +0 -13
  263. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +0 -29
  264. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +0 -66
  265. data/lib/active_merchant/billing/gateways/orbital/avs_result.rb +0 -93
  266. data/lib/active_merchant/billing/gateways/orbital/cvv_result.rb +0 -34
  267. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +0 -93
  268. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +0 -114
  269. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +0 -102
  270. data/lib/active_merchant/billing/gateways/samurai.rb +0 -118
  271. data/lib/active_merchant/billing/gateways/vindicia.rb +0 -361
  272. data/lib/active_merchant/billing/integrations/a1agregator/helper.rb +0 -31
  273. data/lib/active_merchant/billing/integrations/a1agregator/notification.rb +0 -186
  274. data/lib/active_merchant/billing/integrations/a1agregator/status.rb +0 -38
  275. data/lib/active_merchant/billing/integrations/a1agregator.rb +0 -26
  276. data/lib/active_merchant/billing/integrations/action_view_helper.rb +0 -74
  277. data/lib/active_merchant/billing/integrations/alipay/helper.rb +0 -34
  278. data/lib/active_merchant/billing/integrations/alipay/notification.rb +0 -101
  279. data/lib/active_merchant/billing/integrations/alipay.rb +0 -18
  280. data/lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb +0 -229
  281. data/lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb +0 -340
  282. data/lib/active_merchant/billing/integrations/authorize_net_sim.rb +0 -38
  283. data/lib/active_merchant/billing/integrations/bit_pay/helper.rb +0 -64
  284. data/lib/active_merchant/billing/integrations/bit_pay/notification.rb +0 -74
  285. data/lib/active_merchant/billing/integrations/bit_pay/return.rb +0 -10
  286. data/lib/active_merchant/billing/integrations/bit_pay.rb +0 -30
  287. data/lib/active_merchant/billing/integrations/bogus/helper.rb +0 -17
  288. data/lib/active_merchant/billing/integrations/bogus/notification.rb +0 -11
  289. data/lib/active_merchant/billing/integrations/bogus/return.rb +0 -10
  290. data/lib/active_merchant/billing/integrations/bogus.rb +0 -23
  291. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +0 -120
  292. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +0 -158
  293. data/lib/active_merchant/billing/integrations/chronopay/return.rb +0 -10
  294. data/lib/active_merchant/billing/integrations/chronopay.rb +0 -23
  295. data/lib/active_merchant/billing/integrations/citrus/helper.rb +0 -40
  296. data/lib/active_merchant/billing/integrations/citrus/notification.rb +0 -133
  297. data/lib/active_merchant/billing/integrations/citrus/return.rb +0 -40
  298. data/lib/active_merchant/billing/integrations/citrus.rb +0 -51
  299. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +0 -200
  300. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +0 -76
  301. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +0 -32
  302. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +0 -37
  303. data/lib/active_merchant/billing/integrations/direc_pay.rb +0 -41
  304. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +0 -90
  305. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +0 -120
  306. data/lib/active_merchant/billing/integrations/directebanking/return.rb +0 -11
  307. data/lib/active_merchant/billing/integrations/directebanking.rb +0 -47
  308. data/lib/active_merchant/billing/integrations/doku/helper.rb +0 -102
  309. data/lib/active_merchant/billing/integrations/doku/notification.rb +0 -69
  310. data/lib/active_merchant/billing/integrations/doku/return.rb +0 -10
  311. data/lib/active_merchant/billing/integrations/doku.rb +0 -24
  312. data/lib/active_merchant/billing/integrations/dotpay/helper.rb +0 -77
  313. data/lib/active_merchant/billing/integrations/dotpay/notification.rb +0 -86
  314. data/lib/active_merchant/billing/integrations/dotpay/return.rb +0 -11
  315. data/lib/active_merchant/billing/integrations/dotpay.rb +0 -22
  316. data/lib/active_merchant/billing/integrations/dwolla/common.rb +0 -23
  317. data/lib/active_merchant/billing/integrations/dwolla/helper.rb +0 -43
  318. data/lib/active_merchant/billing/integrations/dwolla/notification.rb +0 -64
  319. data/lib/active_merchant/billing/integrations/dwolla/return.rb +0 -49
  320. data/lib/active_merchant/billing/integrations/dwolla.rb +0 -23
  321. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +0 -34
  322. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +0 -84
  323. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +0 -48
  324. data/lib/active_merchant/billing/integrations/easy_pay/common.rb +0 -40
  325. data/lib/active_merchant/billing/integrations/easy_pay/helper.rb +0 -36
  326. data/lib/active_merchant/billing/integrations/easy_pay/notification.rb +0 -59
  327. data/lib/active_merchant/billing/integrations/easy_pay.rb +0 -30
  328. data/lib/active_merchant/billing/integrations/epay/helper.rb +0 -55
  329. data/lib/active_merchant/billing/integrations/epay/notification.rb +0 -110
  330. data/lib/active_merchant/billing/integrations/epay.rb +0 -21
  331. data/lib/active_merchant/billing/integrations/first_data/helper.rb +0 -61
  332. data/lib/active_merchant/billing/integrations/first_data/notification.rb +0 -56
  333. data/lib/active_merchant/billing/integrations/first_data.rb +0 -38
  334. data/lib/active_merchant/billing/integrations/gestpay/common.rb +0 -42
  335. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +0 -70
  336. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +0 -85
  337. data/lib/active_merchant/billing/integrations/gestpay/return.rb +0 -10
  338. data/lib/active_merchant/billing/integrations/gestpay.rb +0 -25
  339. data/lib/active_merchant/billing/integrations/helper.rb +0 -117
  340. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +0 -58
  341. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +0 -59
  342. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +0 -68
  343. data/lib/active_merchant/billing/integrations/hi_trust.rb +0 -27
  344. data/lib/active_merchant/billing/integrations/ipay88/helper.rb +0 -118
  345. data/lib/active_merchant/billing/integrations/ipay88/notification.rb +0 -103
  346. data/lib/active_merchant/billing/integrations/ipay88/return.rb +0 -29
  347. data/lib/active_merchant/billing/integrations/ipay88.rb +0 -23
  348. data/lib/active_merchant/billing/integrations/liqpay/helper.rb +0 -43
  349. data/lib/active_merchant/billing/integrations/liqpay/notification.rb +0 -89
  350. data/lib/active_merchant/billing/integrations/liqpay/return.rb +0 -83
  351. data/lib/active_merchant/billing/integrations/liqpay.rb +0 -30
  352. data/lib/active_merchant/billing/integrations/maksuturva/helper.rb +0 -119
  353. data/lib/active_merchant/billing/integrations/maksuturva/notification.rb +0 -48
  354. data/lib/active_merchant/billing/integrations/maksuturva.rb +0 -86
  355. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +0 -75
  356. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +0 -123
  357. data/lib/active_merchant/billing/integrations/moneybookers.rb +0 -26
  358. data/lib/active_merchant/billing/integrations/nochex/helper.rb +0 -68
  359. data/lib/active_merchant/billing/integrations/nochex/notification.rb +0 -94
  360. data/lib/active_merchant/billing/integrations/nochex/return.rb +0 -10
  361. data/lib/active_merchant/billing/integrations/nochex.rb +0 -88
  362. data/lib/active_merchant/billing/integrations/notification.rb +0 -71
  363. data/lib/active_merchant/billing/integrations/paxum/common.rb +0 -24
  364. data/lib/active_merchant/billing/integrations/paxum/helper.rb +0 -42
  365. data/lib/active_merchant/billing/integrations/paxum/notification.rb +0 -33
  366. data/lib/active_merchant/billing/integrations/paxum.rb +0 -44
  367. data/lib/active_merchant/billing/integrations/pay_fast/common.rb +0 -42
  368. data/lib/active_merchant/billing/integrations/pay_fast/helper.rb +0 -50
  369. data/lib/active_merchant/billing/integrations/pay_fast/notification.rb +0 -134
  370. data/lib/active_merchant/billing/integrations/pay_fast/return.rb +0 -10
  371. data/lib/active_merchant/billing/integrations/pay_fast.rb +0 -70
  372. data/lib/active_merchant/billing/integrations/paydollar/helper.rb +0 -41
  373. data/lib/active_merchant/billing/integrations/paydollar/notification.rb +0 -60
  374. data/lib/active_merchant/billing/integrations/paydollar/return.rb +0 -15
  375. data/lib/active_merchant/billing/integrations/paydollar.rb +0 -59
  376. data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +0 -116
  377. data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +0 -78
  378. data/lib/active_merchant/billing/integrations/payflow_link.rb +0 -21
  379. data/lib/active_merchant/billing/integrations/paypal/helper.rb +0 -119
  380. data/lib/active_merchant/billing/integrations/paypal/notification.rb +0 -227
  381. data/lib/active_merchant/billing/integrations/paypal/return.rb +0 -10
  382. data/lib/active_merchant/billing/integrations/paypal.rb +0 -39
  383. data/lib/active_merchant/billing/integrations/paypal_payments_advanced/helper.rb +0 -15
  384. data/lib/active_merchant/billing/integrations/paypal_payments_advanced.rb +0 -20
  385. data/lib/active_merchant/billing/integrations/paysbuy/helper.rb +0 -15
  386. data/lib/active_merchant/billing/integrations/paysbuy/notification.rb +0 -39
  387. data/lib/active_merchant/billing/integrations/paysbuy.rb +0 -36
  388. data/lib/active_merchant/billing/integrations/payu_in/helper.rb +0 -76
  389. data/lib/active_merchant/billing/integrations/payu_in/notification.rb +0 -154
  390. data/lib/active_merchant/billing/integrations/payu_in/return.rb +0 -36
  391. data/lib/active_merchant/billing/integrations/payu_in.rb +0 -36
  392. data/lib/active_merchant/billing/integrations/payu_in_paisa/helper.rb +0 -19
  393. data/lib/active_merchant/billing/integrations/payu_in_paisa/notification.rb +0 -13
  394. data/lib/active_merchant/billing/integrations/payu_in_paisa/return.rb +0 -16
  395. data/lib/active_merchant/billing/integrations/payu_in_paisa.rb +0 -30
  396. data/lib/active_merchant/billing/integrations/platron/helper.rb +0 -32
  397. data/lib/active_merchant/billing/integrations/platron/notification.rb +0 -113
  398. data/lib/active_merchant/billing/integrations/platron.rb +0 -28
  399. data/lib/active_merchant/billing/integrations/pxpay/helper.rb +0 -112
  400. data/lib/active_merchant/billing/integrations/pxpay/notification.rb +0 -157
  401. data/lib/active_merchant/billing/integrations/pxpay/return.rb +0 -25
  402. data/lib/active_merchant/billing/integrations/pxpay.rb +0 -31
  403. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +0 -96
  404. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +0 -137
  405. data/lib/active_merchant/billing/integrations/quickpay.rb +0 -21
  406. data/lib/active_merchant/billing/integrations/rbkmoney/helper.rb +0 -23
  407. data/lib/active_merchant/billing/integrations/rbkmoney/notification.rb +0 -91
  408. data/lib/active_merchant/billing/integrations/rbkmoney.rb +0 -17
  409. data/lib/active_merchant/billing/integrations/return.rb +0 -42
  410. data/lib/active_merchant/billing/integrations/robokassa/common.rb +0 -19
  411. data/lib/active_merchant/billing/integrations/robokassa/helper.rb +0 -50
  412. data/lib/active_merchant/billing/integrations/robokassa/notification.rb +0 -55
  413. data/lib/active_merchant/billing/integrations/robokassa/return.rb +0 -17
  414. data/lib/active_merchant/billing/integrations/robokassa.rb +0 -49
  415. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +0 -33
  416. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +0 -136
  417. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +0 -210
  418. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +0 -31
  419. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +0 -37
  420. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +0 -107
  421. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +0 -171
  422. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +0 -58
  423. data/lib/active_merchant/billing/integrations/two_checkout.rb +0 -44
  424. data/lib/active_merchant/billing/integrations/valitor/helper.rb +0 -86
  425. data/lib/active_merchant/billing/integrations/valitor/notification.rb +0 -13
  426. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +0 -97
  427. data/lib/active_merchant/billing/integrations/valitor/return.rb +0 -13
  428. data/lib/active_merchant/billing/integrations/valitor.rb +0 -33
  429. data/lib/active_merchant/billing/integrations/verkkomaksut/helper.rb +0 -88
  430. data/lib/active_merchant/billing/integrations/verkkomaksut/notification.rb +0 -59
  431. data/lib/active_merchant/billing/integrations/verkkomaksut.rb +0 -20
  432. data/lib/active_merchant/billing/integrations/web_pay/common.rb +0 -50
  433. data/lib/active_merchant/billing/integrations/web_pay/helper.rb +0 -68
  434. data/lib/active_merchant/billing/integrations/web_pay/notification.rb +0 -51
  435. data/lib/active_merchant/billing/integrations/web_pay.rb +0 -45
  436. data/lib/active_merchant/billing/integrations/webmoney/common.rb +0 -17
  437. data/lib/active_merchant/billing/integrations/webmoney/helper.rb +0 -40
  438. data/lib/active_merchant/billing/integrations/webmoney/notification.rb +0 -47
  439. data/lib/active_merchant/billing/integrations/webmoney.rb +0 -43
  440. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/common.rb +0 -104
  441. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/helper.rb +0 -145
  442. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/notification.rb +0 -101
  443. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/return.rb +0 -35
  444. data/lib/active_merchant/billing/integrations/wirecard_checkout_page.rb +0 -39
  445. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +0 -101
  446. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +0 -160
  447. data/lib/active_merchant/billing/integrations/world_pay.rb +0 -34
  448. data/lib/active_merchant/billing/integrations.rb +0 -17
  449. data.tar.gz.sig +0 -0
  450. metadata.gz.sig +0 -1
@@ -1,141 +1,166 @@
1
+ require 'nokogiri'
2
+
1
3
  module ActiveMerchant #:nodoc:
2
4
  module Billing #:nodoc:
3
5
  class LitleGateway < Gateway
4
- # Specific to Litle options:
5
- # * <tt>:merchant_id</tt> - Merchant Id assigned by Litle
6
- # * <tt>:user</tt> - Username assigned by Litle
7
- # * <tt>:password</tt> - Password assigned by Litle
8
- # * <tt>:version</tt> - The version of the api you are using (eg, '8.10')
9
- # * <tt>:proxy_addr</tt> - Proxy address - nil if not needed
10
- # * <tt>:proxy_port</tt> - Proxy port - nil if not needed
11
- # * <tt>:url</tt> - URL assigned by Litle (for testing, use the sandbox)
12
- #
13
- # Standard Active Merchant options
14
- # * <tt>:order_id</tt> - The order number
15
- # * <tt>:ip</tt> - The IP address of the customer making the purchase
16
- # * <tt>:customer</tt> - The name, customer number, or other information that identifies the customer
17
- # * <tt>:invoice</tt> - The invoice number
18
- # * <tt>:merchant</tt> - The name or description of the merchant offering the product
19
- # * <tt>:description</tt> - A description of the transaction
20
- # * <tt>:email</tt> - The email address of the customer
21
- # * <tt>:currency</tt> - The currency of the transaction. Only important when you are using a currency that is not the default with a gateway that supports multiple currencies.
22
- # * <tt>:billing_address</tt> - A hash containing the billing address of the customer.
23
- # * <tt>:shipping_address</tt> - A hash containing the shipping address of the customer.
24
- #
25
- # The <tt>:billing_address</tt>, and <tt>:shipping_address</tt> hashes can have the following keys:
26
- #
27
- # * <tt>:name</tt> - The full name of the customer.
28
- # * <tt>:company</tt> - The company name of the customer.
29
- # * <tt>:address1</tt> - The primary street address of the customer.
30
- # * <tt>:address2</tt> - Additional line of address information.
31
- # * <tt>:city</tt> - The city of the customer.
32
- # * <tt>:state</tt> - The state of the customer. The 2 digit code for US and Canadian addresses. The full name of the state or province for foreign addresses.
33
- # * <tt>:country</tt> - The [ISO 3166-1-alpha-2 code](http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm) for the customer.
34
- # * <tt>:zip</tt> - The zip or postal code of the customer.
35
- # * <tt>:phone</tt> - The phone number of the customer.
36
-
37
- self.test_url = 'https://www.testlitle.com/sandbox/communicator/online'
38
- self.live_url = 'https://payments.litle.com/vap/communicator/online'
39
-
40
- LITLE_SCHEMA_VERSION = '8.13'
41
-
42
- # The countries the gateway supports merchants from as 2 digit ISO country codes
43
- self.supported_countries = ['US']
6
+ SCHEMA_VERSION = '9.12'
44
7
 
45
- # The card types supported by the payment gateway
46
- self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb]
8
+ self.test_url = 'https://www.testvantivcnp.com/sandbox/communicator/online'
9
+ self.live_url = 'https://payments.vantivcnp.com/vap/communicator/online'
47
10
 
48
- # The homepage URL of the gateway
49
- self.homepage_url = 'http://www.litle.com/'
11
+ self.supported_countries = ['US']
12
+ self.default_currency = 'USD'
13
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb]
50
14
 
51
- # The name of the gateway
52
- self.display_name = 'Litle & Co.'
15
+ self.homepage_url = 'http://www.vantiv.com/'
16
+ self.display_name = 'Vantiv eCommerce'
53
17
 
54
- self.default_currency = 'USD'
18
+ def initialize(options={})
19
+ requires!(options, :login, :password, :merchant_id)
20
+ super
21
+ end
55
22
 
56
- def initialize(options = {})
57
- begin
58
- require 'LitleOnline'
59
- rescue LoadError
60
- raise "Could not load the LitleOnline gem (> 08.15.0). Use `gem install LitleOnline` to install it."
23
+ def purchase(money, payment_method, options={})
24
+ request = build_xml_request do |doc|
25
+ add_authentication(doc)
26
+ if check?(payment_method)
27
+ doc.echeckSale(transaction_attributes(options)) do
28
+ add_echeck_purchase_params(doc, money, payment_method, options)
29
+ end
30
+ else
31
+ doc.sale(transaction_attributes(options)) do
32
+ add_auth_purchase_params(doc, money, payment_method, options)
33
+ end
34
+ end
61
35
  end
36
+ check?(payment_method) ? commit(:echeckSales, request, money) : commit(:sale, request, money)
37
+ end
62
38
 
63
- if wiredump_device
64
- LitleOnline::Configuration.logger = ((Logger === wiredump_device) ? wiredump_device : Logger.new(wiredump_device))
65
- LitleOnline::Configuration.logger.level = Logger::DEBUG
66
- else
67
- LitleOnline::Configuration.logger = Logger.new(STDOUT)
68
- LitleOnline::Configuration.logger.level = Logger::WARN
39
+ def authorize(money, payment_method, options={})
40
+ request = build_xml_request do |doc|
41
+ add_authentication(doc)
42
+ if check?(payment_method)
43
+ doc.echeckVerification(transaction_attributes(options)) do
44
+ add_echeck_purchase_params(doc, money, payment_method, options)
45
+ end
46
+ else
47
+ doc.authorization(transaction_attributes(options)) do
48
+ add_auth_purchase_params(doc, money, payment_method, options)
49
+ end
50
+ end
69
51
  end
52
+ check?(payment_method) ? commit(:echeckVerification, request, money) : commit(:authorization, request, money)
53
+ end
70
54
 
71
- @litle = LitleOnline::LitleOnlineRequest.new
72
-
73
- options[:version] ||= LITLE_SCHEMA_VERSION
74
- options[:merchant] ||= 'Default Report Group'
75
- options[:user] ||= options[:login]
55
+ def capture(money, authorization, options={})
56
+ transaction_id, _, _ = split_authorization(authorization)
76
57
 
77
- requires!(options, :merchant_id, :user, :password, :merchant, :version)
58
+ request = build_xml_request do |doc|
59
+ add_authentication(doc)
60
+ add_descriptor(doc, options)
61
+ doc.capture_(transaction_attributes(options)) do
62
+ doc.litleTxnId(transaction_id)
63
+ doc.amount(money) if money
64
+ end
65
+ end
78
66
 
79
- super
67
+ commit(:capture, request, money)
80
68
  end
81
69
 
82
- def authorize(money, creditcard_or_token, options = {})
83
- to_pass = build_authorize_request(money, creditcard_or_token, options)
84
- build_response(:authorization, @litle.authorization(to_pass))
70
+ def credit(money, authorization, options = {})
71
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
72
+ refund(money, authorization, options)
85
73
  end
86
74
 
87
- def purchase(money, creditcard_or_token, options = {})
88
- to_pass = build_purchase_request(money, creditcard_or_token, options)
89
- build_response(:sale, @litle.sale(to_pass))
75
+ def refund(money, payment, options={})
76
+ request = build_xml_request do |doc|
77
+ add_authentication(doc)
78
+ add_descriptor(doc, options)
79
+ doc.send(refund_type(payment), transaction_attributes(options)) do
80
+ if payment.is_a?(String)
81
+ transaction_id, _, _ = split_authorization(payment)
82
+ doc.litleTxnId(transaction_id)
83
+ doc.amount(money) if money
84
+ elsif check?(payment)
85
+ add_echeck_purchase_params(doc, money, payment, options)
86
+ else
87
+ add_auth_purchase_params(doc, money, payment, options)
88
+ end
89
+ end
90
+ end
91
+
92
+ commit(refund_type(payment), request)
90
93
  end
91
94
 
92
- def capture(money, authorization, options = {})
93
- transaction_id, kind = split_authorization(authorization)
94
- to_pass = create_capture_hash(money, transaction_id, options)
95
- build_response(:capture, @litle.capture(to_pass))
95
+ def verify(creditcard, options = {})
96
+ MultiResponse.run(:use_first_response) do |r|
97
+ r.process { authorize(0, creditcard, options) }
98
+ r.process(:ignore_result) { void(r.authorization, options) }
99
+ end
96
100
  end
97
101
 
98
- # Note: Litle requires that authorization requests be voided via auth_reversal
99
- # and other requests via void. To maintain the same interface as the other
100
- # gateways the transaction_id and the kind of transaction are concatenated
101
- # together with a ; separator (e.g. 1234;authorization)
102
- #
103
- # A partial auth_reversal can be accomplished by passing :amount as an option
104
- def void(identification, options = {})
105
- transaction_id, kind = split_authorization(identification)
106
- if(kind == 'authorization')
107
- to_pass = create_auth_reversal_hash(transaction_id, options[:amount], options)
108
- build_response(:authReversal, @litle.auth_reversal(to_pass))
109
- else
110
- to_pass = create_void_hash(transaction_id, options)
111
- build_response(:void, @litle.void(to_pass))
102
+ def void(authorization, options={})
103
+ transaction_id, kind, money = split_authorization(authorization)
104
+
105
+ request = build_xml_request do |doc|
106
+ add_authentication(doc)
107
+ doc.send(void_type(kind), transaction_attributes(options)) do
108
+ doc.litleTxnId(transaction_id)
109
+ doc.amount(money) if void_type(kind) == :authReversal
110
+ end
112
111
  end
112
+
113
+ commit(void_type(kind), request)
113
114
  end
114
115
 
115
- def refund(money, authorization, options = {})
116
- to_pass = build_credit_request(money, authorization, options)
117
- build_response(:credit, @litle.credit(to_pass))
116
+ def store(payment_method, options = {})
117
+ request = build_xml_request do |doc|
118
+ add_authentication(doc)
119
+ doc.registerTokenRequest(transaction_attributes(options)) do
120
+ doc.orderId(truncate(options[:order_id], 24))
121
+ if payment_method.is_a?(String)
122
+ doc.paypageRegistrationId(payment_method)
123
+ elsif check?(payment_method)
124
+ doc.echeckForToken do
125
+ doc.accNum(payment_method.account_number)
126
+ doc.routingNum(payment_method.routing_number)
127
+ end
128
+ else
129
+ doc.accountNumber(payment_method.number)
130
+ doc.cardValidationNum(payment_method.verification_value) if payment_method.verification_value
131
+ end
132
+ end
133
+ end
134
+
135
+ commit(:registerToken, request)
118
136
  end
119
137
 
120
- def credit(money, authorization, options = {})
121
- deprecated CREDIT_DEPRECATION_MESSAGE
122
- refund(money, authorization, options)
138
+ def supports_scrubbing?
139
+ true
123
140
  end
124
141
 
125
- def store(creditcard_or_paypage_registration_id, options = {})
126
- to_pass = create_token_hash(creditcard_or_paypage_registration_id, options)
127
- build_response(:registerToken, @litle.register_token_request(to_pass), %w(000 801 802))
142
+ def scrub(transcript)
143
+ transcript.
144
+ gsub(%r((<user>).+(</user>)), '\1[FILTERED]\2').
145
+ gsub(%r((<password>).+(</password>)), '\1[FILTERED]\2').
146
+ gsub(%r((<number>).+(</number>)), '\1[FILTERED]\2').
147
+ gsub(%r((<accNum>).+(</accNum>)), '\1[FILTERED]\2').
148
+ gsub(%r((<routingNum>).+(</routingNum>)), '\1[FILTERED]\2').
149
+ gsub(%r((<cardValidationNum>).+(</cardValidationNum>)), '\1[FILTERED]\2').
150
+ gsub(%r((<accountNumber>).+(</accountNumber>)), '\1[FILTERED]\2').
151
+ gsub(%r((<paypageRegistrationId>).+(</paypageRegistrationId>)), '\1[FILTERED]\2').
152
+ gsub(%r((<authenticationValue>).+(</authenticationValue>)), '\1[FILTERED]\2')
128
153
  end
129
154
 
130
155
  private
131
156
 
132
157
  CARD_TYPE = {
133
- 'visa' => 'VI',
134
- 'master' => 'MC',
135
- 'american_express' => 'AX',
136
- 'discover' => 'DI',
137
- 'jcb' => 'DI',
138
- 'diners_club' => 'DI'
158
+ 'visa' => 'VI',
159
+ 'master' => 'MC',
160
+ 'american_express' => 'AX',
161
+ 'discover' => 'DI',
162
+ 'jcb' => 'JC',
163
+ 'diners_club' => 'DC'
139
164
  }
140
165
 
141
166
  AVS_RESPONSE_CODE = {
@@ -156,409 +181,268 @@ module ActiveMerchant #:nodoc:
156
181
  '40' => 'E'
157
182
  }
158
183
 
159
- def url
160
- return @options[:url] if @options[:url].present?
161
-
162
- test? ? self.test_url : self.live_url
163
- end
164
-
165
- def build_response(kind, litle_response, valid_responses=%w(000))
166
- response = Hash.from_xml(litle_response.raw_xml.to_s)['litleOnlineResponse']
167
-
168
- if response['response'] == "0"
169
- detail = response["#{kind}Response"]
170
- fraud = fraud_result(detail)
171
- Response.new(
172
- valid_responses.include?(detail['response']),
173
- detail['message'],
174
- { litleOnlineResponse: response, response_code: detail['response'] },
175
- authorization: authorization_from(detail, kind),
176
- avs_result: { :code => fraud['avs'] },
177
- cvv_result: fraud['cvv'],
178
- test: test?
179
- )
184
+ def void_type(kind)
185
+ if kind == 'authorization'
186
+ :authReversal
187
+ elsif kind == 'echeckSales'
188
+ :echeckVoid
180
189
  else
181
- Response.new(false, response['message'], :litleOnlineResponse => response, :test => test?)
190
+ :void
182
191
  end
183
192
  end
184
193
 
185
- # Generates an authorization string of the appropriate id and the kind of transaction
186
- # See #void for how the kind is used
187
- def authorization_from(litle_response, kind)
188
- case kind
189
- when :registerToken
190
- authorization = litle_response['litleToken']
194
+ def refund_type(payment)
195
+ _, kind, _ = split_authorization(payment)
196
+ if check?(payment) || kind == 'echeckSales'
197
+ :echeckCredit
191
198
  else
192
- authorization = [litle_response['litleTxnId'], kind.to_s].join(";")
199
+ :credit
193
200
  end
194
201
  end
195
202
 
196
- def split_authorization(authorization)
197
- transaction_id, kind = authorization.to_s.split(';')
198
- [transaction_id, kind]
203
+ def check?(payment_method)
204
+ return false if payment_method.is_a?(String)
205
+ card_brand(payment_method) == 'check'
199
206
  end
200
207
 
201
- def build_authorize_request(money, creditcard_or_token, options)
202
- payment_method = build_payment_method(creditcard_or_token, options)
203
-
204
- hash = create_hash(money, options)
205
-
206
- add_creditcard_or_cardtoken_hash(hash, payment_method)
207
-
208
- hash
208
+ def add_authentication(doc)
209
+ doc.authentication do
210
+ doc.user(@options[:login])
211
+ doc.password(@options[:password])
212
+ end
209
213
  end
210
214
 
211
- def build_purchase_request(money, creditcard_or_token, options)
212
- payment_method = build_payment_method(creditcard_or_token, options)
213
-
214
- hash = create_hash(money, options)
215
-
216
- add_creditcard_or_cardtoken_hash(hash, payment_method)
217
-
218
- hash
215
+ def add_auth_purchase_params(doc, money, payment_method, options)
216
+ doc.orderId(truncate(options[:order_id], 24))
217
+ doc.amount(money)
218
+ add_order_source(doc, payment_method, options)
219
+ add_billing_address(doc, payment_method, options)
220
+ add_shipping_address(doc, payment_method, options)
221
+ add_payment_method(doc, payment_method, options)
222
+ add_pos(doc, payment_method)
223
+ add_descriptor(doc, options)
224
+ add_merchant_data(doc, options)
225
+ add_debt_repayment(doc, options)
219
226
  end
220
227
 
221
- def build_credit_request(money, identification_or_token, options)
222
- payment_method = build_payment_method(identification_or_token, options)
223
-
224
- hash = create_hash(money, options)
225
-
226
- add_identification_or_cardtoken_hash(hash, payment_method)
227
-
228
- unless payment_method.is_a?(LitleCardToken)
229
- hash['orderSource'] = nil
230
- hash['orderId'] = nil
228
+ def add_merchant_data(doc, options={})
229
+ if options[:affiliate] || options[:campaign] || options[:merchant_grouping_id]
230
+ doc.merchantData do
231
+ doc.affiliate(options[:affiliate]) if options[:affiliate]
232
+ doc.campaign(options[:campaign]) if options[:campaign]
233
+ doc.merchantGroupingId(options[:merchant_grouping_id]) if options[:merchant_grouping_id]
234
+ end
231
235
  end
232
-
233
- hash
234
236
  end
235
237
 
236
- def build_payment_method(payment_method, options)
237
- result = payment_method
238
+ def add_echeck_purchase_params(doc, money, payment_method, options)
239
+ doc.orderId(truncate(options[:order_id], 24))
240
+ doc.amount(money)
241
+ add_order_source(doc, payment_method, options)
242
+ add_billing_address(doc, payment_method, options)
243
+ add_payment_method(doc, payment_method, options)
244
+ add_descriptor(doc, options)
245
+ end
238
246
 
239
- # Build instance of the LitleCardToken class for internal use if this is a token request.
240
- if payment_method.is_a?(String) && options.has_key?(:token)
241
- result = LitleCardToken.new(:token => payment_method)
242
- result.month = options[:token][:month]
243
- result.year = options[:token][:year]
244
- result.verification_value = options[:token][:verification_value]
245
- result.brand = options[:token][:brand]
247
+ def add_descriptor(doc, options)
248
+ if options[:descriptor_name] || options[:descriptor_phone]
249
+ doc.customBilling do
250
+ doc.phone(options[:descriptor_phone]) if options[:descriptor_phone]
251
+ doc.descriptor(options[:descriptor_name]) if options[:descriptor_name]
252
+ end
246
253
  end
247
-
248
- result
249
254
  end
250
255
 
251
- def add_creditcard_or_cardtoken_hash(hash, creditcard_or_cardtoken)
252
- if creditcard_or_cardtoken.is_a?(LitleCardToken)
253
- add_cardtoken_hash(hash, creditcard_or_cardtoken)
254
- else
255
- add_creditcard_hash(hash, creditcard_or_cardtoken)
256
- end
256
+ def add_debt_repayment(doc, options)
257
+ doc.debtRepayment(true) if options[:debt_repayment] == true
257
258
  end
258
259
 
259
- def add_identification_or_cardtoken_hash(hash, identification_or_cardtoken)
260
- if identification_or_cardtoken.is_a?(LitleCardToken)
261
- add_cardtoken_hash(hash, identification_or_cardtoken)
260
+ def add_payment_method(doc, payment_method, options)
261
+ if payment_method.is_a?(String)
262
+ doc.token do
263
+ doc.litleToken(payment_method)
264
+ end
265
+ elsif payment_method.respond_to?(:track_data) && payment_method.track_data.present?
266
+ doc.card do
267
+ doc.track(payment_method.track_data)
268
+ end
269
+ elsif check?(payment_method)
270
+ doc.echeck do
271
+ doc.accType(payment_method.account_type.capitalize)
272
+ doc.accNum(payment_method.account_number)
273
+ doc.routingNum(payment_method.routing_number)
274
+ doc.checkNum(payment_method.number)
275
+ end
262
276
  else
263
- transaction_id, kind = split_authorization(identification_or_cardtoken)
264
- hash['litleTxnId'] = transaction_id
277
+ doc.card do
278
+ doc.type_(CARD_TYPE[payment_method.brand])
279
+ doc.number(payment_method.number)
280
+ doc.expDate(exp_date(payment_method))
281
+ doc.cardValidationNum(payment_method.verification_value)
282
+ end
283
+ if payment_method.is_a?(NetworkTokenizationCreditCard)
284
+ doc.cardholderAuthentication do
285
+ doc.authenticationValue(payment_method.payment_cryptogram)
286
+ end
287
+ elsif options[:order_source]&.start_with?('3ds')
288
+ doc.cardholderAuthentication do
289
+ doc.authenticationValue(options[:cavv]) if options[:cavv]
290
+ doc.authenticationTransactionId(options[:xid]) if options[:xid]
291
+ end
292
+ end
265
293
  end
266
294
  end
267
295
 
268
- def add_cardtoken_hash(hash, cardtoken)
269
- token_info = {}
270
- token_info['litleToken'] = cardtoken.token
271
- token_info['expDate'] = cardtoken.exp_date if cardtoken.exp_date?
272
- token_info['cardValidationNum'] = cardtoken.verification_value unless cardtoken.verification_value.blank?
273
- token_info['type'] = cardtoken.type unless cardtoken.type.blank?
296
+ def add_billing_address(doc, payment_method, options)
297
+ return if payment_method.is_a?(String)
274
298
 
275
- hash['token'] = token_info
276
- hash
277
- end
299
+ doc.billToAddress do
300
+ if check?(payment_method)
301
+ doc.name(payment_method.name)
302
+ doc.firstName(payment_method.first_name)
303
+ doc.lastName(payment_method.last_name)
304
+ else
305
+ doc.name(payment_method.name)
306
+ end
307
+ doc.email(options[:email]) if options[:email]
278
308
 
279
- def add_creditcard_hash(hash, creditcard)
280
- cc_type = CARD_TYPE[creditcard.brand]
281
- exp_date_yr = creditcard.year.to_s[2..3]
282
- exp_date_mo = '%02d' % creditcard.month.to_i
283
- exp_date = exp_date_mo + exp_date_yr
309
+ add_address(doc, options[:billing_address])
310
+ end
311
+ end
284
312
 
285
- card_info = {
286
- 'type' => cc_type,
287
- 'number' => creditcard.number,
288
- 'expDate' => exp_date,
289
- 'cardValidationNum' => creditcard.verification_value
290
- }
313
+ def add_shipping_address(doc, payment_method, options)
314
+ return if payment_method.is_a?(String)
291
315
 
292
- hash['card'] = card_info
293
- hash
316
+ doc.shipToAddress do
317
+ add_address(doc, options[:shipping_address])
318
+ end
294
319
  end
295
320
 
296
- def create_capture_hash(money, authorization, options={})
297
- hash = create_hash(money, options)
298
- hash['partial'] = true if money
299
- hash['litleTxnId'] = authorization
300
- hash
321
+ def add_address(doc, address)
322
+ return unless address
323
+
324
+ doc.companyName(address[:company]) unless address[:company].blank?
325
+ doc.addressLine1(address[:address1]) unless address[:address1].blank?
326
+ doc.addressLine2(address[:address2]) unless address[:address2].blank?
327
+ doc.city(address[:city]) unless address[:city].blank?
328
+ doc.state(address[:state]) unless address[:state].blank?
329
+ doc.zip(address[:zip]) unless address[:zip].blank?
330
+ doc.country(address[:country]) unless address[:country].blank?
331
+ doc.phone(address[:phone]) unless address[:phone].blank?
301
332
  end
302
333
 
303
- def create_token_hash(creditcard_or_paypage_registration_id, options)
304
- hash = create_hash(0, options)
305
-
306
- if creditcard_or_paypage_registration_id.is_a?(String)
307
- hash['paypageRegistrationId'] = creditcard_or_paypage_registration_id
334
+ def add_order_source(doc, payment_method, options)
335
+ if options[:order_source]
336
+ doc.orderSource(options[:order_source])
337
+ elsif payment_method.is_a?(NetworkTokenizationCreditCard) && payment_method.source == :apple_pay
338
+ doc.orderSource('applepay')
339
+ elsif payment_method.is_a?(NetworkTokenizationCreditCard) && payment_method.source == :android_pay
340
+ doc.orderSource('androidpay')
341
+ elsif payment_method.respond_to?(:track_data) && payment_method.track_data.present?
342
+ doc.orderSource('retail')
308
343
  else
309
- hash['accountNumber'] = creditcard_or_paypage_registration_id.number
344
+ doc.orderSource('ecommerce')
310
345
  end
311
-
312
- hash
313
346
  end
314
347
 
315
- def create_void_hash(identification, options)
316
- hash = create_hash(nil, options)
317
- hash['litleTxnId'] = identification
318
- hash
348
+ def add_pos(doc, payment_method)
349
+ return unless payment_method.respond_to?(:track_data) && payment_method.track_data.present?
350
+
351
+ doc.pos do
352
+ doc.capability('magstripe')
353
+ doc.entryMode('completeread')
354
+ doc.cardholderId('signature')
355
+ end
319
356
  end
320
357
 
321
- def create_auth_reversal_hash(identification, money, options)
322
- hash = create_hash(money, options)
323
- hash['litleTxnId'] = identification
324
- hash
358
+ def exp_date(payment_method)
359
+ "#{format(payment_method.month, :two_digits)}#{format(payment_method.year, :two_digits)}"
325
360
  end
326
361
 
327
- def create_hash(money, options)
328
- fraud_check_type = {}
329
- if options[:ip]
330
- fraud_check_type['customerIpAddress'] = options[:ip]
362
+ def parse(kind, xml)
363
+ parsed = {}
364
+
365
+ doc = Nokogiri::XML(xml).remove_namespaces!
366
+ doc.xpath("//litleOnlineResponse/#{kind}Response/*").each do |node|
367
+ if node.elements.empty?
368
+ parsed[node.name.to_sym] = node.text
369
+ else
370
+ node.elements.each do |childnode|
371
+ name = "#{node.name}_#{childnode.name}"
372
+ parsed[name.to_sym] = childnode.text
373
+ end
374
+ end
331
375
  end
332
376
 
333
- enhanced_data = {}
334
- if options[:invoice]
335
- enhanced_data['invoiceReferenceNumber'] = options[:invoice]
377
+ if parsed.empty?
378
+ %w(response message).each do |attribute|
379
+ parsed[attribute.to_sym] = doc.xpath('//litleOnlineResponse').attribute(attribute).value
380
+ end
336
381
  end
337
382
 
338
- if options[:description]
339
- enhanced_data['customerReference'] = options[:description][0..16]
340
- end
383
+ parsed
384
+ end
341
385
 
342
- if options[:billing_address]
343
- bill_to_address = {
344
- 'name' => options[:billing_address][:name],
345
- 'companyName' => options[:billing_address][:company],
346
- 'addressLine1' => options[:billing_address][:address1],
347
- 'addressLine2' => options[:billing_address][:address2],
348
- 'city' => options[:billing_address][:city],
349
- 'state' => options[:billing_address][:state],
350
- 'zip' => options[:billing_address][:zip],
351
- 'country' => options[:billing_address][:country],
352
- 'email' => options[:email],
353
- 'phone' => options[:billing_address][:phone]
354
- }
355
- end
356
- if options[:shipping_address]
357
- ship_to_address = {
358
- 'name' => options[:shipping_address][:name],
359
- 'companyName' => options[:shipping_address][:company],
360
- 'addressLine1' => options[:shipping_address][:address1],
361
- 'addressLine2' => options[:shipping_address][:address2],
362
- 'city' => options[:shipping_address][:city],
363
- 'state' => options[:shipping_address][:state],
364
- 'zip' => options[:shipping_address][:zip],
365
- 'country' => options[:shipping_address][:country],
366
- 'email' => options[:email],
367
- 'phone' => options[:shipping_address][:phone]
368
- }
369
- end
386
+ def commit(kind, request, money=nil)
387
+ parsed = parse(kind, ssl_post(url, request, headers))
370
388
 
371
- hash = {
372
- 'billToAddress' => bill_to_address,
373
- 'shipToAddress' => ship_to_address,
374
- 'orderId' => truncated_order_id(options),
375
- 'customerId' => options[:customer],
376
- 'reportGroup' => (options[:merchant] || @options[:merchant]),
377
- 'merchantId' => (options[:merchant_id] || @options[:merchant_id]),
378
- 'orderSource' => (options[:order_source] || 'ecommerce'),
379
- 'enhancedData' => enhanced_data,
380
- 'fraudCheckType' => fraud_check_type,
381
- 'user' => (options[:user] || @options[:user]),
382
- 'password' => (options[:password] || @options[:password]),
383
- 'version' => (options[:version] || @options[:version]),
384
- 'url' => (options[:url] || url),
385
- 'proxy_addr' => (options[:proxy_addr] || @options[:proxy_addr]),
386
- 'proxy_port' => (options[:proxy_port] || @options[:proxy_port]),
387
- 'id' => (options[:id] || options[:order_id] || @options[:order_id])
389
+ options = {
390
+ authorization: authorization_from(kind, parsed, money),
391
+ test: test?,
392
+ :avs_result => { :code => AVS_RESPONSE_CODE[parsed[:fraudResult_avsResult]] },
393
+ :cvv_result => parsed[:fraudResult_cardValidationResult]
388
394
  }
389
395
 
390
- hash.merge!('amount' => money) if(money && (money != ""))
391
-
392
- hash
396
+ Response.new(success_from(kind, parsed), parsed[:message], parsed, options)
393
397
  end
394
398
 
395
- def truncated_order_id(options)
396
- order_id = options[:order_id] || @options[:order_id]
397
- return unless order_id
398
- order_id[0..24]
399
+ def success_from(kind, parsed)
400
+ return (parsed[:response] == '000') unless kind == :registerToken
401
+ %w(000 801 802).include?(parsed[:response])
399
402
  end
400
403
 
401
- def fraud_result(authorization_response)
402
- if result = authorization_response['fraudResult']
403
- if result.key?('cardValidationResult')
404
- cvv_to_pass = result['cardValidationResult'].blank? ? "P" : result['cardValidationResult']
405
- end
406
-
407
- avs_to_pass = AVS_RESPONSE_CODE[result['avsResult']] unless result['avsResult'].blank?
408
- end
409
- { 'cvv' => cvv_to_pass, 'avs' => avs_to_pass }
410
- end
411
-
412
- # A +LitleCardToken+ object represents a tokenized credit card, and is capable of validating the various
413
- # data associated with these.
414
- #
415
- # == Example Usage
416
- # token = LitleCardToken.new(
417
- # :token => '1234567890123456',
418
- # :month => '9',
419
- # :year => '2010',
420
- # :brand => 'visa',
421
- # :verification_value => '123'
422
- # )
423
- #
424
- # token.valid? # => true
425
- # cc.exp_date # => 0910
426
- #
427
- class LitleCardToken
428
- include Validateable
429
-
430
- # Returns or sets the token. (required)
431
- #
432
- # @return [String]
433
- attr_accessor :token
434
-
435
- # Returns or sets the expiry month for the card associated with token. (optional)
436
- #
437
- # @return [Integer]
438
- attr_accessor :month
439
-
440
- # Returns or sets the expiry year for the card associated with token. (optional)
441
- #
442
- # @return [Integer]
443
- attr_accessor :year
444
-
445
- # Returns or sets the card verification value. (optional)
446
- #
447
- # @return [String] the verification value
448
- attr_accessor :verification_value
449
-
450
- # Returns or sets the credit card brand. (optional)
451
- #
452
- # Valid card types are
453
- #
454
- # * +'visa'+
455
- # * +'master'+
456
- # * +'discover'+
457
- # * +'american_express'+
458
- # * +'diners_club'+
459
- # * +'jcb'+
460
- # * +'switch'+
461
- # * +'solo'+
462
- # * +'dankort'+
463
- # * +'maestro'+
464
- # * +'forbrugsforeningen'+
465
- # * +'laser'+
466
- #
467
- # @return (String) the credit card brand
468
- attr_accessor :brand
469
-
470
- # Returns the Litle credit card type identifier.
471
- #
472
- # @return (String) the credit card type identifier
473
- def type
474
- CARD_TYPE[brand] unless brand.blank?
475
- end
476
-
477
- # Returns true if the expiration date is set.
478
- #
479
- # @return (Boolean)
480
- def exp_date?
481
- !month.to_i.zero? && !year.to_i.zero?
482
- end
483
-
484
- # Returns the card token expiration date in MMYY format.
485
- #
486
- # @return (String) the expiration date in MMYY format
487
- def exp_date
488
- result = ''
489
- if exp_date?
490
- exp_date_yr = year.to_s[2..3]
491
- exp_date_mo = '%02d' % month.to_i
492
-
493
- result = exp_date_mo + exp_date_yr
494
- end
495
- result
496
- end
497
-
498
- # Validates the card token details.
499
- #
500
- # Any validation errors are added to the {#errors} attribute.
501
- def validate
502
- validate_card_token
503
- validate_expiration_date
504
- validate_card_brand
505
- end
404
+ def authorization_from(kind, parsed, money)
405
+ kind == :registerToken ? parsed[:litleToken] : "#{parsed[:litleTxnId]};#{kind};#{money}"
406
+ end
506
407
 
507
- def check?
508
- false
509
- end
408
+ def split_authorization(authorization)
409
+ transaction_id, kind, money = authorization.to_s.split(';')
410
+ [transaction_id, kind, money]
411
+ end
510
412
 
511
- private
413
+ def transaction_attributes(options)
414
+ attributes = {}
415
+ attributes[:id] = truncate(options[:id] || options[:order_id], 24)
416
+ attributes[:reportGroup] = options[:merchant] || 'Default Report Group'
417
+ attributes[:customerId] = options[:customer]
418
+ attributes.delete_if { |key, value| value == nil }
419
+ attributes
420
+ end
512
421
 
513
- CARD_TYPE = {
514
- 'visa' => 'VI',
515
- 'master' => 'MC',
516
- 'american_express' => 'AX',
517
- 'discover' => 'DI',
518
- 'jcb' => 'DI',
519
- 'diners_club' => 'DI'
422
+ def root_attributes
423
+ {
424
+ merchantId: @options[:merchant_id],
425
+ version: SCHEMA_VERSION,
426
+ xmlns: 'http://www.litle.com/schema'
520
427
  }
428
+ end
521
429
 
522
- def before_validate #:nodoc:
523
- self.month = month.to_i
524
- self.year = year.to_i
525
- end
526
-
527
- # Litle XML Reference Guide 1.8.2
528
- #
529
- # The length of the original card number is reflected in the token, so a
530
- # submitted 16-digit number results in a 16-digit token. Also, all tokens
531
- # use only numeric characters, so you do not have to change your
532
- # systems to accept alpha-numeric characters.
533
- #
534
- # The credit card token numbers themselves have two parts.
535
- # The last four digits match the last four digits of the card number.
536
- # The remaining digits (length can vary based upon original card number
537
- # length) are a randomly generated.
538
- def validate_card_token #:nodoc:
539
- if token.to_s.length < 12 || token.to_s.match(/\A\d+\Z/).nil?
540
- errors.add :token, "is not a valid card token"
541
- end
542
- end
543
-
544
- def validate_expiration_date #:nodoc:
545
- if !month.to_i.zero? || !year.to_i.zero?
546
- errors.add :month, "is not a valid month" unless valid_month?(month)
547
- errors.add :year, "is not a valid year" unless valid_expiry_year?(year)
548
- end
549
- end
550
-
551
- def validate_card_brand #:nodoc:
552
- errors.add :brand, "is invalid" unless brand.blank? || CreditCard.card_companies.keys.include?(brand)
430
+ def build_xml_request
431
+ builder = Nokogiri::XML::Builder.new
432
+ builder.__send__('litleOnlineRequest', root_attributes) do |doc|
433
+ yield(doc)
553
434
  end
435
+ builder.doc.root.to_xml
436
+ end
554
437
 
555
- def valid_month?(month)
556
- (1..12).include?(month.to_i)
557
- end
438
+ def url
439
+ test? ? test_url : live_url
440
+ end
558
441
 
559
- def valid_expiry_year?(year)
560
- year.to_s =~ /\A\d{4}\Z/ && year.to_i > 1987
561
- end
442
+ def headers
443
+ {
444
+ 'Content-Type' => 'text/xml'
445
+ }
562
446
  end
563
447
  end
564
448
  end