activemerchant 1.42.6 → 1.90.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 (450) hide show
  1. checksums.yaml +5 -13
  2. data/CHANGELOG +1420 -2
  3. data/CONTRIBUTORS +106 -0
  4. data/README.md +107 -103
  5. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  6. data/lib/active_merchant/billing/avs_result.rb +12 -13
  7. data/lib/active_merchant/billing/base.rb +13 -16
  8. data/lib/active_merchant/billing/check.rb +35 -24
  9. data/lib/active_merchant/billing/compatibility.rb +117 -0
  10. data/lib/active_merchant/billing/credit_card.rb +196 -81
  11. data/lib/active_merchant/billing/credit_card_formatting.rb +6 -4
  12. data/lib/active_merchant/billing/credit_card_methods.rb +199 -75
  13. data/lib/active_merchant/billing/cvv_result.rb +15 -15
  14. data/lib/active_merchant/billing/gateway.rb +171 -39
  15. data/lib/active_merchant/billing/gateways/adyen.rb +380 -0
  16. data/lib/active_merchant/billing/gateways/allied_wallet.rb +205 -0
  17. data/lib/active_merchant/billing/gateways/authorize_net.rb +933 -604
  18. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +417 -0
  19. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +74 -54
  20. data/lib/active_merchant/billing/gateways/axcessms.rb +181 -0
  21. data/lib/active_merchant/billing/gateways/balanced.rb +130 -370
  22. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  23. data/lib/active_merchant/billing/gateways/banwire.rb +23 -12
  24. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +351 -0
  25. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +6 -6
  26. data/lib/active_merchant/billing/gateways/be2bill.rb +2 -2
  27. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +109 -32
  28. data/lib/active_merchant/billing/gateways/beanstream.rb +59 -13
  29. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +12 -9
  30. data/lib/active_merchant/billing/gateways/blue_pay.rb +520 -498
  31. data/lib/active_merchant/billing/gateways/blue_snap.rb +347 -0
  32. data/lib/active_merchant/billing/gateways/bogus.rb +80 -46
  33. data/lib/active_merchant/billing/gateways/borgun.rb +220 -0
  34. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  35. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +15 -2
  36. data/lib/active_merchant/billing/gateways/braintree.rb +2 -2
  37. data/lib/active_merchant/billing/gateways/braintree_blue.rb +311 -121
  38. data/lib/active_merchant/billing/gateways/braintree_orange.rb +4 -4
  39. data/lib/active_merchant/billing/gateways/bridge_pay.rb +244 -0
  40. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  41. data/lib/active_merchant/billing/gateways/card_connect.rb +311 -0
  42. data/lib/active_merchant/billing/gateways/card_save.rb +6 -7
  43. data/lib/active_merchant/billing/gateways/card_stream.rb +235 -89
  44. data/lib/active_merchant/billing/gateways/cardknox.rb +327 -0
  45. data/lib/active_merchant/billing/gateways/cardprocess.rb +254 -0
  46. data/lib/active_merchant/billing/gateways/cashnet.rb +219 -0
  47. data/lib/active_merchant/billing/gateways/cc5.rb +50 -8
  48. data/lib/active_merchant/billing/gateways/cecabank.rb +27 -14
  49. data/lib/active_merchant/billing/gateways/cenpos.rb +327 -0
  50. data/lib/active_merchant/billing/gateways/checkout.rb +214 -0
  51. data/lib/active_merchant/billing/gateways/checkout_v2.rb +233 -0
  52. data/lib/active_merchant/billing/gateways/citrus_pay.rb +22 -0
  53. data/lib/active_merchant/billing/gateways/clearhaus.rb +220 -0
  54. data/lib/active_merchant/billing/gateways/commercegate.rb +142 -0
  55. data/lib/active_merchant/billing/gateways/conekta.rb +91 -97
  56. data/lib/active_merchant/billing/gateways/creditcall.rb +271 -0
  57. data/lib/active_merchant/billing/gateways/credorax.rb +356 -0
  58. data/lib/active_merchant/billing/gateways/ct_payment.rb +268 -0
  59. data/lib/active_merchant/billing/gateways/culqi.rb +277 -0
  60. data/lib/active_merchant/billing/gateways/cyber_source.rb +294 -158
  61. data/lib/active_merchant/billing/gateways/d_local.rb +226 -0
  62. data/lib/active_merchant/billing/gateways/data_cash.rb +59 -347
  63. data/lib/active_merchant/billing/gateways/dibs.rb +199 -0
  64. data/lib/active_merchant/billing/gateways/digitzs.rb +292 -0
  65. data/lib/active_merchant/billing/gateways/ebanx.rb +296 -0
  66. data/lib/active_merchant/billing/gateways/efsnet.rb +24 -39
  67. data/lib/active_merchant/billing/gateways/elavon.rb +146 -147
  68. data/lib/active_merchant/billing/gateways/element.rb +356 -0
  69. data/lib/active_merchant/billing/gateways/epay.rb +41 -31
  70. data/lib/active_merchant/billing/gateways/evo_ca.rb +1 -1
  71. data/lib/active_merchant/billing/gateways/eway.rb +79 -78
  72. data/lib/active_merchant/billing/gateways/eway_managed.rb +35 -36
  73. data/lib/active_merchant/billing/gateways/eway_rapid.rb +369 -228
  74. data/lib/active_merchant/billing/gateways/exact.rb +32 -26
  75. data/lib/active_merchant/billing/gateways/ezic.rb +195 -0
  76. data/lib/active_merchant/billing/gateways/fat_zebra.rb +90 -64
  77. data/lib/active_merchant/billing/gateways/federated_canada.rb +6 -14
  78. data/lib/active_merchant/billing/gateways/finansbank.rb +3 -3
  79. data/lib/active_merchant/billing/gateways/first_giving.rb +142 -0
  80. data/lib/active_merchant/billing/gateways/first_pay.rb +128 -122
  81. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +190 -64
  82. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +446 -0
  83. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  84. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  85. data/lib/active_merchant/billing/gateways/forte.rb +270 -0
  86. data/lib/active_merchant/billing/gateways/garanti.rb +29 -27
  87. data/lib/active_merchant/billing/gateways/global_collect.rb +340 -0
  88. data/lib/active_merchant/billing/gateways/global_transport.rb +194 -0
  89. data/lib/active_merchant/billing/gateways/hdfc.rb +35 -36
  90. data/lib/active_merchant/billing/gateways/hps.rb +305 -0
  91. data/lib/active_merchant/billing/gateways/iats_payments.rb +271 -16
  92. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  93. data/lib/active_merchant/billing/gateways/inspire.rb +29 -32
  94. data/lib/active_merchant/billing/gateways/instapay.rb +5 -6
  95. data/lib/active_merchant/billing/gateways/ipp.rb +175 -0
  96. data/lib/active_merchant/billing/gateways/iridium.rb +247 -41
  97. data/lib/active_merchant/billing/gateways/itransact.rb +4 -5
  98. data/lib/active_merchant/billing/gateways/iveri.rb +251 -0
  99. data/lib/active_merchant/billing/gateways/jetpay.rb +198 -71
  100. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +437 -0
  101. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  102. data/lib/active_merchant/billing/gateways/kushki.rb +219 -0
  103. data/lib/active_merchant/billing/gateways/latitude19.rb +411 -0
  104. data/lib/active_merchant/billing/gateways/linkpoint.rb +45 -43
  105. data/lib/active_merchant/billing/gateways/litle.rb +328 -444
  106. data/lib/active_merchant/billing/gateways/mastercard.rb +267 -0
  107. data/lib/active_merchant/billing/gateways/maxipago.rb +145 -115
  108. data/lib/active_merchant/billing/gateways/mercado_pago.rb +277 -0
  109. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +37 -19
  110. data/lib/active_merchant/billing/gateways/merchant_one.rb +13 -15
  111. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  112. data/lib/active_merchant/billing/gateways/merchant_ware.rb +57 -60
  113. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +59 -48
  114. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +38 -19
  115. data/lib/active_merchant/billing/gateways/mercury.rb +77 -54
  116. data/lib/active_merchant/billing/gateways/metrics_global.rb +11 -30
  117. data/lib/active_merchant/billing/gateways/micropayment.rb +183 -0
  118. data/lib/active_merchant/billing/gateways/migs.rb +81 -22
  119. data/lib/active_merchant/billing/gateways/modern_payments.rb +3 -3
  120. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +23 -25
  121. data/lib/active_merchant/billing/gateways/monei.rb +307 -0
  122. data/lib/active_merchant/billing/gateways/moneris.rb +146 -64
  123. data/lib/active_merchant/billing/gateways/moneris_us.rb +197 -53
  124. data/lib/active_merchant/billing/gateways/money_movers.rb +6 -15
  125. data/lib/active_merchant/billing/gateways/mundipagg.rb +292 -0
  126. data/lib/active_merchant/billing/gateways/nab_transact.rb +86 -64
  127. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +165 -0
  128. data/lib/active_merchant/billing/gateways/net_registry.rb +11 -5
  129. data/lib/active_merchant/billing/gateways/netaxept.rb +21 -22
  130. data/lib/active_merchant/billing/gateways/netbanx.rb +290 -0
  131. data/lib/active_merchant/billing/gateways/netbilling.rb +70 -35
  132. data/lib/active_merchant/billing/gateways/netpay.rb +5 -6
  133. data/lib/active_merchant/billing/gateways/network_merchants.rb +241 -0
  134. data/lib/active_merchant/billing/gateways/nmi.rb +274 -10
  135. data/lib/active_merchant/billing/gateways/ogone.rb +90 -47
  136. data/lib/active_merchant/billing/gateways/omise.rb +324 -0
  137. data/lib/active_merchant/billing/gateways/openpay.rb +48 -20
  138. data/lib/active_merchant/billing/gateways/opp.rb +369 -0
  139. data/lib/active_merchant/billing/gateways/optimal_payment.rb +79 -44
  140. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +22 -21
  141. data/lib/active_merchant/billing/gateways/orbital.rb +346 -102
  142. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +48 -29
  143. data/lib/active_merchant/billing/gateways/pagarme.rb +246 -0
  144. data/lib/active_merchant/billing/gateways/pago_facil.rb +122 -0
  145. data/lib/active_merchant/billing/gateways/pay_conex.rb +245 -0
  146. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +67 -48
  147. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  148. data/lib/active_merchant/billing/gateways/pay_junction.rb +20 -26
  149. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +188 -0
  150. data/lib/active_merchant/billing/gateways/pay_secure.rb +7 -15
  151. data/lib/active_merchant/billing/gateways/paybox_direct.rb +40 -36
  152. data/lib/active_merchant/billing/gateways/payeezy.rb +410 -0
  153. data/lib/active_merchant/billing/gateways/payex.rb +38 -30
  154. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +62 -36
  155. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +11 -7
  156. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +3 -3
  157. data/lib/active_merchant/billing/gateways/payflow.rb +74 -27
  158. data/lib/active_merchant/billing/gateways/payflow_express.rb +77 -81
  159. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +2 -3
  160. data/lib/active_merchant/billing/gateways/payflow_uk.rb +5 -6
  161. data/lib/active_merchant/billing/gateways/payment_express.rb +54 -45
  162. data/lib/active_merchant/billing/gateways/paymentez.rb +304 -0
  163. data/lib/active_merchant/billing/gateways/paymill.rb +160 -66
  164. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +54 -7
  165. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +4 -0
  166. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +17 -3
  167. data/lib/active_merchant/billing/gateways/paypal.rb +36 -27
  168. data/lib/active_merchant/billing/gateways/paypal_ca.rb +1 -1
  169. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +7 -6
  170. data/lib/active_merchant/billing/gateways/paypal_express.rb +32 -4
  171. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +3 -3
  172. data/lib/active_merchant/billing/gateways/payscout.rb +2 -13
  173. data/lib/active_merchant/billing/gateways/paystation.rb +96 -88
  174. data/lib/active_merchant/billing/gateways/payu_in.rb +248 -0
  175. data/lib/active_merchant/billing/gateways/payu_latam.rb +445 -0
  176. data/lib/active_merchant/billing/gateways/payway.rb +8 -8
  177. data/lib/active_merchant/billing/gateways/pin.rb +74 -18
  178. data/lib/active_merchant/billing/gateways/plugnpay.rb +66 -76
  179. data/lib/active_merchant/billing/gateways/pro_pay.rb +326 -0
  180. data/lib/active_merchant/billing/gateways/psigate.rb +30 -30
  181. data/lib/active_merchant/billing/gateways/psl_card.rb +27 -34
  182. data/lib/active_merchant/billing/gateways/qbms.rb +65 -54
  183. data/lib/active_merchant/billing/gateways/quantum.rb +18 -18
  184. data/lib/active_merchant/billing/gateways/quickbooks.rb +290 -0
  185. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +184 -0
  186. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +295 -0
  187. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +226 -0
  188. data/lib/active_merchant/billing/gateways/quickpay.rb +10 -350
  189. data/lib/active_merchant/billing/gateways/qvalent.rb +236 -0
  190. data/lib/active_merchant/billing/gateways/realex.rb +78 -48
  191. data/lib/active_merchant/billing/gateways/redsys.rb +310 -170
  192. data/lib/active_merchant/billing/gateways/s5.rb +246 -0
  193. data/lib/active_merchant/billing/gateways/safe_charge.rb +262 -0
  194. data/lib/active_merchant/billing/gateways/sage.rb +415 -119
  195. data/lib/active_merchant/billing/gateways/sage_pay.rb +195 -90
  196. data/lib/active_merchant/billing/gateways/sallie_mae.rb +11 -12
  197. data/lib/active_merchant/billing/gateways/secure_net.rb +51 -43
  198. data/lib/active_merchant/billing/gateways/secure_pay.rb +182 -10
  199. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +25 -14
  200. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +10 -18
  201. data/lib/active_merchant/billing/gateways/securion_pay.rb +264 -0
  202. data/lib/active_merchant/billing/gateways/skip_jack.rb +35 -38
  203. data/lib/active_merchant/billing/gateways/smart_ps.rb +50 -42
  204. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +9 -9
  205. data/lib/active_merchant/billing/gateways/spreedly_core.rb +62 -12
  206. data/lib/active_merchant/billing/gateways/stripe.rb +536 -103
  207. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +12 -18
  208. data/lib/active_merchant/billing/gateways/telr.rb +274 -0
  209. data/lib/active_merchant/billing/gateways/tns.rb +22 -0
  210. data/lib/active_merchant/billing/gateways/trans_first.rb +143 -30
  211. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +608 -0
  212. data/lib/active_merchant/billing/gateways/transact_pro.rb +224 -0
  213. data/lib/active_merchant/billing/gateways/transax.rb +5 -6
  214. data/lib/active_merchant/billing/gateways/transnational.rb +2 -232
  215. data/lib/active_merchant/billing/gateways/trexle.rb +218 -0
  216. data/lib/active_merchant/billing/gateways/trust_commerce.rb +86 -57
  217. data/lib/active_merchant/billing/gateways/usa_epay.rb +4 -4
  218. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +196 -89
  219. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +157 -32
  220. data/lib/active_merchant/billing/gateways/vanco.rb +294 -0
  221. data/lib/active_merchant/billing/gateways/verifi.rb +42 -49
  222. data/lib/active_merchant/billing/gateways/viaklix.rb +11 -24
  223. data/lib/active_merchant/billing/gateways/visanet_peru.rb +233 -0
  224. data/lib/active_merchant/billing/gateways/webpay.rb +26 -28
  225. data/lib/active_merchant/billing/gateways/wepay.rb +237 -0
  226. data/lib/active_merchant/billing/gateways/wirecard.rb +153 -31
  227. data/lib/active_merchant/billing/gateways/world_net.rb +344 -0
  228. data/lib/active_merchant/billing/gateways/worldpay.rb +207 -63
  229. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +215 -0
  230. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  231. data/lib/active_merchant/billing/gateways.rb +8 -11
  232. data/lib/active_merchant/billing/model.rb +30 -0
  233. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  234. data/lib/active_merchant/billing/payment_token.rb +21 -0
  235. data/lib/active_merchant/billing/rails.rb +3 -0
  236. data/lib/active_merchant/billing/response.rb +31 -24
  237. data/lib/active_merchant/billing.rb +7 -1
  238. data/lib/active_merchant/connection.rb +195 -0
  239. data/lib/active_merchant/country.rb +335 -0
  240. data/lib/active_merchant/empty.rb +20 -0
  241. data/lib/active_merchant/errors.rb +35 -0
  242. data/lib/active_merchant/net_http_ssl_connection.rb +10 -0
  243. data/lib/active_merchant/network_connection_retries.rb +80 -0
  244. data/lib/active_merchant/post_data.rb +25 -0
  245. data/lib/active_merchant/posts_data.rb +92 -0
  246. data/lib/active_merchant/version.rb +1 -1
  247. data/lib/active_merchant.rb +23 -27
  248. data/lib/activemerchant.rb +1 -1
  249. data/lib/certs/cacert.pem +3988 -0
  250. data/lib/support/gateway_support.rb +7 -9
  251. data/lib/support/outbound_hosts.rb +13 -10
  252. data/lib/support/ssl_verify.rb +6 -7
  253. data/lib/support/ssl_version.rb +87 -0
  254. metadata +148 -323
  255. checksums.yaml.gz.sig +0 -0
  256. data/gem-public_cert.pem +0 -21
  257. data/lib/active_merchant/billing/expiry_date.rb +0 -34
  258. data/lib/active_merchant/billing/gateways/app55.rb +0 -185
  259. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +0 -314
  260. data/lib/active_merchant/billing/gateways/certo_direct.rb +0 -277
  261. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +0 -249
  262. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +0 -13
  263. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +0 -29
  264. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +0 -66
  265. data/lib/active_merchant/billing/gateways/orbital/avs_result.rb +0 -93
  266. data/lib/active_merchant/billing/gateways/orbital/cvv_result.rb +0 -34
  267. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +0 -93
  268. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +0 -114
  269. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +0 -102
  270. data/lib/active_merchant/billing/gateways/samurai.rb +0 -118
  271. data/lib/active_merchant/billing/gateways/vindicia.rb +0 -361
  272. data/lib/active_merchant/billing/integrations/a1agregator/helper.rb +0 -31
  273. data/lib/active_merchant/billing/integrations/a1agregator/notification.rb +0 -186
  274. data/lib/active_merchant/billing/integrations/a1agregator/status.rb +0 -38
  275. data/lib/active_merchant/billing/integrations/a1agregator.rb +0 -26
  276. data/lib/active_merchant/billing/integrations/action_view_helper.rb +0 -74
  277. data/lib/active_merchant/billing/integrations/alipay/helper.rb +0 -34
  278. data/lib/active_merchant/billing/integrations/alipay/notification.rb +0 -101
  279. data/lib/active_merchant/billing/integrations/alipay.rb +0 -18
  280. data/lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb +0 -229
  281. data/lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb +0 -340
  282. data/lib/active_merchant/billing/integrations/authorize_net_sim.rb +0 -38
  283. data/lib/active_merchant/billing/integrations/bit_pay/helper.rb +0 -64
  284. data/lib/active_merchant/billing/integrations/bit_pay/notification.rb +0 -74
  285. data/lib/active_merchant/billing/integrations/bit_pay/return.rb +0 -10
  286. data/lib/active_merchant/billing/integrations/bit_pay.rb +0 -30
  287. data/lib/active_merchant/billing/integrations/bogus/helper.rb +0 -17
  288. data/lib/active_merchant/billing/integrations/bogus/notification.rb +0 -11
  289. data/lib/active_merchant/billing/integrations/bogus/return.rb +0 -10
  290. data/lib/active_merchant/billing/integrations/bogus.rb +0 -23
  291. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +0 -120
  292. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +0 -158
  293. data/lib/active_merchant/billing/integrations/chronopay/return.rb +0 -10
  294. data/lib/active_merchant/billing/integrations/chronopay.rb +0 -23
  295. data/lib/active_merchant/billing/integrations/citrus/helper.rb +0 -40
  296. data/lib/active_merchant/billing/integrations/citrus/notification.rb +0 -133
  297. data/lib/active_merchant/billing/integrations/citrus/return.rb +0 -40
  298. data/lib/active_merchant/billing/integrations/citrus.rb +0 -51
  299. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +0 -200
  300. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +0 -76
  301. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +0 -32
  302. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +0 -37
  303. data/lib/active_merchant/billing/integrations/direc_pay.rb +0 -41
  304. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +0 -90
  305. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +0 -120
  306. data/lib/active_merchant/billing/integrations/directebanking/return.rb +0 -11
  307. data/lib/active_merchant/billing/integrations/directebanking.rb +0 -47
  308. data/lib/active_merchant/billing/integrations/doku/helper.rb +0 -102
  309. data/lib/active_merchant/billing/integrations/doku/notification.rb +0 -69
  310. data/lib/active_merchant/billing/integrations/doku/return.rb +0 -10
  311. data/lib/active_merchant/billing/integrations/doku.rb +0 -24
  312. data/lib/active_merchant/billing/integrations/dotpay/helper.rb +0 -77
  313. data/lib/active_merchant/billing/integrations/dotpay/notification.rb +0 -86
  314. data/lib/active_merchant/billing/integrations/dotpay/return.rb +0 -11
  315. data/lib/active_merchant/billing/integrations/dotpay.rb +0 -22
  316. data/lib/active_merchant/billing/integrations/dwolla/common.rb +0 -23
  317. data/lib/active_merchant/billing/integrations/dwolla/helper.rb +0 -43
  318. data/lib/active_merchant/billing/integrations/dwolla/notification.rb +0 -64
  319. data/lib/active_merchant/billing/integrations/dwolla/return.rb +0 -49
  320. data/lib/active_merchant/billing/integrations/dwolla.rb +0 -23
  321. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +0 -34
  322. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +0 -84
  323. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +0 -48
  324. data/lib/active_merchant/billing/integrations/easy_pay/common.rb +0 -40
  325. data/lib/active_merchant/billing/integrations/easy_pay/helper.rb +0 -36
  326. data/lib/active_merchant/billing/integrations/easy_pay/notification.rb +0 -59
  327. data/lib/active_merchant/billing/integrations/easy_pay.rb +0 -30
  328. data/lib/active_merchant/billing/integrations/epay/helper.rb +0 -55
  329. data/lib/active_merchant/billing/integrations/epay/notification.rb +0 -110
  330. data/lib/active_merchant/billing/integrations/epay.rb +0 -21
  331. data/lib/active_merchant/billing/integrations/first_data/helper.rb +0 -61
  332. data/lib/active_merchant/billing/integrations/first_data/notification.rb +0 -56
  333. data/lib/active_merchant/billing/integrations/first_data.rb +0 -38
  334. data/lib/active_merchant/billing/integrations/gestpay/common.rb +0 -42
  335. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +0 -70
  336. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +0 -85
  337. data/lib/active_merchant/billing/integrations/gestpay/return.rb +0 -10
  338. data/lib/active_merchant/billing/integrations/gestpay.rb +0 -25
  339. data/lib/active_merchant/billing/integrations/helper.rb +0 -117
  340. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +0 -58
  341. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +0 -59
  342. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +0 -68
  343. data/lib/active_merchant/billing/integrations/hi_trust.rb +0 -27
  344. data/lib/active_merchant/billing/integrations/ipay88/helper.rb +0 -118
  345. data/lib/active_merchant/billing/integrations/ipay88/notification.rb +0 -103
  346. data/lib/active_merchant/billing/integrations/ipay88/return.rb +0 -29
  347. data/lib/active_merchant/billing/integrations/ipay88.rb +0 -23
  348. data/lib/active_merchant/billing/integrations/liqpay/helper.rb +0 -43
  349. data/lib/active_merchant/billing/integrations/liqpay/notification.rb +0 -89
  350. data/lib/active_merchant/billing/integrations/liqpay/return.rb +0 -83
  351. data/lib/active_merchant/billing/integrations/liqpay.rb +0 -30
  352. data/lib/active_merchant/billing/integrations/maksuturva/helper.rb +0 -119
  353. data/lib/active_merchant/billing/integrations/maksuturva/notification.rb +0 -48
  354. data/lib/active_merchant/billing/integrations/maksuturva.rb +0 -86
  355. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +0 -75
  356. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +0 -123
  357. data/lib/active_merchant/billing/integrations/moneybookers.rb +0 -26
  358. data/lib/active_merchant/billing/integrations/nochex/helper.rb +0 -68
  359. data/lib/active_merchant/billing/integrations/nochex/notification.rb +0 -94
  360. data/lib/active_merchant/billing/integrations/nochex/return.rb +0 -10
  361. data/lib/active_merchant/billing/integrations/nochex.rb +0 -88
  362. data/lib/active_merchant/billing/integrations/notification.rb +0 -71
  363. data/lib/active_merchant/billing/integrations/paxum/common.rb +0 -24
  364. data/lib/active_merchant/billing/integrations/paxum/helper.rb +0 -42
  365. data/lib/active_merchant/billing/integrations/paxum/notification.rb +0 -33
  366. data/lib/active_merchant/billing/integrations/paxum.rb +0 -44
  367. data/lib/active_merchant/billing/integrations/pay_fast/common.rb +0 -42
  368. data/lib/active_merchant/billing/integrations/pay_fast/helper.rb +0 -50
  369. data/lib/active_merchant/billing/integrations/pay_fast/notification.rb +0 -134
  370. data/lib/active_merchant/billing/integrations/pay_fast/return.rb +0 -10
  371. data/lib/active_merchant/billing/integrations/pay_fast.rb +0 -70
  372. data/lib/active_merchant/billing/integrations/paydollar/helper.rb +0 -41
  373. data/lib/active_merchant/billing/integrations/paydollar/notification.rb +0 -60
  374. data/lib/active_merchant/billing/integrations/paydollar/return.rb +0 -15
  375. data/lib/active_merchant/billing/integrations/paydollar.rb +0 -59
  376. data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +0 -116
  377. data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +0 -78
  378. data/lib/active_merchant/billing/integrations/payflow_link.rb +0 -21
  379. data/lib/active_merchant/billing/integrations/paypal/helper.rb +0 -119
  380. data/lib/active_merchant/billing/integrations/paypal/notification.rb +0 -227
  381. data/lib/active_merchant/billing/integrations/paypal/return.rb +0 -10
  382. data/lib/active_merchant/billing/integrations/paypal.rb +0 -39
  383. data/lib/active_merchant/billing/integrations/paypal_payments_advanced/helper.rb +0 -15
  384. data/lib/active_merchant/billing/integrations/paypal_payments_advanced.rb +0 -20
  385. data/lib/active_merchant/billing/integrations/paysbuy/helper.rb +0 -15
  386. data/lib/active_merchant/billing/integrations/paysbuy/notification.rb +0 -39
  387. data/lib/active_merchant/billing/integrations/paysbuy.rb +0 -36
  388. data/lib/active_merchant/billing/integrations/payu_in/helper.rb +0 -76
  389. data/lib/active_merchant/billing/integrations/payu_in/notification.rb +0 -154
  390. data/lib/active_merchant/billing/integrations/payu_in/return.rb +0 -36
  391. data/lib/active_merchant/billing/integrations/payu_in.rb +0 -36
  392. data/lib/active_merchant/billing/integrations/payu_in_paisa/helper.rb +0 -19
  393. data/lib/active_merchant/billing/integrations/payu_in_paisa/notification.rb +0 -13
  394. data/lib/active_merchant/billing/integrations/payu_in_paisa/return.rb +0 -16
  395. data/lib/active_merchant/billing/integrations/payu_in_paisa.rb +0 -30
  396. data/lib/active_merchant/billing/integrations/platron/helper.rb +0 -32
  397. data/lib/active_merchant/billing/integrations/platron/notification.rb +0 -113
  398. data/lib/active_merchant/billing/integrations/platron.rb +0 -28
  399. data/lib/active_merchant/billing/integrations/pxpay/helper.rb +0 -112
  400. data/lib/active_merchant/billing/integrations/pxpay/notification.rb +0 -157
  401. data/lib/active_merchant/billing/integrations/pxpay/return.rb +0 -25
  402. data/lib/active_merchant/billing/integrations/pxpay.rb +0 -31
  403. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +0 -96
  404. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +0 -137
  405. data/lib/active_merchant/billing/integrations/quickpay.rb +0 -21
  406. data/lib/active_merchant/billing/integrations/rbkmoney/helper.rb +0 -23
  407. data/lib/active_merchant/billing/integrations/rbkmoney/notification.rb +0 -91
  408. data/lib/active_merchant/billing/integrations/rbkmoney.rb +0 -17
  409. data/lib/active_merchant/billing/integrations/return.rb +0 -42
  410. data/lib/active_merchant/billing/integrations/robokassa/common.rb +0 -19
  411. data/lib/active_merchant/billing/integrations/robokassa/helper.rb +0 -50
  412. data/lib/active_merchant/billing/integrations/robokassa/notification.rb +0 -55
  413. data/lib/active_merchant/billing/integrations/robokassa/return.rb +0 -17
  414. data/lib/active_merchant/billing/integrations/robokassa.rb +0 -49
  415. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +0 -33
  416. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +0 -136
  417. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +0 -210
  418. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +0 -31
  419. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +0 -37
  420. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +0 -107
  421. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +0 -171
  422. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +0 -58
  423. data/lib/active_merchant/billing/integrations/two_checkout.rb +0 -44
  424. data/lib/active_merchant/billing/integrations/valitor/helper.rb +0 -86
  425. data/lib/active_merchant/billing/integrations/valitor/notification.rb +0 -13
  426. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +0 -97
  427. data/lib/active_merchant/billing/integrations/valitor/return.rb +0 -13
  428. data/lib/active_merchant/billing/integrations/valitor.rb +0 -33
  429. data/lib/active_merchant/billing/integrations/verkkomaksut/helper.rb +0 -88
  430. data/lib/active_merchant/billing/integrations/verkkomaksut/notification.rb +0 -59
  431. data/lib/active_merchant/billing/integrations/verkkomaksut.rb +0 -20
  432. data/lib/active_merchant/billing/integrations/web_pay/common.rb +0 -50
  433. data/lib/active_merchant/billing/integrations/web_pay/helper.rb +0 -68
  434. data/lib/active_merchant/billing/integrations/web_pay/notification.rb +0 -51
  435. data/lib/active_merchant/billing/integrations/web_pay.rb +0 -45
  436. data/lib/active_merchant/billing/integrations/webmoney/common.rb +0 -17
  437. data/lib/active_merchant/billing/integrations/webmoney/helper.rb +0 -40
  438. data/lib/active_merchant/billing/integrations/webmoney/notification.rb +0 -47
  439. data/lib/active_merchant/billing/integrations/webmoney.rb +0 -43
  440. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/common.rb +0 -104
  441. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/helper.rb +0 -145
  442. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/notification.rb +0 -101
  443. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/return.rb +0 -35
  444. data/lib/active_merchant/billing/integrations/wirecard_checkout_page.rb +0 -39
  445. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +0 -101
  446. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +0 -160
  447. data/lib/active_merchant/billing/integrations/world_pay.rb +0 -34
  448. data/lib/active_merchant/billing/integrations.rb +0 -17
  449. data.tar.gz.sig +0 -0
  450. metadata.gz.sig +0 -1
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  require 'nokogiri'
3
4
 
4
5
  module ActiveMerchant #:nodoc:
@@ -9,30 +10,14 @@ module ActiveMerchant #:nodoc:
9
10
  # used by many banks in Spain and is particularly well supported by
10
11
  # Catalunya Caixa's ecommerce department.
11
12
  #
12
- # Standard ActiveMerchant methods are supported, with one notable exception:
13
- # :order_id must be provided and must conform to a very specific format.
14
- #
15
- # == Example use:
16
- #
17
- # gateway = ActiveMerchant::Billing::RedsysGateway.new(
18
- # :login => "091358382",
19
- # :secret_key => "qwertyasdf0123456789"
20
- # )
21
- #
22
- # # Run a purchase for 10 euros
23
- # response = gateway.purchase(1000, creditcard, :order_id => "123456")
24
- # puts reponse.success? # => true
25
- #
26
- # # Partially refund the purchase
27
- # response = gateway.refund(500, response.authorization)
13
+ # Redsys requires an order_id be provided with each transaction and it must
14
+ # follow a specific format. The rules are as follows:
28
15
  #
29
- # Redsys requires an order_id be provided with each transaction of a
30
- # specific format. The rules are as follows:
31
- #
32
- # * Minimum length: 4
33
- # * Maximum length: 12
34
16
  # * First 4 digits must be numerical
35
17
  # * Remaining 8 digits may be alphanumeric
18
+ # * Max length: 12
19
+ #
20
+ # If an invalid order_id is provided, we do our best to clean it up.
36
21
  #
37
22
  # Much of the code for this library is based on the active_merchant_sermepa
38
23
  # integration gateway which uses essentially the same API but with the
@@ -40,43 +25,66 @@ module ActiveMerchant #:nodoc:
40
25
  #
41
26
  # Written by Samuel Lown for Cabify. For implementation questions, or
42
27
  # test access details please get in touch: sam@cabify.com.
28
+ #
29
+ # *** SHA256 Authentication Update ***
30
+ #
31
+ # Redsys is dropping support for the SHA1 authentication method. This
32
+ # adapter has been updated to work with the new SHA256 authentication
33
+ # method, however in your initialization options hash you will need to
34
+ # specify the key/value :signature_algorithm => "sha256" to use the
35
+ # SHA256 method. Otherwise it will default to using the SHA1.
36
+ #
37
+ #
43
38
  class RedsysGateway < Gateway
44
- self.live_url = "https://sis.sermepa.es/sis/operaciones"
45
- self.test_url = "https://sis-t.sermepa.es:25443/sis/operaciones"
39
+ self.live_url = 'https://sis.sermepa.es/sis/operaciones'
40
+ self.test_url = 'https://sis-t.redsys.es:25443/sis/operaciones'
46
41
 
47
- # Sensible region specific defaults.
48
42
  self.supported_countries = ['ES']
49
43
  self.default_currency = 'EUR'
50
44
  self.money_format = :cents
51
45
 
52
46
  # Not all card types may be activated by the bank!
53
47
  self.supported_cardtypes = [:visa, :master, :american_express, :jcb, :diners_club]
54
-
55
- # Homepage URL of the gateway for reference
56
- self.homepage_url = "http://www.redsys.es/"
57
-
58
- # What to call this gateway
59
- self.display_name = "Redsys"
48
+ self.homepage_url = 'http://www.redsys.es/'
49
+ self.display_name = 'Redsys'
60
50
 
61
51
  CURRENCY_CODES = {
62
- "ARS" => '032',
63
- "AUD" => '036',
64
- "BRL" => '986',
65
- "BOB" => '068',
66
- "CAD" => '124',
67
- "CHF" => '756',
68
- "CLP" => '152',
69
- "COP" => '170',
70
- "EUR" => '978',
71
- "GBP" => '826',
72
- "GTQ" => '320',
73
- "JPY" => '392',
74
- "MXN" => '484',
75
- "NZD" => '554',
76
- "PEN" => '604',
77
- "RUB" => '643',
78
- "USD" => '840',
79
- "UYU" => '858'
52
+ 'AED' => '784',
53
+ 'ARS' => '32',
54
+ 'AUD' => '36',
55
+ 'BRL' => '986',
56
+ 'BOB' => '68',
57
+ 'CAD' => '124',
58
+ 'CHF' => '756',
59
+ 'CLP' => '152',
60
+ 'CNY' => '156',
61
+ 'COP' => '170',
62
+ 'CRC' => '188',
63
+ 'CZK' => '203',
64
+ 'DKK' => '208',
65
+ 'DOP' => '214',
66
+ 'EUR' => '978',
67
+ 'GBP' => '826',
68
+ 'GTQ' => '320',
69
+ 'HUF' => '348',
70
+ 'IDR' => '360',
71
+ 'INR' => '356',
72
+ 'JPY' => '392',
73
+ 'KRW' => '410',
74
+ 'MYR' => '458',
75
+ 'MXN' => '484',
76
+ 'NOK' => '578',
77
+ 'NZD' => '554',
78
+ 'PEN' => '604',
79
+ 'PLN' => '985',
80
+ 'RUB' => '643',
81
+ 'SAR' => '682',
82
+ 'SEK' => '752',
83
+ 'SGD' => '702',
84
+ 'THB' => '764',
85
+ 'TWD' => '901',
86
+ 'USD' => '840',
87
+ 'UYU' => '858'
80
88
  }
81
89
 
82
90
  # The set of supported transactions for this gateway.
@@ -94,77 +102,72 @@ module ActiveMerchant #:nodoc:
94
102
  # a card has been rejected. Syntax or general request errors
95
103
  # are not covered here.
96
104
  RESPONSE_TEXTS = {
97
- # Accepted Codes
98
- 0 => "Transaction Approved",
99
- 400 => "Cancellation Accepted",
100
- 481 => "Cancellation Accepted",
101
- 500 => "Reconciliation Accepted",
102
- 900 => "Refund / Confirmation approved",
103
-
104
- # Declined error codes
105
- 101 => "Card expired",
106
- 102 => "Card blocked temporarily or under susciption of fraud",
107
- 104 => "Transaction not permitted",
108
- 107 => "Contact the card issuer",
109
- 109 => "Invalid identification by merchant or POS terminal",
110
- 110 => "Invalid amount",
111
- 114 => "Card cannot be used to the requested transaction",
112
- 116 => "Insufficient credit",
113
- 118 => "Non-registered card",
114
- 125 => "Card not effective",
115
- 129 => "CVV2/CVC2 Error",
116
- 167 => "Contact the card issuer: suspected fraud",
117
- 180 => "Card out of service",
118
- 181 => "Card with credit or debit restrictions",
119
- 182 => "Card with credit or debit restrictions",
120
- 184 => "Authentication error",
121
- 190 => "Refusal with no specific reason",
122
- 191 => "Expiry date incorrect",
123
-
124
- # Declined, and suspected of fraud
125
- 201 => "Card expired",
126
- 202 => "Card blocked temporarily or under suscipition of fraud",
127
- 204 => "Transaction not permitted",
128
- 207 => "Contact the card issuer",
129
- 208 => "Lost or stolen card",
130
- 209 => "Lost or stolen card",
131
- 280 => "CVV2/CVC2 Error",
132
- 290 => "Declined with no specific reason",
133
-
134
- # More general codes for specific types of transaction
135
- 480 => "Original transaction not located, or time-out exceeded",
136
- 501 => "Original transaction not located, or time-out exceeded",
137
- 502 => "Original transaction not located, or time-out exceeded",
138
- 503 => "Original transaction not located, or time-out exceeded",
139
-
140
- # Declined transactions by the bank
141
- 904 => "Merchant not registered at FUC",
142
- 909 => "System error",
143
- 912 => "Issuer not available",
144
- 913 => "Duplicate transmission",
145
- 916 => "Amount too low",
146
- 928 => "Time-out exceeded",
147
- 940 => "Transaction cancelled previously",
148
- 941 => "Authorization operation already cancelled",
149
- 942 => "Original authorization declined",
150
- 943 => "Different details from origin transaction",
151
- 944 => "Session error",
152
- 945 => "Duplicate transmission",
153
- 946 => "Cancellation of transaction while in progress",
154
- 947 => "Duplicate tranmission while in progress",
155
- 949 => "POS Inoperative",
156
- 950 => "Refund not possible",
157
- 9064 => "Card number incorrect",
158
- 9078 => "No payment method available",
159
- 9093 => "Non-existent card",
160
- 9218 => "Recursive transaction in bad gateway",
161
- 9253 => "Check-digit incorrect",
162
- 9256 => "Preauth not allowed for merchant",
163
- 9257 => "Preauth not allowed for card",
164
- 9261 => "Operating limit exceeded",
165
- 9912 => "Issuer not available",
166
- 9913 => "Confirmation error",
167
- 9914 => "KO Confirmation"
105
+ 0 => 'Transaction Approved',
106
+ 400 => 'Cancellation Accepted',
107
+ 481 => 'Cancellation Accepted',
108
+ 500 => 'Reconciliation Accepted',
109
+ 900 => 'Refund / Confirmation approved',
110
+
111
+ 101 => 'Card expired',
112
+ 102 => 'Card blocked temporarily or under susciption of fraud',
113
+ 104 => 'Transaction not permitted',
114
+ 107 => 'Contact the card issuer',
115
+ 109 => 'Invalid identification by merchant or POS terminal',
116
+ 110 => 'Invalid amount',
117
+ 114 => 'Card cannot be used to the requested transaction',
118
+ 116 => 'Insufficient credit',
119
+ 118 => 'Non-registered card',
120
+ 125 => 'Card not effective',
121
+ 129 => 'CVV2/CVC2 Error',
122
+ 167 => 'Contact the card issuer: suspected fraud',
123
+ 180 => 'Card out of service',
124
+ 181 => 'Card with credit or debit restrictions',
125
+ 182 => 'Card with credit or debit restrictions',
126
+ 184 => 'Authentication error',
127
+ 190 => 'Refusal with no specific reason',
128
+ 191 => 'Expiry date incorrect',
129
+
130
+ 201 => 'Card expired',
131
+ 202 => 'Card blocked temporarily or under suspicion of fraud',
132
+ 204 => 'Transaction not permitted',
133
+ 207 => 'Contact the card issuer',
134
+ 208 => 'Lost or stolen card',
135
+ 209 => 'Lost or stolen card',
136
+ 280 => 'CVV2/CVC2 Error',
137
+ 290 => 'Declined with no specific reason',
138
+
139
+ 480 => 'Original transaction not located, or time-out exceeded',
140
+ 501 => 'Original transaction not located, or time-out exceeded',
141
+ 502 => 'Original transaction not located, or time-out exceeded',
142
+ 503 => 'Original transaction not located, or time-out exceeded',
143
+
144
+ 904 => 'Merchant not registered at FUC',
145
+ 909 => 'System error',
146
+ 912 => 'Issuer not available',
147
+ 913 => 'Duplicate transmission',
148
+ 916 => 'Amount too low',
149
+ 928 => 'Time-out exceeded',
150
+ 940 => 'Transaction cancelled previously',
151
+ 941 => 'Authorization operation already cancelled',
152
+ 942 => 'Original authorization declined',
153
+ 943 => 'Different details from origin transaction',
154
+ 944 => 'Session error',
155
+ 945 => 'Duplicate transmission',
156
+ 946 => 'Cancellation of transaction while in progress',
157
+ 947 => 'Duplicate tranmission while in progress',
158
+ 949 => 'POS Inoperative',
159
+ 950 => 'Refund not possible',
160
+ 9064 => 'Card number incorrect',
161
+ 9078 => 'No payment method available',
162
+ 9093 => 'Non-existent card',
163
+ 9218 => 'Recursive transaction in bad gateway',
164
+ 9253 => 'Check-digit incorrect',
165
+ 9256 => 'Preauth not allowed for merchant',
166
+ 9257 => 'Preauth not allowed for card',
167
+ 9261 => 'Operating limit exceeded',
168
+ 9912 => 'Issuer not available',
169
+ 9913 => 'Confirmation error',
170
+ 9914 => 'KO Confirmation'
168
171
  }
169
172
 
170
173
  # Creates a new instance
@@ -178,32 +181,38 @@ module ActiveMerchant #:nodoc:
178
181
  # * <tt>:secret_key</tt> -- The Redsys Secret Key. (REQUIRED)
179
182
  # * <tt>:terminal</tt> -- The Redsys Terminal. Defaults to 1. (OPTIONAL)
180
183
  # * <tt>:test</tt> -- +true+ or +false+. Defaults to +false+. (OPTIONAL)
184
+ # * <tt>:signature_algorithm</tt> -- +"sha256"+ Defaults to +"sha1"+. (OPTIONAL)
181
185
  def initialize(options = {})
182
186
  requires!(options, :login, :secret_key)
183
187
  options[:terminal] ||= 1
188
+ options[:signature_algorithm] ||= 'sha1'
184
189
  super
185
190
  end
186
191
 
187
- def purchase(money, creditcard, options = {})
192
+ def purchase(money, payment, options = {})
188
193
  requires!(options, :order_id)
189
194
 
190
195
  data = {}
191
196
  add_action(data, :purchase)
192
197
  add_amount(data, money, options)
193
198
  add_order(data, options[:order_id])
194
- add_creditcard(data, creditcard)
199
+ add_payment(data, payment)
200
+ data[:description] = options[:description]
201
+ data[:store_in_vault] = options[:store]
195
202
 
196
203
  commit data
197
204
  end
198
205
 
199
- def authorize(money, creditcard, options = {})
206
+ def authorize(money, payment, options = {})
200
207
  requires!(options, :order_id)
201
208
 
202
209
  data = {}
203
210
  add_action(data, :authorize)
204
211
  add_amount(data, money, options)
205
212
  add_order(data, options[:order_id])
206
- add_creditcard(data, creditcard)
213
+ add_payment(data, payment)
214
+ data[:description] = options[:description]
215
+ data[:store_in_vault] = options[:store]
207
216
 
208
217
  commit data
209
218
  end
@@ -214,6 +223,7 @@ module ActiveMerchant #:nodoc:
214
223
  add_amount(data, money, options)
215
224
  order_id, _, _ = split_authorization(authorization)
216
225
  add_order(data, order_id)
226
+ data[:description] = options[:description]
217
227
 
218
228
  commit data
219
229
  end
@@ -224,6 +234,7 @@ module ActiveMerchant #:nodoc:
224
234
  order_id, amount, currency = split_authorization(authorization)
225
235
  add_amount(data, amount, :currency => currency)
226
236
  add_order(data, order_id)
237
+ data[:description] = options[:description]
227
238
 
228
239
  commit data
229
240
  end
@@ -234,10 +245,37 @@ module ActiveMerchant #:nodoc:
234
245
  add_amount(data, money, options)
235
246
  order_id, _, _ = split_authorization(authorization)
236
247
  add_order(data, order_id)
248
+ data[:description] = options[:description]
237
249
 
238
250
  commit data
239
251
  end
240
252
 
253
+ def verify(creditcard, options = {})
254
+ MultiResponse.run(:use_first_response) do |r|
255
+ r.process { authorize(100, creditcard, options) }
256
+ r.process(:ignore_result) { void(r.authorization, options) }
257
+ end
258
+ end
259
+
260
+ def supports_scrubbing
261
+ true
262
+ end
263
+
264
+ def scrub(transcript)
265
+ transcript.
266
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
267
+ gsub(%r((%3CDS_MERCHANT_PAN%3E)\d+(%3C%2FDS_MERCHANT_PAN%3E))i, '\1[FILTERED]\2').
268
+ gsub(%r((%3CDS_MERCHANT_CVV2%3E)\d+(%3C%2FDS_MERCHANT_CVV2%3E))i, '\1[FILTERED]\2').
269
+ gsub(%r((<DS_MERCHANT_PAN>)\d+(</DS_MERCHANT_PAN>))i, '\1[FILTERED]\2').
270
+ gsub(%r((<DS_MERCHANT_CVV2>)\d+(</DS_MERCHANT_CVV2>))i, '\1[FILTERED]\2').
271
+ gsub(%r((DS_MERCHANT_CVV2)%2F%3E%0A%3C%2F)i, '\1[BLANK]').
272
+ gsub(%r((DS_MERCHANT_CVV2)%2F%3E%3C)i, '\1[BLANK]').
273
+ gsub(%r((DS_MERCHANT_CVV2%3E)(%3C%2FDS_MERCHANT_CVV2))i, '\1[BLANK]\2').
274
+ gsub(%r((<DS_MERCHANT_CVV2>)(</DS_MERCHANT_CVV2>))i, '\1[BLANK]\2').
275
+ gsub(%r((DS_MERCHANT_CVV2%3E)\++(%3C%2FDS_MERCHANT_CVV2))i, '\1[BLANK]\2').
276
+ gsub(%r((<DS_MERCHANT_CVV2>)\s+(</DS_MERCHANT_CVV2>))i, '\1[BLANK]\2')
277
+ end
278
+
241
279
  private
242
280
 
243
281
  def add_action(data, action)
@@ -250,39 +288,52 @@ module ActiveMerchant #:nodoc:
250
288
  end
251
289
 
252
290
  def add_order(data, order_id)
253
- raise ArgumentError.new("Invalid order_id format") unless(/^\d{4}[\da-zA-Z]{0,8}$/ =~ order_id)
254
- data[:order_id] = order_id
291
+ data[:order_id] = clean_order_id(order_id)
255
292
  end
256
293
 
257
294
  def url
258
295
  test? ? test_url : live_url
259
296
  end
260
297
 
261
- def add_creditcard(data, card)
262
- name = [card.first_name, card.last_name].join(' ').slice(0, 60)
263
- year = sprintf("%.4i", card.year)
264
- month = sprintf("%.2i", card.month)
265
- data[:card] = {
266
- :name => name,
267
- :pan => card.number,
268
- :date => "#{year[2..3]}#{month}",
269
- :cvv => card.verification_value
270
- }
298
+ def add_payment(data, card)
299
+ if card.is_a?(String)
300
+ data[:credit_card_token] = card
301
+ else
302
+ name = [card.first_name, card.last_name].join(' ').slice(0, 60)
303
+ year = sprintf('%.4i', card.year)
304
+ month = sprintf('%.2i', card.month)
305
+ data[:card] = {
306
+ :name => name,
307
+ :pan => card.number,
308
+ :date => "#{year[2..3]}#{month}",
309
+ :cvv => card.verification_value
310
+ }
311
+ end
271
312
  end
272
313
 
273
314
  def commit(data)
274
- headers = {
315
+ parse(ssl_post(url, "entrada=#{CGI.escape(xml_request_from(data))}", headers))
316
+ end
317
+
318
+ def headers
319
+ {
275
320
  'Content-Type' => 'application/x-www-form-urlencoded'
276
321
  }
277
- xml = build_xml_request(data)
278
- parse(ssl_post(url, "entrada=#{CGI.escape(xml)}", headers))
322
+ end
323
+
324
+ def xml_request_from(data)
325
+ if sha256_authentication?
326
+ build_sha256_xml_request(data)
327
+ else
328
+ build_sha1_xml_request(data)
329
+ end
279
330
  end
280
331
 
281
332
  def build_signature(data)
282
333
  str = data[:amount] +
283
- data[:order_id].to_s +
284
- @options[:login].to_s +
285
- data[:currency]
334
+ data[:order_id].to_s +
335
+ @options[:login].to_s +
336
+ data[:currency]
286
337
 
287
338
  if card = data[:card]
288
339
  str << card[:pan]
@@ -290,23 +341,51 @@ module ActiveMerchant #:nodoc:
290
341
  end
291
342
 
292
343
  str << data[:action]
344
+ if data[:store_in_vault]
345
+ str << 'REQUIRED'
346
+ elsif data[:credit_card_token]
347
+ str << data[:credit_card_token]
348
+ end
293
349
  str << @options[:secret_key]
294
350
 
295
351
  Digest::SHA1.hexdigest(str)
296
352
  end
297
353
 
298
- def build_xml_request(data)
354
+ def build_sha256_xml_request(data)
355
+ xml = Builder::XmlMarkup.new
356
+ xml.instruct!
357
+ xml.REQUEST do
358
+ build_merchant_data(xml, data)
359
+ xml.DS_SIGNATUREVERSION 'HMAC_SHA256_V1'
360
+ xml.DS_SIGNATURE sign_request(merchant_data_xml(data), data[:order_id])
361
+ end
362
+ xml.target!
363
+ end
364
+
365
+ def build_sha1_xml_request(data)
299
366
  xml = Builder::XmlMarkup.new :indent => 2
367
+ build_merchant_data(xml, data)
368
+ xml.target!
369
+ end
370
+
371
+ def merchant_data_xml(data)
372
+ xml = Builder::XmlMarkup.new
373
+ build_merchant_data(xml, data)
374
+ xml.target!
375
+ end
376
+
377
+ def build_merchant_data(xml, data)
300
378
  xml.DATOSENTRADA do
301
379
  # Basic elements
302
380
  xml.DS_Version 0.1
303
- xml.DS_MERCHANT_CURRENCY data[:currency]
304
- xml.DS_MERCHANT_AMOUNT data[:amount]
305
- xml.DS_MERCHANT_ORDER data[:order_id]
306
- xml.DS_MERCHANT_TRANSACTIONTYPE data[:action]
307
- xml.DS_MERCHANT_TERMINAL @options[:terminal]
308
- xml.DS_MERCHANT_MERCHANTCODE @options[:login]
309
- xml.DS_MERCHANT_MERCHANTSIGNATURE build_signature(data)
381
+ xml.DS_MERCHANT_CURRENCY data[:currency]
382
+ xml.DS_MERCHANT_AMOUNT data[:amount]
383
+ xml.DS_MERCHANT_ORDER data[:order_id]
384
+ xml.DS_MERCHANT_TRANSACTIONTYPE data[:action]
385
+ xml.DS_MERCHANT_PRODUCTDESCRIPTION data[:description]
386
+ xml.DS_MERCHANT_TERMINAL @options[:terminal]
387
+ xml.DS_MERCHANT_MERCHANTCODE @options[:login]
388
+ xml.DS_MERCHANT_MERCHANTSIGNATURE build_signature(data) unless sha256_authentication?
310
389
 
311
390
  # Only when card is present
312
391
  if data[:card]
@@ -314,20 +393,23 @@ module ActiveMerchant #:nodoc:
314
393
  xml.DS_MERCHANT_PAN data[:card][:pan]
315
394
  xml.DS_MERCHANT_EXPIRYDATE data[:card][:date]
316
395
  xml.DS_MERCHANT_CVV2 data[:card][:cvv]
396
+ xml.DS_MERCHANT_IDENTIFIER 'REQUIRED' if data[:store_in_vault]
397
+ elsif data[:credit_card_token]
398
+ xml.DS_MERCHANT_IDENTIFIER data[:credit_card_token]
399
+ xml.DS_MERCHANT_DIRECTPAYMENT 'true'
317
400
  end
318
401
  end
319
- xml.target!
320
402
  end
321
403
 
322
404
  def parse(data)
323
405
  params = {}
324
406
  success = false
325
- message = ""
407
+ message = ''
326
408
  options = @options.merge(:test => test?)
327
409
  xml = Nokogiri::XML(data)
328
- code = xml.xpath("//RETORNOXML/CODIGO").text
329
- if code == "0"
330
- op = xml.xpath("//RETORNOXML/OPERACION")
410
+ code = xml.xpath('//RETORNOXML/CODIGO').text
411
+ if code == '0'
412
+ op = xml.xpath('//RETORNOXML/OPERACION')
331
413
  op.children.each do |element|
332
414
  params[element.name.downcase.to_sym] = element.text
333
415
  end
@@ -337,7 +419,7 @@ module ActiveMerchant #:nodoc:
337
419
  options[:authorization] = build_authorization(params)
338
420
  success = is_success_response?(params[:ds_response])
339
421
  else
340
- message = "Response failed validation check"
422
+ message = 'Response failed validation check'
341
423
  end
342
424
  else
343
425
  # Some kind of programmer error with the request!
@@ -348,31 +430,37 @@ module ActiveMerchant #:nodoc:
348
430
  end
349
431
 
350
432
  def validate_signature(data)
351
- str = data[:ds_amount] +
352
- data[:ds_order].to_s +
353
- data[:ds_merchantcode] +
354
- data[:ds_currency] +
355
- data[:ds_response] +
356
- data[:ds_cardnumber].to_s +
357
- data[:ds_transactiontype].to_s +
358
- data[:ds_securepayment].to_s +
359
- @options[:secret_key]
360
-
361
- sig = Digest::SHA1.hexdigest(str)
362
- data[:ds_signature].to_s.downcase == sig
433
+ if sha256_authentication?
434
+ sig = Base64.strict_encode64(mac256(get_key(data[:ds_order].to_s), xml_signed_fields(data)))
435
+ sig.casecmp(data[:ds_signature].to_s).zero?
436
+ else
437
+ str = data[:ds_amount] +
438
+ data[:ds_order].to_s +
439
+ data[:ds_merchantcode] +
440
+ data[:ds_currency] +
441
+ data[:ds_response] +
442
+ data[:ds_cardnumber].to_s +
443
+ data[:ds_transactiontype].to_s +
444
+ data[:ds_securepayment].to_s +
445
+ @options[:secret_key]
446
+
447
+ sig = Digest::SHA1.hexdigest(str)
448
+ data[:ds_signature].to_s.downcase == sig
449
+ end
363
450
  end
364
451
 
365
452
  def build_authorization(params)
366
- [params[:ds_order], params[:ds_amount], params[:ds_currency]].join("|")
453
+ [params[:ds_order], params[:ds_amount], params[:ds_currency]].join('|')
367
454
  end
368
455
 
369
456
  def split_authorization(authorization)
370
- order_id, amount, currency = authorization.split("|")
457
+ order_id, amount, currency = authorization.split('|')
371
458
  [order_id, amount.to_i, currency]
372
459
  end
373
460
 
374
461
  def currency_code(currency)
375
462
  return currency if currency =~ /^\d+$/
463
+ raise ArgumentError, "Unknown currency #{currency}" unless CURRENCY_CODES[currency]
376
464
  CURRENCY_CODES[currency]
377
465
  end
378
466
 
@@ -383,12 +471,64 @@ module ActiveMerchant #:nodoc:
383
471
  def response_text(code)
384
472
  code = code.to_i
385
473
  code = 0 if code < 100
386
- RESPONSE_TEXTS[code] || "Unkown code, please check in manual"
474
+ RESPONSE_TEXTS[code] || 'Unkown code, please check in manual'
387
475
  end
388
476
 
389
477
  def is_success_response?(code)
390
478
  (code.to_i < 100) || [400, 481, 500, 900].include?(code.to_i)
391
479
  end
480
+
481
+ def clean_order_id(order_id)
482
+ cleansed = order_id.gsub(/[^\da-zA-Z]/, '')
483
+ if cleansed =~ /^\d{4}/
484
+ cleansed[0..11]
485
+ else
486
+ '%04d%s' % [rand(0..9999), cleansed[0...8]]
487
+ end
488
+ end
489
+
490
+ def sha256_authentication?
491
+ @options[:signature_algorithm] == 'sha256'
492
+ end
493
+
494
+ def sign_request(xml_request_string, order_id)
495
+ key = encrypt(@options[:secret_key], order_id)
496
+ Base64.strict_encode64(mac256(key, xml_request_string))
497
+ end
498
+
499
+ def encrypt(key, order_id)
500
+ block_length = 8
501
+ cipher = OpenSSL::Cipher.new('DES3')
502
+ cipher.encrypt
503
+
504
+ cipher.key = Base64.strict_decode64(key)
505
+ # The OpenSSL default of an all-zeroes ("\\0") IV is used.
506
+ cipher.padding = 0
507
+
508
+ order_id += "\0" until order_id.bytesize % block_length == 0 # Pad with zeros
509
+
510
+ output = cipher.update(order_id) + cipher.final
511
+ output
512
+ end
513
+
514
+ def mac256(key, data)
515
+ OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, data)
516
+ end
517
+
518
+ def xml_signed_fields(data)
519
+ xml_signed_fields = data[:ds_amount] + data[:ds_order] + data[:ds_merchantcode] +
520
+ data[:ds_currency] + data[:ds_response]
521
+
522
+ if data[:ds_cardnumber]
523
+ xml_signed_fields += data[:ds_cardnumber]
524
+ end
525
+
526
+ xml_signed_fields + data[:ds_transactiontype] + data[:ds_securepayment]
527
+ end
528
+
529
+ def get_key(order_id)
530
+ encrypt(@options[:secret_key], order_id)
531
+ end
392
532
  end
393
533
  end
394
534
  end