activemerchant 1.133.0 → 1.138.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +450 -0
  3. data/CONTRIBUTORS +1 -0
  4. data/lib/active_merchant/billing/apple_pay_payment_token.rb +2 -2
  5. data/lib/active_merchant/billing/base.rb +2 -2
  6. data/lib/active_merchant/billing/check.rb +16 -4
  7. data/lib/active_merchant/billing/compatibility.rb +4 -4
  8. data/lib/active_merchant/billing/credit_card.rb +35 -16
  9. data/lib/active_merchant/billing/credit_card_formatting.rb +13 -2
  10. data/lib/active_merchant/billing/credit_card_methods.rb +74 -19
  11. data/lib/active_merchant/billing/gateway.rb +22 -2
  12. data/lib/active_merchant/billing/gateways/adyen.rb +282 -87
  13. data/lib/active_merchant/billing/gateways/airwallex.rb +46 -25
  14. data/lib/active_merchant/billing/gateways/alelo.rb +29 -11
  15. data/lib/active_merchant/billing/gateways/allied_wallet.rb +2 -2
  16. data/lib/active_merchant/billing/gateways/authorize_net.rb +49 -41
  17. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +14 -10
  18. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +3 -5
  19. data/lib/active_merchant/billing/gateways/axcessms.rb +9 -5
  20. data/lib/active_merchant/billing/gateways/balanced.rb +2 -2
  21. data/lib/active_merchant/billing/gateways/bambora_apac.rb +2 -2
  22. data/lib/active_merchant/billing/gateways/bank_frick.rb +2 -2
  23. data/lib/active_merchant/billing/gateways/banwire.rb +6 -4
  24. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +8 -8
  25. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +2 -2
  26. data/lib/active_merchant/billing/gateways/be2bill.rb +2 -2
  27. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +12 -8
  28. data/lib/active_merchant/billing/gateways/beanstream.rb +2 -2
  29. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +2 -2
  30. data/lib/active_merchant/billing/gateways/blue_pay.rb +15 -7
  31. data/lib/active_merchant/billing/gateways/blue_snap.rb +5 -5
  32. data/lib/active_merchant/billing/gateways/bogus.rb +2 -2
  33. data/lib/active_merchant/billing/gateways/borgun.rb +2 -2
  34. data/lib/active_merchant/billing/gateways/bpoint.rb +2 -2
  35. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +3 -1
  36. data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +68 -23
  37. data/lib/active_merchant/billing/gateways/braintree.rb +2 -2
  38. data/lib/active_merchant/billing/gateways/braintree_blue.rb +266 -89
  39. data/lib/active_merchant/billing/gateways/braintree_orange.rb +3 -3
  40. data/lib/active_merchant/billing/gateways/bridge_pay.rb +2 -2
  41. data/lib/active_merchant/billing/gateways/cams.rb +2 -2
  42. data/lib/active_merchant/billing/gateways/card_connect.rb +7 -4
  43. data/lib/active_merchant/billing/gateways/card_save.rb +2 -2
  44. data/lib/active_merchant/billing/gateways/card_stream.rb +12 -13
  45. data/lib/active_merchant/billing/gateways/cardknox.rb +2 -2
  46. data/lib/active_merchant/billing/gateways/cardprocess.rb +2 -2
  47. data/lib/active_merchant/billing/gateways/cashnet.rb +4 -4
  48. data/lib/active_merchant/billing/gateways/cc5.rb +2 -2
  49. data/lib/active_merchant/billing/gateways/cecabank/cecabank_common.rb +36 -0
  50. data/lib/active_merchant/billing/gateways/cecabank/cecabank_json.rb +331 -0
  51. data/lib/active_merchant/billing/gateways/cecabank/cecabank_xml.rb +220 -0
  52. data/lib/active_merchant/billing/gateways/cecabank.rb +9 -242
  53. data/lib/active_merchant/billing/gateways/cenpos.rb +9 -3
  54. data/lib/active_merchant/billing/gateways/checkout.rb +5 -5
  55. data/lib/active_merchant/billing/gateways/checkout_v2.rb +362 -50
  56. data/lib/active_merchant/billing/gateways/clearhaus.rb +2 -2
  57. data/lib/active_merchant/billing/gateways/commerce_hub.rb +117 -35
  58. data/lib/active_merchant/billing/gateways/commercegate.rb +4 -4
  59. data/lib/active_merchant/billing/gateways/conekta.rb +2 -2
  60. data/lib/active_merchant/billing/gateways/creditcall.rb +2 -2
  61. data/lib/active_merchant/billing/gateways/credorax.rb +109 -20
  62. data/lib/active_merchant/billing/gateways/ct_payment.rb +6 -6
  63. data/lib/active_merchant/billing/gateways/culqi.rb +2 -2
  64. data/lib/active_merchant/billing/gateways/cyber_source/cyber_source_common.rb +2 -2
  65. data/lib/active_merchant/billing/gateways/cyber_source.rb +379 -100
  66. data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +147 -76
  67. data/lib/active_merchant/billing/gateways/d_local.rb +45 -22
  68. data/lib/active_merchant/billing/gateways/data_cash.rb +22 -18
  69. data/lib/active_merchant/billing/gateways/datatrans.rb +284 -0
  70. data/lib/active_merchant/billing/gateways/decidir.rb +82 -46
  71. data/lib/active_merchant/billing/gateways/decidir_plus.rb +31 -35
  72. data/lib/active_merchant/billing/gateways/deepstack.rb +382 -0
  73. data/lib/active_merchant/billing/gateways/dibs.rb +3 -3
  74. data/lib/active_merchant/billing/gateways/digitzs.rb +2 -2
  75. data/lib/active_merchant/billing/gateways/ebanx.rb +116 -68
  76. data/lib/active_merchant/billing/gateways/efsnet.rb +13 -8
  77. data/lib/active_merchant/billing/gateways/elavon.rb +80 -47
  78. data/lib/active_merchant/billing/gateways/element.rb +39 -10
  79. data/lib/active_merchant/billing/gateways/epay.rb +8 -4
  80. data/lib/active_merchant/billing/gateways/evo_ca.rb +8 -4
  81. data/lib/active_merchant/billing/gateways/eway.rb +6 -4
  82. data/lib/active_merchant/billing/gateways/eway_managed.rb +8 -4
  83. data/lib/active_merchant/billing/gateways/eway_rapid.rb +3 -3
  84. data/lib/active_merchant/billing/gateways/exact.rb +8 -4
  85. data/lib/active_merchant/billing/gateways/fat_zebra.rb +37 -7
  86. data/lib/active_merchant/billing/gateways/federated_canada.rb +8 -4
  87. data/lib/active_merchant/billing/gateways/finansbank.rb +2 -2
  88. data/lib/active_merchant/billing/gateways/first_giving.rb +2 -2
  89. data/lib/active_merchant/billing/gateways/first_pay/first_pay_common.rb +15 -0
  90. data/lib/active_merchant/billing/gateways/first_pay/first_pay_json.rb +190 -0
  91. data/lib/active_merchant/billing/gateways/first_pay/first_pay_xml.rb +183 -0
  92. data/lib/active_merchant/billing/gateways/first_pay.rb +8 -174
  93. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +8 -4
  94. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +9 -5
  95. data/lib/active_merchant/billing/gateways/flex_charge.rb +359 -0
  96. data/lib/active_merchant/billing/gateways/flo2cash.rb +4 -2
  97. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +2 -2
  98. data/lib/active_merchant/billing/gateways/forte.rb +6 -4
  99. data/lib/active_merchant/billing/gateways/fortis.rb +347 -0
  100. data/lib/active_merchant/billing/gateways/garanti.rb +6 -4
  101. data/lib/active_merchant/billing/gateways/global_collect.rb +69 -50
  102. data/lib/active_merchant/billing/gateways/global_transport.rb +2 -2
  103. data/lib/active_merchant/billing/gateways/hdfc.rb +2 -2
  104. data/lib/active_merchant/billing/gateways/hi_pay.rb +287 -0
  105. data/lib/active_merchant/billing/gateways/hps.rb +40 -47
  106. data/lib/active_merchant/billing/gateways/iats_payments.rb +9 -4
  107. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +2 -2
  108. data/lib/active_merchant/billing/gateways/inspire.rb +8 -6
  109. data/lib/active_merchant/billing/gateways/instapay.rb +9 -6
  110. data/lib/active_merchant/billing/gateways/ipg.rb +14 -10
  111. data/lib/active_merchant/billing/gateways/ipp.rb +2 -2
  112. data/lib/active_merchant/billing/gateways/iridium.rb +18 -8
  113. data/lib/active_merchant/billing/gateways/itransact.rb +8 -4
  114. data/lib/active_merchant/billing/gateways/iveri.rb +12 -9
  115. data/lib/active_merchant/billing/gateways/ixopay.rb +4 -4
  116. data/lib/active_merchant/billing/gateways/jetpay.rb +6 -4
  117. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +9 -6
  118. data/lib/active_merchant/billing/gateways/komoju.rb +2 -2
  119. data/lib/active_merchant/billing/gateways/kushki.rb +79 -16
  120. data/lib/active_merchant/billing/gateways/latitude19.rb +2 -2
  121. data/lib/active_merchant/billing/gateways/linkpoint.rb +8 -4
  122. data/lib/active_merchant/billing/gateways/litle.rb +37 -54
  123. data/lib/active_merchant/billing/gateways/loan_payment_pro.rb +267 -0
  124. data/lib/active_merchant/billing/gateways/loan_payment_pro_ach.rb +93 -0
  125. data/lib/active_merchant/billing/gateways/mastercard.rb +4 -4
  126. data/lib/active_merchant/billing/gateways/maxipago.rb +4 -4
  127. data/lib/active_merchant/billing/gateways/mercado_pago.rb +32 -11
  128. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +10 -7
  129. data/lib/active_merchant/billing/gateways/merchant_one.rb +2 -2
  130. data/lib/active_merchant/billing/gateways/merchant_partners.rb +2 -2
  131. data/lib/active_merchant/billing/gateways/merchant_ware.rb +13 -6
  132. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +13 -6
  133. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +21 -5
  134. data/lib/active_merchant/billing/gateways/mercury.rb +11 -5
  135. data/lib/active_merchant/billing/gateways/metrics_global.rb +10 -8
  136. data/lib/active_merchant/billing/gateways/micropayment.rb +2 -2
  137. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +7 -6
  138. data/lib/active_merchant/billing/gateways/migs.rb +8 -4
  139. data/lib/active_merchant/billing/gateways/mit.rb +10 -5
  140. data/lib/active_merchant/billing/gateways/modern_payments.rb +2 -2
  141. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +21 -13
  142. data/lib/active_merchant/billing/gateways/moka.rb +2 -2
  143. data/lib/active_merchant/billing/gateways/monei.rb +3 -3
  144. data/lib/active_merchant/billing/gateways/moneris.rb +11 -5
  145. data/lib/active_merchant/billing/gateways/money_movers.rb +8 -4
  146. data/lib/active_merchant/billing/gateways/multi_pay.rb +267 -0
  147. data/lib/active_merchant/billing/gateways/mundipagg.rb +5 -3
  148. data/lib/active_merchant/billing/gateways/nab_transact.rb +18 -10
  149. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +2 -2
  150. data/lib/active_merchant/billing/gateways/net_registry.rb +6 -2
  151. data/lib/active_merchant/billing/gateways/netaxept.rb +4 -4
  152. data/lib/active_merchant/billing/gateways/netbanx.rb +4 -6
  153. data/lib/active_merchant/billing/gateways/netbilling.rb +8 -4
  154. data/lib/active_merchant/billing/gateways/netpay.rb +2 -2
  155. data/lib/active_merchant/billing/gateways/network_merchants.rb +9 -5
  156. data/lib/active_merchant/billing/gateways/nmi.rb +29 -8
  157. data/lib/active_merchant/billing/gateways/nuvei.rb +573 -0
  158. data/lib/active_merchant/billing/gateways/ogone.rb +8 -4
  159. data/lib/active_merchant/billing/gateways/omise.rb +2 -2
  160. data/lib/active_merchant/billing/gateways/openpay.rb +6 -4
  161. data/lib/active_merchant/billing/gateways/opp.rb +3 -4
  162. data/lib/active_merchant/billing/gateways/optimal_payment.rb +12 -6
  163. data/lib/active_merchant/billing/gateways/orbital/orbital_codes.rb +273 -0
  164. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +3 -5
  165. data/lib/active_merchant/billing/gateways/orbital.rb +114 -94
  166. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +9 -6
  167. data/lib/active_merchant/billing/gateways/pagarme.rb +2 -2
  168. data/lib/active_merchant/billing/gateways/pago_facil.rb +2 -2
  169. data/lib/active_merchant/billing/gateways/pay_arc.rb +9 -7
  170. data/lib/active_merchant/billing/gateways/pay_conex.rb +6 -4
  171. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +8 -4
  172. data/lib/active_merchant/billing/gateways/pay_hub.rb +7 -5
  173. data/lib/active_merchant/billing/gateways/pay_junction.rb +8 -4
  174. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +2 -2
  175. data/lib/active_merchant/billing/gateways/pay_secure.rb +8 -4
  176. data/lib/active_merchant/billing/gateways/pay_trace.rb +36 -22
  177. data/lib/active_merchant/billing/gateways/paybox_direct.rb +14 -14
  178. data/lib/active_merchant/billing/gateways/payeezy.rb +26 -13
  179. data/lib/active_merchant/billing/gateways/payex.rb +8 -6
  180. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +3 -3
  181. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +2 -2
  182. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +2 -2
  183. data/lib/active_merchant/billing/gateways/payflow.rb +12 -11
  184. data/lib/active_merchant/billing/gateways/payflow_express.rb +2 -2
  185. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +2 -2
  186. data/lib/active_merchant/billing/gateways/payflow_uk.rb +2 -2
  187. data/lib/active_merchant/billing/gateways/payment_express.rb +10 -6
  188. data/lib/active_merchant/billing/gateways/paymentez.rb +30 -16
  189. data/lib/active_merchant/billing/gateways/paymill.rb +6 -4
  190. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +17 -12
  191. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +2 -2
  192. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +2 -2
  193. data/lib/active_merchant/billing/gateways/paypal.rb +4 -2
  194. data/lib/active_merchant/billing/gateways/paypal_ca.rb +2 -2
  195. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +2 -2
  196. data/lib/active_merchant/billing/gateways/paypal_express.rb +4 -2
  197. data/lib/active_merchant/billing/gateways/paysafe.rb +48 -24
  198. data/lib/active_merchant/billing/gateways/payscout.rb +9 -6
  199. data/lib/active_merchant/billing/gateways/paystation.rb +9 -5
  200. data/lib/active_merchant/billing/gateways/payu_in.rb +2 -2
  201. data/lib/active_merchant/billing/gateways/payu_latam.rb +7 -5
  202. data/lib/active_merchant/billing/gateways/payway.rb +6 -2
  203. data/lib/active_merchant/billing/gateways/payway_dot_com.rb +6 -6
  204. data/lib/active_merchant/billing/gateways/pin.rb +126 -41
  205. data/lib/active_merchant/billing/gateways/plexo.rb +71 -20
  206. data/lib/active_merchant/billing/gateways/plugnpay.rb +6 -2
  207. data/lib/active_merchant/billing/gateways/priority.rb +29 -24
  208. data/lib/active_merchant/billing/gateways/pro_pay.rb +2 -2
  209. data/lib/active_merchant/billing/gateways/psigate.rb +8 -4
  210. data/lib/active_merchant/billing/gateways/psl_card.rb +6 -2
  211. data/lib/active_merchant/billing/gateways/qbms.rb +9 -5
  212. data/lib/active_merchant/billing/gateways/quantum.rb +9 -5
  213. data/lib/active_merchant/billing/gateways/quickbooks.rb +27 -17
  214. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +7 -4
  215. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +8 -4
  216. data/lib/active_merchant/billing/gateways/quickpay.rb +2 -2
  217. data/lib/active_merchant/billing/gateways/qvalent.rb +2 -2
  218. data/lib/active_merchant/billing/gateways/rapyd.rb +172 -53
  219. data/lib/active_merchant/billing/gateways/reach.rb +16 -9
  220. data/lib/active_merchant/billing/gateways/redsys.rb +7 -15
  221. data/lib/active_merchant/billing/gateways/redsys_rest.rb +545 -0
  222. data/lib/active_merchant/billing/gateways/s5.rb +5 -5
  223. data/lib/active_merchant/billing/gateways/safe_charge.rb +47 -24
  224. data/lib/active_merchant/billing/gateways/sage.rb +14 -6
  225. data/lib/active_merchant/billing/gateways/sage_pay.rb +81 -7
  226. data/lib/active_merchant/billing/gateways/sallie_mae.rb +8 -4
  227. data/lib/active_merchant/billing/gateways/secure_net.rb +9 -5
  228. data/lib/active_merchant/billing/gateways/secure_pay.rb +10 -8
  229. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +25 -15
  230. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +8 -4
  231. data/lib/active_merchant/billing/gateways/securion_pay.rb +26 -12
  232. data/lib/active_merchant/billing/gateways/shift4.rb +34 -26
  233. data/lib/active_merchant/billing/gateways/shift4_v2.rb +117 -0
  234. data/lib/active_merchant/billing/gateways/simetrik.rb +26 -17
  235. data/lib/active_merchant/billing/gateways/skip_jack.rb +8 -4
  236. data/lib/active_merchant/billing/gateways/smart_ps.rb +10 -7
  237. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +6 -4
  238. data/lib/active_merchant/billing/gateways/spreedly_core.rb +4 -6
  239. data/lib/active_merchant/billing/gateways/stripe.rb +88 -84
  240. data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +388 -77
  241. data/lib/active_merchant/billing/gateways/sum_up.rb +224 -0
  242. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +6 -4
  243. data/lib/active_merchant/billing/gateways/telr.rb +6 -7
  244. data/lib/active_merchant/billing/gateways/trans_first.rb +6 -4
  245. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +10 -18
  246. data/lib/active_merchant/billing/gateways/transact_pro.rb +3 -3
  247. data/lib/active_merchant/billing/gateways/transax.rb +2 -2
  248. data/lib/active_merchant/billing/gateways/transnational.rb +2 -2
  249. data/lib/active_merchant/billing/gateways/trexle.rb +2 -2
  250. data/lib/active_merchant/billing/gateways/trust_commerce.rb +9 -5
  251. data/lib/active_merchant/billing/gateways/usa_epay.rb +2 -2
  252. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +32 -31
  253. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +8 -4
  254. data/lib/active_merchant/billing/gateways/vanco.rb +2 -4
  255. data/lib/active_merchant/billing/gateways/vantiv_express.rb +668 -0
  256. data/lib/active_merchant/billing/gateways/verifi.rb +12 -8
  257. data/lib/active_merchant/billing/gateways/versa_pay.rb +307 -0
  258. data/lib/active_merchant/billing/gateways/viaklix.rb +8 -4
  259. data/lib/active_merchant/billing/gateways/visanet_peru.rb +5 -5
  260. data/lib/active_merchant/billing/gateways/vpos.rb +25 -13
  261. data/lib/active_merchant/billing/gateways/webpay.rb +3 -3
  262. data/lib/active_merchant/billing/gateways/wepay.rb +6 -4
  263. data/lib/active_merchant/billing/gateways/wirecard.rb +10 -6
  264. data/lib/active_merchant/billing/gateways/wompi.rb +14 -7
  265. data/lib/active_merchant/billing/gateways/world_net.rb +2 -2
  266. data/lib/active_merchant/billing/gateways/worldpay.rb +297 -113
  267. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +16 -13
  268. data/lib/active_merchant/billing/gateways/worldpay_us.rb +2 -2
  269. data/lib/active_merchant/billing/gateways/xpay.rb +244 -0
  270. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +15 -3
  271. data/lib/active_merchant/billing/payment_token.rb +2 -2
  272. data/lib/active_merchant/billing/response.rb +7 -6
  273. data/lib/active_merchant/billing.rb +1 -0
  274. data/lib/active_merchant/connection.rb +8 -20
  275. data/lib/active_merchant/country.rb +3 -1
  276. data/lib/active_merchant/errors.rb +12 -2
  277. data/lib/active_merchant/net_http_ssl_connection.rb +35 -0
  278. data/lib/active_merchant/posts_data.rb +19 -4
  279. data/lib/active_merchant/version.rb +1 -1
  280. data/lib/active_merchant/versionable.rb +29 -0
  281. data/lib/certs/cacert.pem +1326 -1491
  282. data/lib/support/gateway_support.rb +3 -3
  283. data/lib/support/ssl_verify.rb +6 -6
  284. data/lib/support/ssl_version.rb +8 -8
  285. metadata +35 -9
@@ -0,0 +1,220 @@
1
+ require 'active_merchant/billing/gateways/cecabank/cecabank_common'
2
+
3
+ module ActiveMerchant
4
+ module Billing
5
+ class CecabankXmlGateway < Gateway
6
+ include CecabankCommon
7
+
8
+ self.test_url = 'https://tpv.ceca.es'
9
+ self.live_url = 'https://pgw.ceca.es'
10
+
11
+ #### CECA's MAGIC NUMBERS
12
+ CECA_NOTIFICATIONS_URL = 'NONE'
13
+ CECA_DECIMALS = '2'
14
+ CECA_MODE = 'SSL'
15
+ CECA_UI_LESS_LANGUAGE = 'XML'
16
+ CECA_UI_LESS_LANGUAGE_REFUND = '1'
17
+ CECA_UI_LESS_REFUND_PAGE = 'anulacion_xml'
18
+ CECA_ACTION_REFUND = 'anulaciones/anularParcial' # use partial refund's URL to avoid time frame limitations and decision logic on client side
19
+ CECA_ACTION_PURCHASE = 'tpv/compra'
20
+
21
+ # Perform a purchase, which is essentially an authorization and capture in a single operation.
22
+ #
23
+ # ==== Parameters
24
+ #
25
+ # * <tt>money</tt> -- The amount to be purchased as an Integer value in cents.
26
+ # * <tt>creditcard</tt> -- The CreditCard details for the transaction.
27
+ # * <tt>options</tt> -- A hash of optional parameters.
28
+ #
29
+ # ==== Options
30
+ #
31
+ # * <tt>:order_id</tt> -- order_id passed used purchase. (REQUIRED)
32
+ # * <tt>:currency</tt> -- currency. Supported: EUR, USD, GBP.
33
+ # * <tt>:description</tt> -- description to be pased to the gateway.
34
+ def purchase(money, creditcard, options = {})
35
+ requires!(options, :order_id)
36
+
37
+ post = { 'Descripcion' => options[:description],
38
+ 'Num_operacion' => options[:order_id],
39
+ 'Idioma' => CECA_UI_LESS_LANGUAGE,
40
+ 'Pago_soportado' => CECA_MODE,
41
+ 'URL_OK' => CECA_NOTIFICATIONS_URL,
42
+ 'URL_NOK' => CECA_NOTIFICATIONS_URL,
43
+ 'Importe' => amount(money),
44
+ 'TipoMoneda' => CECA_CURRENCIES_DICTIONARY[options[:currency] || currency(money)] }
45
+
46
+ add_creditcard(post, creditcard)
47
+
48
+ commit(CECA_ACTION_PURCHASE, post)
49
+ end
50
+
51
+ # Refund a transaction.
52
+ #
53
+ # This transaction indicates to the gateway that
54
+ # money should flow from the merchant to the customer.
55
+ #
56
+ # ==== Parameters
57
+ #
58
+ # * <tt>money</tt> -- The amount to be credited to the customer as an Integer value in cents.
59
+ # * <tt>identification</tt> -- The reference given from the gateway on purchase (reference, not operation).
60
+ # * <tt>options</tt> -- A hash of parameters.
61
+ def refund(money, identification, options = {})
62
+ reference, order_id = split_authorization(identification)
63
+
64
+ post = { 'Referencia' => reference,
65
+ 'Num_operacion' => order_id,
66
+ 'Idioma' => CECA_UI_LESS_LANGUAGE_REFUND,
67
+ 'Pagina' => CECA_UI_LESS_REFUND_PAGE,
68
+ 'Importe' => amount(money),
69
+ 'TipoMoneda' => CECA_CURRENCIES_DICTIONARY[options[:currency] || currency(money)] }
70
+
71
+ commit(CECA_ACTION_REFUND, post)
72
+ end
73
+
74
+ def scrub(transcript)
75
+ transcript.
76
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
77
+ gsub(%r((&?pan=)[^&]*)i, '\1[FILTERED]').
78
+ gsub(%r((&?cvv2=)[^&]*)i, '\1[FILTERED]')
79
+ end
80
+
81
+ private
82
+
83
+ def add_creditcard(post, creditcard)
84
+ post['PAN'] = creditcard.number
85
+ post['Caducidad'] = expdate(creditcard)
86
+ post['CVV2'] = creditcard.verification_value
87
+ post['Pago_elegido'] = CECA_MODE
88
+ end
89
+
90
+ def expdate(creditcard)
91
+ "#{format(creditcard.year, :four_digits)}#{format(creditcard.month, :two_digits)}"
92
+ end
93
+
94
+ def parse(body)
95
+ response = {}
96
+
97
+ root = REXML::Document.new(body).root
98
+
99
+ response[:success] = (root.attributes['valor'] == 'OK')
100
+ response[:date] = root.attributes['fecha']
101
+ response[:operation_number] = root.attributes['numeroOperacion']
102
+ response[:message] = root.attributes['valor']
103
+
104
+ if root.elements['OPERACION']
105
+ response[:operation_type] = root.elements['OPERACION'].attributes['tipo']
106
+ response[:amount] = root.elements['OPERACION/importe'].text.strip
107
+ end
108
+
109
+ response[:description] = root.elements['OPERACION/descripcion'].text if root.elements['OPERACION/descripcion']
110
+ response[:authorization_number] = root.elements['OPERACION/numeroAutorizacion'].text if root.elements['OPERACION/numeroAutorizacion']
111
+ response[:reference] = root.elements['OPERACION/referencia'].text if root.elements['OPERACION/referencia']
112
+ response[:pan] = root.elements['OPERACION/pan'].text if root.elements['OPERACION/pan']
113
+
114
+ if root.elements['ERROR']
115
+ response[:error_code] = root.elements['ERROR/codigo'].text
116
+ response[:error_message] = root.elements['ERROR/descripcion'].text
117
+ elsif root.elements['OPERACION'].attributes['numeroOperacion'] == '000'
118
+ response[:authorization] = root.elements['OPERACION/numeroAutorizacion'].text if root.elements['OPERACION/numeroAutorizacion']
119
+ else
120
+ response[:authorization] = root.attributes['numeroOperacion']
121
+ end
122
+
123
+ return response
124
+ rescue REXML::ParseException => e
125
+ response[:success] = false
126
+ response[:message] = 'Unable to parse the response.'
127
+ response[:error_message] = e.message
128
+ response
129
+ end
130
+
131
+ def commit(action, parameters)
132
+ parameters.merge!(
133
+ 'Cifrado' => CECA_ENCRIPTION,
134
+ 'Firma' => generate_signature(action, parameters),
135
+ 'Exponente' => CECA_DECIMALS,
136
+ 'MerchantID' => options[:merchant_id],
137
+ 'AcquirerBIN' => options[:acquirer_bin],
138
+ 'TerminalID' => options[:terminal_id]
139
+ )
140
+ url = (test? ? self.test_url : self.live_url) + "/tpvweb/#{action}.action"
141
+ xml = ssl_post("#{url}?", post_data(parameters))
142
+ response = parse(xml)
143
+ Response.new(
144
+ response[:success],
145
+ message_from(response),
146
+ response,
147
+ test: test?,
148
+ authorization: build_authorization(response),
149
+ error_code: response[:error_code]
150
+ )
151
+ end
152
+
153
+ def message_from(response)
154
+ if response[:message] == 'ERROR' && response[:error_message]
155
+ response[:error_message]
156
+ elsif response[:error_message]
157
+ "#{response[:message]} #{response[:error_message]}"
158
+ else
159
+ response[:message]
160
+ end
161
+ end
162
+
163
+ def post_data(params)
164
+ return nil unless params
165
+
166
+ params.map do |key, value|
167
+ next if value.blank?
168
+
169
+ if value.is_a?(Hash)
170
+ h = {}
171
+ value.each do |k, v|
172
+ h["#{key}.#{k}"] = v unless v.blank?
173
+ end
174
+ post_data(h)
175
+ else
176
+ "#{key}=#{CGI.escape(value.to_s)}"
177
+ end
178
+ end.compact.join('&')
179
+ end
180
+
181
+ def build_authorization(response)
182
+ [response[:reference], response[:authorization]].join('|')
183
+ end
184
+
185
+ def split_authorization(authorization)
186
+ authorization.split('|')
187
+ end
188
+
189
+ def generate_signature(action, parameters)
190
+ signature_fields =
191
+ case action
192
+ when CECA_ACTION_REFUND
193
+ options[:signature_key].to_s +
194
+ options[:merchant_id].to_s +
195
+ options[:acquirer_bin].to_s +
196
+ options[:terminal_id].to_s +
197
+ parameters['Num_operacion'].to_s +
198
+ parameters['Importe'].to_s +
199
+ parameters['TipoMoneda'].to_s +
200
+ CECA_DECIMALS +
201
+ parameters['Referencia'].to_s +
202
+ CECA_ENCRIPTION
203
+ else
204
+ options[:signature_key].to_s +
205
+ options[:merchant_id].to_s +
206
+ options[:acquirer_bin].to_s +
207
+ options[:terminal_id].to_s +
208
+ parameters['Num_operacion'].to_s +
209
+ parameters['Importe'].to_s +
210
+ parameters['TipoMoneda'].to_s +
211
+ CECA_DECIMALS +
212
+ CECA_ENCRIPTION +
213
+ CECA_NOTIFICATIONS_URL +
214
+ CECA_NOTIFICATIONS_URL
215
+ end
216
+ Digest::SHA2.hexdigest(signature_fields)
217
+ end
218
+ end
219
+ end
220
+ end
@@ -1,248 +1,15 @@
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
1
+ require 'active_merchant/billing/gateways/cecabank/cecabank_xml'
2
+ require 'active_merchant/billing/gateways/cecabank/cecabank_json'
116
3
 
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
4
+ module ActiveMerchant # :nodoc:
5
+ module Billing # :nodoc:
6
+ class CecabankGateway < Gateway
7
+ self.abstract_class = true
213
8
 
214
- def split_authorization(authorization)
215
- authorization.split('|')
216
- end
9
+ def self.new(options = {})
10
+ return CecabankJsonGateway.new(options) if options[:is_rest_json]
217
11
 
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)
12
+ CecabankXmlGateway.new(options)
246
13
  end
247
14
  end
248
15
  end
@@ -1,12 +1,13 @@
1
1
  require 'nokogiri'
2
2
 
3
- module ActiveMerchant #:nodoc:
4
- module Billing #:nodoc:
3
+ module ActiveMerchant # :nodoc:
4
+ module Billing # :nodoc:
5
5
  class CenposGateway < Gateway
6
6
  self.display_name = 'CenPOS'
7
7
  self.homepage_url = 'https://www.cenpos.com/'
8
8
 
9
9
  self.live_url = 'https://ww3.cenpos.net/6/transact.asmx'
10
+ self.test_url = 'https://abistaging.cenpos.net/6/transact.asmx'
10
11
 
11
12
  self.supported_countries = %w(AD AI AG AR AU AT BS BB BE BZ BM BR BN BG CA HR CY CZ DK DM EE FI FR DE GR GD GY HK HU IS IL IT JP LV LI LT LU MY MT MX MC MS NL PA PL PT KN LC MF VC SM SG SK SI ZA ES SR SE CH TR GB US UY)
12
13
  self.default_currency = 'USD'
@@ -98,6 +99,7 @@ module ActiveMerchant #:nodoc:
98
99
  post[:CurrencyCode] = options[:currency] || currency(money)
99
100
  post[:InvoiceDetail] = options[:invoice_detail] if options[:invoice_detail]
100
101
  post[:CustomerCode] = options[:customer_code] if options[:customer_code]
102
+ post[:PurchaseOrderNumber] = options[:purchase_order_number] if options[:purchase_order_number]
101
103
  add_order_id(post, options)
102
104
  add_tax(post, options)
103
105
  end
@@ -145,6 +147,10 @@ module ActiveMerchant #:nodoc:
145
147
  post[:Amount] = split_authorization(authorization).last
146
148
  end
147
149
 
150
+ def url
151
+ test? ? test_url : live_url
152
+ end
153
+
148
154
  def commit(action, post)
149
155
  post[:MerchantId] = @options[:merchant_id]
150
156
  post[:Password] = @options[:password]
@@ -153,7 +159,7 @@ module ActiveMerchant #:nodoc:
153
159
 
154
160
  data = build_request(post)
155
161
  begin
156
- xml = ssl_post(self.live_url, data, headers)
162
+ xml = ssl_post(url, data, headers)
157
163
  raw = parse(xml)
158
164
  rescue ActiveMerchant::ResponseError => e
159
165
  if e.response.code == '500' && e.response.body.start_with?('<s:Envelope')
@@ -1,8 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'nokogiri'
3
3
 
4
- module ActiveMerchant #:nodoc:
5
- module Billing #:nodoc:
4
+ module ActiveMerchant # :nodoc:
5
+ module Billing # :nodoc:
6
6
  class CheckoutGateway < Gateway
7
7
  self.default_currency = 'USD'
8
8
  self.money_format = :cents
@@ -70,7 +70,7 @@ module ActiveMerchant #:nodoc:
70
70
  _, _, orig_action, amount, currency = split_authorization(authorization)
71
71
  commit("void_#{orig_action}") do |xml|
72
72
  add_credentials(xml, options)
73
- add_invoice(xml, amount.to_i, options.merge(currency: currency))
73
+ add_invoice(xml, amount.to_i, options.merge(currency:))
74
74
  add_reference(xml, authorization)
75
75
  end
76
76
  end
@@ -159,8 +159,8 @@ module ActiveMerchant #:nodoc:
159
159
  xml.trackid(trackid) if trackid
160
160
  end
161
161
 
162
- def commit(action, amount = nil, options = {}, &builder)
163
- response = parse_xml(ssl_post(live_url, build_xml(action, &builder)))
162
+ def commit(action, amount = nil, options = {}, &)
163
+ response = parse_xml(ssl_post(live_url, build_xml(action, &)))
164
164
  Response.new(
165
165
  (response[:responsecode] == '0'),
166
166
  (response[:result] || response[:error_text] || 'Unknown Response'),