activemerchant 1.38.0 → 1.78.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (397) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +1344 -3
  3. data/CONTRIBUTORS +154 -0
  4. data/README.md +157 -144
  5. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  6. data/lib/active_merchant/billing/base.rb +21 -17
  7. data/lib/active_merchant/billing/check.rb +32 -22
  8. data/lib/active_merchant/billing/compatibility.rb +120 -0
  9. data/lib/active_merchant/billing/credit_card.rb +215 -67
  10. data/lib/active_merchant/billing/credit_card_formatting.rb +4 -1
  11. data/lib/active_merchant/billing/credit_card_methods.rb +149 -52
  12. data/lib/active_merchant/billing/cvv_result.rb +15 -15
  13. data/lib/active_merchant/billing/gateway.rb +170 -24
  14. data/lib/active_merchant/billing/gateways/adyen.rb +284 -0
  15. data/lib/active_merchant/billing/gateways/allied_wallet.rb +206 -0
  16. data/lib/active_merchant/billing/gateways/authorize_net.rb +899 -606
  17. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +417 -0
  18. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +43 -18
  19. data/lib/active_merchant/billing/gateways/axcessms.rb +181 -0
  20. data/lib/active_merchant/billing/gateways/balanced.rb +134 -346
  21. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  22. data/lib/active_merchant/billing/gateways/banwire.rb +13 -2
  23. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +325 -0
  24. data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
  25. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +96 -15
  26. data/lib/active_merchant/billing/gateways/beanstream.rb +52 -9
  27. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +12 -8
  28. data/lib/active_merchant/billing/gateways/blue_pay.rb +520 -501
  29. data/lib/active_merchant/billing/gateways/blue_snap.rb +343 -0
  30. data/lib/active_merchant/billing/gateways/bogus.rb +94 -50
  31. data/lib/active_merchant/billing/gateways/borgun.rb +222 -0
  32. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  33. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +14 -2
  34. data/lib/active_merchant/billing/gateways/braintree.rb +2 -2
  35. data/lib/active_merchant/billing/gateways/braintree_blue.rb +372 -137
  36. data/lib/active_merchant/billing/gateways/braintree_orange.rb +4 -4
  37. data/lib/active_merchant/billing/gateways/bridge_pay.rb +245 -0
  38. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  39. data/lib/active_merchant/billing/gateways/card_connect.rb +286 -0
  40. data/lib/active_merchant/billing/gateways/card_stream.rb +269 -118
  41. data/lib/active_merchant/billing/gateways/cardknox.rb +328 -0
  42. data/lib/active_merchant/billing/gateways/cardprocess.rb +254 -0
  43. data/lib/active_merchant/billing/gateways/cashnet.rb +219 -0
  44. data/lib/active_merchant/billing/gateways/cc5.rb +45 -0
  45. data/lib/active_merchant/billing/gateways/cecabank.rb +239 -0
  46. data/lib/active_merchant/billing/gateways/cenpos.rb +327 -0
  47. data/lib/active_merchant/billing/gateways/checkout.rb +214 -0
  48. data/lib/active_merchant/billing/gateways/checkout_v2.rb +226 -0
  49. data/lib/active_merchant/billing/gateways/citrus_pay.rb +23 -0
  50. data/lib/active_merchant/billing/gateways/clearhaus.rb +222 -0
  51. data/lib/active_merchant/billing/gateways/commercegate.rb +143 -0
  52. data/lib/active_merchant/billing/gateways/conekta.rb +224 -0
  53. data/lib/active_merchant/billing/gateways/creditcall.rb +272 -0
  54. data/lib/active_merchant/billing/gateways/credorax.rb +345 -0
  55. data/lib/active_merchant/billing/gateways/culqi.rb +279 -0
  56. data/lib/active_merchant/billing/gateways/cyber_source.rb +228 -98
  57. data/lib/active_merchant/billing/gateways/data_cash.rb +41 -314
  58. data/lib/active_merchant/billing/gateways/dibs.rb +205 -0
  59. data/lib/active_merchant/billing/gateways/digitzs.rb +292 -0
  60. data/lib/active_merchant/billing/gateways/ebanx.rb +296 -0
  61. data/lib/active_merchant/billing/gateways/efsnet.rb +3 -14
  62. data/lib/active_merchant/billing/gateways/elavon.rb +143 -142
  63. data/lib/active_merchant/billing/gateways/element.rb +356 -0
  64. data/lib/active_merchant/billing/gateways/epay.rb +23 -12
  65. data/lib/active_merchant/billing/gateways/eway.rb +12 -12
  66. data/lib/active_merchant/billing/gateways/eway_managed.rb +1 -1
  67. data/lib/active_merchant/billing/gateways/eway_rapid.rb +417 -204
  68. data/lib/active_merchant/billing/gateways/exact.rb +10 -1
  69. data/lib/active_merchant/billing/gateways/ezic.rb +196 -0
  70. data/lib/active_merchant/billing/gateways/fat_zebra.rb +65 -37
  71. data/lib/active_merchant/billing/gateways/federated_canada.rb +1 -8
  72. data/lib/active_merchant/billing/gateways/finansbank.rb +3 -2
  73. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  74. data/lib/active_merchant/billing/gateways/first_pay.rb +109 -124
  75. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +155 -29
  76. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  77. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  78. data/lib/active_merchant/billing/gateways/forte.rb +256 -0
  79. data/lib/active_merchant/billing/gateways/garanti.rb +11 -5
  80. data/lib/active_merchant/billing/gateways/global_collect.rb +334 -0
  81. data/lib/active_merchant/billing/gateways/global_transport.rb +194 -0
  82. data/lib/active_merchant/billing/gateways/hps.rb +305 -0
  83. data/lib/active_merchant/billing/gateways/iats_payments.rb +271 -16
  84. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +2 -5
  85. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +0 -0
  86. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +1 -1
  87. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  88. data/lib/active_merchant/billing/gateways/inspire.rb +8 -10
  89. data/lib/active_merchant/billing/gateways/instapay.rb +0 -0
  90. data/lib/active_merchant/billing/gateways/ipp.rb +175 -0
  91. data/lib/active_merchant/billing/gateways/iridium.rb +210 -4
  92. data/lib/active_merchant/billing/gateways/iveri.rb +251 -0
  93. data/lib/active_merchant/billing/gateways/jetpay.rb +176 -49
  94. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +437 -0
  95. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  96. data/lib/active_merchant/billing/gateways/kushki.rb +227 -0
  97. data/lib/active_merchant/billing/gateways/latitude19.rb +416 -0
  98. data/lib/active_merchant/billing/gateways/linkpoint.rb +17 -13
  99. data/lib/active_merchant/billing/gateways/litle.rb +329 -439
  100. data/lib/active_merchant/billing/gateways/mastercard.rb +268 -0
  101. data/lib/active_merchant/billing/gateways/maxipago.rb +220 -0
  102. data/lib/active_merchant/billing/gateways/mercado_pago.rb +262 -0
  103. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +15 -7
  104. data/lib/active_merchant/billing/gateways/merchant_one.rb +0 -1
  105. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  106. data/lib/active_merchant/billing/gateways/merchant_ware.rb +12 -15
  107. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +24 -13
  108. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +21 -14
  109. data/lib/active_merchant/billing/gateways/mercury.rb +74 -29
  110. data/lib/active_merchant/billing/gateways/metrics_global.rb +2 -21
  111. data/lib/active_merchant/billing/gateways/micropayment.rb +185 -0
  112. data/lib/active_merchant/billing/gateways/migs.rb +74 -13
  113. data/lib/active_merchant/billing/gateways/modern_payments.rb +1 -1
  114. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +1 -3
  115. data/lib/active_merchant/billing/gateways/monei.rb +307 -0
  116. data/lib/active_merchant/billing/gateways/moneris.rb +119 -36
  117. data/lib/active_merchant/billing/gateways/moneris_us.rb +146 -45
  118. data/lib/active_merchant/billing/gateways/money_movers.rb +152 -0
  119. data/lib/active_merchant/billing/gateways/nab_transact.rb +78 -53
  120. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +165 -0
  121. data/lib/active_merchant/billing/gateways/net_registry.rb +8 -3
  122. data/lib/active_merchant/billing/gateways/netbanx.rb +289 -0
  123. data/lib/active_merchant/billing/gateways/netbilling.rb +61 -26
  124. data/lib/active_merchant/billing/gateways/netpay.rb +1 -1
  125. data/lib/active_merchant/billing/gateways/network_merchants.rb +242 -0
  126. data/lib/active_merchant/billing/gateways/nmi.rb +265 -10
  127. data/lib/active_merchant/billing/gateways/ogone.rb +85 -27
  128. data/lib/active_merchant/billing/gateways/omise.rb +324 -0
  129. data/lib/active_merchant/billing/gateways/openpay.rb +227 -0
  130. data/lib/active_merchant/billing/gateways/opp.rb +372 -0
  131. data/lib/active_merchant/billing/gateways/optimal_payment.rb +59 -28
  132. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +22 -21
  133. data/lib/active_merchant/billing/gateways/orbital.rb +346 -56
  134. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +207 -0
  135. data/lib/active_merchant/billing/gateways/pagarme.rb +248 -0
  136. data/lib/active_merchant/billing/gateways/pago_facil.rb +122 -0
  137. data/lib/active_merchant/billing/gateways/pay_conex.rb +246 -0
  138. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +30 -14
  139. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  140. data/lib/active_merchant/billing/gateways/pay_junction.rb +19 -25
  141. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +190 -0
  142. data/lib/active_merchant/billing/gateways/pay_secure.rb +0 -7
  143. data/lib/active_merchant/billing/gateways/paybox_direct.rb +16 -12
  144. data/lib/active_merchant/billing/gateways/payeezy.rb +386 -0
  145. data/lib/active_merchant/billing/gateways/payex.rb +412 -0
  146. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +38 -17
  147. data/lib/active_merchant/billing/gateways/payflow.rb +100 -19
  148. data/lib/active_merchant/billing/gateways/payflow_express.rb +22 -22
  149. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +2 -2
  150. data/lib/active_merchant/billing/gateways/payflow_uk.rb +6 -6
  151. data/lib/active_merchant/billing/gateways/payment_express.rb +15 -3
  152. data/lib/active_merchant/billing/gateways/paymentez.rb +283 -0
  153. data/lib/active_merchant/billing/gateways/paymill.rb +237 -48
  154. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +41 -8
  155. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +4 -0
  156. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +18 -4
  157. data/lib/active_merchant/billing/gateways/paypal.rb +49 -20
  158. data/lib/active_merchant/billing/gateways/paypal_ca.rb +1 -1
  159. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +6 -5
  160. data/lib/active_merchant/billing/gateways/paypal_express.rb +32 -4
  161. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +3 -3
  162. data/lib/active_merchant/billing/gateways/payscout.rb +162 -0
  163. data/lib/active_merchant/billing/gateways/paystation.rb +22 -24
  164. data/lib/active_merchant/billing/gateways/payu_in.rb +248 -0
  165. data/lib/active_merchant/billing/gateways/payu_latam.rb +440 -0
  166. data/lib/active_merchant/billing/gateways/pin.rb +68 -13
  167. data/lib/active_merchant/billing/gateways/plugnpay.rb +1 -12
  168. data/lib/active_merchant/billing/gateways/pro_pay.rb +326 -0
  169. data/lib/active_merchant/billing/gateways/psigate.rb +3 -14
  170. data/lib/active_merchant/billing/gateways/psl_card.rb +3 -3
  171. data/lib/active_merchant/billing/gateways/qbms.rb +1 -1
  172. data/lib/active_merchant/billing/gateways/quantum.rb +2 -2
  173. data/lib/active_merchant/billing/gateways/quickbooks.rb +290 -0
  174. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +188 -0
  175. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +299 -0
  176. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +227 -0
  177. data/lib/active_merchant/billing/gateways/quickpay.rb +10 -319
  178. data/lib/active_merchant/billing/gateways/qvalent.rb +236 -0
  179. data/lib/active_merchant/billing/gateways/realex.rb +27 -25
  180. data/lib/active_merchant/billing/gateways/redsys.rb +212 -80
  181. data/lib/active_merchant/billing/gateways/s5.rb +247 -0
  182. data/lib/active_merchant/billing/gateways/safe_charge.rb +258 -0
  183. data/lib/active_merchant/billing/gateways/sage.rb +412 -119
  184. data/lib/active_merchant/billing/gateways/sage_pay.rb +176 -59
  185. data/lib/active_merchant/billing/gateways/secure_net.rb +35 -29
  186. data/lib/active_merchant/billing/gateways/secure_pay.rb +182 -9
  187. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +21 -7
  188. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +0 -7
  189. data/lib/active_merchant/billing/gateways/securion_pay.rb +267 -0
  190. data/lib/active_merchant/billing/gateways/skip_jack.rb +1 -3
  191. data/lib/active_merchant/billing/gateways/smart_ps.rb +13 -2
  192. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  193. data/lib/active_merchant/billing/gateways/spreedly_core.rb +36 -11
  194. data/lib/active_merchant/billing/gateways/stripe.rb +461 -82
  195. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +156 -0
  196. data/lib/active_merchant/billing/gateways/telr.rb +275 -0
  197. data/lib/active_merchant/billing/gateways/tns.rb +22 -0
  198. data/lib/active_merchant/billing/gateways/trans_first.rb +142 -28
  199. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +608 -0
  200. data/lib/active_merchant/billing/gateways/transact_pro.rb +224 -0
  201. data/lib/active_merchant/billing/gateways/transnational.rb +2 -231
  202. data/lib/active_merchant/billing/gateways/trexle.rb +217 -0
  203. data/lib/active_merchant/billing/gateways/trust_commerce.rb +17 -11
  204. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +193 -75
  205. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +150 -63
  206. data/lib/active_merchant/billing/gateways/vanco.rb +294 -0
  207. data/lib/active_merchant/billing/gateways/verifi.rb +1 -8
  208. data/lib/active_merchant/billing/gateways/viaklix.rb +1 -15
  209. data/lib/active_merchant/billing/gateways/visanet_peru.rb +209 -0
  210. data/lib/active_merchant/billing/gateways/webpay.rb +45 -28
  211. data/lib/active_merchant/billing/gateways/wepay.rb +238 -0
  212. data/lib/active_merchant/billing/gateways/wirecard.rb +167 -49
  213. data/lib/active_merchant/billing/gateways/world_net.rb +344 -0
  214. data/lib/active_merchant/billing/gateways/worldpay.rb +131 -36
  215. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +218 -0
  216. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  217. data/lib/active_merchant/billing/gateways.rb +8 -11
  218. data/lib/active_merchant/billing/model.rb +30 -0
  219. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  220. data/lib/active_merchant/billing/payment_token.rb +21 -0
  221. data/lib/active_merchant/billing/rails.rb +3 -0
  222. data/lib/active_merchant/billing/response.rb +24 -17
  223. data/lib/active_merchant/billing.rb +7 -1
  224. data/lib/active_merchant/connection.rb +177 -0
  225. data/lib/active_merchant/country.rb +334 -0
  226. data/lib/active_merchant/empty.rb +20 -0
  227. data/lib/active_merchant/errors.rb +35 -0
  228. data/lib/active_merchant/network_connection_retries.rb +79 -0
  229. data/lib/active_merchant/post_data.rb +24 -0
  230. data/lib/active_merchant/posts_data.rb +84 -0
  231. data/lib/active_merchant/version.rb +1 -1
  232. data/lib/active_merchant.rb +24 -21
  233. data/lib/certs/cacert.pem +3951 -0
  234. data/lib/support/gateway_support.rb +16 -10
  235. data/lib/support/outbound_hosts.rb +13 -10
  236. metadata +161 -306
  237. data/gem-public_cert.pem +0 -20
  238. data/lib/active_merchant/billing/expiry_date.rb +0 -34
  239. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +0 -314
  240. data/lib/active_merchant/billing/gateways/card_stream_modern.rb +0 -155
  241. data/lib/active_merchant/billing/gateways/certo_direct.rb +0 -277
  242. data/lib/active_merchant/billing/gateways/orbital/avs_result.rb +0 -93
  243. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +0 -93
  244. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +0 -114
  245. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +0 -102
  246. data/lib/active_merchant/billing/gateways/samurai.rb +0 -118
  247. data/lib/active_merchant/billing/gateways/vindicia.rb +0 -361
  248. data/lib/active_merchant/billing/integrations/a1agregator/helper.rb +0 -31
  249. data/lib/active_merchant/billing/integrations/a1agregator/notification.rb +0 -186
  250. data/lib/active_merchant/billing/integrations/a1agregator/status.rb +0 -38
  251. data/lib/active_merchant/billing/integrations/a1agregator.rb +0 -26
  252. data/lib/active_merchant/billing/integrations/action_view_helper.rb +0 -73
  253. data/lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb +0 -229
  254. data/lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb +0 -340
  255. data/lib/active_merchant/billing/integrations/authorize_net_sim.rb +0 -38
  256. data/lib/active_merchant/billing/integrations/bogus/helper.rb +0 -17
  257. data/lib/active_merchant/billing/integrations/bogus/notification.rb +0 -11
  258. data/lib/active_merchant/billing/integrations/bogus/return.rb +0 -10
  259. data/lib/active_merchant/billing/integrations/bogus.rb +0 -23
  260. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +0 -120
  261. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +0 -158
  262. data/lib/active_merchant/billing/integrations/chronopay/return.rb +0 -10
  263. data/lib/active_merchant/billing/integrations/chronopay.rb +0 -23
  264. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +0 -200
  265. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +0 -76
  266. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +0 -32
  267. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +0 -37
  268. data/lib/active_merchant/billing/integrations/direc_pay.rb +0 -41
  269. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +0 -90
  270. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +0 -120
  271. data/lib/active_merchant/billing/integrations/directebanking/return.rb +0 -11
  272. data/lib/active_merchant/billing/integrations/directebanking.rb +0 -47
  273. data/lib/active_merchant/billing/integrations/dotpay/helper.rb +0 -77
  274. data/lib/active_merchant/billing/integrations/dotpay/notification.rb +0 -86
  275. data/lib/active_merchant/billing/integrations/dotpay/return.rb +0 -11
  276. data/lib/active_merchant/billing/integrations/dotpay.rb +0 -22
  277. data/lib/active_merchant/billing/integrations/dwolla/common.rb +0 -23
  278. data/lib/active_merchant/billing/integrations/dwolla/helper.rb +0 -43
  279. data/lib/active_merchant/billing/integrations/dwolla/notification.rb +0 -64
  280. data/lib/active_merchant/billing/integrations/dwolla/return.rb +0 -49
  281. data/lib/active_merchant/billing/integrations/dwolla.rb +0 -23
  282. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +0 -34
  283. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +0 -84
  284. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +0 -48
  285. data/lib/active_merchant/billing/integrations/easy_pay/common.rb +0 -40
  286. data/lib/active_merchant/billing/integrations/easy_pay/helper.rb +0 -36
  287. data/lib/active_merchant/billing/integrations/easy_pay/notification.rb +0 -59
  288. data/lib/active_merchant/billing/integrations/easy_pay.rb +0 -30
  289. data/lib/active_merchant/billing/integrations/epay/helper.rb +0 -55
  290. data/lib/active_merchant/billing/integrations/epay/notification.rb +0 -110
  291. data/lib/active_merchant/billing/integrations/epay.rb +0 -21
  292. data/lib/active_merchant/billing/integrations/first_data/helper.rb +0 -61
  293. data/lib/active_merchant/billing/integrations/first_data/notification.rb +0 -56
  294. data/lib/active_merchant/billing/integrations/first_data.rb +0 -38
  295. data/lib/active_merchant/billing/integrations/gestpay/common.rb +0 -42
  296. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +0 -70
  297. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +0 -85
  298. data/lib/active_merchant/billing/integrations/gestpay/return.rb +0 -10
  299. data/lib/active_merchant/billing/integrations/gestpay.rb +0 -25
  300. data/lib/active_merchant/billing/integrations/helper.rb +0 -117
  301. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +0 -58
  302. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +0 -59
  303. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +0 -68
  304. data/lib/active_merchant/billing/integrations/hi_trust.rb +0 -27
  305. data/lib/active_merchant/billing/integrations/ipay88/helper.rb +0 -114
  306. data/lib/active_merchant/billing/integrations/ipay88/return.rb +0 -95
  307. data/lib/active_merchant/billing/integrations/ipay88.rb +0 -19
  308. data/lib/active_merchant/billing/integrations/liqpay/helper.rb +0 -43
  309. data/lib/active_merchant/billing/integrations/liqpay/notification.rb +0 -89
  310. data/lib/active_merchant/billing/integrations/liqpay/return.rb +0 -83
  311. data/lib/active_merchant/billing/integrations/liqpay.rb +0 -30
  312. data/lib/active_merchant/billing/integrations/maksuturva/helper.rb +0 -119
  313. data/lib/active_merchant/billing/integrations/maksuturva/notification.rb +0 -48
  314. data/lib/active_merchant/billing/integrations/maksuturva.rb +0 -86
  315. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +0 -75
  316. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +0 -129
  317. data/lib/active_merchant/billing/integrations/moneybookers.rb +0 -26
  318. data/lib/active_merchant/billing/integrations/nochex/helper.rb +0 -68
  319. data/lib/active_merchant/billing/integrations/nochex/notification.rb +0 -94
  320. data/lib/active_merchant/billing/integrations/nochex/return.rb +0 -10
  321. data/lib/active_merchant/billing/integrations/nochex.rb +0 -88
  322. data/lib/active_merchant/billing/integrations/notification.rb +0 -71
  323. data/lib/active_merchant/billing/integrations/paxum/common.rb +0 -24
  324. data/lib/active_merchant/billing/integrations/paxum/helper.rb +0 -42
  325. data/lib/active_merchant/billing/integrations/paxum/notification.rb +0 -33
  326. data/lib/active_merchant/billing/integrations/paxum.rb +0 -44
  327. data/lib/active_merchant/billing/integrations/pay_fast/common.rb +0 -42
  328. data/lib/active_merchant/billing/integrations/pay_fast/helper.rb +0 -50
  329. data/lib/active_merchant/billing/integrations/pay_fast/notification.rb +0 -134
  330. data/lib/active_merchant/billing/integrations/pay_fast/return.rb +0 -10
  331. data/lib/active_merchant/billing/integrations/pay_fast.rb +0 -70
  332. data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +0 -116
  333. data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +0 -78
  334. data/lib/active_merchant/billing/integrations/payflow_link.rb +0 -21
  335. data/lib/active_merchant/billing/integrations/paypal/helper.rb +0 -119
  336. data/lib/active_merchant/billing/integrations/paypal/notification.rb +0 -227
  337. data/lib/active_merchant/billing/integrations/paypal/return.rb +0 -10
  338. data/lib/active_merchant/billing/integrations/paypal.rb +0 -39
  339. data/lib/active_merchant/billing/integrations/paypal_payments_advanced/helper.rb +0 -15
  340. data/lib/active_merchant/billing/integrations/paypal_payments_advanced.rb +0 -20
  341. data/lib/active_merchant/billing/integrations/paysbuy/helper.rb +0 -15
  342. data/lib/active_merchant/billing/integrations/paysbuy/notification.rb +0 -28
  343. data/lib/active_merchant/billing/integrations/paysbuy.rb +0 -36
  344. data/lib/active_merchant/billing/integrations/payu_in/helper.rb +0 -74
  345. data/lib/active_merchant/billing/integrations/payu_in/notification.rb +0 -165
  346. data/lib/active_merchant/billing/integrations/payu_in/return.rb +0 -36
  347. data/lib/active_merchant/billing/integrations/payu_in.rb +0 -43
  348. data/lib/active_merchant/billing/integrations/platron/helper.rb +0 -32
  349. data/lib/active_merchant/billing/integrations/platron/notification.rb +0 -113
  350. data/lib/active_merchant/billing/integrations/platron.rb +0 -28
  351. data/lib/active_merchant/billing/integrations/pxpay/helper.rb +0 -112
  352. data/lib/active_merchant/billing/integrations/pxpay/notification.rb +0 -157
  353. data/lib/active_merchant/billing/integrations/pxpay/return.rb +0 -25
  354. data/lib/active_merchant/billing/integrations/pxpay.rb +0 -31
  355. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +0 -74
  356. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +0 -137
  357. data/lib/active_merchant/billing/integrations/quickpay.rb +0 -21
  358. data/lib/active_merchant/billing/integrations/rbkmoney/helper.rb +0 -23
  359. data/lib/active_merchant/billing/integrations/rbkmoney/notification.rb +0 -91
  360. data/lib/active_merchant/billing/integrations/rbkmoney.rb +0 -17
  361. data/lib/active_merchant/billing/integrations/return.rb +0 -42
  362. data/lib/active_merchant/billing/integrations/robokassa/common.rb +0 -19
  363. data/lib/active_merchant/billing/integrations/robokassa/helper.rb +0 -50
  364. data/lib/active_merchant/billing/integrations/robokassa/notification.rb +0 -55
  365. data/lib/active_merchant/billing/integrations/robokassa/return.rb +0 -17
  366. data/lib/active_merchant/billing/integrations/robokassa.rb +0 -49
  367. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +0 -33
  368. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +0 -136
  369. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +0 -210
  370. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +0 -31
  371. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +0 -37
  372. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +0 -91
  373. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +0 -139
  374. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +0 -17
  375. data/lib/active_merchant/billing/integrations/two_checkout.rb +0 -44
  376. data/lib/active_merchant/billing/integrations/valitor/helper.rb +0 -86
  377. data/lib/active_merchant/billing/integrations/valitor/notification.rb +0 -13
  378. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +0 -97
  379. data/lib/active_merchant/billing/integrations/valitor/return.rb +0 -13
  380. data/lib/active_merchant/billing/integrations/valitor.rb +0 -33
  381. data/lib/active_merchant/billing/integrations/verkkomaksut/helper.rb +0 -88
  382. data/lib/active_merchant/billing/integrations/verkkomaksut/notification.rb +0 -59
  383. data/lib/active_merchant/billing/integrations/verkkomaksut.rb +0 -20
  384. data/lib/active_merchant/billing/integrations/web_pay/common.rb +0 -50
  385. data/lib/active_merchant/billing/integrations/web_pay/helper.rb +0 -68
  386. data/lib/active_merchant/billing/integrations/web_pay/notification.rb +0 -51
  387. data/lib/active_merchant/billing/integrations/web_pay.rb +0 -45
  388. data/lib/active_merchant/billing/integrations/webmoney/common.rb +0 -17
  389. data/lib/active_merchant/billing/integrations/webmoney/helper.rb +0 -40
  390. data/lib/active_merchant/billing/integrations/webmoney/notification.rb +0 -47
  391. data/lib/active_merchant/billing/integrations/webmoney.rb +0 -43
  392. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +0 -101
  393. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +0 -160
  394. data/lib/active_merchant/billing/integrations/world_pay.rb +0 -34
  395. data/lib/active_merchant/billing/integrations.rb +0 -17
  396. data.tar.gz.sig +0 -0
  397. metadata.gz.sig +0 -0
@@ -1,152 +1,445 @@
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(@gateway.ssl_post(@live_url,
368
+ build_soap_request(action, request),
369
+ build_headers(action))
370
+ )
371
+
372
+ case action
373
+ when :store
374
+ success = response[:success] == 'true'
375
+ message = response[:message].downcase.capitalize if response[:message]
376
+ when :unstore
377
+ success = response[:delete_data_result] == 'true'
378
+ message = success ? 'Succeeded' : 'Failed'
379
+ end
380
+
381
+ Response.new(success, message, response,
382
+ authorization: response[:guid]
383
+ )
384
+ end
385
+
386
+ ENVELOPE_NAMESPACES = {
387
+ 'xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/",
388
+ 'xmlns:ns1' => "https://www.sagepayments.net/web_services/wsVault/wsVault"
389
+ }
390
+
391
+ ACTION_ELEMENTS = {
392
+ store: 'INSERT_CREDIT_CARD_DATA',
393
+ unstore: 'DELETE_DATA'
394
+ }
395
+
396
+ def build_soap_request(action, body)
397
+ xml = Builder::XmlMarkup.new
398
+
399
+ xml.instruct!
400
+ xml.tag! 'SOAP-ENV:Envelope', ENVELOPE_NAMESPACES do
401
+ xml.tag! 'SOAP-ENV:Body' do
402
+ xml.tag! "ns1:#{ACTION_ELEMENTS[action]}" do
403
+ add_customer_data(xml)
404
+ xml << body
405
+ end
406
+ end
407
+ end
408
+ xml.target!
409
+ end
410
+
411
+ SOAP_ACTIONS = {
412
+ store: 'https://www.sagepayments.net/web_services/wsVault/wsVault/INSERT_CREDIT_CARD_DATA',
413
+ unstore: 'https://www.sagepayments.net/web_services/wsVault/wsVault/DELETE_DATA'
414
+ }
415
+
416
+ def build_headers(action)
417
+ {
418
+ "SOAPAction" => SOAP_ACTIONS[action],
419
+ "Content-Type" => "text/xml; charset=utf-8"
420
+ }
421
+ end
422
+
423
+ def parse(body)
424
+ response = {}
425
+ hashify_xml!(body, response)
426
+ response
427
+ end
428
+
429
+ def hashify_xml!(xml, response)
430
+ xml = REXML::Document.new(xml)
431
+
432
+ # Store
433
+ xml.elements.each("//Table1/*") do |node|
434
+ response[node.name.underscore.to_sym] = node.text
435
+ end
436
+
437
+ # Unstore
438
+ xml.elements.each("//DELETE_DATAResponse/*") do |node|
439
+ response[node.name.underscore.to_sym] = node.text
440
+ end
441
+ end
148
442
  end
149
443
  end
150
444
  end
151
445
  end
152
-