Я пытаюсь выяснить, как определить тип кредитной карты, основываясь исключительно на ее номере. Кто-нибудь знает точный, надежный способ найти это?
algorithm
language-agnostic
e-commerce
Эндрю Эдвалсон
источник
источник
Ответы:
Номер кредитной / дебетовой карты называется PAN или Первичным номером счета . Первые шесть цифр PAN взяты из IIN или идентификационного номера эмитента , принадлежащего банку-эмитенту (ранее IIN назывались BIN - идентификационные номера банков - поэтому вы можете увидеть ссылки на эту терминологию в некоторых документах). Эти шесть цифр соответствуют международному стандарту ISO / IEC 7812 и могут использоваться для определения типа карты по номеру.
К сожалению, фактическая база данных ИСО / МЭК 7812 не является общедоступной, однако существуют неофициальные списки, как коммерческие, так и бесплатные, в том числе в Википедии .
В любом случае, чтобы определить тип по числу, вы можете использовать регулярное выражение, подобное приведенному ниже: Кредит на оригинальные выражения
Visa:
^4[0-9]{6,}$
номера карт Visa начинаются с 4.MasterCard:
^5[1-5][0-9]{5,}|222[1-9][0-9]{3,}|22[3-9][0-9]{4,}|2[3-6][0-9]{5,}|27[01][0-9]{4,}|2720[0-9]{3,}$
до 2016 года номера MasterCard начинаются с цифр от 51 до 55, но это будет определять только кредитные карты MasterCard ; Существуют и другие карты, выпущенные с использованием системы MasterCard, которые не попадают в этот диапазон IIN. В 2016 году они добавят номера в диапазоне (222100-272099).American Express:
^3[47][0-9]{5,}$
номера карт American Express начинаются с 34 или 37.Diners Club:
^3(?:0[0-5]|[68][0-9])[0-9]{4,}$
номера карт Diners Club начинаются с 300 до 305, 36 или 38. Существуют карты Diners Club, которые начинаются с 5 и имеют 16 цифр. Это совместное предприятие Diners Club и MasterCard, и их следует обрабатывать как MasterCard.Обнаружение:
^6(?:011|5[0-9]{2})[0-9]{3,}$
Обнаружение номеров карт начинается с 6011 или 65.JCB:
^(?:2131|1800|35[0-9]{3})[0-9]{3,}$
карты JCB начинаются с 2131, 1800 или 35.К сожалению, существует ряд типов карт, обработанных системой MasterCard, которые не находятся в диапазоне IIN MasterCard (числа, начинающиеся с 51 ... 55); наиболее важный случай - карты Maestro, многие из которых были выпущены из диапазонов IIN других банков и расположены по всему пространству номеров. В результате, может быть лучше предположить, что любая карта, не относящаяся к какому-либо другому типу, которую вы принимаете, должна быть MasterCard .
Важно : номера карт различаются по длине; например, Visa в прошлом выпускала карты с 13-значными PAN и карты с 16-значными PAN. В настоящее время в документации Visa указано, что она может выдавать или иметь номера с 12 до 19 цифрами. Поэтому не следует проверять длину номера карты, за исключением проверки того, что он имеет не менее 7 цифр (для полного ИИН плюс одна контрольная цифра, которая должна соответствовать значению, предсказанному алгоритмом Луна ).
Еще один совет: перед обработкой PAN владельца карты удалите все пробелы и знаки препинания из ввода . Почему? Потому что, как правило , вводить цифры в группы гораздо проще, подобно тому, как они отображаются на лицевой стороне реальной кредитной карты, т.е.
гораздо легче правильно ввести, чем
На самом деле нет смысла наказывать пользователей, потому что они вводят символы, которых вы здесь не ожидаете.
Это также означает, что в полях ввода должно быть не менее 24 символов, в противном случае пользователям, которые вводят пробелы, не хватит места. Я бы порекомендовал вам сделать поле достаточно широким, чтобы отображать 32 символа и разрешать до 64; это дает много возможностей для расширения.
Вот изображение, которое дает немного больше понимания:
ОБНОВЛЕНИЕ (2014): метод контрольной суммы больше не является допустимым способом проверки подлинности карты, как отмечено в комментариях к этому ответу.
ОБНОВЛЕНИЕ (2016): Mastercard вводит новые диапазоны BIN, начиная с Ach Payment .
источник
В JavaScript:
Модульный тест:
источник
Обновлено: 15 июня 2016 г. (как окончательное решение в настоящее время)
Пожалуйста, обратите внимание, что я даже отстаиваю голос за того, за кого проголосовали лидеры, но чтобы прояснить это, на самом деле это регулярные выражения, я протестировал его с тысячами реальных кодов БИН. Самое главное - использовать стартовые строки (^), иначе это приведет к ложным результатам в реальном мире!
JCB
^(?:2131|1800|35)[0-9]{0,}$
Начать с: 2131, 1800, 35 (3528-3589)American Express
^3[47][0-9]{0,}$
Начать с: 34, 37Diners Club
^3(?:0[0-59]{1}|[689])[0-9]{0,}$
Начните с: 300-305, 309, 36, 38-39Виза
^4[0-9]{0,}$
Начать с: 4MasterCard
^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$
Начать с: 2221-2720, 51-55Маэстро
^(5[06789]|6)[0-9]{0,}$
Маэстро всегда растет в диапазоне: 60-69 , начинается с / не с чего-то другого, но начиная с 5, в любом случае, необходимо закодировать как mastercard. Карты Maestro должны быть обнаружены в конце кода, потому что некоторые другие имеют в диапазоне 60-69. Пожалуйста, посмотрите на код.Откройте для
^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$
себя Откройте для себя довольно сложный код, начните с: 6011, 622126-622925, 644-649, 65В JavaScript я использую эту функцию. Это хорошо, когда вы назначаете его на событие onkeyup, и оно дает результат как можно скорее.
Здесь вы можете поиграть с ним:
http://jsfiddle.net/upN3L/69/
Для PHP используйте эту функцию, она также обнаруживает некоторые карты VISA / MC:
источник
Вот функция проверки типа кредитной карты с помощью Regex, c #
источник
Проверь это:
http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B
источник
недавно мне понадобился такой функционал, я портировал валидатор кредитных карт Zend Framework на ruby. ruby gem: https://github.com/Fivell/credit_card_validations zend framework: https://github.com/zendframework/zf2/blob/master/library/Zend/Validator/CreditCard.php
Они оба используют диапазоны INN для определения типа. Здесь вы можете прочитать о ИНН
В соответствии с этим вы можете обнаружить кредитную карту в качестве альтернативы (без регулярных выражений, но с объявлением некоторых правил о префиксах и возможной длине)
Таким образом, у нас есть следующие правила для большинства используемых карт
Затем, выполнив поиск префикса и сравнив длину, вы можете определить марку кредитной карты. Также не забывайте про luhn algoritm (он описан здесь http://en.wikipedia.org/wiki/Luhn ).
ОБНОВИТЬ
Обновленный список правил можно найти здесь https://raw.githubusercontent.com/Fivell/credit_card_validations/master/lib/data/brands.yaml
источник
Вот полный код C # или VB для всех видов связанных с CC вещей в codeproject.
Эта статья была в течение нескольких лет без негативных комментариев.
источник
Компактная версия JavaScript
источник
Ответ Анатолия в PHP:
источник
Вот функция класса php возвращает CCtype по CCnumber.
Этот код не проверяет карту или не запускает алгоритм Луна, только попытайтесь найти тип кредитной карты на основе таблицы на этой странице . в основном использует длину CCnumber и префикс CCcard для определения типа CCcard.
источник
Не пытайтесь определить тип кредитной карты как часть обработки платежа. Вы рискуете отклонить действительные транзакции.
Если вам необходимо предоставить информацию обработчику платежей (например, объекту кредитной карты PayPal требуется указать тип карты ), то угадайте ее по наименьшей доступной информации, например
Этой реализации (с использованием только первых двух цифр) достаточно для идентификации всех основных (а в случае PayPal всех поддерживаемых) схем карт. На самом деле, вы можете вообще пропустить исключение и использовать по умолчанию самый популярный тип карт. Пусть платежный шлюз / процессор сообщит вам, если в ответ на ваш запрос произошла ошибка проверки.
Реальность такова, что ваш платежный шлюз не заботится о ценности, которую вы предоставляете .
источник
Первые цифры кредитной карты можно использовать для приблизительного определения поставщика:
источник
В распознавании диапазона карт (CRR) недостатком алгоритмов, использующих ряд регулярных выражений или других жестко закодированных диапазонов, является то, что в моем опыте со временем меняются BIN / IIN. Кобрендинг карт - это постоянное осложнение. Разным эквайрерам / продавцам карт может потребоваться, чтобы вы относились к одной и той же карте по-разному, в зависимости, например, от геолокации.
Кроме того, в последние несколько лет, когда, например, карты UnionPay получили более широкое распространение, существующие модели не справляются с новыми диапазонами, которые иногда чередуются с более широкими диапазонами, которые они заменяют.
Знание географии вашей системы может помочь, так как некоторые диапазоны ограничены для использования в определенных странах. Например, диапазоны 62 включают некоторые поддиапазоны AAA в США, но если ваша торговая база находится за пределами США, вы можете рассматривать все 62 как UnionPay.
Вас также могут попросить относиться к карте по-разному в зависимости от местоположения продавца. Например, рассматривать некоторые британские карты как дебетовые внутри страны, но как кредитные на международном уровне.
Существует очень полезный набор правил, поддерживаемых одним крупным эквайринговым банком. Например, https://www.barclaycard.co.uk/business/files/BIN-Rules-EIRE.pdf и https://www.barclaycard.co.uk/business/files/BIN-Rules-UK.pdf . (Действительные ссылки по состоянию на июнь 2017 года, благодаря пользователю, предоставившему ссылку на обновленную ссылку.) Но учтите, что, хотя эти правила CRR могут представлять юниверс выдачи карт, поскольку он применяется к торговцам, приобретенным этой организацией, он не включает, например, диапазоны, обозначенные как CUP / UPI.
Эти комментарии относятся к сценариям с магнитной полосой (MagStripe) или PKE (Pan Key Entry). Ситуация снова в мире ICC / EMV.
Обновление: другие ответы на этой странице (а также связанная страница WikiPedia) имеют JCB как всегда 16 длинных. Однако в моей компании есть специальная команда инженеров, которая сертифицирует наши POS-устройства и программное обеспечение в нескольких банках-эквайерах и географических регионах. Самый последний пакет сертификации, полученный этой командой от JCB, имел пропускную коробку для 19-кратного PAN.
источник
Swift 2.1 Версия ответа Усмана Y. Используйте оператор print для проверки, поэтому вызывайте по некоторому строковому значению
источник
Stripe предоставил эту фантастическую библиотеку JavaScript для определения схемы карты. Позвольте мне добавить несколько фрагментов кода и показать, как его использовать.
Сначала включите его на свою веб-страницу как
Во-вторых, используйте функцию cardType для определения схемы карты.
Вот ссылки для большего количества примеров и демонстраций.
источник
В swift вы можете создать перечисление для определения типа кредитной карты.
Вызовите метод CreditCardType.cardTypeForCreditCardNumber ("# номер карты"), который возвращает значение перечисления CreditCardType.
источник
Мое решение с JQuery:
В случае возврата 0 тип кредитной карты не определяется.
Класс «кредитная карта» должен быть добавлен в поле ввода кредитной карты.
источник
Я довольно долго искал форматирование кредитной карты и номера телефона. Нашел много хороших советов, но ничего не соответствовало моим точным желаниям, поэтому я создал этот кусочек кода . Вы используете это так:
источник
источник
Просто маленькая ложка кормления:
источник
Вот пример некоторых булевых функций, написанных на Python, которые возвращают,
True
если карта обнаружена согласно имени функции.источник
Исходя из вышеизложенного, я хотел бы сохранить фрагмент кода JAVA для идентификации бренда карты.
Ссылка
источник
Попробуйте это для kotlin. Добавьте Regex и добавьте в оператор when.
источник
Правила регулярных выражений, соответствующие поставщикам соответствующих карт :
(4\d{12}(?:\d{3})?)
для визы.(5[1-5]\d{14})
для MasterCard.(3[47]\d{13})
для AMEX.((?:5020|5038|6304|6579|6761)\d{12}(?:\d\d)?)
для маэстро.(3(?:0[0-5]|[68][0-9])[0-9]{11})
для Diners Club.(6(?:011|5[0-9]{2})[0-9]{12})
для Обнаружения.(35[2-8][89]\d\d\d{10})
для JCB.источник
Я использую https://github.com/bendrucker/creditcards-types/ для определения типа кредитной карты по номеру. Одна проблема, с которой я столкнулся, это обнаружение теста № 6011 1111 1111 1117
из https://www.cybersource.com/developers/other_resources/quick_references/test_cc_numbers/ мы можем видеть, что это номер обнаружения, потому что он начинается с 6011. Но результат, который я получаю от типов кредитных карт, - «Maestro». Я открыл вопрос автору. Он ответил мне очень скоро и предоставил этот документ в формате PDF https://www.discovernetwork.com/downloads/IPP_VAR_Compliance.pdf Из документа мы можем ясно видеть, что 6011 1111 1111 1117 не попадает в диапазон кредитных карт обнаружения.
источник
Попробуйте это. Для быстрого.
Использование.
источник
источник