Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'json'
- card_networks_string = '[
- { "id": 1, "name": "American Express", "bins": ["34", "37"] },
- { "id": 2, "name": "Bankcard", "bins": ["5610", "560221-560225"] },
- { "id": 3, "name": "China UnionPay", "bins": ["62"] },
- { "id": 4, "name": "Dankort", "bins": ["5019", "4571"] },
- { "id": 5, "name": "Diners Club enRoute", "bins": ["2014", "2149"] },
- { "id": 6, "name": "Diners Club International", "bins": ["36", "300-305", "3095", "38-39"] },
- { "id": 7, "name": "Discover Card", "bins": ["6011", "64", "65"] },
- { "id": 8, "name": "InstaPayment", "bins": ["637-639"] },
- { "id": 9, "name": "InterPayment", "bins": ["636"] },
- { "id": 10, "name": "JCB", "bins": ["3528-3589"] },
- { "id": 11, "name": "Laser", "bins": ["6304", "6706", "6771", "6709"] },
- { "id": 12, "name": "Maestro", "bins": ["50", "56-58", "6"] },
- { "id": 13, "name": "MasterCard", "bins": ["2221-2720", "51-55"] },
- { "id": 14, "name": "MIR", "bins": ["2200-2204"] },
- { "id": 15, "name": "RuPay", "bins": ["60", "6521"] },
- { "id": 16, "name": "Solo", "bins": ["6334", "6767"] },
- { "id": 17, "name": "Switch", "bins": ["4903", "4905", "4911", "4936", "564182", "633110", "6333", "6759"] },
- { "id": 18, "name": "Troy", "bins": ["979200-979289"] },
- { "id": 19, "name": "UATP", "bins": ["1"] },
- { "id": 20, "name": "Verve", "bins": ["506099-506198", "650002-650027"] },
- { "id": 21, "name": "Visa", "bins": ["4"] }
- ]'
- card_networks = JSON.parse(card_networks_string)
- class CardNetworks
- # card_networks - json из конфигурации card-networks.yml
- def initialize(card_networks)
- @cards_bins_map = map_cards_bins(card_networks)
- end
- # создание массива элементов из заданного интервала чисел
- # from = 1, to = 5, результат: [1, 2, 3, 4, 5]
- def interval(from, to)
- arr = []
- while from <= to
- arr.push(from)
- from += 1
- end
- arr
- end
- # преобразование списка вида ['5610', '560221-560225'] bin-ов
- # в массив элементов ['5610', '560221', '560222', '560223', '560224', '560225']
- def bins_list(bins)
- result = []
- bins.each {
- |bin|
- # если элемент является интервалом вида "560221-560225", то
- # то создаём список вида ['560221', '560222', '560223', '560224', '560225']
- if (!(bin =~ /\-/).nil?)
- fromTo = bin.split('-')
- expanded = interval(fromTo[0].to_i, fromTo[1].to_i)
- result.concat(expanded)
- else
- result.push(bin.to_i)
- end
- }
- result
- end
- # содание массива соотвествия id карты и её бинов [{ cardId: 1, bin: 104212 }, { cardId: 1, bin: 45 }]
- def map_card_bins(card_network, bins)
- result = []
- bins.each {
- |bin|
- result.push({
- id: card_network['id'],
- network: card_network['name'],
- networkIcon: card_network['icon'],
- bin: bin,
- })
- }
- result
- end
- # создание массива объектов вида [{ card_id: 1, bin: 104212 }, { card_id: 1, bin: 45 }, { card_id: 2, bin: 345375 }]
- # т.е. соотношение одного bin-а к id карты, которой он соответствует
- # на одну и ту же карту может приходиться несколько bin-ов
- def map_cards_bins(card_networks)
- result = []
- card_networks.each {
- |card_network|
- card_bins = card_network['bins']
- bins = bins_list(card_bins)
- map_card = map_card_bins(card_network, bins)
- result.concat(map_card)
- }
- result = result.sort_by do |item|
- item[:bin]
- end
- result.reverse
- end
- # поиск карты по bin-у
- def search(bin)
- item = []
- @cards_bins_map.find {
- |item|
- regexp = Regexp.new('^' + item[:bin].to_s)
- !(bin =~ regexp).nil?
- }
- end
- end
- helper = CardNetworks.new(card_networks)
- puts helper.search('220220')
Add Comment
Please, Sign In to add comment