Как определить, какой номер в серии является недействительным номером кредитной карты - PullRequest
1 голос
/ 10 ноября 2011

Мне нужна помощь со сценарием проверки кредитной карты.Я выяснил, как определить, является ли кредитная карта действительной / недействительной, но мне нужно следующее:

Если кто-то вводит неверный номер кредитной карты, есть ли способ определить, какой номерневерно?

Вот мой текущий код, чтобы определить, является ли карта действительной / недействительной:

function validateCreditcard_number($credit_card_number) {
    //Get the first digit
    $firstnumber = substr($credit_card_number, 0, 1);
    //Make sure it is the correct amount of digits. Account for dashes being present.
    switch ($firstnumber) {
        case 3:
            if (!preg_match('/^3\d{3}[ \-]?\d{6}[ \-]?\d{5}$/', $credit_card_number)) {
               return '<li>This is not a valid American Express card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
            }
            break;
        case 4:
            if (!preg_match('/^4\d{3}[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/', $credit_card_number)) {
                return '<li>This is not a valid Visa card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
            }
            break;
        case 5:
            if (!preg_match('/^5\d{3}[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/', $credit_card_number)) {
                 return '<li>This is not a valid MasterCard card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
            }
            break;
        case 6:
            if (!preg_match('/^6011[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/', $credit_card_number)) {
                return '<li>This is not a valid Discover card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
            }
            break;
        default:
            return '<li>This is not a valid credit card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
    } //END Switch statement

    //Luhn Algorithm
    $credit_card_number = str_replace('.', '', $credit_card_number);
    $credit_card_number = str_replace('-', '', $credit_card_number);
    $credit_card_number = str_replace(' ', '', $credit_card_number);
    $map = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
                0, 2, 4, 6, 8, 1, 3, 5, 7, 9);
    $sum = 0;
    $last = strlen($credit_card_number) - 1;

    for ($i = 0; $i <= $last; $i++) {
        $sum += $map[$credit_card_number[$last - $i] + ($i & 1) * 10];
    }

    if ($sum % 10 != 0) {
       return '<li>This is not a valid credit card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
    } else {
       //If we made it this far the credit card number is in a valid format
       return 'This is a valid credit card number' ;
    }

} //END validateCreditcard_number

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

Контрольная сумма Luhn не может определить, какая цифра неверна, она может обнаружить только однозначные ошибки и некоторые многозначные ошибки. Вполне возможно набрать две цифры и получить номер с правильной контрольной суммой.

2 голосов
/ 10 ноября 2011

Вы могли бы пройти долгий путь, не предполагая, что первое число правильное.В настоящее время кому-то, кто опечатывает самое первое число своей визы как 3 вместо 4, говорят, что они вводят недействительный American Express.Это жестоко с точки зрения юзабилити.Если номер кредитной карты недействителен, он просто недействителен.Это не недействительный American Express, если только явно не выберет American Express из другого раскрывающегося списка.

Кроме того небольшого улучшения, то, о чем вы просите, невозможно.Алгоритм контрольной суммы mod10 не может сказать вам, какая цифра неверна.

Чтобы попытаться объяснить, почему, рассмотрим следующий упрощенный сценарий:

  • У меня есть 5 цифр, я незнать, что они есть
  • Сумма из 5 цифр равна 50
  • Одна из следующих цифр не соответствует единице

Какая из следующих цифр являетсяневерно?

9 + 11 + 8 + 9 + 12 = 49

Невозможно сказать .Это может быть любая из этих цифр, любая из них может быть отключена на -1.Но это не начинает описывать нашу проблему.Я сказал вам, что неверна только одна цифра.В вашей ситуации вы не знаете, сколько ошибаетесь.Одна цифра может быть выключена на -2, а другая картинка может быть выключена на +1.Буквально бесконечное количество «неправильных» состояний.Возможно, все пять чисел неверны!Возможно правильные 5 чисел 0 0 0 0 50.Это проблема, с которой вы сталкиваетесь при проверке мод10 / Luhn.Абсолютно невозможно определить, какие числа / числа являются / являются неправильными.

Вы спросили в ответ на другой ответ, существует ли какой-либо другой алгоритм, чтобы определить, является ли индивидуальная цифра неправильной;это не имеет никакого смысла. Лун это алгоритм , нравится это или нет.Числа не были сгенерированы, чтобы соответствовать любому другому алгоритму, и вы не сможете изменить алгоритм после того, как он используется всем миром.


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

2 голосов
/ 10 ноября 2011

Вы не можете.Номера кредитных карт имеют контрольную сумму (код проверки ошибок), которая позволяет обнаруживать ошибки, но у них нет никаких ошибок исправлений кода.

...