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,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