swiss-activemerchant 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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 +249 -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 +243 -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 +227 -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 +312 -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 +120 -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,235 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class CashnetGateway < Gateway
4
+ include Empty
5
+
6
+ self.live_url = 'https://commerce.cashnet.com/'
7
+ self.test_url = 'https://train.cashnet.com/'
8
+
9
+ self.supported_countries = ['US']
10
+ self.supported_cardtypes = %i[visa master american_express discover diners_club jcb]
11
+ self.homepage_url = 'https://transactcampus.com'
12
+ self.display_name = 'Cashnet'
13
+ self.money_format = :dollars
14
+ self.max_retries = 0
15
+
16
+ # Creates a new CashnetGateway
17
+ #
18
+ # ==== Options
19
+ #
20
+ # * <tt>:merchant</tt> -- Gateway Merchant (REQUIRED)
21
+ # * <tt>:operator</tt> -- Operator (REQUIRED)
22
+ # * <tt>:password</tt> -- Password (REQUIRED)
23
+ # * <tt>:merchant_gateway_name</tt> -- Site name (REQUIRED)
24
+ # * <tt>:station</tt> -- Station (defaults to "WEB")
25
+ # * <tt>:custcode</tt> -- Customer code (defaults to
26
+ # "ActiveMerchant/#{ActiveMerchant::VERSION}")
27
+ # * <tt>:default_item_code</tt> -- Default item code (defaults to "FEE",
28
+ # can be overridden on a per-transaction basis with options[:item_code])
29
+ def initialize(options = {})
30
+ requires!(
31
+ options,
32
+ :merchant,
33
+ :operator,
34
+ :password,
35
+ :merchant_gateway_name
36
+ )
37
+ options[:default_item_code] ||= 'FEE'
38
+ super
39
+ end
40
+
41
+ def purchase(money, payment_object, options = {})
42
+ post = {}
43
+ add_creditcard(post, payment_object)
44
+ add_invoice(post, money, options)
45
+ add_address(post, options)
46
+ add_customer_data(post, options)
47
+ commit('SALE', money, post)
48
+ end
49
+
50
+ def refund(money, identification, options = {})
51
+ post = {}
52
+ post[:origtx] = identification
53
+ add_invoice(post, money, options)
54
+ add_customer_data(post, options)
55
+ commit('REFUND', money, post)
56
+ end
57
+
58
+ def supports_scrubbing?
59
+ true
60
+ end
61
+
62
+ def scrub(transcript)
63
+ transcript.
64
+ gsub(%r{(password=)[^&]+}, '\1[FILTERED]').
65
+ gsub(%r{(cardno=)[^&]+}, '\1[FILTERED]').
66
+ gsub(%r{(cid=)[^&]+}, '\1[FILTERED]')
67
+ end
68
+
69
+ private
70
+
71
+ def commit(action, money, fields)
72
+ url = (test? ? test_url : live_url) + CGI.escape(@options[:merchant_gateway_name])
73
+ raw_response = ssl_post(url, post_data(action, fields))
74
+ parsed_response = parse(raw_response)
75
+
76
+ return unparsable_response(raw_response) unless parsed_response
77
+
78
+ success = success?(parsed_response)
79
+ Response.new(
80
+ success,
81
+ CASHNET_CODES[parsed_response[:result]],
82
+ parsed_response,
83
+ test: test?,
84
+ authorization: (success ? parsed_response[:tx] : '')
85
+ )
86
+ end
87
+
88
+ def success?(response)
89
+ response[:result] == '0'
90
+ end
91
+
92
+ def post_data(action, parameters = {})
93
+ post = {}
94
+
95
+ post[:command] = action
96
+ post[:merchant] = @options[:merchant]
97
+ post[:operator] = @options[:operator]
98
+ post[:password] = @options[:password]
99
+ post[:station] = (@options[:station] || 'WEB')
100
+ post[:custcode] = (@options[:custcode] || "ActiveMerchant/#{ActiveMerchant::VERSION}")
101
+ post.merge(parameters).collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join('&')
102
+ end
103
+
104
+ def add_creditcard(post, creditcard)
105
+ post[:cardno] = creditcard.number
106
+ post[:cid] = creditcard.verification_value
107
+ post[:expdate] = expdate(creditcard)
108
+ post[:card_name_g] = creditcard.name
109
+ post[:fname] = creditcard.first_name
110
+ post[:lname] = creditcard.last_name
111
+ end
112
+
113
+ def add_invoice(post, money, options)
114
+ post[:order_number] = options[:order_id] if options[:order_id].present?
115
+
116
+ if options[:item_codes].present?
117
+ codes_and_amounts = options[:item_codes].transform_keys { |key| key.to_s.delete('_') }
118
+ codes_and_amounts.each do |key, value|
119
+ post[key] = value if key.start_with?('itemcode')
120
+ post[key] = amount(value.to_i) if key.start_with?('amount')
121
+ end
122
+ else
123
+ post[:itemcode] = (options[:item_code] || @options[:default_item_code])
124
+ post[:amount] = amount(money.to_i)
125
+ end
126
+ end
127
+
128
+ def add_address(post, options)
129
+ if address = (options[:shipping_address] || options[:billing_address] || options[:address])
130
+ post[:addr_g] = String(address[:address1]) + ',' + String(address[:address2])
131
+ post[:city_g] = address[:city]
132
+ post[:state_g] = address[:state]
133
+ post[:zip_g] = address[:zip]
134
+ end
135
+ end
136
+
137
+ def add_customer_data(post, options)
138
+ post[:email_g] = options[:email]
139
+ post[:custcode] = options[:custcode] unless empty?(options[:custcode])
140
+ end
141
+
142
+ def expdate(creditcard)
143
+ year = format(creditcard.year, :two_digits)
144
+ month = format(creditcard.month, :two_digits)
145
+
146
+ "#{month}#{year}"
147
+ end
148
+
149
+ def parse(body)
150
+ match = body.match(/<cngateway>(.*)<\/cngateway>/)
151
+ return nil unless match
152
+
153
+ Hash[CGI::parse(match[1]).map { |k, v| [k.to_sym, v.first] }]
154
+ end
155
+
156
+ def handle_response(response)
157
+ if (200...300).cover?(response.code.to_i)
158
+ return response.body
159
+ elsif response.code.to_i == 302
160
+ return ssl_get(URI.parse(response['location']))
161
+ end
162
+
163
+ raise ResponseError.new(response)
164
+ end
165
+
166
+ def unparsable_response(raw_response)
167
+ message = 'Unparsable response received from Cashnet. Please contact Cashnet if you continue to receive this message.'
168
+ message += " (The raw response returned by the API was #{raw_response.inspect})"
169
+ return Response.new(false, message)
170
+ end
171
+
172
+ CASHNET_CODES = {
173
+ '0' => 'Success',
174
+ '1' => 'Invalid customer code, no customer code specified',
175
+ '2' => 'Invalid operator code, no operator specified',
176
+ '3' => 'Invalid workstation code, no station specified',
177
+ '4' => 'Invalid item code, no code specified',
178
+ '5' => 'Negative amount is not allowed',
179
+ '6' => 'Invalid credit card number, no credit card number provided',
180
+ '7' => 'Invalid expiration date, no expiration date provided',
181
+ '8' => 'Please only provide either ACH or credit card information',
182
+ '9' => 'Invalid ACH account number, no account number provided',
183
+ '10' => 'Invalid routing/transit number, no routing/transit number provided',
184
+ '11' => 'Invalid account type, no account type provided',
185
+ '12' => 'Invalid check digit for routing/transit number',
186
+ '13' => 'No ACH merchant account set up for the location of the station being used',
187
+ '21' => 'Invalid merchant code, no merchant code provided',
188
+ '22' => 'Invalid client code, no client code provided',
189
+ '23' => 'Invalid password, no password provided',
190
+ '24' => 'Invalid transaction type, no transaction type provided',
191
+ '25' => 'Invalid amount, amount not provided',
192
+ '26' => 'Invalid payment code provided',
193
+ '27' => 'Invalid version number, version not found',
194
+ '31' => 'Application amount exceeds account balance',
195
+ '150' => 'Invalid payment information, no payment information provided',
196
+ '200' => 'Invalid command',
197
+ '201' => 'Customer not on file',
198
+ '205' => 'Invalid operator or password',
199
+ '206' => 'Operator is not authorized for this function',
200
+ '208' => 'Customer/PIN authentication unsuccessful',
201
+ '209' => 'Credit card error',
202
+ '211' => 'Credit card error',
203
+ '212' => 'Customer/PIN not on file',
204
+ '213' => 'Customer information not on file',
205
+ '215' => 'Old PIN does not validate ',
206
+ '221' => 'Invalid credit card processor type specified in location or payment code',
207
+ '222' => 'Credit card processor error',
208
+ '230' => 'Host Error (USE VOID OR REVERSAL TO REFUND UNSETTLED TRANSACTIONS)',
209
+ '280' => 'SmartPay transaction not posted',
210
+ '301' => 'Original transaction not found for this customer',
211
+ '302' => 'Amount to refund exceeds original payment amount or is missing',
212
+ '304' => 'Original credit card payment not found or corrupted',
213
+ '305' => 'Refund amounts should be expressed as positive amounts',
214
+ '306' => 'Original ACH payment not found',
215
+ '307' => 'Original electronic payment not found',
216
+ '308' => 'Invalid original transaction number, original transaction number not found',
217
+ '310' => 'Refund amount exceeds amount still available for a refund',
218
+ '321' => 'Store has not been implemented',
219
+ '501' => 'Unable to roll over batch',
220
+ '502' => 'Batch not found',
221
+ '503' => 'Batch information not available',
222
+ '650' => 'Invalid quick code',
223
+ '651' => 'Transaction amount does not match amount specified in quick code',
224
+ '652' => 'Invalid item code in the detail of the quick code',
225
+ '701' => 'This website has been disabled. Please contact the system administrator.',
226
+ '702' => 'Improper merchant code. Please contact the system administrator.',
227
+ '703' => 'This site is temporarily down for maintenance. We regret the inconvenience. Please try again later.',
228
+ '704' => 'Duplicate item violation. Please contact the system administrator.',
229
+ '705' => 'An invalid reference type has been passed into the system. Please contact the system administrator',
230
+ '706' => 'Items violating unique selection have been passed in. Please contact the system administrator.',
231
+ '999' => 'An unexpected error has occurred. Please consult the event log.'
232
+ }
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,198 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ # CC5 API is used by many banks in Turkey. Extend this base class to provide
4
+ # concrete implementations.
5
+ class CC5Gateway < Gateway
6
+ self.default_currency = 'TRY'
7
+
8
+ CURRENCY_CODES = {
9
+ 'TRY' => 949,
10
+ 'YTL' => 949,
11
+ 'TRL' => 949,
12
+ 'TL' => 949,
13
+ 'USD' => 840,
14
+ 'EUR' => 978,
15
+ 'GBP' => 826,
16
+ 'JPY' => 392
17
+ }
18
+
19
+ def initialize(options = {})
20
+ requires!(options, :login, :password, :client_id)
21
+ super
22
+ end
23
+
24
+ def purchase(money, creditcard, options = {})
25
+ commit(build_sale_request('Auth', money, creditcard, options))
26
+ end
27
+
28
+ def authorize(money, creditcard, options = {})
29
+ commit(build_sale_request('PreAuth', money, creditcard, options))
30
+ end
31
+
32
+ def capture(money, authorization, options = {})
33
+ commit(build_capture_request(money, authorization, options))
34
+ end
35
+
36
+ def void(authorization, options = {})
37
+ commit(build_void_request(authorization, options))
38
+ end
39
+
40
+ def refund(money, authorization, options = {})
41
+ commit(build_authorization_credit_request(money, authorization, options))
42
+ end
43
+
44
+ def credit(money, creditcard, options = {})
45
+ commit(build_creditcard_credit_request(money, creditcard, options))
46
+ end
47
+
48
+ protected
49
+
50
+ def build_sale_request(type, money, creditcard, options = {})
51
+ requires!(options, :order_id)
52
+
53
+ xml = Builder::XmlMarkup.new indent: 2
54
+
55
+ xml.tag! 'CC5Request' do
56
+ add_login_tags(xml)
57
+ xml.tag! 'OrderId', options[:order_id]
58
+ xml.tag! 'Type', type
59
+ xml.tag! 'Number', creditcard.number
60
+ xml.tag! 'Expires', [format(creditcard.month, :two_digits), format(creditcard.year, :two_digits)].join('/')
61
+ xml.tag! 'Cvv2Val', creditcard.verification_value
62
+ add_amount_tags(money, options, xml)
63
+ xml.tag! 'Email', options[:email] if options[:email]
64
+
65
+ if (address = (options[:billing_address] || options[:address]))
66
+ xml.tag! 'BillTo' do
67
+ add_address(xml, address)
68
+ end
69
+ xml.tag! 'ShipTo' do
70
+ add_address(xml, address)
71
+ end
72
+ end
73
+ end
74
+
75
+ xml.target!
76
+ end
77
+
78
+ def build_capture_request(money, authorization, options = {})
79
+ xml = Builder::XmlMarkup.new indent: 2
80
+
81
+ xml.tag! 'CC5Request' do
82
+ add_login_tags(xml)
83
+ xml.tag! 'OrderId', authorization
84
+ xml.tag! 'Type', 'PostAuth'
85
+ add_amount_tags(money, options, xml)
86
+ end
87
+ end
88
+
89
+ def build_void_request(authorization, options = {})
90
+ xml = Builder::XmlMarkup.new indent: 2
91
+
92
+ xml.tag! 'CC5Request' do
93
+ add_login_tags(xml)
94
+ xml.tag! 'OrderId', authorization
95
+ xml.tag! 'Type', 'Void'
96
+ end
97
+ end
98
+
99
+ def build_authorization_credit_request(money, authorization, options = {})
100
+ xml = Builder::XmlMarkup.new indent: 2
101
+
102
+ xml.tag! 'CC5Request' do
103
+ add_login_tags(xml)
104
+ xml.tag! 'OrderId', authorization
105
+ xml.tag! 'Type', 'Credit'
106
+ add_amount_tags(money, options, xml)
107
+ end
108
+ end
109
+
110
+ def build_creditcard_credit_request(money, creditcard, options = {})
111
+ xml = Builder::XmlMarkup.new indent: 2
112
+
113
+ xml.tag! 'CC5Request' do
114
+ add_login_tags(xml)
115
+ xml.tag! 'Type', 'Credit'
116
+ xml.tag! 'Number', creditcard.number
117
+
118
+ add_amount_tags(money, options, xml)
119
+ end
120
+ end
121
+
122
+ def add_address(xml, address)
123
+ xml.tag! 'Name', normalize(address[:name])
124
+ xml.tag! 'Street1', normalize(address[:address1])
125
+ xml.tag! 'Street2', normalize(address[:address2]) if address[:address2]
126
+ xml.tag! 'City', normalize(address[:city])
127
+ xml.tag! 'PostalCode', address[:zip]
128
+ xml.tag! 'Country', normalize(address[:country])
129
+ xml.tag! 'Company', normalize(address[:company])
130
+ xml.tag! 'TelVoice', address[:phone].to_s.gsub(/[^0-9]/, '') if address[:phone]
131
+ end
132
+
133
+ def add_login_tags(xml)
134
+ xml.tag! 'Name', @options[:login]
135
+ xml.tag! 'Password', @options[:password]
136
+ xml.tag! 'ClientId', @options[:client_id]
137
+ xml.tag! 'Mode', (test? ? 'T' : 'P')
138
+ end
139
+
140
+ def add_amount_tags(money, options, xml)
141
+ xml.tag! 'Total', amount(money)
142
+ xml.tag! 'Currency', currency_code(options[:currency] || currency(money))
143
+ end
144
+
145
+ def currency_code(currency)
146
+ (CURRENCY_CODES[currency] || CURRENCY_CODES[default_currency])
147
+ end
148
+
149
+ def commit(request)
150
+ raw_response = ssl_post((test? ? self.test_url : self.live_url), 'DATA=' + request)
151
+
152
+ response = parse(raw_response)
153
+
154
+ success = success?(response)
155
+
156
+ Response.new(
157
+ success,
158
+ (success ? 'Approved' : "Declined (Reason: #{response[:proc_return_code]} - #{response[:err_msg]})"),
159
+ response,
160
+ test: test?,
161
+ authorization: response[:order_id]
162
+ )
163
+ end
164
+
165
+ def parse(body)
166
+ xml = REXML::Document.new(body)
167
+
168
+ response = {}
169
+ xml.root.elements.to_a.each do |node|
170
+ parse_element(response, node)
171
+ end
172
+ response
173
+ end
174
+
175
+ def parse_element(response, node)
176
+ if node.has_elements?
177
+ node.elements.each { |element| parse_element(response, element) }
178
+ else
179
+ response[node.name.underscore.to_sym] = node.text
180
+ end
181
+ end
182
+
183
+ def success?(response)
184
+ (response[:response] == 'Approved')
185
+ end
186
+
187
+ def normalize(text)
188
+ return unless text
189
+
190
+ if ActiveSupport::Inflector.method(:transliterate).arity == -2
191
+ ActiveSupport::Inflector.transliterate(text, '')
192
+ else
193
+ text.gsub(/[^\x00-\x7F]+/, '')
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,249 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class CecabankGateway < Gateway
4
+ self.test_url = 'https://tpv.ceca.es'
5
+ self.live_url = 'https://pgw.ceca.es'
6
+
7
+ self.supported_countries = ['ES']
8
+ self.supported_cardtypes = %i[visa master american_express]
9
+ self.homepage_url = 'http://www.ceca.es/es/'
10
+ self.display_name = 'Cecabank'
11
+ self.default_currency = 'EUR'
12
+ self.money_format = :cents
13
+
14
+ #### CECA's MAGIC NUMBERS
15
+ CECA_NOTIFICATIONS_URL = 'NONE'
16
+ CECA_ENCRIPTION = 'SHA2'
17
+ CECA_DECIMALS = '2'
18
+ CECA_MODE = 'SSL'
19
+ CECA_UI_LESS_LANGUAGE = 'XML'
20
+ CECA_UI_LESS_LANGUAGE_REFUND = '1'
21
+ CECA_UI_LESS_REFUND_PAGE = 'anulacion_xml'
22
+ CECA_ACTION_REFUND = 'anulaciones/anularParcial' # use partial refund's URL to avoid time frame limitations and decision logic on client side
23
+ CECA_ACTION_PURCHASE = 'tpv/compra'
24
+ CECA_CURRENCIES_DICTIONARY = { 'EUR' => 978, 'USD' => 840, 'GBP' => 826 }
25
+
26
+ # Creates a new CecabankGateway
27
+ #
28
+ # The gateway requires four values for connection to be passed
29
+ # in the +options+ hash.
30
+ #
31
+ # ==== Options
32
+ #
33
+ # * <tt>:merchant_id</tt> -- Cecabank's merchant_id (REQUIRED)
34
+ # * <tt>:acquirer_bin</tt> -- Cecabank's acquirer_bin (REQUIRED)
35
+ # * <tt>:terminal_id</tt> -- Cecabank's terminal_id (REQUIRED)
36
+ # * <tt>:key</tt> -- Cecabank's cypher key (REQUIRED)
37
+ # * <tt>:test</tt> -- +true+ or +false+. If true, perform transactions against the test server.
38
+ # Otherwise, perform transactions against the production server.
39
+ def initialize(options = {})
40
+ requires!(options, :merchant_id, :acquirer_bin, :terminal_id, :key)
41
+ super
42
+ end
43
+
44
+ # Perform a purchase, which is essentially an authorization and capture in a single operation.
45
+ #
46
+ # ==== Parameters
47
+ #
48
+ # * <tt>money</tt> -- The amount to be purchased as an Integer value in cents.
49
+ # * <tt>creditcard</tt> -- The CreditCard details for the transaction.
50
+ # * <tt>options</tt> -- A hash of optional parameters.
51
+ #
52
+ # ==== Options
53
+ #
54
+ # * <tt>:order_id</tt> -- order_id passed used purchase. (REQUIRED)
55
+ # * <tt>:currency</tt> -- currency. Supported: EUR, USD, GBP.
56
+ # * <tt>:description</tt> -- description to be pased to the gateway.
57
+ def purchase(money, creditcard, options = {})
58
+ requires!(options, :order_id)
59
+
60
+ post = { 'Descripcion' => options[:description],
61
+ 'Num_operacion' => options[:order_id],
62
+ 'Idioma' => CECA_UI_LESS_LANGUAGE,
63
+ 'Pago_soportado' => CECA_MODE,
64
+ 'URL_OK' => CECA_NOTIFICATIONS_URL,
65
+ 'URL_NOK' => CECA_NOTIFICATIONS_URL,
66
+ 'Importe' => amount(money),
67
+ 'TipoMoneda' => CECA_CURRENCIES_DICTIONARY[options[:currency] || currency(money)] }
68
+
69
+ add_creditcard(post, creditcard)
70
+
71
+ commit(CECA_ACTION_PURCHASE, post)
72
+ end
73
+
74
+ # Refund a transaction.
75
+ #
76
+ # This transaction indicates to the gateway that
77
+ # money should flow from the merchant to the customer.
78
+ #
79
+ # ==== Parameters
80
+ #
81
+ # * <tt>money</tt> -- The amount to be credited to the customer as an Integer value in cents.
82
+ # * <tt>identification</tt> -- The reference given from the gateway on purchase (reference, not operation).
83
+ # * <tt>options</tt> -- A hash of parameters.
84
+ def refund(money, identification, options = {})
85
+ reference, order_id = split_authorization(identification)
86
+
87
+ post = { 'Referencia' => reference,
88
+ 'Num_operacion' => order_id,
89
+ 'Idioma' => CECA_UI_LESS_LANGUAGE_REFUND,
90
+ 'Pagina' => CECA_UI_LESS_REFUND_PAGE,
91
+ 'Importe' => amount(money),
92
+ 'TipoMoneda' => CECA_CURRENCIES_DICTIONARY[options[:currency] || currency(money)] }
93
+
94
+ commit(CECA_ACTION_REFUND, post)
95
+ end
96
+
97
+ def supports_scrubbing
98
+ true
99
+ end
100
+
101
+ def scrub(transcript)
102
+ transcript.
103
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
104
+ gsub(%r((&?pan=)[^&]*)i, '\1[FILTERED]').
105
+ gsub(%r((&?cvv2=)[^&]*)i, '\1[FILTERED]')
106
+ end
107
+
108
+ private
109
+
110
+ def add_creditcard(post, creditcard)
111
+ post['PAN'] = creditcard.number
112
+ post['Caducidad'] = expdate(creditcard)
113
+ post['CVV2'] = creditcard.verification_value
114
+ post['Pago_elegido'] = CECA_MODE
115
+ end
116
+
117
+ def expdate(creditcard)
118
+ "#{format(creditcard.year, :four_digits)}#{format(creditcard.month, :two_digits)}"
119
+ end
120
+
121
+ def parse(body)
122
+ response = {}
123
+
124
+ root = REXML::Document.new(body).root
125
+
126
+ response[:success] = (root.attributes['valor'] == 'OK')
127
+ response[:date] = root.attributes['fecha']
128
+ response[:operation_number] = root.attributes['numeroOperacion']
129
+ response[:message] = root.attributes['valor']
130
+
131
+ if root.elements['OPERACION']
132
+ response[:operation_type] = root.elements['OPERACION'].attributes['tipo']
133
+ response[:amount] = root.elements['OPERACION/importe'].text.strip
134
+ end
135
+
136
+ response[:description] = root.elements['OPERACION/descripcion'].text if root.elements['OPERACION/descripcion']
137
+ response[:authorization_number] = root.elements['OPERACION/numeroAutorizacion'].text if root.elements['OPERACION/numeroAutorizacion']
138
+ response[:reference] = root.elements['OPERACION/referencia'].text if root.elements['OPERACION/referencia']
139
+ response[:pan] = root.elements['OPERACION/pan'].text if root.elements['OPERACION/pan']
140
+
141
+ if root.elements['ERROR']
142
+ response[:error_code] = root.elements['ERROR/codigo'].text
143
+ response[:error_message] = root.elements['ERROR/descripcion'].text
144
+ else
145
+ if root.elements['OPERACION'].attributes['numeroOperacion'] == '000'
146
+ response[:authorization] = root.elements['OPERACION/numeroAutorizacion'].text if root.elements['OPERACION/numeroAutorizacion']
147
+ else
148
+ response[:authorization] = root.attributes['numeroOperacion']
149
+ end
150
+ end
151
+
152
+ return response
153
+ rescue REXML::ParseException => e
154
+ response[:success] = false
155
+ response[:message] = 'Unable to parse the response.'
156
+ response[:error_message] = e.message
157
+ response
158
+ end
159
+
160
+ def commit(action, parameters)
161
+ parameters.merge!(
162
+ 'Cifrado' => CECA_ENCRIPTION,
163
+ 'Firma' => generate_signature(action, parameters),
164
+ 'Exponente' => CECA_DECIMALS,
165
+ 'MerchantID' => options[:merchant_id],
166
+ 'AcquirerBIN' => options[:acquirer_bin],
167
+ 'TerminalID' => options[:terminal_id]
168
+ )
169
+ url = (test? ? self.test_url : self.live_url) + "/tpvweb/#{action}.action"
170
+ xml = ssl_post("#{url}?", post_data(parameters))
171
+ response = parse(xml)
172
+ Response.new(
173
+ response[:success],
174
+ message_from(response),
175
+ response,
176
+ test: test?,
177
+ authorization: build_authorization(response),
178
+ error_code: response[:error_code]
179
+ )
180
+ end
181
+
182
+ def message_from(response)
183
+ if response[:message] == 'ERROR' && response[:error_message]
184
+ response[:error_message]
185
+ elsif response[:error_message]
186
+ "#{response[:message]} #{response[:error_message]}"
187
+ else
188
+ response[:message]
189
+ end
190
+ end
191
+
192
+ def post_data(params)
193
+ return nil unless params
194
+
195
+ params.map do |key, value|
196
+ next if value.blank?
197
+
198
+ if value.is_a?(Hash)
199
+ h = {}
200
+ value.each do |k, v|
201
+ h["#{key}.#{k}"] = v unless v.blank?
202
+ end
203
+ post_data(h)
204
+ else
205
+ "#{key}=#{CGI.escape(value.to_s)}"
206
+ end
207
+ end.compact.join('&')
208
+ end
209
+
210
+ def build_authorization(response)
211
+ [response[:reference], response[:authorization]].join('|')
212
+ end
213
+
214
+ def split_authorization(authorization)
215
+ authorization.split('|')
216
+ end
217
+
218
+ def generate_signature(action, parameters)
219
+ signature_fields =
220
+ case action
221
+ when CECA_ACTION_REFUND
222
+ options[:key].to_s +
223
+ options[:merchant_id].to_s +
224
+ options[:acquirer_bin].to_s +
225
+ options[:terminal_id].to_s +
226
+ parameters['Num_operacion'].to_s +
227
+ parameters['Importe'].to_s +
228
+ parameters['TipoMoneda'].to_s +
229
+ CECA_DECIMALS +
230
+ parameters['Referencia'].to_s +
231
+ CECA_ENCRIPTION
232
+ else
233
+ options[:key].to_s +
234
+ options[:merchant_id].to_s +
235
+ options[:acquirer_bin].to_s +
236
+ options[:terminal_id].to_s +
237
+ parameters['Num_operacion'].to_s +
238
+ parameters['Importe'].to_s +
239
+ parameters['TipoMoneda'].to_s +
240
+ CECA_DECIMALS +
241
+ CECA_ENCRIPTION +
242
+ CECA_NOTIFICATIONS_URL +
243
+ CECA_NOTIFICATIONS_URL
244
+ end
245
+ Digest::SHA2.hexdigest(signature_fields)
246
+ end
247
+ end
248
+ end
249
+ end