swiss-crm-activemerchant 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +4033 -0
  3. data/CONTRIBUTORS +568 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +252 -0
  6. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  7. data/lib/active_merchant/billing/avs_result.rb +95 -0
  8. data/lib/active_merchant/billing/base.rb +48 -0
  9. data/lib/active_merchant/billing/check.rb +112 -0
  10. data/lib/active_merchant/billing/compatibility.rb +118 -0
  11. data/lib/active_merchant/billing/credit_card.rb +451 -0
  12. data/lib/active_merchant/billing/credit_card_formatting.rb +24 -0
  13. data/lib/active_merchant/billing/credit_card_methods.rb +512 -0
  14. data/lib/active_merchant/billing/cvv_result.rb +37 -0
  15. data/lib/active_merchant/billing/gateway.rb +332 -0
  16. data/lib/active_merchant/billing/gateways/adyen.rb +774 -0
  17. data/lib/active_merchant/billing/gateways/airwallex.rb +370 -0
  18. data/lib/active_merchant/billing/gateways/alelo.rb +256 -0
  19. data/lib/active_merchant/billing/gateways/allied_wallet.rb +205 -0
  20. data/lib/active_merchant/billing/gateways/authorize_net.rb +1125 -0
  21. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +424 -0
  22. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +977 -0
  23. data/lib/active_merchant/billing/gateways/axcessms.rb +242 -0
  24. data/lib/active_merchant/billing/gateways/balanced.rb +263 -0
  25. data/lib/active_merchant/billing/gateways/bambora_apac.rb +222 -0
  26. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  27. data/lib/active_merchant/billing/gateways/banwire.rb +116 -0
  28. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +397 -0
  29. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +15 -0
  30. data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
  31. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +474 -0
  32. data/lib/active_merchant/billing/gateways/beanstream.rb +238 -0
  33. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +57 -0
  34. data/lib/active_merchant/billing/gateways/blue_pay.rb +549 -0
  35. data/lib/active_merchant/billing/gateways/blue_snap.rb +644 -0
  36. data/lib/active_merchant/billing/gateways/bogus.rb +190 -0
  37. data/lib/active_merchant/billing/gateways/borgun.rb +272 -0
  38. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  39. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +28 -0
  40. data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +113 -0
  41. data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
  42. data/lib/active_merchant/billing/gateways/braintree_blue.rb +952 -0
  43. data/lib/active_merchant/billing/gateways/braintree_orange.rb +19 -0
  44. data/lib/active_merchant/billing/gateways/bridge_pay.rb +244 -0
  45. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  46. data/lib/active_merchant/billing/gateways/card_connect.rb +338 -0
  47. data/lib/active_merchant/billing/gateways/card_save.rb +21 -0
  48. data/lib/active_merchant/billing/gateways/card_stream.rb +394 -0
  49. data/lib/active_merchant/billing/gateways/cardknox.rb +327 -0
  50. data/lib/active_merchant/billing/gateways/cardprocess.rb +256 -0
  51. data/lib/active_merchant/billing/gateways/cashnet.rb +235 -0
  52. data/lib/active_merchant/billing/gateways/cc5.rb +198 -0
  53. data/lib/active_merchant/billing/gateways/cecabank.rb +249 -0
  54. data/lib/active_merchant/billing/gateways/cenpos.rb +328 -0
  55. data/lib/active_merchant/billing/gateways/checkout.rb +212 -0
  56. data/lib/active_merchant/billing/gateways/checkout_v2.rb +587 -0
  57. data/lib/active_merchant/billing/gateways/citrus_pay.rb +21 -0
  58. data/lib/active_merchant/billing/gateways/clearhaus.rb +219 -0
  59. data/lib/active_merchant/billing/gateways/commerce_hub.rb +366 -0
  60. data/lib/active_merchant/billing/gateways/commercegate.rb +142 -0
  61. data/lib/active_merchant/billing/gateways/conekta.rb +230 -0
  62. data/lib/active_merchant/billing/gateways/creditcall.rb +272 -0
  63. data/lib/active_merchant/billing/gateways/credorax.rb +526 -0
  64. data/lib/active_merchant/billing/gateways/ct_payment.rb +269 -0
  65. data/lib/active_merchant/billing/gateways/culqi.rb +279 -0
  66. data/lib/active_merchant/billing/gateways/cyber_source/cyber_source_common.rb +36 -0
  67. data/lib/active_merchant/billing/gateways/cyber_source.rb +1148 -0
  68. data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +454 -0
  69. data/lib/active_merchant/billing/gateways/d_local.rb +343 -0
  70. data/lib/active_merchant/billing/gateways/data_cash.rb +302 -0
  71. data/lib/active_merchant/billing/gateways/decidir.rb +358 -0
  72. data/lib/active_merchant/billing/gateways/decidir_plus.rb +344 -0
  73. data/lib/active_merchant/billing/gateways/dibs.rb +199 -0
  74. data/lib/active_merchant/billing/gateways/digitzs.rb +295 -0
  75. data/lib/active_merchant/billing/gateways/ebanx.rb +346 -0
  76. data/lib/active_merchant/billing/gateways/efsnet.rb +215 -0
  77. data/lib/active_merchant/billing/gateways/elavon.rb +475 -0
  78. data/lib/active_merchant/billing/gateways/element.rb +406 -0
  79. data/lib/active_merchant/billing/gateways/epay.rb +296 -0
  80. data/lib/active_merchant/billing/gateways/evo_ca.rb +307 -0
  81. data/lib/active_merchant/billing/gateways/eway.rb +226 -0
  82. data/lib/active_merchant/billing/gateways/eway_managed.rb +289 -0
  83. data/lib/active_merchant/billing/gateways/eway_rapid.rb +578 -0
  84. data/lib/active_merchant/billing/gateways/exact.rb +219 -0
  85. data/lib/active_merchant/billing/gateways/ezic.rb +195 -0
  86. data/lib/active_merchant/billing/gateways/fat_zebra.rb +223 -0
  87. data/lib/active_merchant/billing/gateways/federated_canada.rb +158 -0
  88. data/lib/active_merchant/billing/gateways/finansbank.rb +22 -0
  89. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  90. data/lib/active_merchant/billing/gateways/first_pay.rb +182 -0
  91. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +452 -0
  92. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +505 -0
  93. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  94. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  95. data/lib/active_merchant/billing/gateways/fluidpay.rb +275 -0
  96. data/lib/active_merchant/billing/gateways/forte.rb +286 -0
  97. data/lib/active_merchant/billing/gateways/garanti.rb +256 -0
  98. data/lib/active_merchant/billing/gateways/global_collect.rb +580 -0
  99. data/lib/active_merchant/billing/gateways/global_transport.rb +193 -0
  100. data/lib/active_merchant/billing/gateways/hdfc.rb +205 -0
  101. data/lib/active_merchant/billing/gateways/hps.rb +472 -0
  102. data/lib/active_merchant/billing/gateways/iats_payments.rb +312 -0
  103. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  104. data/lib/active_merchant/billing/gateways/inspire.rb +213 -0
  105. data/lib/active_merchant/billing/gateways/instapay.rb +159 -0
  106. data/lib/active_merchant/billing/gateways/ipg.rb +420 -0
  107. data/lib/active_merchant/billing/gateways/ipp.rb +176 -0
  108. data/lib/active_merchant/billing/gateways/iridium.rb +467 -0
  109. data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
  110. data/lib/active_merchant/billing/gateways/iveri.rb +290 -0
  111. data/lib/active_merchant/billing/gateways/ixopay.rb +320 -0
  112. data/lib/active_merchant/billing/gateways/jetpay.rb +395 -0
  113. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +432 -0
  114. data/lib/active_merchant/billing/gateways/klarna.rb +317 -0
  115. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  116. data/lib/active_merchant/billing/gateways/kushki.rb +297 -0
  117. data/lib/active_merchant/billing/gateways/latitude19.rb +412 -0
  118. data/lib/active_merchant/billing/gateways/linkpoint.rb +448 -0
  119. data/lib/active_merchant/billing/gateways/litle.rb +643 -0
  120. data/lib/active_merchant/billing/gateways/mastercard.rb +286 -0
  121. data/lib/active_merchant/billing/gateways/maxipago.rb +220 -0
  122. data/lib/active_merchant/billing/gateways/mercado_pago.rb +348 -0
  123. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +228 -0
  124. data/lib/active_merchant/billing/gateways/merchant_one.rb +110 -0
  125. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  126. data/lib/active_merchant/billing/gateways/merchant_ware.rb +313 -0
  127. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +284 -0
  128. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +248 -0
  129. data/lib/active_merchant/billing/gateways/mercury.rb +352 -0
  130. data/lib/active_merchant/billing/gateways/metrics_global.rb +293 -0
  131. data/lib/active_merchant/billing/gateways/micropayment.rb +182 -0
  132. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
  133. data/lib/active_merchant/billing/gateways/migs.rb +329 -0
  134. data/lib/active_merchant/billing/gateways/mit.rb +260 -0
  135. data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
  136. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +215 -0
  137. data/lib/active_merchant/billing/gateways/moka.rb +290 -0
  138. data/lib/active_merchant/billing/gateways/monei.rb +424 -0
  139. data/lib/active_merchant/billing/gateways/moneris.rb +488 -0
  140. data/lib/active_merchant/billing/gateways/money_movers.rb +150 -0
  141. data/lib/active_merchant/billing/gateways/mundipagg.rb +366 -0
  142. data/lib/active_merchant/billing/gateways/nab_transact.rb +299 -0
  143. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +163 -0
  144. data/lib/active_merchant/billing/gateways/net_registry.rb +198 -0
  145. data/lib/active_merchant/billing/gateways/netaxept.rb +180 -0
  146. data/lib/active_merchant/billing/gateways/netbanx.rb +376 -0
  147. data/lib/active_merchant/billing/gateways/netbilling.rb +229 -0
  148. data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
  149. data/lib/active_merchant/billing/gateways/network_merchants.rb +238 -0
  150. data/lib/active_merchant/billing/gateways/nmi.rb +396 -0
  151. data/lib/active_merchant/billing/gateways/ogone.rb +509 -0
  152. data/lib/active_merchant/billing/gateways/omise.rb +323 -0
  153. data/lib/active_merchant/billing/gateways/openpay.rb +246 -0
  154. data/lib/active_merchant/billing/gateways/opp.rb +394 -0
  155. data/lib/active_merchant/billing/gateways/optimal_payment.rb +331 -0
  156. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +45 -0
  157. data/lib/active_merchant/billing/gateways/orbital.rb +1267 -0
  158. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +206 -0
  159. data/lib/active_merchant/billing/gateways/pagarme.rb +239 -0
  160. data/lib/active_merchant/billing/gateways/pago_facil.rb +120 -0
  161. data/lib/active_merchant/billing/gateways/pay_arc.rb +392 -0
  162. data/lib/active_merchant/billing/gateways/pay_conex.rb +245 -0
  163. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +277 -0
  164. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  165. data/lib/active_merchant/billing/gateways/pay_junction.rb +390 -0
  166. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +206 -0
  167. data/lib/active_merchant/billing/gateways/pay_secure.rb +110 -0
  168. data/lib/active_merchant/billing/gateways/pay_trace.rb +450 -0
  169. data/lib/active_merchant/billing/gateways/paybox_direct.rb +224 -0
  170. data/lib/active_merchant/billing/gateways/payeezy.rb +513 -0
  171. data/lib/active_merchant/billing/gateways/payex.rb +409 -0
  172. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +235 -0
  173. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +42 -0
  174. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  175. data/lib/active_merchant/billing/gateways/payflow.rb +473 -0
  176. data/lib/active_merchant/billing/gateways/payflow_express.rb +220 -0
  177. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +14 -0
  178. data/lib/active_merchant/billing/gateways/payflow_uk.rb +20 -0
  179. data/lib/active_merchant/billing/gateways/payment_express.rb +373 -0
  180. data/lib/active_merchant/billing/gateways/paymentez.rb +365 -0
  181. data/lib/active_merchant/billing/gateways/paymill.rb +369 -0
  182. data/lib/active_merchant/billing/gateways/paynetworx.rb +228 -0
  183. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +718 -0
  184. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +69 -0
  185. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +262 -0
  186. data/lib/active_merchant/billing/gateways/paypal.rb +136 -0
  187. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  188. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +44 -0
  189. data/lib/active_merchant/billing/gateways/paypal_express.rb +272 -0
  190. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
  191. data/lib/active_merchant/billing/gateways/paypal_standard.rb +281 -0
  192. data/lib/active_merchant/billing/gateways/paysafe.rb +420 -0
  193. data/lib/active_merchant/billing/gateways/payscout.rb +159 -0
  194. data/lib/active_merchant/billing/gateways/paystation.rb +204 -0
  195. data/lib/active_merchant/billing/gateways/payu_in.rb +249 -0
  196. data/lib/active_merchant/billing/gateways/payu_latam.rb +482 -0
  197. data/lib/active_merchant/billing/gateways/payway.rb +207 -0
  198. data/lib/active_merchant/billing/gateways/payway_dot_com.rb +253 -0
  199. data/lib/active_merchant/billing/gateways/pin.rb +273 -0
  200. data/lib/active_merchant/billing/gateways/pixxels.rb +263 -0
  201. data/lib/active_merchant/billing/gateways/plexo.rb +308 -0
  202. data/lib/active_merchant/billing/gateways/plugnpay.rb +283 -0
  203. data/lib/active_merchant/billing/gateways/priority.rb +392 -0
  204. data/lib/active_merchant/billing/gateways/pro_pay.rb +325 -0
  205. data/lib/active_merchant/billing/gateways/psigate.rb +227 -0
  206. data/lib/active_merchant/billing/gateways/psl_card.rb +295 -0
  207. data/lib/active_merchant/billing/gateways/qbms.rb +302 -0
  208. data/lib/active_merchant/billing/gateways/quantum.rb +274 -0
  209. data/lib/active_merchant/billing/gateways/quickbooks.rb +377 -0
  210. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +184 -0
  211. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +297 -0
  212. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +226 -0
  213. data/lib/active_merchant/billing/gateways/quickpay.rb +24 -0
  214. data/lib/active_merchant/billing/gateways/qvalent.rb +305 -0
  215. data/lib/active_merchant/billing/gateways/rapyd.rb +319 -0
  216. data/lib/active_merchant/billing/gateways/reach.rb +277 -0
  217. data/lib/active_merchant/billing/gateways/realex.rb +400 -0
  218. data/lib/active_merchant/billing/gateways/redsys.rb +723 -0
  219. data/lib/active_merchant/billing/gateways/s5.rb +247 -0
  220. data/lib/active_merchant/billing/gateways/safe_charge.rb +298 -0
  221. data/lib/active_merchant/billing/gateways/sage.rb +446 -0
  222. data/lib/active_merchant/billing/gateways/sage_pay.rb +434 -0
  223. data/lib/active_merchant/billing/gateways/sallie_mae.rb +141 -0
  224. data/lib/active_merchant/billing/gateways/secure_net.rb +260 -0
  225. data/lib/active_merchant/billing/gateways/secure_pay.rb +191 -0
  226. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +290 -0
  227. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +103 -0
  228. data/lib/active_merchant/billing/gateways/securion_pay.rb +305 -0
  229. data/lib/active_merchant/billing/gateways/shift4.rb +345 -0
  230. data/lib/active_merchant/billing/gateways/simetrik.rb +368 -0
  231. data/lib/active_merchant/billing/gateways/skip_jack.rb +450 -0
  232. data/lib/active_merchant/billing/gateways/smart_ps.rb +274 -0
  233. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  234. data/lib/active_merchant/billing/gateways/spreedly_core.rb +354 -0
  235. data/lib/active_merchant/billing/gateways/stripe.rb +866 -0
  236. data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +602 -0
  237. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +151 -0
  238. data/lib/active_merchant/billing/gateways/telr.rb +273 -0
  239. data/lib/active_merchant/billing/gateways/tns.rb +23 -0
  240. data/lib/active_merchant/billing/gateways/trans_first.rb +240 -0
  241. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +612 -0
  242. data/lib/active_merchant/billing/gateways/transact_pro.rb +222 -0
  243. data/lib/active_merchant/billing/gateways/transax.rb +21 -0
  244. data/lib/active_merchant/billing/gateways/transnational.rb +9 -0
  245. data/lib/active_merchant/billing/gateways/trexle.rb +221 -0
  246. data/lib/active_merchant/billing/gateways/trust_commerce.rb +500 -0
  247. data/lib/active_merchant/billing/gateways/usa_epay.rb +24 -0
  248. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1612 -0
  249. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +367 -0
  250. data/lib/active_merchant/billing/gateways/vanco.rb +303 -0
  251. data/lib/active_merchant/billing/gateways/verifi.rb +224 -0
  252. data/lib/active_merchant/billing/gateways/viaklix.rb +171 -0
  253. data/lib/active_merchant/billing/gateways/visanet_peru.rb +250 -0
  254. data/lib/active_merchant/billing/gateways/vpos.rb +223 -0
  255. data/lib/active_merchant/billing/gateways/webpay.rb +97 -0
  256. data/lib/active_merchant/billing/gateways/wepay.rb +235 -0
  257. data/lib/active_merchant/billing/gateways/wirecard.rb +430 -0
  258. data/lib/active_merchant/billing/gateways/wompi.rb +197 -0
  259. data/lib/active_merchant/billing/gateways/world_net.rb +345 -0
  260. data/lib/active_merchant/billing/gateways/worldpay.rb +1050 -0
  261. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +208 -0
  262. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  263. data/lib/active_merchant/billing/gateways.rb +14 -0
  264. data/lib/active_merchant/billing/model.rb +30 -0
  265. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  266. data/lib/active_merchant/billing/payment_token.rb +21 -0
  267. data/lib/active_merchant/billing/rails.rb +3 -0
  268. data/lib/active_merchant/billing/response.rb +121 -0
  269. data/lib/active_merchant/billing/three_d_secure_eci_mapper.rb +27 -0
  270. data/lib/active_merchant/billing.rb +16 -0
  271. data/lib/active_merchant/connection.rb +194 -0
  272. data/lib/active_merchant/country.rb +338 -0
  273. data/lib/active_merchant/empty.rb +20 -0
  274. data/lib/active_merchant/errors.rb +38 -0
  275. data/lib/active_merchant/net_http_ssl_connection.rb +11 -0
  276. data/lib/active_merchant/network_connection_retries.rb +78 -0
  277. data/lib/active_merchant/post_data.rb +26 -0
  278. data/lib/active_merchant/posts_data.rb +92 -0
  279. data/lib/active_merchant/version.rb +3 -0
  280. data/lib/active_merchant.rb +63 -0
  281. data/lib/activemerchant.rb +1 -0
  282. data/lib/certs/cacert.pem +3214 -0
  283. data/lib/support/gateway_support.rb +69 -0
  284. data/lib/support/outbound_hosts.rb +28 -0
  285. data/lib/support/ssl_verify.rb +88 -0
  286. data/lib/support/ssl_version.rb +86 -0
  287. metadata +506 -0
@@ -0,0 +1,488 @@
1
+ require 'rexml/document'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ # To learn more about the Moneris gateway, please contact
6
+ # eselectplus@moneris.com for a copy of their integration guide. For
7
+ # information on remote testing, please see "Test Environment Penny Value
8
+ # Response Table", and "Test Environment eFraud (AVS and CVD) Penny
9
+ # Response Values", available at Moneris' {eSelect Plus Documentation
10
+ # Centre}[https://www3.moneris.com/connect/en/documents/index.html].
11
+ class MonerisGateway < Gateway
12
+ WALLETS = %w(APP GPP)
13
+
14
+ self.test_url = 'https://esqa.moneris.com/gateway2/servlet/MpgRequest'
15
+ self.live_url = 'https://www3.moneris.com/gateway2/servlet/MpgRequest'
16
+
17
+ self.supported_countries = ['CA']
18
+ self.supported_cardtypes = %i[visa master american_express diners_club discover]
19
+ self.homepage_url = 'http://www.moneris.com/'
20
+ self.display_name = 'Moneris'
21
+
22
+ # Initialize the Gateway
23
+ #
24
+ # The gateway requires that a valid login and password be passed
25
+ # in the +options+ hash.
26
+ #
27
+ # ==== Options
28
+ #
29
+ # * <tt>:login</tt> -- Your Store ID
30
+ # * <tt>:password</tt> -- Your API Token
31
+ # * <tt>:cvv_enabled</tt> -- Specify that you would like the CVV passed to the gateway.
32
+ # Only particular account types at Moneris will allow this.
33
+ # Defaults to false. (optional)
34
+ def initialize(options = {})
35
+ requires!(options, :login, :password)
36
+ @cvv_enabled = options[:cvv_enabled]
37
+ @avs_enabled = options[:avs_enabled]
38
+ options[:crypt_type] = 7 unless options.has_key?(:crypt_type)
39
+ super
40
+ end
41
+
42
+ # Referred to as "PreAuth" in the Moneris integration guide, this action
43
+ # verifies and locks funds on a customer's card, which then must be
44
+ # captured at a later date.
45
+ #
46
+ # Pass in +order_id+ and optionally a +customer+ parameter.
47
+ def authorize(money, creditcard_or_datakey, options = {})
48
+ requires!(options, :order_id)
49
+ post = {}
50
+ add_payment_source(post, creditcard_or_datakey, options)
51
+ post[:amount] = amount(money)
52
+ post[:order_id] = format_order_id(post[:wallet_indicator], options[:order_id])
53
+ post[:address] = options[:billing_address] || options[:address]
54
+ post[:crypt_type] = options[:crypt_type] || @options[:crypt_type]
55
+ add_external_mpi_fields(post, options)
56
+ add_stored_credential(post, options)
57
+ action = if post[:cavv] || options[:three_d_secure]
58
+ 'cavv_preauth'
59
+ elsif post[:data_key].blank?
60
+ 'preauth'
61
+ else
62
+ 'res_preauth_cc'
63
+ end
64
+ commit(action, post, options)
65
+ end
66
+
67
+ # This action verifies funding on a customer's card and readies them for
68
+ # deposit in a merchant's account.
69
+ #
70
+ # Pass in <tt>order_id</tt> and optionally a <tt>customer</tt> parameter
71
+ def purchase(money, creditcard_or_datakey, options = {})
72
+ requires!(options, :order_id)
73
+ post = {}
74
+ add_payment_source(post, creditcard_or_datakey, options)
75
+ post[:amount] = amount(money)
76
+ post[:order_id] = format_order_id(post[:wallet_indicator], options[:order_id])
77
+ post[:address] = options[:billing_address] || options[:address]
78
+ post[:crypt_type] = options[:crypt_type] || @options[:crypt_type]
79
+ add_external_mpi_fields(post, options)
80
+ add_stored_credential(post, options)
81
+ action = if post[:cavv] || options[:three_d_secure]
82
+ 'cavv_purchase'
83
+ elsif post[:data_key].blank?
84
+ 'purchase'
85
+ else
86
+ 'res_purchase_cc'
87
+ end
88
+ commit(action, post, options)
89
+ end
90
+
91
+ # This method retrieves locked funds from a customer's account (from a
92
+ # PreAuth) and prepares them for deposit in a merchant's account.
93
+ #
94
+ # Note: Moneris requires both the order_id and the transaction number of
95
+ # the original authorization. To maintain the same interface as the other
96
+ # gateways the two numbers are concatenated together with a ; separator as
97
+ # the authorization number returned by authorization
98
+ def capture(money, authorization, options = {})
99
+ commit 'completion', crediting_params(authorization, comp_amount: amount(money))
100
+ end
101
+
102
+ # Voiding requires the original transaction ID and order ID of some open
103
+ # transaction. Closed transactions must be refunded.
104
+ #
105
+ # Moneris supports the voiding of an unsettled capture or purchase via
106
+ # its <tt>purchasecorrection</tt> command. This action can only occur
107
+ # on the same day as the capture/purchase prior to 22:00-23:00 EST. If
108
+ # you want to do this, pass <tt>:purchasecorrection => true</tt> as
109
+ # an option.
110
+ #
111
+ # Fun, Historical Trivia:
112
+ # Voiding an authorization in Moneris is a relatively new feature
113
+ # (September, 2011). It is actually done by doing a $0 capture.
114
+ #
115
+ # Concatenate your transaction number and order_id by using a semicolon
116
+ # (';'). This is to keep the Moneris interface consistent with other
117
+ # gateways. (See +capture+ for details.)
118
+ def void(authorization, options = {})
119
+ if options[:purchasecorrection]
120
+ commit 'purchasecorrection', crediting_params(authorization)
121
+ else
122
+ capture(0, authorization, options)
123
+ end
124
+ end
125
+
126
+ # Performs a refund. This method requires that the original transaction
127
+ # number and order number be included. Concatenate your transaction
128
+ # number and order_id by using a semicolon (';'). This is to keep the
129
+ # Moneris interface consistent with other gateways. (See +capture+ for
130
+ # details.)
131
+ def credit(money, authorization, options = {})
132
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
133
+ refund(money, authorization, options)
134
+ end
135
+
136
+ def refund(money, authorization, options = {})
137
+ commit 'refund', crediting_params(authorization, amount: amount(money))
138
+ end
139
+
140
+ def verify(credit_card, options = {})
141
+ requires!(options, :order_id)
142
+ post = {}
143
+ add_payment_source(post, credit_card, options)
144
+ post[:order_id] = options[:order_id]
145
+ post[:address] = options[:billing_address] || options[:address]
146
+ post[:crypt_type] = options[:crypt_type] || @options[:crypt_type]
147
+ add_stored_credential(post, options)
148
+ action = if post[:data_key].blank?
149
+ 'card_verification'
150
+ else
151
+ 'res_card_verification_cc'
152
+ end
153
+ commit(action, post)
154
+ end
155
+
156
+ # When passing a :duration option (time in seconds) you can create a
157
+ # temporary vault record to avoid incurring Moneris vault storage fees
158
+ #
159
+ # https://developer.moneris.com/Documentation/NA/E-Commerce%20Solutions/API/Vault#vaulttokenadd
160
+ def store(credit_card, options = {})
161
+ post = {}
162
+ post[:pan] = credit_card.number
163
+ post[:expdate] = expdate(credit_card)
164
+ post[:address] = options[:billing_address] || options[:address]
165
+ post[:crypt_type] = options[:crypt_type] || @options[:crypt_type]
166
+ add_stored_credential(post, options)
167
+
168
+ if options[:duration]
169
+ post[:duration] = options[:duration]
170
+ commit('res_temp_add', post)
171
+ else
172
+ commit('res_add_cc', post)
173
+ end
174
+ end
175
+
176
+ def unstore(data_key, options = {})
177
+ post = {}
178
+ post[:data_key] = data_key
179
+ commit('res_delete', post)
180
+ end
181
+
182
+ def update(data_key, credit_card, options = {})
183
+ post = {}
184
+ post[:pan] = credit_card.number
185
+ post[:expdate] = expdate(credit_card)
186
+ post[:data_key] = data_key
187
+ post[:crypt_type] = options[:crypt_type] || @options[:crypt_type]
188
+ commit('res_update_cc', post)
189
+ end
190
+
191
+ def supports_scrubbing?
192
+ true
193
+ end
194
+
195
+ def scrub(transcript)
196
+ transcript.
197
+ gsub(%r((<store_id>).+(</store_id>)), '\1[FILTERED]\2').
198
+ gsub(%r((<api_token>).+(</api_token>)), '\1[FILTERED]\2').
199
+ gsub(%r((<pan>).+(</pan>)), '\1[FILTERED]\2').
200
+ gsub(%r((<cvd_value>).+(</cvd_value>)), '\1[FILTERED]\2').
201
+ gsub(%r((<cavv>).+(</cavv>)), '\1[FILTERED]\2')
202
+ end
203
+
204
+ private # :nodoc: all
205
+
206
+ def expdate(creditcard)
207
+ sprintf('%.4i', creditcard.year)[-2..-1] + sprintf('%.2i', creditcard.month)
208
+ end
209
+
210
+ def add_external_mpi_fields(post, options)
211
+ # See these pages:
212
+ # https://developer.moneris.com/livedemo/3ds2/cavv_purchase/tool/php
213
+ # https://developer.moneris.com/livedemo/3ds2/cavv_preauth/guide/php
214
+ return unless options[:three_d_secure]
215
+
216
+ three_d_secure_options = options[:three_d_secure]
217
+
218
+ post[:threeds_version] = three_d_secure_options[:version]
219
+ post[:crypt_type] = three_d_secure_options[:eci]
220
+ post[:cavv] = three_d_secure_options[:cavv]
221
+ post[:threeds_server_trans_id] = three_d_secure_options[:three_ds_server_trans_id]
222
+ post[:ds_trans_id] = three_d_secure_options[:ds_transaction_id]
223
+ end
224
+
225
+ def add_payment_source(post, payment_method, options)
226
+ if payment_method.is_a?(String)
227
+ post[:data_key] = payment_method
228
+ post[:cust_id] = options[:customer]
229
+ else
230
+ if payment_method.respond_to?(:track_data) && payment_method.track_data.present?
231
+ post[:pos_code] = '00'
232
+ post[:track2] = payment_method.track_data
233
+ else
234
+ post[:pan] = payment_method.number
235
+ post[:expdate] = expdate(payment_method)
236
+ post[:cvd_value] = payment_method.verification_value if payment_method.verification_value?
237
+ post[:cavv] = payment_method.payment_cryptogram if payment_method.is_a?(NetworkTokenizationCreditCard)
238
+ post[:wallet_indicator] = wallet_indicator(payment_method.source.to_s) if payment_method.is_a?(NetworkTokenizationCreditCard)
239
+ post[:crypt_type] = (payment_method.eci || 7) if payment_method.is_a?(NetworkTokenizationCreditCard)
240
+ end
241
+ post[:cust_id] = options[:customer] || payment_method.name
242
+ end
243
+ end
244
+
245
+ def add_cof(post, options)
246
+ post[:issuer_id] = options[:issuer_id] if options[:issuer_id]
247
+ post[:payment_indicator] = options[:payment_indicator] if options[:payment_indicator]
248
+ post[:payment_information] = options[:payment_information] if options[:payment_information]
249
+ end
250
+
251
+ def add_stored_credential(post, options)
252
+ add_cof(post, options)
253
+ # if any of :issuer_id, :payment_information, or :payment_indicator is not passed,
254
+ # then check for :stored credential options
255
+ return unless (stored_credential = options[:stored_credential]) && !cof_details_present?(options)
256
+
257
+ if stored_credential[:initial_transaction]
258
+ add_stored_credential_initial(post, options)
259
+ else
260
+ add_stored_credential_used(post, options)
261
+ end
262
+ end
263
+
264
+ def add_stored_credential_initial(post, options)
265
+ post[:payment_information] ||= '0'
266
+ post[:issuer_id] ||= ''
267
+ if options[:stored_credential][:initiator] == 'merchant'
268
+ case options[:stored_credential][:reason_type]
269
+ when 'recurring', 'installment'
270
+ post[:payment_indicator] ||= 'R'
271
+ when 'unscheduled'
272
+ post[:payment_indicator] ||= 'C'
273
+ end
274
+ else
275
+ post[:payment_indicator] ||= 'C'
276
+ end
277
+ end
278
+
279
+ def add_stored_credential_used(post, options)
280
+ post[:payment_information] ||= '2'
281
+ post[:issuer_id] = options[:stored_credential][:network_transaction_id] if options[:issuer_id].blank?
282
+ if options[:stored_credential][:initiator] == 'merchant'
283
+ case options[:stored_credential][:reason_type]
284
+ when 'recurring', 'installment'
285
+ post[:payment_indicator] ||= 'R'
286
+ when '', 'unscheduled'
287
+ post[:payment_indicator] ||= 'U'
288
+ end
289
+ else
290
+ post[:payment_indicator] ||= 'Z'
291
+ end
292
+ end
293
+
294
+ # Common params used amongst the +credit+, +void+ and +capture+ methods
295
+ def crediting_params(authorization, options = {})
296
+ {
297
+ txn_number: split_authorization(authorization).first,
298
+ order_id: split_authorization(authorization).last,
299
+ crypt_type: options[:crypt_type] || @options[:crypt_type]
300
+ }.merge(options)
301
+ end
302
+
303
+ # Splits an +authorization+ param and retrieves the order id and
304
+ # transaction number in that order.
305
+ def split_authorization(authorization)
306
+ if authorization.nil? || authorization.empty? || authorization !~ /;/
307
+ raise ArgumentError, 'You must include a valid authorization code (e.g. "1234;567")'
308
+ else
309
+ authorization.split(';')
310
+ end
311
+ end
312
+
313
+ def commit(action, parameters = {}, options = {})
314
+ threed_ds_transaction = options[:three_d_secure].present?
315
+
316
+ data = post_data(action, parameters)
317
+ url = test? ? self.test_url : self.live_url
318
+ raw = ssl_post(url, data)
319
+ response = parse(raw)
320
+
321
+ Response.new(
322
+ successful?(action, response, threed_ds_transaction),
323
+ message_from(response[:message]),
324
+ response,
325
+ test: test?,
326
+ avs_result: { code: response[:avs_result_code] },
327
+ cvv_result: response[:cvd_result_code] && response[:cvd_result_code][-1, 1],
328
+ authorization: authorization_from(response)
329
+ )
330
+ end
331
+
332
+ # Generates a Moneris authorization string of the form 'trans_id;receipt_id'.
333
+ def authorization_from(response = {})
334
+ "#{response[:trans_id]};#{response[:receipt_id]}" if response[:trans_id] && response[:receipt_id]
335
+ end
336
+
337
+ # Tests for a successful response from Moneris' servers
338
+ def successful?(action, response, threed_ds_transaction = false)
339
+ # See 9.4 CAVV Result Codes in https://developer.moneris.com/livedemo/3ds2/reference/guide/php
340
+ cavv_accepted = if threed_ds_transaction
341
+ response[:cavv_result_code] && response[:cavv_result_code] == '2'
342
+ else
343
+ true
344
+ end
345
+
346
+ cavv_accepted &&
347
+ response[:response_code] &&
348
+ response[:complete] &&
349
+ (0..49).cover?(response[:response_code].to_i)
350
+ end
351
+
352
+ def parse(xml)
353
+ response = { message: 'Global Error Receipt', complete: false }
354
+ hashify_xml!(xml, response)
355
+ response
356
+ end
357
+
358
+ def hashify_xml!(xml, response)
359
+ xml = REXML::Document.new(xml)
360
+ return if xml.root.nil?
361
+
362
+ xml.elements.each('//receipt/*') do |node|
363
+ response[node.name.underscore.to_sym] = normalize(node.text)
364
+ end
365
+ end
366
+
367
+ def post_data(action, parameters = {})
368
+ xml = REXML::Document.new
369
+ root = xml.add_element('request')
370
+ root.add_element('store_id').text = options[:login]
371
+ root.add_element('api_token').text = options[:password]
372
+ root.add_element(transaction_element(action, parameters))
373
+
374
+ xml.to_s
375
+ end
376
+
377
+ def transaction_element(action, parameters)
378
+ transaction = REXML::Element.new(action)
379
+
380
+ # Must add the elements in the correct order
381
+ actions[action].each do |key|
382
+ case key
383
+ when :avs_info
384
+ transaction.add_element(avs_element(parameters[:address])) if @avs_enabled && parameters[:address]
385
+ when :cvd_info
386
+ transaction.add_element(cvd_element(parameters[:cvd_value])) if @cvv_enabled
387
+ when :cof_info
388
+ transaction.add_element(credential_on_file(parameters)) if cof_details_present?(parameters)
389
+ else
390
+ transaction.add_element(key.to_s).text = parameters[key] unless parameters[key].blank?
391
+ end
392
+ end
393
+
394
+ transaction
395
+ end
396
+
397
+ def avs_element(address)
398
+ full_address = "#{address[:address1]} #{address[:address2]}"
399
+ tokens = full_address.split(/\s+/)
400
+
401
+ element = REXML::Element.new('avs_info')
402
+ element.add_element('avs_street_number').text = tokens.select { |x| x =~ /\d/ }.join(' ')
403
+ element.add_element('avs_street_name').text = tokens.reject { |x| x =~ /\d/ }.join(' ')
404
+ element.add_element('avs_zipcode').text = address[:zip]
405
+ element
406
+ end
407
+
408
+ def cvd_element(cvd_value)
409
+ element = REXML::Element.new('cvd_info')
410
+ if cvd_value
411
+ element.add_element('cvd_indicator').text = '1'
412
+ element.add_element('cvd_value').text = cvd_value
413
+ else
414
+ element.add_element('cvd_indicator').text = '0'
415
+ end
416
+ element
417
+ end
418
+
419
+ def cof_details_present?(parameters)
420
+ parameters[:issuer_id] && parameters[:payment_indicator] && parameters[:payment_information]
421
+ end
422
+
423
+ def credential_on_file(parameters)
424
+ issuer_id = parameters[:issuer_id]
425
+ payment_indicator = parameters[:payment_indicator]
426
+ payment_information = parameters[:payment_information]
427
+
428
+ cof_info = REXML::Element.new('cof_info')
429
+ cof_info.add_element('issuer_id').text = issuer_id
430
+ cof_info.add_element('payment_indicator').text = payment_indicator
431
+ cof_info.add_element('payment_information').text = payment_information
432
+ cof_info
433
+ end
434
+
435
+ def wallet_indicator(token_source)
436
+ return {
437
+ 'apple_pay' => 'APP',
438
+ 'google_pay' => 'GPP',
439
+ 'android_pay' => 'ANP'
440
+ }[token_source]
441
+ end
442
+
443
+ def format_order_id(wallet_indicator_code, order_id = nil)
444
+ # Truncate (max 100 characters) order id for
445
+ # google pay and apple pay (specific wallets / token sources)
446
+ return truncate_order_id(order_id) if WALLETS.include?(wallet_indicator_code)
447
+
448
+ order_id
449
+ end
450
+
451
+ def truncate_order_id(order_id = nil)
452
+ order_id.present? ? order_id[0, 100] : SecureRandom.alphanumeric(100)
453
+ end
454
+
455
+ def message_from(message)
456
+ return 'Unspecified error' if message.blank?
457
+
458
+ message.gsub(/[^\w]/, ' ').split.join(' ').capitalize
459
+ end
460
+
461
+ def actions
462
+ {
463
+ 'purchase' => %i[order_id cust_id amount pan expdate crypt_type avs_info cvd_info track2 pos_code cof_info],
464
+ 'preauth' => %i[order_id cust_id amount pan expdate crypt_type avs_info cvd_info track2 pos_code cof_info],
465
+ 'command' => [:order_id],
466
+ 'refund' => %i[order_id amount txn_number crypt_type],
467
+ 'indrefund' => %i[order_id cust_id amount pan expdate crypt_type],
468
+ 'completion' => %i[order_id comp_amount txn_number crypt_type],
469
+ 'purchasecorrection' => %i[order_id txn_number crypt_type],
470
+ 'cavv_preauth' => %i[order_id cust_id amount pan expdate cavv crypt_type wallet_indicator],
471
+ 'cavv_purchase' => %i[order_id cust_id amount pan expdate cavv crypt_type wallet_indicator],
472
+ 'card_verification' => %i[order_id cust_id pan expdate crypt_type avs_info cvd_info cof_info],
473
+ 'transact' => %i[order_id cust_id amount pan expdate crypt_type],
474
+ 'Batchcloseall' => [],
475
+ 'opentotals' => [:ecr_number],
476
+ 'batchclose' => [:ecr_number],
477
+ 'res_add_cc' => %i[pan expdate crypt_type avs_info cof_info],
478
+ 'res_temp_add' => %i[pan expdate crypt_type duration],
479
+ 'res_delete' => [:data_key],
480
+ 'res_update_cc' => %i[data_key pan expdate crypt_type avs_info cof_info],
481
+ 'res_purchase_cc' => %i[data_key order_id cust_id amount crypt_type cof_info],
482
+ 'res_preauth_cc' => %i[data_key order_id cust_id amount crypt_type cof_info],
483
+ 'res_card_verification_cc' => %i[order_id data_key expdate crypt_type cof_info]
484
+ }
485
+ end
486
+ end
487
+ end
488
+ end
@@ -0,0 +1,150 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class MoneyMoversGateway < Gateway
4
+ self.live_url = self.test_url = 'https://secure.mmoagateway.com/api/transact.php'
5
+
6
+ APPROVED, DECLINED, ERROR = 1, 2, 3
7
+
8
+ self.homepage_url = 'http://mmoa.us/'
9
+ self.display_name = 'MoneyMovers'
10
+ self.supported_countries = ['US']
11
+ self.supported_cardtypes = %i[visa master american_express discover]
12
+
13
+ def initialize(options = {})
14
+ requires!(options, :login, :password)
15
+ @options = options
16
+ super
17
+ end
18
+
19
+ def purchase(money, creditcard, options = {})
20
+ post = {}
21
+ add_invoice(post, options)
22
+ add_creditcard(post, creditcard)
23
+ add_address(post, options)
24
+ add_customer_data(post, options)
25
+ commit('sale', money, post)
26
+ end
27
+
28
+ def authorize(money, creditcard, options = {})
29
+ post = {}
30
+ add_invoice(post, options)
31
+ add_creditcard(post, creditcard)
32
+ add_address(post, options)
33
+ add_customer_data(post, options)
34
+ commit('auth', money, post)
35
+ end
36
+
37
+ def capture(money, authorization, options = {})
38
+ options[:transactionid] = authorization
39
+ commit('capture', money, options)
40
+ end
41
+
42
+ def void(authorization, options = {})
43
+ options[:transactionid] = authorization
44
+ commit('void', nil, options)
45
+ end
46
+
47
+ def refund(money, authorization, options = {})
48
+ commit('refund', money, options.merge(transactionid: authorization))
49
+ end
50
+
51
+ def credit(money, authorization, options = {})
52
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
53
+ refund(money, authorization, options)
54
+ end
55
+
56
+ private
57
+
58
+ def add_customer_data(post, options)
59
+ post[:firstname] = options[:first_name]
60
+ post[:lastname] = options[:last_name]
61
+
62
+ post[:email] = options[:email]
63
+ end
64
+
65
+ def add_address(post, options)
66
+ if address = (options[:billing_address] || options[:address])
67
+ post[:company] = address[:company]
68
+ post[:address1] = address[:address1]
69
+ post[:address2] = address[:address2]
70
+ post[:city] = address[:city]
71
+ post[:state] = address[:state]
72
+ post[:zip] = address[:zip]
73
+ post[:country] = address[:country]
74
+ post[:phone] = address[:phone]
75
+ end
76
+ if address = options[:shipping_address]
77
+ post[:shipping_firstname] = address[:first_name]
78
+ post[:shipping_lastname] = address[:last_name]
79
+ post[:shipping_company] = address[:company]
80
+ post[:shipping_address1] = address[:address1]
81
+ post[:shipping_address2] = address[:address2]
82
+ post[:shipping_city] = address[:city]
83
+ post[:shipping_state] = address[:state]
84
+ post[:shipping_zip] = address[:zip]
85
+ post[:shipping_country] = address[:country]
86
+ post[:shipping_email] = address[:email]
87
+ end
88
+ end
89
+
90
+ def add_invoice(post, options)
91
+ post[:orderid] = options[:order_id]
92
+ post[:orderdescription] = options[:description]
93
+ end
94
+
95
+ def add_creditcard(post, creditcard)
96
+ post[:ccnumber] = creditcard.number
97
+ post[:ccexp] = expdate(creditcard)
98
+ post[:cvv] = creditcard.verification_value
99
+ end
100
+
101
+ def parse(body)
102
+ body.split('&').inject({}) do |memo, x|
103
+ k, v = x.split('=')
104
+ memo[k] = v
105
+ memo
106
+ end
107
+ end
108
+
109
+ def commit(action, money, parameters)
110
+ parameters[:amount] = amount(money)
111
+
112
+ data = ssl_post(self.live_url, post_data(action, parameters))
113
+ response = parse(data)
114
+ message = message_from(response)
115
+
116
+ Response.new(success?(response), message, response,
117
+ test: test?,
118
+ authorization: response['transactionid'],
119
+ avs_result: { code: response['avsresponse'] },
120
+ cvv_result: response['cvvresponse'])
121
+ end
122
+
123
+ def success?(response)
124
+ response['response'] == '1'
125
+ end
126
+
127
+ def test?
128
+ @options[:login].eql?('demo') && @options[:password].eql?('password')
129
+ end
130
+
131
+ def message_from(response)
132
+ case response['response'].to_i
133
+ when APPROVED
134
+ 'Transaction Approved'
135
+ when DECLINED
136
+ 'Transaction Declined'
137
+ else
138
+ 'Error in transaction data or system error'
139
+ end
140
+ end
141
+
142
+ def post_data(action, parameters = {})
143
+ parameters[:type] = action
144
+ parameters[:username] = @options[:login]
145
+ parameters[:password] = @options[:password]
146
+ parameters.map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')
147
+ end
148
+ end
149
+ end
150
+ end