swiss-crm-activemerchant 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +4033 -0
  3. data/CONTRIBUTORS +568 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +252 -0
  6. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  7. data/lib/active_merchant/billing/avs_result.rb +95 -0
  8. data/lib/active_merchant/billing/base.rb +48 -0
  9. data/lib/active_merchant/billing/check.rb +112 -0
  10. data/lib/active_merchant/billing/compatibility.rb +118 -0
  11. data/lib/active_merchant/billing/credit_card.rb +451 -0
  12. data/lib/active_merchant/billing/credit_card_formatting.rb +24 -0
  13. data/lib/active_merchant/billing/credit_card_methods.rb +512 -0
  14. data/lib/active_merchant/billing/cvv_result.rb +37 -0
  15. data/lib/active_merchant/billing/gateway.rb +332 -0
  16. data/lib/active_merchant/billing/gateways/adyen.rb +774 -0
  17. data/lib/active_merchant/billing/gateways/airwallex.rb +370 -0
  18. data/lib/active_merchant/billing/gateways/alelo.rb +256 -0
  19. data/lib/active_merchant/billing/gateways/allied_wallet.rb +205 -0
  20. data/lib/active_merchant/billing/gateways/authorize_net.rb +1125 -0
  21. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +424 -0
  22. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +977 -0
  23. data/lib/active_merchant/billing/gateways/axcessms.rb +242 -0
  24. data/lib/active_merchant/billing/gateways/balanced.rb +263 -0
  25. data/lib/active_merchant/billing/gateways/bambora_apac.rb +222 -0
  26. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  27. data/lib/active_merchant/billing/gateways/banwire.rb +116 -0
  28. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +397 -0
  29. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +15 -0
  30. data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
  31. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +474 -0
  32. data/lib/active_merchant/billing/gateways/beanstream.rb +238 -0
  33. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +57 -0
  34. data/lib/active_merchant/billing/gateways/blue_pay.rb +549 -0
  35. data/lib/active_merchant/billing/gateways/blue_snap.rb +644 -0
  36. data/lib/active_merchant/billing/gateways/bogus.rb +190 -0
  37. data/lib/active_merchant/billing/gateways/borgun.rb +272 -0
  38. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  39. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +28 -0
  40. data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +113 -0
  41. data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
  42. data/lib/active_merchant/billing/gateways/braintree_blue.rb +952 -0
  43. data/lib/active_merchant/billing/gateways/braintree_orange.rb +19 -0
  44. data/lib/active_merchant/billing/gateways/bridge_pay.rb +244 -0
  45. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  46. data/lib/active_merchant/billing/gateways/card_connect.rb +338 -0
  47. data/lib/active_merchant/billing/gateways/card_save.rb +21 -0
  48. data/lib/active_merchant/billing/gateways/card_stream.rb +394 -0
  49. data/lib/active_merchant/billing/gateways/cardknox.rb +327 -0
  50. data/lib/active_merchant/billing/gateways/cardprocess.rb +256 -0
  51. data/lib/active_merchant/billing/gateways/cashnet.rb +235 -0
  52. data/lib/active_merchant/billing/gateways/cc5.rb +198 -0
  53. data/lib/active_merchant/billing/gateways/cecabank.rb +249 -0
  54. data/lib/active_merchant/billing/gateways/cenpos.rb +328 -0
  55. data/lib/active_merchant/billing/gateways/checkout.rb +212 -0
  56. data/lib/active_merchant/billing/gateways/checkout_v2.rb +587 -0
  57. data/lib/active_merchant/billing/gateways/citrus_pay.rb +21 -0
  58. data/lib/active_merchant/billing/gateways/clearhaus.rb +219 -0
  59. data/lib/active_merchant/billing/gateways/commerce_hub.rb +366 -0
  60. data/lib/active_merchant/billing/gateways/commercegate.rb +142 -0
  61. data/lib/active_merchant/billing/gateways/conekta.rb +230 -0
  62. data/lib/active_merchant/billing/gateways/creditcall.rb +272 -0
  63. data/lib/active_merchant/billing/gateways/credorax.rb +526 -0
  64. data/lib/active_merchant/billing/gateways/ct_payment.rb +269 -0
  65. data/lib/active_merchant/billing/gateways/culqi.rb +279 -0
  66. data/lib/active_merchant/billing/gateways/cyber_source/cyber_source_common.rb +36 -0
  67. data/lib/active_merchant/billing/gateways/cyber_source.rb +1148 -0
  68. data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +454 -0
  69. data/lib/active_merchant/billing/gateways/d_local.rb +343 -0
  70. data/lib/active_merchant/billing/gateways/data_cash.rb +302 -0
  71. data/lib/active_merchant/billing/gateways/decidir.rb +358 -0
  72. data/lib/active_merchant/billing/gateways/decidir_plus.rb +344 -0
  73. data/lib/active_merchant/billing/gateways/dibs.rb +199 -0
  74. data/lib/active_merchant/billing/gateways/digitzs.rb +295 -0
  75. data/lib/active_merchant/billing/gateways/ebanx.rb +346 -0
  76. data/lib/active_merchant/billing/gateways/efsnet.rb +215 -0
  77. data/lib/active_merchant/billing/gateways/elavon.rb +475 -0
  78. data/lib/active_merchant/billing/gateways/element.rb +406 -0
  79. data/lib/active_merchant/billing/gateways/epay.rb +296 -0
  80. data/lib/active_merchant/billing/gateways/evo_ca.rb +307 -0
  81. data/lib/active_merchant/billing/gateways/eway.rb +226 -0
  82. data/lib/active_merchant/billing/gateways/eway_managed.rb +289 -0
  83. data/lib/active_merchant/billing/gateways/eway_rapid.rb +578 -0
  84. data/lib/active_merchant/billing/gateways/exact.rb +219 -0
  85. data/lib/active_merchant/billing/gateways/ezic.rb +195 -0
  86. data/lib/active_merchant/billing/gateways/fat_zebra.rb +223 -0
  87. data/lib/active_merchant/billing/gateways/federated_canada.rb +158 -0
  88. data/lib/active_merchant/billing/gateways/finansbank.rb +22 -0
  89. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  90. data/lib/active_merchant/billing/gateways/first_pay.rb +182 -0
  91. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +452 -0
  92. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +505 -0
  93. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  94. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  95. data/lib/active_merchant/billing/gateways/fluidpay.rb +275 -0
  96. data/lib/active_merchant/billing/gateways/forte.rb +286 -0
  97. data/lib/active_merchant/billing/gateways/garanti.rb +256 -0
  98. data/lib/active_merchant/billing/gateways/global_collect.rb +580 -0
  99. data/lib/active_merchant/billing/gateways/global_transport.rb +193 -0
  100. data/lib/active_merchant/billing/gateways/hdfc.rb +205 -0
  101. data/lib/active_merchant/billing/gateways/hps.rb +472 -0
  102. data/lib/active_merchant/billing/gateways/iats_payments.rb +312 -0
  103. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  104. data/lib/active_merchant/billing/gateways/inspire.rb +213 -0
  105. data/lib/active_merchant/billing/gateways/instapay.rb +159 -0
  106. data/lib/active_merchant/billing/gateways/ipg.rb +420 -0
  107. data/lib/active_merchant/billing/gateways/ipp.rb +176 -0
  108. data/lib/active_merchant/billing/gateways/iridium.rb +467 -0
  109. data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
  110. data/lib/active_merchant/billing/gateways/iveri.rb +290 -0
  111. data/lib/active_merchant/billing/gateways/ixopay.rb +320 -0
  112. data/lib/active_merchant/billing/gateways/jetpay.rb +395 -0
  113. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +432 -0
  114. data/lib/active_merchant/billing/gateways/klarna.rb +317 -0
  115. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  116. data/lib/active_merchant/billing/gateways/kushki.rb +297 -0
  117. data/lib/active_merchant/billing/gateways/latitude19.rb +412 -0
  118. data/lib/active_merchant/billing/gateways/linkpoint.rb +448 -0
  119. data/lib/active_merchant/billing/gateways/litle.rb +643 -0
  120. data/lib/active_merchant/billing/gateways/mastercard.rb +286 -0
  121. data/lib/active_merchant/billing/gateways/maxipago.rb +220 -0
  122. data/lib/active_merchant/billing/gateways/mercado_pago.rb +348 -0
  123. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +228 -0
  124. data/lib/active_merchant/billing/gateways/merchant_one.rb +110 -0
  125. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  126. data/lib/active_merchant/billing/gateways/merchant_ware.rb +313 -0
  127. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +284 -0
  128. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +248 -0
  129. data/lib/active_merchant/billing/gateways/mercury.rb +352 -0
  130. data/lib/active_merchant/billing/gateways/metrics_global.rb +293 -0
  131. data/lib/active_merchant/billing/gateways/micropayment.rb +182 -0
  132. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
  133. data/lib/active_merchant/billing/gateways/migs.rb +329 -0
  134. data/lib/active_merchant/billing/gateways/mit.rb +260 -0
  135. data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
  136. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +215 -0
  137. data/lib/active_merchant/billing/gateways/moka.rb +290 -0
  138. data/lib/active_merchant/billing/gateways/monei.rb +424 -0
  139. data/lib/active_merchant/billing/gateways/moneris.rb +488 -0
  140. data/lib/active_merchant/billing/gateways/money_movers.rb +150 -0
  141. data/lib/active_merchant/billing/gateways/mundipagg.rb +366 -0
  142. data/lib/active_merchant/billing/gateways/nab_transact.rb +299 -0
  143. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +163 -0
  144. data/lib/active_merchant/billing/gateways/net_registry.rb +198 -0
  145. data/lib/active_merchant/billing/gateways/netaxept.rb +180 -0
  146. data/lib/active_merchant/billing/gateways/netbanx.rb +376 -0
  147. data/lib/active_merchant/billing/gateways/netbilling.rb +229 -0
  148. data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
  149. data/lib/active_merchant/billing/gateways/network_merchants.rb +238 -0
  150. data/lib/active_merchant/billing/gateways/nmi.rb +396 -0
  151. data/lib/active_merchant/billing/gateways/ogone.rb +509 -0
  152. data/lib/active_merchant/billing/gateways/omise.rb +323 -0
  153. data/lib/active_merchant/billing/gateways/openpay.rb +246 -0
  154. data/lib/active_merchant/billing/gateways/opp.rb +394 -0
  155. data/lib/active_merchant/billing/gateways/optimal_payment.rb +331 -0
  156. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +45 -0
  157. data/lib/active_merchant/billing/gateways/orbital.rb +1267 -0
  158. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +206 -0
  159. data/lib/active_merchant/billing/gateways/pagarme.rb +239 -0
  160. data/lib/active_merchant/billing/gateways/pago_facil.rb +120 -0
  161. data/lib/active_merchant/billing/gateways/pay_arc.rb +392 -0
  162. data/lib/active_merchant/billing/gateways/pay_conex.rb +245 -0
  163. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +277 -0
  164. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  165. data/lib/active_merchant/billing/gateways/pay_junction.rb +390 -0
  166. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +206 -0
  167. data/lib/active_merchant/billing/gateways/pay_secure.rb +110 -0
  168. data/lib/active_merchant/billing/gateways/pay_trace.rb +450 -0
  169. data/lib/active_merchant/billing/gateways/paybox_direct.rb +224 -0
  170. data/lib/active_merchant/billing/gateways/payeezy.rb +513 -0
  171. data/lib/active_merchant/billing/gateways/payex.rb +409 -0
  172. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +235 -0
  173. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +42 -0
  174. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  175. data/lib/active_merchant/billing/gateways/payflow.rb +473 -0
  176. data/lib/active_merchant/billing/gateways/payflow_express.rb +220 -0
  177. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +14 -0
  178. data/lib/active_merchant/billing/gateways/payflow_uk.rb +20 -0
  179. data/lib/active_merchant/billing/gateways/payment_express.rb +373 -0
  180. data/lib/active_merchant/billing/gateways/paymentez.rb +365 -0
  181. data/lib/active_merchant/billing/gateways/paymill.rb +369 -0
  182. data/lib/active_merchant/billing/gateways/paynetworx.rb +228 -0
  183. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +718 -0
  184. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +69 -0
  185. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +262 -0
  186. data/lib/active_merchant/billing/gateways/paypal.rb +136 -0
  187. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  188. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +44 -0
  189. data/lib/active_merchant/billing/gateways/paypal_express.rb +272 -0
  190. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
  191. data/lib/active_merchant/billing/gateways/paypal_standard.rb +281 -0
  192. data/lib/active_merchant/billing/gateways/paysafe.rb +420 -0
  193. data/lib/active_merchant/billing/gateways/payscout.rb +159 -0
  194. data/lib/active_merchant/billing/gateways/paystation.rb +204 -0
  195. data/lib/active_merchant/billing/gateways/payu_in.rb +249 -0
  196. data/lib/active_merchant/billing/gateways/payu_latam.rb +482 -0
  197. data/lib/active_merchant/billing/gateways/payway.rb +207 -0
  198. data/lib/active_merchant/billing/gateways/payway_dot_com.rb +253 -0
  199. data/lib/active_merchant/billing/gateways/pin.rb +273 -0
  200. data/lib/active_merchant/billing/gateways/pixxels.rb +263 -0
  201. data/lib/active_merchant/billing/gateways/plexo.rb +308 -0
  202. data/lib/active_merchant/billing/gateways/plugnpay.rb +283 -0
  203. data/lib/active_merchant/billing/gateways/priority.rb +392 -0
  204. data/lib/active_merchant/billing/gateways/pro_pay.rb +325 -0
  205. data/lib/active_merchant/billing/gateways/psigate.rb +227 -0
  206. data/lib/active_merchant/billing/gateways/psl_card.rb +295 -0
  207. data/lib/active_merchant/billing/gateways/qbms.rb +302 -0
  208. data/lib/active_merchant/billing/gateways/quantum.rb +274 -0
  209. data/lib/active_merchant/billing/gateways/quickbooks.rb +377 -0
  210. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +184 -0
  211. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +297 -0
  212. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +226 -0
  213. data/lib/active_merchant/billing/gateways/quickpay.rb +24 -0
  214. data/lib/active_merchant/billing/gateways/qvalent.rb +305 -0
  215. data/lib/active_merchant/billing/gateways/rapyd.rb +319 -0
  216. data/lib/active_merchant/billing/gateways/reach.rb +277 -0
  217. data/lib/active_merchant/billing/gateways/realex.rb +400 -0
  218. data/lib/active_merchant/billing/gateways/redsys.rb +723 -0
  219. data/lib/active_merchant/billing/gateways/s5.rb +247 -0
  220. data/lib/active_merchant/billing/gateways/safe_charge.rb +298 -0
  221. data/lib/active_merchant/billing/gateways/sage.rb +446 -0
  222. data/lib/active_merchant/billing/gateways/sage_pay.rb +434 -0
  223. data/lib/active_merchant/billing/gateways/sallie_mae.rb +141 -0
  224. data/lib/active_merchant/billing/gateways/secure_net.rb +260 -0
  225. data/lib/active_merchant/billing/gateways/secure_pay.rb +191 -0
  226. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +290 -0
  227. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +103 -0
  228. data/lib/active_merchant/billing/gateways/securion_pay.rb +305 -0
  229. data/lib/active_merchant/billing/gateways/shift4.rb +345 -0
  230. data/lib/active_merchant/billing/gateways/simetrik.rb +368 -0
  231. data/lib/active_merchant/billing/gateways/skip_jack.rb +450 -0
  232. data/lib/active_merchant/billing/gateways/smart_ps.rb +274 -0
  233. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  234. data/lib/active_merchant/billing/gateways/spreedly_core.rb +354 -0
  235. data/lib/active_merchant/billing/gateways/stripe.rb +866 -0
  236. data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +602 -0
  237. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +151 -0
  238. data/lib/active_merchant/billing/gateways/telr.rb +273 -0
  239. data/lib/active_merchant/billing/gateways/tns.rb +23 -0
  240. data/lib/active_merchant/billing/gateways/trans_first.rb +240 -0
  241. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +612 -0
  242. data/lib/active_merchant/billing/gateways/transact_pro.rb +222 -0
  243. data/lib/active_merchant/billing/gateways/transax.rb +21 -0
  244. data/lib/active_merchant/billing/gateways/transnational.rb +9 -0
  245. data/lib/active_merchant/billing/gateways/trexle.rb +221 -0
  246. data/lib/active_merchant/billing/gateways/trust_commerce.rb +500 -0
  247. data/lib/active_merchant/billing/gateways/usa_epay.rb +24 -0
  248. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1612 -0
  249. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +367 -0
  250. data/lib/active_merchant/billing/gateways/vanco.rb +303 -0
  251. data/lib/active_merchant/billing/gateways/verifi.rb +224 -0
  252. data/lib/active_merchant/billing/gateways/viaklix.rb +171 -0
  253. data/lib/active_merchant/billing/gateways/visanet_peru.rb +250 -0
  254. data/lib/active_merchant/billing/gateways/vpos.rb +223 -0
  255. data/lib/active_merchant/billing/gateways/webpay.rb +97 -0
  256. data/lib/active_merchant/billing/gateways/wepay.rb +235 -0
  257. data/lib/active_merchant/billing/gateways/wirecard.rb +430 -0
  258. data/lib/active_merchant/billing/gateways/wompi.rb +197 -0
  259. data/lib/active_merchant/billing/gateways/world_net.rb +345 -0
  260. data/lib/active_merchant/billing/gateways/worldpay.rb +1050 -0
  261. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +208 -0
  262. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  263. data/lib/active_merchant/billing/gateways.rb +14 -0
  264. data/lib/active_merchant/billing/model.rb +30 -0
  265. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  266. data/lib/active_merchant/billing/payment_token.rb +21 -0
  267. data/lib/active_merchant/billing/rails.rb +3 -0
  268. data/lib/active_merchant/billing/response.rb +121 -0
  269. data/lib/active_merchant/billing/three_d_secure_eci_mapper.rb +27 -0
  270. data/lib/active_merchant/billing.rb +16 -0
  271. data/lib/active_merchant/connection.rb +194 -0
  272. data/lib/active_merchant/country.rb +338 -0
  273. data/lib/active_merchant/empty.rb +20 -0
  274. data/lib/active_merchant/errors.rb +38 -0
  275. data/lib/active_merchant/net_http_ssl_connection.rb +11 -0
  276. data/lib/active_merchant/network_connection_retries.rb +78 -0
  277. data/lib/active_merchant/post_data.rb +26 -0
  278. data/lib/active_merchant/posts_data.rb +92 -0
  279. data/lib/active_merchant/version.rb +3 -0
  280. data/lib/active_merchant.rb +63 -0
  281. data/lib/activemerchant.rb +1 -0
  282. data/lib/certs/cacert.pem +3214 -0
  283. data/lib/support/gateway_support.rb +69 -0
  284. data/lib/support/outbound_hosts.rb +28 -0
  285. data/lib/support/ssl_verify.rb +88 -0
  286. data/lib/support/ssl_version.rb +86 -0
  287. metadata +506 -0
@@ -0,0 +1,512 @@
1
+ require 'set'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ # Convenience methods that can be included into a custom Credit Card object, such as an ActiveRecord based Credit Card object.
6
+ module CreditCardMethods
7
+ CARD_COMPANY_DETECTORS = {
8
+ 'visa' => ->(num) { num =~ /^4\d{12}(\d{3})?(\d{3})?$/ },
9
+ 'master' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 6), MASTERCARD_RANGES) },
10
+ 'elo' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 6), ELO_RANGES) },
11
+ 'cabal' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 8), CABAL_RANGES) },
12
+ 'alelo' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 6), ALELO_RANGES) },
13
+ 'discover' => ->(num) { num =~ /^(6011|65\d{2}|64[4-9]\d)\d{12,15}$/ },
14
+ 'american_express' => ->(num) { num =~ /^3[47]\d{13}$/ },
15
+ 'naranja' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 6), NARANJA_RANGES) },
16
+ 'diners_club' => ->(num) { num =~ /^3(0[0-5]|[68]\d)\d{11,16}$/ },
17
+ 'jcb' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 4), JCB_RANGES) },
18
+ 'dankort' => ->(num) { num =~ /^5019\d{12}$/ },
19
+ 'maestro' => lambda { |num|
20
+ (12..19).cover?(num&.size) && (
21
+ in_bin_range?(num.slice(0, 6), MAESTRO_RANGES) ||
22
+ MAESTRO_BINS.any? { |bin| num.slice(0, bin.size) == bin }
23
+ )
24
+ },
25
+ 'maestro_no_luhn' => ->(num) { num =~ /^(501080|501081|501082)\d{6,13}$/ },
26
+ 'forbrugsforeningen' => ->(num) { num =~ /^600722\d{10}$/ },
27
+ 'sodexo' => ->(num) { num =~ /^(606071|603389|606070|606069|606068|600818|505864|505865)\d{10}$/ },
28
+ 'alia' => ->(num) { num =~ /^(504997|505878|601030|601073|505874)\d{10}$/ },
29
+ 'vr' => ->(num) { num =~ /^(627416|637036)\d{10}$/ },
30
+ 'unionpay' => ->(num) { (16..19).cover?(num&.size) && in_bin_range?(num.slice(0, 8), UNIONPAY_RANGES) },
31
+ 'carnet' => lambda { |num|
32
+ num&.size == 16 && (
33
+ in_bin_range?(num.slice(0, 6), CARNET_RANGES) ||
34
+ CARNET_BINS.any? { |bin| num.slice(0, bin.size) == bin }
35
+ )
36
+ },
37
+ 'cartes_bancaires' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 6), CARTES_BANCAIRES_RANGES) },
38
+ 'olimpica' => ->(num) { num =~ /^636853\d{10}$/ },
39
+ 'creditel' => ->(num) { num =~ /^601933\d{10}$/ },
40
+ 'confiable' => ->(num) { num =~ /^560718\d{10}$/ },
41
+ 'synchrony' => ->(num) { num =~ /^700600\d{10}$/ },
42
+ 'routex' => ->(num) { num =~ /^(700676|700678)\d{13}$/ },
43
+ 'mada' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 6), MADA_RANGES) },
44
+ 'bp_plus' => ->(num) { num =~ /^(7050\d\s\d{9}\s\d{3}$|705\d\s\d{8}\s\d{5}$)/ },
45
+ 'passcard' => ->(num) { num =~ /^628026\d{10}$/ },
46
+ 'edenred' => ->(num) { num =~ /^637483\d{10}$/ },
47
+ 'anda' => ->(num) { num =~ /^603199\d{10}$/ },
48
+ 'tarjeta-d' => ->(num) { num =~ /^601828\d{10}$/ },
49
+ 'hipercard' => ->(num) { num&.size == 16 && in_bin_range?(num.slice(0, 6), HIPERCARD_RANGES) }
50
+ }
51
+
52
+ SODEXO_NO_LUHN = ->(num) { num =~ /^(505864|505865)\d{10}$/ }
53
+
54
+ # http://www.barclaycard.co.uk/business/files/bin_rules.pdf
55
+ ELECTRON_RANGES = [
56
+ [400115],
57
+ (400837..400839),
58
+ (412921..412923),
59
+ [417935],
60
+ (419740..419741),
61
+ (419773..419775),
62
+ [424519],
63
+ (424962..424963),
64
+ [437860],
65
+ [444000],
66
+ [459472],
67
+ (484406..484411),
68
+ (484413..484414),
69
+ (484418..484418),
70
+ (484428..484455),
71
+ (491730..491759),
72
+ ]
73
+
74
+ CARNET_RANGES = [
75
+ (506199..506499),
76
+ ]
77
+
78
+ CARNET_BINS = Set.new(
79
+ %w[
80
+ 286900 502275 606333 627535 636318 636379 639388
81
+ 639484 639559 50633601 50633606 58877274 62753500
82
+ 60462203 60462204 588772
83
+ ]
84
+ )
85
+
86
+ CARTES_BANCAIRES_RANGES = [
87
+ (507589..507590),
88
+ (507593..507595),
89
+ [507597],
90
+ [560408],
91
+ [581752],
92
+ (585402..585405),
93
+ (585501..585505),
94
+ (585577..585582)
95
+ ]
96
+
97
+ # https://www.mastercard.us/content/dam/mccom/global/documents/mastercard-rules.pdf, page 73
98
+ MASTERCARD_RANGES = [
99
+ (222100..272099),
100
+ (510000..559999),
101
+ [605272],
102
+ [606282],
103
+ [637095],
104
+ [637568],
105
+ (637599..637600),
106
+ [637609],
107
+ ]
108
+
109
+ MAESTRO_BINS = Set.new(
110
+ %w[ 500057
111
+ 501018 501043 501045 501047 501049 501051 501072 501075 501083 501087 501089 501095
112
+ 501500 501623
113
+ 501879 502113 502120 502121 502301
114
+ 503175 503337 503645 503670
115
+ 504310 504338 504363 504533 504587 504620 504639 504656 504738 504781 504910
116
+ 507001 507002 507004 507082 507090
117
+ 560014 560565 561033
118
+ 572402 572610 572626
119
+ 576904
120
+ 578614
121
+ 581149
122
+ 585274 585697
123
+ 586509
124
+ 588729 588792
125
+ 589244 589407 589471 589605 589633 589647 589671 589916
126
+ 590043 590206 590263 590265 590278 590361 590362 590379 590393 590590
127
+ 591235 591420 591481 591620 591770 591948 591994
128
+ 592024 592161 592184 592186 592201 592384 592393 592528 592566 592704 592735 592879 592884
129
+ 593074 593264 593272 593355 593496 593556 593589 593666 593709 593825 593963 593994
130
+ 594184 594409 594468 594475 594581 594665 594691 594710 594874 594968
131
+ 595355 595364 595532 595547 595561 595568 595743 595929
132
+ 596245 596289 596399 596405 596590 596608 596645 596646 596791 596808 596815 596846
133
+ 597077 597094 597143 597370 597410 597765 597855 597862
134
+ 598053 598054 598395 598585 598793 598794 598815 598835 598838 598880 598889
135
+ 599000 599069 599089 599148 599191 599310 599741 599742 599867
136
+ 601070 601452 601628 601638
137
+ 602648
138
+ 603326 603450 603689
139
+ 604983
140
+ 606126
141
+ 608710
142
+ 627339 627453 627454 627973
143
+ 636117 636380 636422 636502 636639
144
+ 637046 637529 637568 637600 637756
145
+ 639130 639229 639350
146
+ 690032]
147
+ )
148
+
149
+ # https://www.mastercard.us/content/dam/mccom/global/documents/mastercard-rules.pdf, page 79
150
+ MAESTRO_RANGES = [
151
+ (500032..500033),
152
+ (501015..501016),
153
+ (501020..501021),
154
+ (501023..501029),
155
+ (501038..501041),
156
+ (501053..501058),
157
+ (501060..501063),
158
+ (501066..501067),
159
+ (501091..501092),
160
+ (501104..501105),
161
+ (501107..501108),
162
+ (501104..501105),
163
+ (501107..501108),
164
+ (501800..501899),
165
+ (502000..502099),
166
+ (503800..503899),
167
+ (561200..561269),
168
+ (561271..561299),
169
+ (561320..561356),
170
+ (581700..581751),
171
+ (581753..581800),
172
+ (589300..589399),
173
+ (589998..591259),
174
+ (591261..596770),
175
+ (596772..598744),
176
+ (598746..599999),
177
+ (600297..600314),
178
+ (600316..600335),
179
+ (600337..600362),
180
+ (600364..600382),
181
+ (601232..601254),
182
+ (601256..601276),
183
+ (601640..601652),
184
+ (601689..601700),
185
+ (602011..602050),
186
+ (630400..630499),
187
+ (639000..639099),
188
+ (670000..679999),
189
+ ]
190
+
191
+ # https://dev.elo.com.br/apis/tabela-de-bins, download csv from left sidebar
192
+ ELO_RANGES = [
193
+ 506707..506708, 506715..506715, 506717..506722, 506724..506736, 506739..506743,
194
+ 506745..506747, 506753..506753, 506774..506778, 509000..509007, 509009..509014,
195
+ 509020..509030, 509035..509042, 509044..509089, 509091..509101, 509104..509807,
196
+ 509831..509877, 509897..509900, 509918..509964, 509971..509986, 509995..509999,
197
+ 627780..627780, 636297..636298, 636368..636368, 650031..650033, 650035..650051,
198
+ 650057..650081, 650406..650439, 650485..650504, 650506..650538, 650552..650598,
199
+ 650720..650727, 650901..650922, 650928..650928, 650938..650939, 650946..650978,
200
+ 651652..651704, 655000..655019, 655021..655057
201
+ ]
202
+
203
+ # Alelo provides BIN ranges by e-mailing them out periodically.
204
+ # The BINs beginning with the digit 4 overlap with Visa's range of valid card numbers.
205
+ # By placing the 'alelo' entry in CARD_COMPANY_DETECTORS below the 'visa' entry, we
206
+ # identify these cards as Visa. This works because transactions with such cards will
207
+ # run on Visa rails.
208
+ ALELO_RANGES = [
209
+ 402588..402588, 404347..404347, 405876..405876, 405882..405882, 405884..405884,
210
+ 405886..405886, 430471..430471, 438061..438061, 438064..438064, 470063..470066,
211
+ 496067..496067, 506699..506704, 506706..506706, 506713..506714, 506716..506716,
212
+ 506749..506750, 506752..506752, 506754..506756, 506758..506767, 506770..506771,
213
+ 506773..506773, 509015..509019, 509880..509882, 509884..509885, 509887..509887,
214
+ 509987..509992
215
+ ]
216
+
217
+ CABAL_RANGES = [
218
+ 60420100..60440099,
219
+ 58965700..58965799,
220
+ 60352200..60352299,
221
+ 65027200..65027299,
222
+ 65008700..65008700
223
+ ]
224
+
225
+ MADA_RANGES = [
226
+ 504300..504300, 506968..506968, 508160..508160, 585265..585265, 588848..588848,
227
+ 588850..588850, 588982..588983, 589005..589005, 589206..589206, 604906..604906,
228
+ 605141..605141, 636120..636120, 968201..968209, 968211..968211
229
+ ]
230
+
231
+ NARANJA_RANGES = [
232
+ 589562..589562
233
+ ]
234
+
235
+ # https://www.discoverglobalnetwork.com/content/dam/discover/en_us/dgn/pdfs/IPP-VAR-Enabler-Compliance.pdf
236
+ UNIONPAY_RANGES = [
237
+ 62000000..62000000, 62212600..62379699, 62400000..62699999, 62820000..62889999,
238
+ 81000000..81099999, 81100000..81319999, 81320000..81519999, 81520000..81639999, 81640000..81719999
239
+ ]
240
+
241
+ JCB_RANGES = [
242
+ 3528..3589, 3088..3094, 3096..3102, 3112..3120, 3158..3159, 3337..3349
243
+ ]
244
+
245
+ HIPERCARD_RANGES = [
246
+ 384100..384100, 384140..384140, 384160..384160, 606282..606282, 637095..637095,
247
+ 637568..637568, 637599..637599, 637609..637609, 637612..637612
248
+ ]
249
+
250
+ def self.included(base)
251
+ base.extend(ClassMethods)
252
+ end
253
+
254
+ def self.in_bin_range?(number, ranges)
255
+ bin = number.to_i
256
+ ranges.any? do |range|
257
+ range.include?(bin)
258
+ end
259
+ end
260
+
261
+ def valid_month?(month)
262
+ (1..12).cover?(month.to_i)
263
+ end
264
+
265
+ def credit_card?
266
+ true
267
+ end
268
+
269
+ def valid_expiry_year?(year)
270
+ (Time.now.year..Time.now.year + 20).cover?(year.to_i)
271
+ end
272
+
273
+ def valid_start_year?(year)
274
+ ((year.to_s =~ /^\d{4}$/) && (year.to_i > 1987))
275
+ end
276
+
277
+ # Credit card providers have 3 digit verification values
278
+ # This isn't standardised, these are called various names such as
279
+ # CVC, CVV, CID, CSC and more
280
+ # See: http://en.wikipedia.org/wiki/Card_security_code
281
+ # American Express is the exception with 4 digits
282
+ #
283
+ # Below are links from the card providers with their requirements
284
+ # visa: http://usa.visa.com/personal/security/3-digit-security-code.jsp
285
+ # master: http://www.mastercard.com/ca/merchant/en/getstarted/Anatomy_MasterCard.html
286
+ # jcb: http://www.jcbcard.com/security/info.html
287
+ # diners_club: http://www.dinersclub.com/assets/DinersClub_card_ID_features.pdf
288
+ # discover: https://www.discover.com/credit-cards/help-center/glossary.html
289
+ # american_express: https://online.americanexpress.com/myca/fuidfyp/us/action?request_type=un_fuid&Face=en_US
290
+ def valid_card_verification_value?(cvv, brand)
291
+ cvv.to_s =~ /^\d{#{card_verification_value_length(brand)}}$/
292
+ end
293
+
294
+ def card_verification_value_length(brand)
295
+ case brand
296
+ when 'american_express'
297
+ 4
298
+ when 'maestro'
299
+ 0
300
+ else
301
+ 3
302
+ end
303
+ end
304
+
305
+ def valid_issue_number?(number)
306
+ (number.to_s =~ /^\d{1,2}$/)
307
+ end
308
+
309
+ # Returns if the card matches known Electron BINs
310
+ def electron?
311
+ self.class.electron?(number)
312
+ end
313
+
314
+ module ClassMethods
315
+ # Returns true if it validates. Optionally, you can pass a card brand as an argument and
316
+ # make sure it is of the correct brand.
317
+ #
318
+ # References:
319
+ # - http://perl.about.com/compute/perl/library/nosearch/P073000.htm
320
+ # - http://www.beachnet.com/~hstiles/cardtype.html
321
+ def valid_number?(number)
322
+ valid_test_mode_card_number?(number) ||
323
+ valid_card_number_length?(number) &&
324
+ valid_card_number_characters?(brand?(number), number) &&
325
+ valid_by_algorithm?(brand?(number), number)
326
+ end
327
+
328
+ def card_companies
329
+ CARD_COMPANY_DETECTORS.keys
330
+ end
331
+
332
+ # Returns a string containing the brand of card from the list of known information below.
333
+ def brand?(number)
334
+ return 'bogus' if valid_test_mode_card_number?(number)
335
+
336
+ CARD_COMPANY_DETECTORS.each do |company, func|
337
+ return company.dup if func.call(number)
338
+ end
339
+
340
+ return nil
341
+ end
342
+
343
+ def electron?(number)
344
+ return false unless [16, 19].include?(number&.length)
345
+
346
+ # don't recalculate for each range
347
+ bank_identification_number = first_digits(number).to_i
348
+
349
+ ELECTRON_RANGES.any? do |range|
350
+ range.include?(bank_identification_number)
351
+ end
352
+ end
353
+
354
+ def type?(number)
355
+ ActiveMerchant.deprecated 'CreditCard#type? is deprecated and will be removed from a future release of ActiveMerchant. Please use CreditCard#brand? instead.'
356
+ brand?(number)
357
+ end
358
+
359
+ def first_digits(number)
360
+ number&.slice(0, 6) || ''
361
+ end
362
+
363
+ def last_digits(number)
364
+ return '' if number.nil?
365
+
366
+ number.length <= 4 ? number : number.slice(-4..-1)
367
+ end
368
+
369
+ def mask(number)
370
+ "XXXX-XXXX-XXXX-#{last_digits(number)}"
371
+ end
372
+
373
+ # Checks to see if the calculated brand matches the specified brand
374
+ def matching_brand?(number, brand)
375
+ brand?(number) == brand
376
+ end
377
+
378
+ def matching_type?(number, brand)
379
+ ActiveMerchant.deprecated 'CreditCard#matching_type? is deprecated and will be removed from a future release of ActiveMerchant. Please use CreditCard#matching_brand? instead.'
380
+ matching_brand?(number, brand)
381
+ end
382
+
383
+ private
384
+
385
+ def valid_card_number_length?(number) #:nodoc:
386
+ return false if number.nil?
387
+
388
+ number.length >= 12
389
+ end
390
+
391
+ def valid_card_number_characters?(brand, number) #:nodoc:
392
+ return false if number.nil?
393
+ return number =~ /\A[0-9 ]+\Z/ if brand == 'bp_plus'
394
+
395
+ !number.match(/\D/)
396
+ end
397
+
398
+ def valid_test_mode_card_number?(number) #:nodoc:
399
+ ActiveMerchant::Billing::Base.test? &&
400
+ %w[1 2 3 success failure error].include?(number)
401
+ end
402
+
403
+ def sodexo_no_luhn?(numbers)
404
+ SODEXO_NO_LUHN.call(numbers)
405
+ end
406
+
407
+ def valid_by_algorithm?(brand, numbers) #:nodoc:
408
+ case brand
409
+ when 'naranja'
410
+ valid_naranja_algo?(numbers)
411
+ when 'creditel'
412
+ valid_creditel_algo?(numbers)
413
+ when 'alia', 'confiable', 'maestro_no_luhn', 'anda', 'tarjeta-d', 'hipercard'
414
+ true
415
+ when 'sodexo'
416
+ sodexo_no_luhn?(numbers) ? true : valid_luhn?(numbers)
417
+ when 'bp_plus', 'passcard', 'edenred'
418
+ valid_luhn_non_zero_check_digit?(numbers)
419
+ else
420
+ valid_luhn?(numbers)
421
+ end
422
+ end
423
+
424
+ BYTES_TO_DIGITS = {
425
+ 48 => 0,
426
+ 49 => 1,
427
+ 50 => 2,
428
+ 51 => 3,
429
+ 52 => 4,
430
+ 53 => 5,
431
+ 54 => 6,
432
+ 55 => 7,
433
+ 56 => 8,
434
+ 57 => 9,
435
+ nil => 0
436
+ }.freeze
437
+
438
+ BYTES_TO_DIGITS_DOUBLED = {
439
+ 48 => 0, # 0 * 2
440
+ 49 => 2, # 1 * 2
441
+ 50 => 4, # 2 * 2
442
+ 51 => 6, # 3 * 2
443
+ 52 => 8, # 4 * 2
444
+ 53 => 1, # 5 * 2 - 9
445
+ 54 => 3, # 6 * 2 - 9
446
+ 55 => 5, # etc ...
447
+ 56 => 7,
448
+ 57 => 9
449
+ }.freeze
450
+
451
+ # Checks the validity of a card number by use of the Luhn Algorithm.
452
+ # Please see http://en.wikipedia.org/wiki/Luhn_algorithm for details.
453
+ # This implementation is from the luhn_checksum gem, https://github.com/zendesk/luhn_checksum.
454
+ def valid_luhn?(numbers) #:nodoc:
455
+ sum = 0
456
+
457
+ odd = true
458
+ numbers.reverse.bytes.each do |bytes|
459
+ if odd
460
+ odd = false
461
+ sum += BYTES_TO_DIGITS[bytes]
462
+ else
463
+ odd = true
464
+ sum += BYTES_TO_DIGITS_DOUBLED[bytes]
465
+ end
466
+ end
467
+
468
+ sum % 10 == 0
469
+ end
470
+
471
+ def valid_luhn_with_check_digit?(numbers, check_digit)
472
+ sum = 0
473
+
474
+ doubler = true
475
+
476
+ numbers.reverse.bytes.each do |bytes|
477
+ doubler ? sum += BYTES_TO_DIGITS_DOUBLED[bytes] : sum += BYTES_TO_DIGITS[bytes]
478
+ doubler = !doubler
479
+ end
480
+
481
+ (10 - (sum % 10)) % 10 == check_digit.to_i
482
+ end
483
+
484
+ def valid_luhn_non_zero_check_digit?(numbers)
485
+ return valid_luhn?(numbers.delete(' ')) if numbers[5] == ' '
486
+
487
+ check_digit = numbers[-1]
488
+ luhn_payload = numbers.delete(' ').chop
489
+ valid_luhn_with_check_digit?(luhn_payload, check_digit)
490
+ end
491
+
492
+ # Checks the validity of a card number by use of specific algorithms
493
+ def valid_naranja_algo?(numbers) #:nodoc:
494
+ num_array = numbers.to_s.chars.map(&:to_i)
495
+ multipliers = [4, 3, 2, 7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
496
+ num_sum = num_array[0..14].zip(multipliers).map { |a, b| a * b }.reduce(:+)
497
+ intermediate = 11 - (num_sum % 11)
498
+ final_num = intermediate > 9 ? 0 : intermediate
499
+ final_num == num_array[15]
500
+ end
501
+
502
+ def valid_creditel_algo?(numbers) #:nodoc:
503
+ num_array = numbers.to_s.chars.map(&:to_i)
504
+ multipliers = [5, 4, 3, 2, 1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9]
505
+ num_sum = num_array[0..14].zip(multipliers).map { |a, b| a * b }.reduce(:+)
506
+ final_num = num_sum % 10
507
+ final_num == num_array[15]
508
+ end
509
+ end
510
+ end
511
+ end
512
+ end
@@ -0,0 +1,37 @@
1
+ module ActiveMerchant
2
+ module Billing
3
+ # Result of the Card Verification Value check
4
+ # http://www.bbbonline.org/eExport/doc/MerchantGuide_cvv2.pdf
5
+ # Check additional codes from cybersource website
6
+ class CVVResult
7
+ MESSAGES = {
8
+ 'D' => 'CVV check flagged transaction as suspicious',
9
+ 'I' => 'CVV failed data validation check',
10
+ 'M' => 'CVV matches',
11
+ 'N' => 'CVV does not match',
12
+ 'P' => 'CVV not processed',
13
+ 'S' => 'CVV should have been present',
14
+ 'U' => 'CVV request unable to be processed by issuer',
15
+ 'X' => 'CVV check not supported for card'
16
+ }
17
+
18
+ def self.messages
19
+ MESSAGES
20
+ end
21
+
22
+ attr_reader :code, :message
23
+
24
+ def initialize(code)
25
+ @code = (code.blank? ? nil : code.upcase)
26
+ @message = MESSAGES[@code]
27
+ end
28
+
29
+ def to_hash
30
+ {
31
+ 'code' => code,
32
+ 'message' => message
33
+ }
34
+ end
35
+ end
36
+ end
37
+ end