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
@@ -10,19 +10,16 @@ module ActiveMerchant #:nodoc:
10
10
  #
11
11
  # The standard list of gateway functions that most concrete gateway subclasses implement is:
12
12
  #
13
- # * <tt>purchase(money, creditcard, options = {})</tt>
14
- # * <tt>authorize(money, creditcard, options = {})</tt>
13
+ # * <tt>purchase(money, credit_card, options = {})</tt>
14
+ # * <tt>authorize(money, credit_card, options = {})</tt>
15
15
  # * <tt>capture(money, authorization, options = {})</tt>
16
16
  # * <tt>void(identification, options = {})</tt>
17
- # * <tt>credit(money, identification, options = {})</tt>
18
- #
19
- # Some gateways include features for recurring billing
20
- #
21
- # * <tt>recurring(money, creditcard, options = {})</tt>
17
+ # * <tt>refund(money, identification, options = {})</tt>
18
+ # * <tt>verify(credit_card, options = {})</tt>
22
19
  #
23
20
  # Some gateways also support features for storing credit cards:
24
21
  #
25
- # * <tt>store(creditcard, options = {})</tt>
22
+ # * <tt>store(credit_card, options = {})</tt>
26
23
  # * <tt>unstore(identification, options = {})</tt>
27
24
  #
28
25
  # === Gateway Options
@@ -51,19 +48,55 @@ module ActiveMerchant #:nodoc:
51
48
  # * <tt>:zip</tt> - The zip or postal code of the customer.
52
49
  # * <tt>:phone</tt> - The phone number of the customer.
53
50
  #
54
- # == Implmenting new gateways
51
+ # == Implementing new gateways
55
52
  #
56
- # See the {ActiveMerchant Guide to Contributing}[https://github.com/Shopify/active_merchant/wiki/Contributing]
53
+ # See the {ActiveMerchant Guide to Contributing}[https://github.com/activemerchant/active_merchant/wiki/Contributing]
57
54
  #
58
55
  class Gateway
59
56
  include PostsData
60
- include RequiresParameters
61
57
  include CreditCardFormatting
62
- include Utils
63
58
 
64
- DEBIT_CARDS = [ :switch, :solo ]
65
- CURRENCIES_WITHOUT_FRACTIONS = [ 'BIF', 'BYR', 'CLP', 'CVE', 'DJF', 'GNF', 'HUF', 'ISK', 'JPY', 'KMF', 'KRW', 'PYG', 'RWF', 'TWD', 'UGX', 'VND', 'VUV', 'XAF', 'XOF', 'XPF' ]
66
- CREDIT_DEPRECATION_MESSAGE = "Support for using credit to refund existing transactions is deprecated and will be removed from a future release of ActiveMerchant. Please use the refund method instead."
59
+ CREDIT_DEPRECATION_MESSAGE = 'Support for using credit to refund existing transactions is deprecated and will be removed from a future release of ActiveMerchant. Please use the refund method instead.'
60
+ RECURRING_DEPRECATION_MESSAGE = 'Recurring functionality in ActiveMerchant is deprecated and will be removed in a future version. Please contact the ActiveMerchant maintainers if you have an interest in taking ownership of a separate gem that continues support for it.'
61
+
62
+ # == Standardized Error Codes
63
+ #
64
+ # :incorrect_number - Card number does not comply with ISO/IEC 7812 numbering standard
65
+ # :invalid_number - Card number was not matched by processor
66
+ # :invalid_expiry_date - Expiry date does not match correct formatting
67
+ # :invalid_cvc - Security codes does not match correct format (3-4 digits)
68
+ # :expired_card - Card number is expired
69
+ # :incorrect_cvc - Security code was not matched by the processor
70
+ # :incorrect_zip - Zip code is not in correct format
71
+ # :incorrect_address - Billing address info was not matched by the processor
72
+ # :incorrect_pin - Card PIN is incorrect
73
+ # :card_declined - Card number declined by processor
74
+ # :processing_error - Processor error
75
+ # :call_issuer - Transaction requires voice authentication, call issuer
76
+ # :pickup_card - Issuer requests that you pickup the card from merchant
77
+ # :test_mode_live_card - Card was declined. Request was in test mode, but used a non test card.
78
+ # :unsupported_feature - Transaction failed due to gateway or merchant
79
+ # configuration not supporting a feature used, such
80
+ # as network tokenization.
81
+
82
+ STANDARD_ERROR_CODE = {
83
+ :incorrect_number => 'incorrect_number',
84
+ :invalid_number => 'invalid_number',
85
+ :invalid_expiry_date => 'invalid_expiry_date',
86
+ :invalid_cvc => 'invalid_cvc',
87
+ :expired_card => 'expired_card',
88
+ :incorrect_cvc => 'incorrect_cvc',
89
+ :incorrect_zip => 'incorrect_zip',
90
+ :incorrect_address => 'incorrect_address',
91
+ :incorrect_pin => 'incorrect_pin',
92
+ :card_declined => 'card_declined',
93
+ :processing_error => 'processing_error',
94
+ :call_issuer => 'call_issuer',
95
+ :pickup_card => 'pick_up_card',
96
+ :config_error => 'config_error',
97
+ :test_mode_live_card => 'test_mode_live_card',
98
+ :unsupported_feature => 'unsupported_feature',
99
+ }
67
100
 
68
101
  cattr_reader :implementations
69
102
  @@implementations = []
@@ -73,6 +106,10 @@ module ActiveMerchant #:nodoc:
73
106
  @@implementations << subclass
74
107
  end
75
108
 
109
+ def generate_unique_id
110
+ SecureRandom.hex(16)
111
+ end
112
+
76
113
  # The format of the amounts used by the gateway
77
114
  # :dollars => '12.50'
78
115
  # :cents => '1250'
@@ -82,14 +119,14 @@ module ActiveMerchant #:nodoc:
82
119
  # The default currency for the transactions if no currency is provided
83
120
  class_attribute :default_currency
84
121
 
85
- # The countries of merchants the gateway supports
86
- class_attribute :supported_countries
87
- self.supported_countries = []
88
-
89
122
  # The supported card types for the gateway
90
123
  class_attribute :supported_cardtypes
91
124
  self.supported_cardtypes = []
92
125
 
126
+ class_attribute :currencies_without_fractions, :currencies_with_three_decimal_places
127
+ self.currencies_without_fractions = %w(BIF BYR CLP CVE DJF GNF ISK JPY KMF KRW PYG RWF UGX VND VUV XAF XOF XPF)
128
+ self.currencies_with_three_decimal_places = %w()
129
+
93
130
  class_attribute :homepage_url
94
131
  class_attribute :display_name
95
132
 
@@ -101,8 +138,8 @@ module ActiveMerchant #:nodoc:
101
138
 
102
139
  # The application making the calls to the gateway
103
140
  # Useful for things like the PayPal build notation (BN) id fields
104
- superclass_delegating_accessor :application_id
105
- self.application_id = 'ActiveMerchant'
141
+ class_attribute :application_id, instance_writer: false
142
+ self.application_id = nil
106
143
 
107
144
  attr_reader :options
108
145
 
@@ -116,6 +153,23 @@ module ActiveMerchant #:nodoc:
116
153
  result.to_s.downcase
117
154
  end
118
155
 
156
+ def self.supported_countries=(country_codes)
157
+ country_codes.each do |country_code|
158
+ unless ActiveMerchant::Country.find(country_code)
159
+ raise ActiveMerchant::InvalidCountryCodeError, "No country could be found for the country #{country_code}"
160
+ end
161
+ end
162
+ @supported_countries = country_codes.dup
163
+ end
164
+
165
+ def self.supported_countries
166
+ @supported_countries ||= []
167
+ end
168
+
169
+ def supported_countries
170
+ self.class.supported_countries
171
+ end
172
+
119
173
  def card_brand(source)
120
174
  self.class.card_brand(source)
121
175
  end
@@ -133,6 +187,51 @@ module ActiveMerchant #:nodoc:
133
187
  (@options.has_key?(:test) ? @options[:test] : Base.test?)
134
188
  end
135
189
 
190
+ # Does this gateway know how to scrub sensitive information out of HTTP transcripts?
191
+ def supports_scrubbing?
192
+ false
193
+ end
194
+
195
+ def scrub(transcript)
196
+ raise 'This gateway does not support scrubbing.'
197
+ end
198
+
199
+ def supports_network_tokenization?
200
+ false
201
+ end
202
+
203
+ protected # :nodoc: all
204
+
205
+ def normalize(field)
206
+ case field
207
+ when 'true' then true
208
+ when 'false' then false
209
+ when '' then nil
210
+ when 'null' then nil
211
+ else field
212
+ end
213
+ end
214
+
215
+ def user_agent
216
+ @@ua ||= JSON.dump({
217
+ :bindings_version => ActiveMerchant::VERSION,
218
+ :lang => 'ruby',
219
+ :lang_version => "#{RUBY_VERSION} p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE})",
220
+ :platform => RUBY_PLATFORM,
221
+ :publisher => 'active_merchant'
222
+ })
223
+ end
224
+
225
+ def strip_invalid_xml_chars(xml)
226
+ begin
227
+ REXML::Document.new(xml)
228
+ rescue REXML::ParseException
229
+ xml = xml.gsub(/&(?!(?:[a-z]+|#[0-9]+|x[a-zA-Z0-9]+);)/, '&amp;')
230
+ end
231
+
232
+ xml
233
+ end
234
+
136
235
  private # :nodoc: all
137
236
 
138
237
  def name
@@ -142,10 +241,10 @@ module ActiveMerchant #:nodoc:
142
241
  def amount(money)
143
242
  return nil if money.nil?
144
243
  cents = if money.respond_to?(:cents)
145
- deprecated "Support for Money objects is deprecated and will be removed from a future release of ActiveMerchant. Please use an Integer value in cents"
146
- money.cents
147
- else
148
- money
244
+ ActiveMerchant.deprecated 'Support for Money objects is deprecated and will be removed from a future release of ActiveMerchant. Please use an Integer value in cents'
245
+ money.cents
246
+ else
247
+ money
149
248
  end
150
249
 
151
250
  if money.is_a?(String)
@@ -155,33 +254,66 @@ module ActiveMerchant #:nodoc:
155
254
  if self.money_format == :cents
156
255
  cents.to_s
157
256
  else
158
- sprintf("%.2f", cents.to_f / 100)
257
+ sprintf('%.2f', cents.to_f / 100)
159
258
  end
160
259
  end
161
260
 
261
+ def non_fractional_currency?(currency)
262
+ self.currencies_without_fractions.include?(currency.to_s)
263
+ end
264
+
265
+ def three_decimal_currency?(currency)
266
+ self.currencies_with_three_decimal_places.include?(currency.to_s)
267
+ end
268
+
162
269
  def localized_amount(money, currency)
163
270
  amount = amount(money)
164
271
 
165
- return amount unless non_fractional_currency?(currency)
166
-
167
- if self.money_format == :cents
168
- sprintf("%.0f", amount.to_f / 100)
169
- else
170
- amount.split('.').first
272
+ return amount unless non_fractional_currency?(currency) || three_decimal_currency?(currency)
273
+ if non_fractional_currency?(currency)
274
+ if self.money_format == :cents
275
+ sprintf('%.0f', amount.to_f / 100)
276
+ else
277
+ amount.split('.').first
278
+ end
279
+ elsif three_decimal_currency?(currency)
280
+ if self.money_format == :cents
281
+ amount.to_s
282
+ else
283
+ sprintf('%.3f', (amount.to_f / 10))
284
+ end
171
285
  end
172
286
  end
173
287
 
174
- def non_fractional_currency?(currency)
175
- CURRENCIES_WITHOUT_FRACTIONS.include?(currency.to_s)
176
- end
177
-
178
288
  def currency(money)
179
289
  money.respond_to?(:currency) ? money.currency : self.default_currency
180
290
  end
181
291
 
182
- def requires_start_date_or_issue_number?(credit_card)
183
- return false if card_brand(credit_card).blank?
184
- DEBIT_CARDS.include?(card_brand(credit_card).to_sym)
292
+ def truncate(value, max_size)
293
+ return nil unless value
294
+ value.to_s[0, max_size]
295
+ end
296
+
297
+ def split_names(full_name)
298
+ names = (full_name || '').split
299
+ return [nil, nil] if names.size == 0
300
+
301
+ last_name = names.pop
302
+ first_name = names.join(' ')
303
+ [first_name, last_name]
304
+ end
305
+
306
+ def requires!(hash, *params)
307
+ params.each do |param|
308
+ if param.is_a?(Array)
309
+ raise ArgumentError.new("Missing required parameter: #{param.first}") unless hash.has_key?(param.first)
310
+
311
+ valid_options = param[1..-1]
312
+ raise ArgumentError.new("Parameter: #{param.first} must be one of #{valid_options.to_sentence(:words_connector => 'or')}") unless valid_options.include?(hash[param.first])
313
+ else
314
+ raise ArgumentError.new("Missing required parameter: #{param}") unless hash.has_key?(param)
315
+ end
316
+ end
185
317
  end
186
318
  end
187
319
  end
@@ -0,0 +1,380 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class AdyenGateway < Gateway
4
+
5
+ # we recommend setting up merchant-specific endpoints.
6
+ # https://docs.adyen.com/developers/api-manual#apiendpoints
7
+ self.test_url = 'https://pal-test.adyen.com/pal/servlet/Payment/v18'
8
+ self.live_url = 'https://pal-live.adyen.com/pal/servlet/Payment/v18'
9
+
10
+ self.supported_countries = ['AT', 'AU', 'BE', 'BG', 'BR', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GB', 'GI', 'GR', 'HK', 'HU', 'IE', 'IS', 'IT', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'NL', 'NO', 'PL', 'PT', 'RO', 'SE', 'SG', 'SK', 'SI', 'US']
11
+ self.default_currency = 'USD'
12
+ self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :jcb, :dankort, :maestro, :discover]
13
+
14
+ self.money_format = :cents
15
+
16
+ self.homepage_url = 'https://www.adyen.com/'
17
+ self.display_name = 'Adyen'
18
+
19
+ STANDARD_ERROR_CODE_MAPPING = {
20
+ '101' => STANDARD_ERROR_CODE[:incorrect_number],
21
+ '103' => STANDARD_ERROR_CODE[:invalid_cvc],
22
+ '131' => STANDARD_ERROR_CODE[:incorrect_address],
23
+ '132' => STANDARD_ERROR_CODE[:incorrect_address],
24
+ '133' => STANDARD_ERROR_CODE[:incorrect_address],
25
+ '134' => STANDARD_ERROR_CODE[:incorrect_address],
26
+ '135' => STANDARD_ERROR_CODE[:incorrect_address],
27
+ }
28
+
29
+ def initialize(options={})
30
+ requires!(options, :username, :password, :merchant_account)
31
+ @username, @password, @merchant_account = options.values_at(:username, :password, :merchant_account)
32
+ super
33
+ end
34
+
35
+ def purchase(money, payment, options={})
36
+ if options[:execute_threed]
37
+ authorize(money, payment, options)
38
+ else
39
+ MultiResponse.run do |r|
40
+ r.process { authorize(money, payment, options) }
41
+ r.process { capture(money, r.authorization, options) }
42
+ end
43
+ end
44
+ end
45
+
46
+ def authorize(money, payment, options={})
47
+ requires!(options, :order_id)
48
+ post = init_post(options)
49
+ add_invoice(post, money, options)
50
+ add_payment(post, payment)
51
+ add_extra_data(post, payment, options)
52
+ add_shopper_interaction(post, payment, options)
53
+ add_address(post, options)
54
+ add_installments(post, options) if options[:installments]
55
+ add_3ds(post, options) if options[:execute_threed]
56
+ commit('authorise', post)
57
+ end
58
+
59
+ def capture(money, authorization, options={})
60
+ post = init_post(options)
61
+ add_invoice_for_modification(post, money, options)
62
+ add_reference(post, authorization, options)
63
+ commit('capture', post)
64
+ end
65
+
66
+ def refund(money, authorization, options={})
67
+ post = init_post(options)
68
+ add_invoice_for_modification(post, money, options)
69
+ add_original_reference(post, authorization, options)
70
+ commit('refund', post)
71
+ end
72
+
73
+ def void(authorization, options={})
74
+ post = init_post(options)
75
+ add_reference(post, authorization, options)
76
+ commit('cancel', post)
77
+ end
78
+
79
+ def store(credit_card, options={})
80
+ requires!(options, :order_id)
81
+ post = init_post(options)
82
+ add_invoice(post, 0, options)
83
+ add_payment(post, credit_card)
84
+ add_extra_data(post, credit_card, options)
85
+ add_recurring_contract(post, options)
86
+ add_address(post, options)
87
+ commit('authorise', post)
88
+ end
89
+
90
+ def verify(credit_card, options={})
91
+ MultiResponse.run(:use_first_response) do |r|
92
+ r.process { authorize(0, credit_card, options) }
93
+ r.process(:ignore_result) { void(r.authorization, options) }
94
+ end
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(("number\\?":\\?")[^"]*)i, '\1[FILTERED]').
105
+ gsub(%r(("cvc\\?":\\?")[^"]*)i, '\1[FILTERED]').
106
+ gsub(%r(("cavv\\?":\\?")[^"]*)i, '\1[FILTERED]')
107
+ end
108
+
109
+ private
110
+
111
+ AVS_MAPPING = {
112
+ '0' => 'R', # Unknown
113
+ '1' => 'A', # Address matches, postal code doesn't
114
+ '2' => 'N', # Neither postal code nor address match
115
+ '3' => 'R', # AVS unavailable
116
+ '4' => 'E', # AVS not supported for this card type
117
+ '5' => 'U', # No AVS data provided
118
+ '6' => 'Z', # Postal code matches, address doesn't match
119
+ '7' => 'D', # Both postal code and address match
120
+ '8' => 'U', # Address not checked, postal code unknown
121
+ '9' => 'B', # Address matches, postal code unknown
122
+ '10' => 'N', # Address doesn't match, postal code unknown
123
+ '11' => 'U', # Postal code not checked, address unknown
124
+ '12' => 'B', # Address matches, postal code not checked
125
+ '13' => 'U', # Address doesn't match, postal code not checked
126
+ '14' => 'P', # Postal code matches, address unknown
127
+ '15' => 'P', # Postal code matches, address not checked
128
+ '16' => 'N', # Postal code doesn't match, address unknown
129
+ '17' => 'U', # Postal code doesn't match, address not checked
130
+ '18' => 'I' # Neither postal code nor address were checked
131
+ }
132
+
133
+ CVC_MAPPING = {
134
+ '0' => 'P', # Unknown
135
+ '1' => 'M', # Matches
136
+ '2' => 'N', # Does not match
137
+ '3' => 'P', # Not checked
138
+ '4' => 'S', # No CVC/CVV provided, but was required
139
+ '5' => 'U', # Issuer not certifed by CVC/CVV
140
+ '6' => 'P' # No CVC/CVV provided
141
+ }
142
+
143
+ NETWORK_TOKENIZATION_CARD_SOURCE = {
144
+ 'apple_pay' => 'applepay',
145
+ 'android_pay' => 'androidpay',
146
+ 'google_pay' => 'paywithgoogle'
147
+ }
148
+
149
+ def add_extra_data(post, payment, options)
150
+ post[:shopperEmail] = options[:shopper_email] if options[:shopper_email]
151
+ post[:shopperIP] = options[:shopper_ip] if options[:shopper_ip]
152
+ post[:shopperReference] = options[:shopper_reference] if options[:shopper_reference]
153
+ post[:fraudOffset] = options[:fraud_offset] if options[:fraud_offset]
154
+ post[:selectedBrand] = options[:selected_brand] if options[:selected_brand]
155
+ post[:selectedBrand] ||= NETWORK_TOKENIZATION_CARD_SOURCE[payment.source.to_s] if payment.is_a?(NetworkTokenizationCreditCard)
156
+ post[:deliveryDate] = options[:delivery_date] if options[:delivery_date]
157
+ post[:merchantOrderReference] = options[:merchant_order_reference] if options[:merchant_order_reference]
158
+ post[:additionalData] ||= {}
159
+ post[:additionalData][:overwriteBrand] = normalize(options[:overwrite_brand]) if options[:overwrite_brand]
160
+ post[:additionalData][:customRoutingFlag] = options[:custom_routing_flag] if options[:custom_routing_flag]
161
+ post[:additionalData]['paymentdatasource.type'] = NETWORK_TOKENIZATION_CARD_SOURCE[payment.source.to_s] if payment.is_a?(NetworkTokenizationCreditCard)
162
+ add_risk_data(post, options)
163
+ end
164
+
165
+ def add_risk_data(post, options)
166
+ risk_data = {}
167
+ risk_data.merge!(options[:risk_data]) if options[:risk_data]
168
+
169
+ post[:additionalData][:riskData] = risk_data unless risk_data.empty?
170
+ end
171
+
172
+ def add_shopper_interaction(post, payment, options={})
173
+ if (payment.respond_to?(:verification_value) && payment.verification_value) || payment.is_a?(NetworkTokenizationCreditCard)
174
+ shopper_interaction = 'Ecommerce'
175
+ else
176
+ shopper_interaction = 'ContAuth'
177
+ end
178
+
179
+ post[:shopperInteraction] = options[:shopper_interaction] || shopper_interaction
180
+ end
181
+
182
+ def add_address(post, options)
183
+ return unless post[:card]&.kind_of?(Hash)
184
+ if (address = options[:billing_address] || options[:address]) && address[:country]
185
+ post[:card][:billingAddress] = {}
186
+ post[:card][:billingAddress][:street] = address[:address1] || 'N/A'
187
+ post[:card][:billingAddress][:houseNumberOrName] = address[:address2] || 'N/A'
188
+ post[:card][:billingAddress][:postalCode] = address[:zip] if address[:zip]
189
+ post[:card][:billingAddress][:city] = address[:city] || 'N/A'
190
+ post[:card][:billingAddress][:stateOrProvince] = address[:state] if address[:state]
191
+ post[:card][:billingAddress][:country] = address[:country] if address[:country]
192
+ end
193
+ end
194
+
195
+ def add_invoice(post, money, options)
196
+ amount = {
197
+ value: amount(money),
198
+ currency: options[:currency] || currency(money)
199
+ }
200
+ post[:amount] = amount
201
+ post[:recurringProcessingModel] = options[:recurring_processing_model] if options[:recurring_processing_model]
202
+ end
203
+
204
+ def add_invoice_for_modification(post, money, options)
205
+ amount = {
206
+ value: amount(money),
207
+ currency: options[:currency] || currency(money)
208
+ }
209
+ post[:modificationAmount] = amount
210
+ end
211
+
212
+ def add_payment(post, payment)
213
+ if payment.is_a?(String)
214
+ _, _, recurring_detail_reference = payment.split('#')
215
+ post[:selectedRecurringDetailReference] = recurring_detail_reference
216
+ add_recurring_contract(post, options)
217
+ else
218
+ add_mpi_data_for_network_tokenization_card(post, payment) if payment.is_a?(NetworkTokenizationCreditCard)
219
+ add_card(post, payment)
220
+ end
221
+ end
222
+
223
+ def add_card(post, credit_card)
224
+ card = {
225
+ expiryMonth: credit_card.month,
226
+ expiryYear: credit_card.year,
227
+ holderName: credit_card.name,
228
+ number: credit_card.number,
229
+ cvc: credit_card.verification_value
230
+ }
231
+
232
+ card.delete_if { |k, v| v.blank? }
233
+ card[:holderName] ||= 'Not Provided' if credit_card.is_a?(NetworkTokenizationCreditCard)
234
+ requires!(card, :expiryMonth, :expiryYear, :holderName, :number)
235
+ post[:card] = card
236
+ end
237
+
238
+ def add_reference(post, authorization, options = {})
239
+ _, psp_reference, _ = authorization.split('#')
240
+ post[:originalReference] = single_reference(authorization) || psp_reference
241
+ end
242
+
243
+ def add_original_reference(post, authorization, options = {})
244
+ original_psp_reference, _, _ = authorization.split('#')
245
+ post[:originalReference] = single_reference(authorization) || original_psp_reference
246
+ end
247
+
248
+ def add_mpi_data_for_network_tokenization_card(post, payment)
249
+ post[:mpiData] = {}
250
+ post[:mpiData][:authenticationResponse] = 'Y'
251
+ post[:mpiData][:cavv] = payment.payment_cryptogram
252
+ post[:mpiData][:directoryResponse] = 'Y'
253
+ post[:mpiData][:eci] = payment.eci || '07'
254
+ end
255
+
256
+ def single_reference(authorization)
257
+ authorization if !authorization.include?('#')
258
+ end
259
+
260
+ def add_recurring_contract(post, options = {})
261
+ recurring = {
262
+ contract: 'RECURRING'
263
+ }
264
+
265
+ post[:recurring] = recurring
266
+ end
267
+
268
+ def add_installments(post, options)
269
+ post[:installments] = {
270
+ value: options[:installments]
271
+ }
272
+ end
273
+
274
+ def add_3ds(post, options)
275
+ post[:additionalData] = { executeThreeD: 'true' }
276
+ post[:browserInfo] = { userAgent: options[:user_agent], acceptHeader: options[:accept_header] }
277
+ end
278
+
279
+ def parse(body)
280
+ return {} if body.blank?
281
+ JSON.parse(body)
282
+ end
283
+
284
+ def commit(action, parameters)
285
+ begin
286
+ raw_response = ssl_post("#{url}/#{action}", post_data(action, parameters), request_headers)
287
+ response = parse(raw_response)
288
+ rescue ResponseError => e
289
+ raw_response = e.response.body
290
+ response = parse(raw_response)
291
+ end
292
+ success = success_from(action, response)
293
+ Response.new(
294
+ success,
295
+ message_from(action, response),
296
+ response,
297
+ authorization: authorization_from(action, parameters, response),
298
+ test: test?,
299
+ error_code: success ? nil : error_code_from(response),
300
+ avs_result: AVSResult.new(:code => avs_code_from(response)),
301
+ cvv_result: CVVResult.new(cvv_result_from(response))
302
+ )
303
+ end
304
+
305
+ def avs_code_from(response)
306
+ AVS_MAPPING[response['additionalData']['avsResult'][0..1].strip] if response.dig('additionalData', 'avsResult')
307
+ end
308
+
309
+ def cvv_result_from(response)
310
+ CVC_MAPPING[response['additionalData']['cvcResult'][0]] if response.dig('additionalData', 'cvcResult')
311
+ end
312
+
313
+ def url
314
+ if test?
315
+ test_url
316
+ elsif @options[:subdomain]
317
+ "https://#{@options[:subdomain]}-pal-live.adyenpayments.com/pal/servlet/Payment/v18"
318
+ else
319
+ live_url
320
+ end
321
+ end
322
+
323
+ def basic_auth
324
+ Base64.strict_encode64("#{@username}:#{@password}")
325
+ end
326
+
327
+ def request_headers
328
+ {
329
+ 'Content-Type' => 'application/json',
330
+ 'Authorization' => "Basic #{basic_auth}"
331
+ }
332
+ end
333
+
334
+ def success_from(action, response)
335
+ case action.to_s
336
+ when 'authorise', 'authorise3d'
337
+ ['Authorised', 'Received', 'RedirectShopper'].include?(response['resultCode'])
338
+ when 'capture', 'refund', 'cancel'
339
+ response['response'] == "[#{action}-received]"
340
+ else
341
+ false
342
+ end
343
+ end
344
+
345
+ def message_from(action, response)
346
+ return authorize_message_from(response) if action.to_s == 'authorise'
347
+ response['response'] || response['message']
348
+ end
349
+
350
+ def authorize_message_from(response)
351
+ if response['refusalReason'] && response['additionalData'] && response['additionalData']['refusalReasonRaw']
352
+ "#{response['refusalReason']} | #{response['additionalData']['refusalReasonRaw']}"
353
+ else
354
+ response['refusalReason'] || response['resultCode'] || response['message']
355
+ end
356
+ end
357
+
358
+ def authorization_from(action, parameters, response)
359
+ return nil if response['pspReference'].nil?
360
+ recurring = response['additionalData']['recurring.recurringDetailReference'] if response['additionalData']
361
+ "#{parameters[:originalReference]}##{response['pspReference']}##{recurring}"
362
+ end
363
+
364
+ def init_post(options = {})
365
+ post = {}
366
+ post[:merchantAccount] = options[:merchant_account] || @merchant_account
367
+ post[:reference] = options[:order_id] if options[:order_id]
368
+ post
369
+ end
370
+
371
+ def post_data(action, parameters = {})
372
+ JSON.generate(parameters)
373
+ end
374
+
375
+ def error_code_from(response)
376
+ STANDARD_ERROR_CODE_MAPPING[response['errorCode']]
377
+ end
378
+ end
379
+ end
380
+ end