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,152 +1,448 @@
1
- require File.dirname(__FILE__) + '/sage/sage_bankcard'
2
- require File.dirname(__FILE__) + '/sage/sage_virtual_check'
3
-
4
1
  module ActiveMerchant #:nodoc:
5
2
  module Billing #:nodoc:
6
3
  class SageGateway < Gateway
7
- self.supported_countries = SageBankcardGateway.supported_countries
8
- self.supported_cardtypes = SageBankcardGateway.supported_cardtypes
9
-
10
- self.abstract_class = true
11
-
12
- # Creates a new SageGateway
13
- #
14
- # The gateway requires that a valid login and password be passed
15
- # in the +options+ hash.
16
- #
17
- # ==== Options
18
- #
19
- # * <tt>:login</tt> - The Sage Payment Solutions Merchant ID Number.
20
- # * <tt>:password</tt> - The Sage Payment Solutions Merchant Key Number.
4
+ include Empty
5
+
6
+ self.display_name = 'http://www.sagepayments.com'
7
+ self.homepage_url = 'Sage Payment Solutions'
8
+ self.live_url = 'https://www.sagepayments.net/cgi-bin'
9
+
10
+ self.supported_countries = ['US', 'CA']
11
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover, :jcb, :diners_club]
12
+
13
+ TRANSACTIONS = {
14
+ :purchase => '01',
15
+ :authorization => '02',
16
+ :capture => '11',
17
+ :void => '04',
18
+ :credit => '06',
19
+ :refund => '10'
20
+ }
21
+
22
+ SOURCE_CARD = 'bankcard'
23
+ SOURCE_ECHECK = 'virtual_check'
24
+
21
25
  def initialize(options = {})
22
26
  requires!(options, :login, :password)
23
27
  super
24
28
  end
25
29
 
26
- # Performs an authorization transaction
27
- #
28
- # ==== Parameters
29
- # * <tt>money</tt> - The amount to be authorized as an integer value in cents.
30
- # * <tt>credit_card</tt> - The CreditCard object to be used as the funding source for the transaction.
31
- # * <tt>options</tt> - A hash of optional parameters.
32
- # * <tt>:order_id</tt> - A unique reference for this order. (maximum of 20 characters).
33
- # * <tt>:email</tt> - The customer's email address
34
- # * <tt>:customer</tt> - The Customer Number for Purchase Card Level II Transactions
35
- # * <tt>:billing_address</tt> - The customer's billing address as a hash of address information.
36
- # * <tt>:address1</tt> - The billing address street
37
- # * <tt>:city</tt> - The billing address city
38
- # * <tt>:state</tt> - The billing address state
39
- # * <tt>:country</tt> - The 2 digit ISO billing address country code
40
- # * <tt>:zip</tt> - The billing address zip code
41
- # * <tt>:phone</tt> - The billing address phone number
42
- # * <tt>:fax</tt> - The billing address fax number
43
- # * <tt>:shipping_address</tt> - The customer's shipping address as a hash of address information.
44
- # * <tt>:name</tt> - The name at the shipping address
45
- # * <tt>:address1</tt> - The shipping address street
46
- # * <tt>:city</tt> - The shipping address city
47
- # * <tt>:state</tt> - The shipping address state code
48
- # * <tt>:country</tt> - The 2 digit ISO shipping address country code
49
- # * <tt>:zip</tt> - The shipping address zip code
50
- # * <tt>:tax</tt> - The tax amount for the transaction as an Integer value in cents. Maps to Sage <tt>T_tax</tt>.
51
- # * <tt>:shipping</tt> - The shipping amount for the transaction as an Integer value in cents. Maps to Sage <tt>T_shipping</tt>.
52
30
  def authorize(money, credit_card, options = {})
53
- bankcard.authorize(money, credit_card, options)
54
- end
55
-
56
- # Performs a purchase, which is essentially an authorization and capture in a single operation.
57
- #
58
- # ==== Parameters
59
- #
60
- # * <tt>money</tt> - The amount to be authorized as an integer value in cents.
61
- # * <tt>source</tt> - The CreditCard or Check object to be used as the funding source for the transaction.
62
- # * <tt>options</tt> - A hash of optional parameters.
63
- # * <tt>:order_id</tt> - A unique reference for this order. (maximum of 20 characters).
64
- # * <tt>:email</tt> - The customer's email address
65
- # * <tt>:customer</tt> - The Customer Number for Purchase Card Level II Transactions
66
- # * <tt>:billing_address</tt> - The customer's billing address as a hash of address information.
67
- # * <tt>:address1</tt> - The billing address street
68
- # * <tt>:city</tt> - The billing address city
69
- # * <tt>:state</tt> - The billing address state
70
- # * <tt>:country</tt> - The 2 digit ISO billing address country code
71
- # * <tt>:zip</tt> - The billing address zip code
72
- # * <tt>:phone</tt> - The billing address phone number
73
- # * <tt>:fax</tt> - The billing address fax number
74
- # * <tt>:shipping_address</tt> - The customer's shipping address as a hash of address information.
75
- # * <tt>:name</tt> - The name at the shipping address
76
- # * <tt>:address1</tt> - The shipping address street
77
- # * <tt>:city</tt> - The shipping address city
78
- # * <tt>:state</tt> - The shipping address state code
79
- # * <tt>:country</tt> - The 2 digit ISO shipping address country code
80
- # * <tt>:zip</tt> - The shipping address zip code
81
- # * <tt>:tax</tt> - The tax amount for the transaction as an integer value in cents. Maps to Sage <tt>T_tax</tt>.
82
- # * <tt>:shipping</tt> - The shipping amount for the transaction as an integer value in cents. Maps to Sage <tt>T_shipping</tt>.
83
- #
84
- # ==== Additional options in the +options+ hash for when using a Check as the funding source
85
- # * <tt>:originator_id</tt> - 10 digit originator. If not provided, Sage will use the default Originator ID for the specific customer type.
86
- # * <tt>:addenda</tt> - Transaction addenda.
87
- # * <tt>:ssn</tt> - The customer's Social Security Number.
88
- # * <tt>:drivers_license_state</tt> - The customer's drivers license state code.
89
- # * <tt>:drivers_license_number</tt> - The customer's drivers license number.
90
- # * <tt>:date_of_birth</tt> - The customer's date of birth as a Time or Date object or a string in the format <tt>mm/dd/yyyy</tt>.
91
- def purchase(money, source, options = {})
92
- if card_brand(source) == "check"
93
- virtual_check.purchase(money, source, options)
31
+ post = {}
32
+ add_credit_card(post, credit_card)
33
+ add_transaction_data(post, money, options)
34
+ commit(:authorization, post, SOURCE_CARD)
35
+ end
36
+
37
+ def purchase(money, payment_method, options = {})
38
+ post = {}
39
+ if card_brand(payment_method) == 'check'
40
+ source = SOURCE_ECHECK
41
+ add_check(post, payment_method)
42
+ add_check_customer_data(post, options)
94
43
  else
95
- bankcard.purchase(money, source, options)
44
+ source = SOURCE_CARD
45
+ add_credit_card(post, payment_method)
96
46
  end
47
+ add_transaction_data(post, money, options)
48
+ commit(:purchase, post, source)
97
49
  end
98
50
 
99
- # Captures authorized funds.
100
- #
101
- # ==== Parameters
102
- #
103
- # * <tt>money</tt> - The amount to be authorized as an integer value in cents. Sage doesn't support changing the capture amount, so the full amount of the initial transaction will be captured.
104
- # * <tt>reference</tt> - The authorization reference string returned by the original transaction's Response#authorization.
51
+ # The +money+ amount is not used. The entire amount of the
52
+ # initial authorization will be captured.
105
53
  def capture(money, reference, options = {})
106
- bankcard.capture(money, reference, options)
54
+ post = {}
55
+ add_reference(post, reference)
56
+ commit(:capture, post, SOURCE_CARD)
107
57
  end
108
58
 
109
- # Voids a prior transaction. Works for both CreditCard and Check transactions.
110
- #
111
- # ==== Parameters
112
- #
113
- # * <tt>reference</tt> - The authorization reference string returned by the original transaction's Response#authorization.
114
59
  def void(reference, options = {})
115
- if reference.split(";").last == "virtual_check"
116
- virtual_check.void(reference, options)
60
+ post = {}
61
+ add_reference(post, reference)
62
+ source = reference.split(';').last
63
+ commit(:void, post, source)
64
+ end
65
+
66
+ def credit(money, payment_method, options = {})
67
+ post = {}
68
+ if card_brand(payment_method) == 'check'
69
+ source = SOURCE_ECHECK
70
+ add_check(post, payment_method)
71
+ add_check_customer_data(post, options)
117
72
  else
118
- bankcard.void(reference, options)
73
+ source = SOURCE_CARD
74
+ add_credit_card(post, payment_method)
75
+ end
76
+ add_transaction_data(post, money, options)
77
+ commit(:credit, post, source)
78
+ end
79
+
80
+ def refund(money, reference, options={})
81
+ post = {}
82
+ add_reference(post, reference)
83
+ add_transaction_data(post, money, options)
84
+ commit(:refund, post, SOURCE_CARD)
85
+ end
86
+
87
+ def store(credit_card, options = {})
88
+ vault.store(credit_card, options)
89
+ end
90
+
91
+ def unstore(identification, options = {})
92
+ vault.unstore(identification, options)
93
+ end
94
+
95
+ def supports_scrubbing?
96
+ true
97
+ end
98
+
99
+ def scrub(transcript)
100
+ force_utf8(transcript).
101
+ gsub(%r((M_id=)[^&]*), '\1[FILTERED]').
102
+ gsub(%r((M_key=)[^&]*), '\1[FILTERED]').
103
+ gsub(%r((C_cardnumber=)[^&]*), '\1[FILTERED]').
104
+ gsub(%r((C_cvv=)[^&]*), '\1[FILTERED]').
105
+ gsub(%r((C_rte=)[^&]*), '\1[FILTERED]').
106
+ gsub(%r((C_acct=)[^&]*), '\1[FILTERED]').
107
+ gsub(%r((C_ssn=)[^&]*), '\1[FILTERED]').
108
+ gsub(%r((<ns1:CARDNUMBER>).+(</ns1:CARDNUMBER>)), '\1[FILTERED]\2').
109
+ gsub(%r((<ns1:M_ID>).+(</ns1:M_ID>)), '\1[FILTERED]\2').
110
+ gsub(%r((<ns1:M_KEY>).+(</ns1:M_KEY>)), '\1[FILTERED]\2')
111
+ end
112
+
113
+ private
114
+
115
+ # use the same method as in pay_conex
116
+ def force_utf8(string)
117
+ return nil unless string
118
+ binary = string.encode('BINARY', invalid: :replace, undef: :replace, replace: '?') # Needed for Ruby 2.0 since #encode is a no-op if the string is already UTF-8. It's not needed for Ruby 2.1 and up since it's not a no-op there.
119
+ binary.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
120
+ end
121
+
122
+ def add_credit_card(post, credit_card)
123
+ post[:C_name] = credit_card.name
124
+ post[:C_cardnumber] = credit_card.number
125
+ post[:C_exp] = expdate(credit_card)
126
+ post[:C_cvv] = credit_card.verification_value if credit_card.verification_value?
127
+ end
128
+
129
+ def add_check(post, check)
130
+ post[:C_first_name] = check.first_name
131
+ post[:C_last_name] = check.last_name
132
+ post[:C_rte] = check.routing_number
133
+ post[:C_acct] = check.account_number
134
+ post[:C_check_number] = check.number
135
+ post[:C_acct_type] = account_type(check)
136
+ end
137
+
138
+ def add_check_customer_data(post, options)
139
+ # Required  Customer Type – (NACHA Transaction Class)
140
+ # CCD for Commercial, Merchant Initiated
141
+ # PPD for Personal, Merchant Initiated
142
+ # WEB for Internet, Consumer Initiated
143
+ # RCK for Returned Checks
144
+ # ARC for Account Receivable Entry
145
+ # TEL for TelephoneInitiated
146
+ post[:C_customer_type] = 'WEB'
147
+
148
+ # Optional  10  Digit Originator  ID – Assigned  By for  each transaction  class  or  business  purpose. If  not provided, the default Originator ID for the specific  Customer Type will be applied. 
149
+ post[:C_originator_id] = options[:originator_id]
150
+
151
+ # Optional  Transaction Addenda
152
+ post[:T_addenda] = options[:addenda]
153
+
154
+ # Required  Check  Writer  Social  Security  Number  (  Numbers Only, No Dashes ) 
155
+ post[:C_ssn] = options[:ssn].to_s.gsub(/[^\d]/, '')
156
+
157
+ post[:C_dl_state_code] = options[:drivers_license_state]
158
+ post[:C_dl_number] = options[:drivers_license_number]
159
+ post[:C_dob] = format_birth_date(options[:date_of_birth])
160
+ end
161
+
162
+ def format_birth_date(date)
163
+ date.respond_to?(:strftime) ? date.strftime('%m/%d/%Y') : date
164
+ end
165
+
166
+ # DDA for Checking
167
+ # SAV for Savings 
168
+ def account_type(check)
169
+ case check.account_type
170
+ when 'checking' then 'DDA'
171
+ when 'savings' then 'SAV'
172
+ else raise ArgumentError, "Unknown account type #{check.account_type}"
173
+ end
174
+ end
175
+
176
+ def parse(data, source)
177
+ source == SOURCE_ECHECK ? parse_check(data) : parse_credit_card(data)
178
+ end
179
+
180
+ def parse_check(data)
181
+ response = {}
182
+ response[:success] = data[1, 1]
183
+ response[:code] = data[2, 6].strip
184
+ response[:message] = data[8, 32].strip
185
+ response[:risk] = data[40, 2]
186
+ response[:reference] = data[42, 10]
187
+
188
+ extra_data = data[53...-1].split("\034")
189
+ response[:order_number] = extra_data[0]
190
+ response[:authentication_indicator] = extra_data[1]
191
+ response[:authentication_disclosure] = extra_data[2]
192
+ response
193
+ end
194
+
195
+ def parse_credit_card(data)
196
+ response = {}
197
+ response[:success] = data[1, 1]
198
+ response[:code] = data[2, 6]
199
+ response[:message] = data[8, 32].strip
200
+ response[:front_end] = data[40, 2]
201
+ response[:cvv_result] = data[42, 1]
202
+ response[:avs_result] = data[43, 1].strip
203
+ response[:risk] = data[44, 2]
204
+ response[:reference] = data[46, 10]
205
+
206
+ response[:order_number], response[:recurring] = data[57...-1].split("\034")
207
+ response
208
+ end
209
+
210
+ def add_invoice(post, options)
211
+ post[:T_ordernum] = (options[:order_id] || generate_unique_id).slice(0, 20)
212
+ post[:T_tax] = amount(options[:tax]) unless empty?(options[:tax])
213
+ post[:T_shipping] = amount(options[:shipping]) unless empty?(options[:shipping])
214
+ end
215
+
216
+ def add_reference(post, reference)
217
+ ref, _ = reference.to_s.split(';')
218
+ post[:T_reference] = ref
219
+ end
220
+
221
+ def add_amount(post, money)
222
+ post[:T_amt] = amount(money)
223
+ end
224
+
225
+ def add_customer_data(post, options)
226
+ post[:T_customer_number] = options[:customer] if Float(options[:customer]) rescue nil
227
+ end
228
+
229
+ def add_addresses(post, options)
230
+ billing_address = options[:billing_address] || options[:address] || {}
231
+
232
+ post[:C_address] = billing_address[:address1]
233
+ post[:C_city] = billing_address[:city]
234
+ post[:C_state] = empty?(billing_address[:state]) ? 'Outside of US' : billing_address[:state]
235
+ post[:C_zip] = billing_address[:zip]
236
+ post[:C_country] = billing_address[:country]
237
+ post[:C_telephone] = billing_address[:phone]
238
+ post[:C_fax] = billing_address[:fax]
239
+ post[:C_email] = options[:email]
240
+
241
+ if shipping_address = options[:shipping_address]
242
+ post[:C_ship_name] = shipping_address[:name]
243
+ post[:C_ship_address] = shipping_address[:address1]
244
+ post[:C_ship_city] = shipping_address[:city]
245
+ post[:C_ship_state] = shipping_address[:state]
246
+ post[:C_ship_zip] = shipping_address[:zip]
247
+ post[:C_ship_country] = shipping_address[:country]
119
248
  end
120
249
  end
121
250
 
122
- def credit(money, source, options = {})
123
- deprecated CREDIT_DEPRECATION_MESSAGE
124
- refund(money, source, options)
251
+ def add_transaction_data(post, money, options)
252
+ add_amount(post, money)
253
+ add_invoice(post, options)
254
+ add_addresses(post, options)
255
+ add_customer_data(post, options)
256
+ end
257
+
258
+ def commit(action, params, source)
259
+ url = url(params, source)
260
+ response = parse(ssl_post(url, post_data(action, params)), source)
261
+
262
+ Response.new(success?(response), response[:message], response,
263
+ :test => test?,
264
+ :authorization => authorization_from(response, source),
265
+ :avs_result => { :code => response[:avs_result] },
266
+ :cvv_result => response[:cvv_result]
267
+ )
125
268
  end
126
269
 
127
- # Performs a refund transaction.
128
- #
129
- # ==== Parameters
130
- #
131
- # * <tt>money</tt> - The amount to be authorized as an integer value in cents.
132
- # * <tt>source</tt> - The CreditCard or Check object to be used as the target for the refund.
133
- def refund(money, source, options = {})
134
- if card_brand(source) == "check"
135
- virtual_check.refund(money, source, options)
270
+ def url(params, source)
271
+ if source == SOURCE_ECHECK
272
+ "#{live_url}/eftVirtualCheck.dll?transaction"
136
273
  else
137
- bankcard.refund(money, source, options)
274
+ "#{live_url}/eftBankcard.dll?transaction"
138
275
  end
139
276
  end
140
277
 
141
- private
142
- def bankcard
143
- @bankcard ||= SageBankcardGateway.new(@options)
278
+ def authorization_from(response, source)
279
+ "#{response[:reference]};#{source}"
280
+ end
281
+
282
+ def success?(response)
283
+ response[:success] == 'A'
284
+ end
285
+
286
+ def post_data(action, params = {})
287
+ params[:M_id] = @options[:login]
288
+ params[:M_key] = @options[:password]
289
+ params[:T_code] = TRANSACTIONS[action]
290
+
291
+ params.collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join('&')
144
292
  end
145
293
 
146
- def virtual_check
147
- @virtual_check ||= SageVirtualCheckGateway.new(@options)
294
+ def vault
295
+ @vault ||= SageVault.new(@options, self)
296
+ end
297
+
298
+ class SageVault
299
+
300
+ def initialize(options, gateway)
301
+ @live_url = 'https://www.sagepayments.net/web_services/wsVault/wsVault.asmx'
302
+ @options = options
303
+ @gateway = gateway
304
+ end
305
+
306
+ def store(credit_card, options = {})
307
+ request = build_store_request(credit_card, options)
308
+ commit(:store, request)
309
+ end
310
+
311
+ def unstore(identification, options = {})
312
+ request = build_unstore_request(identification, options)
313
+ commit(:unstore, request)
314
+ end
315
+
316
+ private
317
+
318
+ # A valid request example, since the Sage docs have none:
319
+ #
320
+ # <?xml version="1.0" encoding="UTF-8" ?>
321
+ # <SOAP-ENV:Envelope
322
+ # xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
323
+ # xmlns:ns1="https://www.sagepayments.net/web_services/wsVault/wsVault">
324
+ # <SOAP-ENV:Body>
325
+ # <ns1:INSERT_CREDIT_CARD_DATA>
326
+ # <ns1:M_ID>279277516172</ns1:M_ID>
327
+ # <ns1:M_KEY>O3I8G2H8V6A3</ns1:M_KEY>
328
+ # <ns1:CARDNUMBER>4111111111111111</ns1:CARDNUMBER>
329
+ # <ns1:EXPIRATION_DATE>0915</ns1:EXPIRATION_DATE>
330
+ # </ns1:INSERT_CREDIT_CARD_DATA>
331
+ # </SOAP-ENV:Body>
332
+ # </SOAP-ENV:Envelope>
333
+ def build_store_request(credit_card, options)
334
+ xml = Builder::XmlMarkup.new
335
+ add_credit_card(xml, credit_card, options)
336
+ xml.target!
337
+ end
338
+
339
+ def build_unstore_request(identification, options)
340
+ xml = Builder::XmlMarkup.new
341
+ add_identification(xml, identification, options)
342
+ xml.target!
343
+ end
344
+
345
+ def add_customer_data(xml)
346
+ xml.tag! 'ns1:M_ID', @options[:login]
347
+ xml.tag! 'ns1:M_KEY', @options[:password]
348
+ end
349
+
350
+ def add_credit_card(xml, credit_card, options)
351
+ xml.tag! 'ns1:CARDNUMBER', credit_card.number
352
+ xml.tag! 'ns1:EXPIRATION_DATE', exp_date(credit_card)
353
+ end
354
+
355
+ def add_identification(xml, identification, options)
356
+ xml.tag! 'ns1:GUID', identification
357
+ end
358
+
359
+ def exp_date(credit_card)
360
+ year = sprintf('%.4i', credit_card.year)
361
+ month = sprintf('%.2i', credit_card.month)
362
+
363
+ "#{month}#{year[-2..-1]}"
364
+ end
365
+
366
+ def commit(action, request)
367
+ response = parse(
368
+ @gateway.ssl_post(
369
+ @live_url,
370
+ build_soap_request(action, request),
371
+ build_headers(action)
372
+ )
373
+ )
374
+
375
+ case action
376
+ when :store
377
+ success = response[:success] == 'true'
378
+ message = response[:message].downcase.capitalize if response[:message]
379
+ when :unstore
380
+ success = response[:delete_data_result] == 'true'
381
+ message = success ? 'Succeeded' : 'Failed'
382
+ end
383
+
384
+ Response.new(success, message, response,
385
+ authorization: response[:guid]
386
+ )
387
+ end
388
+
389
+ ENVELOPE_NAMESPACES = {
390
+ 'xmlns:SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
391
+ 'xmlns:ns1' => 'https://www.sagepayments.net/web_services/wsVault/wsVault'
392
+ }
393
+
394
+ ACTION_ELEMENTS = {
395
+ store: 'INSERT_CREDIT_CARD_DATA',
396
+ unstore: 'DELETE_DATA'
397
+ }
398
+
399
+ def build_soap_request(action, body)
400
+ xml = Builder::XmlMarkup.new
401
+
402
+ xml.instruct!
403
+ xml.tag! 'SOAP-ENV:Envelope', ENVELOPE_NAMESPACES do
404
+ xml.tag! 'SOAP-ENV:Body' do
405
+ xml.tag! "ns1:#{ACTION_ELEMENTS[action]}" do
406
+ add_customer_data(xml)
407
+ xml << body
408
+ end
409
+ end
410
+ end
411
+ xml.target!
412
+ end
413
+
414
+ SOAP_ACTIONS = {
415
+ store: 'https://www.sagepayments.net/web_services/wsVault/wsVault/INSERT_CREDIT_CARD_DATA',
416
+ unstore: 'https://www.sagepayments.net/web_services/wsVault/wsVault/DELETE_DATA'
417
+ }
418
+
419
+ def build_headers(action)
420
+ {
421
+ 'SOAPAction' => SOAP_ACTIONS[action],
422
+ 'Content-Type' => 'text/xml; charset=utf-8'
423
+ }
424
+ end
425
+
426
+ def parse(body)
427
+ response = {}
428
+ hashify_xml!(body, response)
429
+ response
430
+ end
431
+
432
+ def hashify_xml!(xml, response)
433
+ xml = REXML::Document.new(xml)
434
+
435
+ # Store
436
+ xml.elements.each('//Table1/*') do |node|
437
+ response[node.name.underscore.to_sym] = node.text
438
+ end
439
+
440
+ # Unstore
441
+ xml.elements.each('//DELETE_DATAResponse/*') do |node|
442
+ response[node.name.underscore.to_sym] = node.text
443
+ end
444
+ end
148
445
  end
149
446
  end
150
447
  end
151
448
  end
152
-