Я хотел бы объявить о существовании инструментария автоматической интроспекции / отражения «IDK». Он использует мета-компилятор, такой как Qt, и добавляет метаинформацию непосредственно в объектные файлы. Утверждается, что он прост в использовании. Нет внешних зависимостей. Он даже позволяет автоматически отражать std :: string, а затем использовать его в скриптах. Посмотрите IDK
Число кредитной / дебетовой карты упоминается как 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 .
Первые числа кредитной карты могут использоваться для приближения поставщика:
Попробуйте это за 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"
}
}
Вот Полный код C # или VB для всех видов вещей, связанных с CC в codeproject.
] Эта статья была опубликована пару лет без отрицательных комментариев.
Проверьте это:
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;
}