Как вы определяете тип кредитной карты по номеру?

Я хотел бы объявить о существовании инструментария автоматической интроспекции / отражения «IDK». Он использует мета-компилятор, такой как Qt, и добавляет метаинформацию непосредственно в объектные файлы. Утверждается, что он прост в использовании. Нет внешних зависимостей. Он даже позволяет автоматически отражать std :: string, а затем использовать его в скриптах. Посмотрите IDK

497
задан NullUserException 30 December 2011 в 16:15
поделиться

5 ответов

Число кредитной / дебетовой карты упоминается как PAN, или Первичный номер счета . Первые шесть цифр PAN взяты от IIN, или Выпускающий Идентификационный номер , принадлежа эмиссионному банку (IINs были ранее известны как МУСОРНОЕ ВЕДРΠ— Идентификационные номера Банка —, таким образом, можно видеть ссылки на ту терминологию в некоторых документах). Эти шесть цифр подвергаются международному стандарту, ISO/IEC 7812, и могут использоваться для определения типа карты от числа.

, К сожалению, фактическая база данных ISO/IEC 7812 не общедоступна, однако, существуют неофициальные списки, и коммерческие и бесплатные, включая на Википедию .

Так или иначе, для обнаружения типа от числа можно использовать регулярное выражение как те ниже: Кредит на исходные выражения

Виза: ^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.

Клуб Посетителей: ^3(?:0[0-5]|[68][0-9])[0-9]{4,}$ номера карты Клуба Посетителей начинаются 300 - 305, 36 или 38. Существуют карты Клуба Посетителей, которые начинаются 5 и имеют 16 цифр. Они - совместное предприятие между Клубом Небольших ресторанов и 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, которые не живут в диапазоне MasterCard’s IIN (числа, запускающиеся 51... 55); самый важный случай является случаем карт Маэстро, многие из которых были выпущены от другого banks’ IIN диапазоны и так расположены на всем протяжении пространства числа. В результате может быть лучше предположить, что любая карта, которая не имеет некоторого другого типа, который Вы принимаете, должен быть MasterCard.

Важный : номера карты действительно варьируются по длине; например, Виза имеет в прошлых выпущенных картах с 13 ПАНОРАМИРОВАНИЯМИ цифры и картах с 16 ПАНОРАМИРОВАНИЯМИ цифры. Документация Visa’s в настоящее время указывает, что может выпустить или, возможно, выпустила числа с между 12 и 19 цифрами. Поэтому Вы не должны проверять длину номера карты, кроме проверить, что это имеет по крайней мере 7 цифр (для полного IIN плюс один контрольный разряд, который должен соответствовать значению, предсказанному [1 111] алгоритм Luhn ).

Одна дальнейшая подсказка: прежде, чем обработать PAN держателя карты, разделите любые пробельные символы и знаки пунктуации от входа . Почему? Поскольку it’s обычно очень легче ввести цифры в группы, подобные тому, как they’re, отображенный на передней стороне фактической кредитной карты, т.е.

4444 4444 4444 4444

, намного легче ввести правильно, чем [1 130]

4444444444444444

There’s действительно никакое преимущество в наказании пользователя, потому что they’ve ввел символы, которые Вы не ожидаете здесь.

Это также подразумевает проверку, что Ваши поля записи имеют пространство для [1 116] [по крайней мере 1 116] 24 символа, иначе пользователи, которые вводят пробелы, выбегут из комнаты. I’d рекомендуют сделать поле достаточно широким, чтобы отобразить 32 символа и позволить до 64; это дает много высоты для расширения.

Вот изображение, которое дает немного больше понимания:

ОБНОВЛЕНИЕ (2014): метод контрольных сумм больше, кажется, не допустимый способ проверить подлинность карты , как отмечено в комментариях к этому ответу.

ОБНОВЛЕНИЕ (2016): MasterCard должна реализовать новые диапазоны МУСОРНОГО ВЕДРА, запускающиеся Оплата Ach .

Credit Card Verification

726
ответ дан OmG 30 December 2011 в 16:15
поделиться

Первые числа кредитной карты могут использоваться для приближения поставщика:

  • Виза: 49,44 или 47
  • VISA Electron: 42, 45, 48, 49
  • MasterCard: 51
  • посетители Amex:34
  • : 30, 36, 38
  • JCB: 35
5
ответ дан Gajus 30 December 2011 в 16:15
поделиться
  • 1
    @Codemonkey, byebug doesn' t (и won' t) работа с Ruby 1.9.x, но это должно работа для Ruby 2.0.0 потому что that' s его единственная цель. Я просто ответил на Ваш вопрос, если byebug все еще не работает на Вас, сообщите мне. – deivid 14 June 2013 в 11:28

Попробуйте это за kotlin. Добавьте Regex и добавьте к когда оператор.

private fun getCardType(number: String): String {

        val visa = Regex("^4[0-9]{12}(?:[0-9]{3})?$")
        val mastercard = Regex("^5[1-5][0-9]{14}$")
        val amx = Regex("^3[47][0-9]{13}$")

        return when {
            visa.matches(number) -> "Visa"
            mastercard.matches(number) -> "Mastercard"
            amx.matches(number) -> "American Express"
            else -> "Unknown"
        }
    }
0
ответ дан 22 November 2019 в 22:35
поделиться

Вот Полный код C # или VB для всех видов вещей, связанных с CC в codeproject.

  • IsValidNumber
  • GetCardTypeFromNumber
  • GetCardTestNumber
  • PassesLuhnTest

] Эта статья была опубликована пару лет без отрицательных комментариев.

13
ответ дан 22 November 2019 в 22:35
поделиться

Проверьте это:

http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B

function isValidCreditCard(type, ccnum) {
/* Visa: length 16, prefix 4, dashes optional.
Mastercard: length 16, prefix 51-55, dashes optional.
Discover: length 16, prefix 6011, dashes optional.
American Express: length 15, prefix 34 or 37.
Diners: length 14, prefix 30, 36, or 38. */

  var re = new Regex({ "visa": "/^4\d{3}-?\d{4}-?\d{4}-?\d",
                       "mc": "/^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/",
                       "disc": "/^6011-?\d{4}-?\d{4}-?\d{4}$/",
                       "amex": "/^3[47]\d{13}$/",
                       "diners": "/^3[068]\d{12}$/"}[type.toLowerCase()])

   if (!re.test(ccnum)) return false;
   // Remove all dashes for the checksum checks to eliminate negative numbers
   ccnum = ccnum.split("-").join("");
   // Checksum ("Mod 10")
   // Add even digits in even length strings or odd digits in odd length strings.
   var checksum = 0;
   for (var i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
      checksum += parseInt(ccnum.charAt(i-1));
   }
   // Analyze odd digits in even length strings or even digits in odd length strings.
   for (var i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
      var digit = parseInt(ccnum.charAt(i-1)) * 2;
      if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
   }
   if ((checksum % 10) == 0) return true; else return false;
}
19
ответ дан 22 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: