Как я могу использовать номера кредитных карт, содержащие пробелы? - PullRequest
12 голосов
/ 18 мая 2009

На некоторых модных веб-сайтах появляется диалоговое окно с сообщением об ошибке, когда обнаруживается, что неподготовленный покупатель ввел номер кредитной / дебетовой карты, указанный на его карточке с пробелами. Можно ли каким-то образом написать веб-приложение на Java, которое обрабатывает эти числа с пробелами, как если бы они были правильными?

Ответы [ 18 ]

1 голос
/ 18 мая 2009

Существует несколько вариантов, но наиболее логичным представляется сделать простую замену строки, чтобы заменить все пробелы закрытым символом, т. Е. ''. Это уменьшит строку кредитной карты до одной длинной строки чисел .. затем просто обработайте

1 голос
/ 21 мая 2009

Реклама на этом сайте ... Всего за $ 49,95 у вас может быть новая специальная клавиатура, совместимая с этим интернет-магазином. Нажмите здесь, чтобы добавить новую клавиатуру в корзину и оформить заказ. При выезде, пожалуйста, введите номер своей кредитной карты в указанное поле. Пожалуйста, не вводите пробелы между числами, так как наш магазин не знает, как обращаться с пробелами между числами.

0 голосов
/ 25 мая 2009

Если вы имеете в виду javascript, вы можете использовать метод «перейти к следующему вводу»:

Вот HTML:

<form id="ccform" action="cc_submit.php" method="post">
    <fieldset id="ccnumber">
        <input id="firstset" type="text" maxlength="4" />
        <input id="secondset" type="text" maxlength="4" />
        <input id="thirdset" type="text" maxlength="4" />
        <input id="fourthset" type="text" maxlength="4" />
    </fieldset>
</form>

А вот и JS:

var ccfields;

function moveToNext(e) {
    var field = e.currentTarget;
    var chars = field.value.length;
    var setnumb = Number(field.id.substr(3,1)) - 1;
    if(chars >= 4 && setnumb < 3) {
        ccfields[setnumb + 1].focus();
    }
}

window.onload = function() {
    ccfields = document.getElementById("ccnumber").getElementsByTagName("input");
    for (var i = 0; i < ccfields.length; i++) {
        ccfields[i].onkeyup = moveToNext;
    }
};

Конечно, вы захотите добавить функцию, которая проверяет наличие не чисел, и функцию для сбора четырех полей и объединения их в одну строку для возврата обратно в форму. Также неплохо использовать библиотеку js, такую ​​как Jquery, чтобы гарантировать, что события обрабатываются одинаково, и упростить обход через входы, чтобы вы могли использовать такие атрибуты, как «имя», без каких-либо путаницы.

Но, как правило, если люди видят 4 поля, это облегчает ввод их числа, и для тех посетителей, которые думают «ах, я должен использовать мышь для каждого числа», они (или, по крайней мере, я ) рад, что страница достаточно умна, чтобы знать, чтобы перейти к следующему полю.

0 голосов
/ 23 мая 2009

Я написал эту пару функций Perl в магазине, где в 1998 году была разрешена только Visa (... на самом деле ...).

sub mod10_checkdigit
{
    my($acct) = @_;
    die "invalid account number in BRPS::mod10_checkdigit"
        unless $acct =~ m%^\d+$%;
    my(@digits) = split //, $acct;
    my($len) = scalar(@digits);
    print "# ($len) @digits\n" if ($ENV{PERL_BRPS_DEBUG});
    my($i, $sum, $chk);
    my($mul) = (($len % 2) == 1) ? 1 : 2;
    $len--;
    for ($i = 0; $i < $len; $i++)
    {
        my($val) = $mul * $digits[$i];
        # Note that we need the digital root of the value, but $val is not
        # greater than 18 (because $digits[$i] <= 9 and $mul <= 2).
        $val -= 9 if ($val >= 10);
        $sum += $val;
        print "# $i: $digits[$i] * $mul => $val => $sum\n" if ($ENV{PERL_BRPS_DEBUG});
        $mul = 3 - $mul;
    }
    $chk = 10 - ($sum % 10);
    $chk = 0 if ($chk == 10);
    return $chk;
}

sub validate_account
{
    my($acct) = @_;
    # Strip leading and trailing blanks
    $acct =~ s/^\s*(\S.*\S)\s*$/$1/;
    my($clean) = $acct;
    # Check that account number is string of digits, blanks and dashes
    return undef, "account number is not a sequence of digits, blanks and dashes"
        unless $acct =~ m/^[- \d]+$/;
    return undef, "account number is not a Visa account number"
        unless $acct =~ m/^4/;
    # Remove non-digits
    $clean =~ s/\D//g;
    return undef, "account number is neither 13 nor 16 digits"
        unless length($clean) == 16 || length($clean) == 13;
    # Punctuators must be reasonably consistent!
    return undef, "invalid punctuation pattern"
        unless ($acct =~ m/^\d{16}$/o or $acct =~ m/^\d{13}$/o or
                $acct =~ m/^\d{4}[- ]\d{4}[- ]\d{4}[- ]\d{4}$/o or
                $acct =~ m/^\d{4}[- ]\d{3}[- ]\d{3}[- ]\d{3}$/o);
    # Determine check digit
    my($chk) = mod10_checkdigit($clean);
    return undef, "check digit on account number is incorrect"
        unless $clean =~ m/$chk$/;
    return $clean, "ok";
}

Разрешить правдоподобные номера кредитных карт через. Нетрудно обобщить работу с Mastercard, Discover, American Express.

Рант

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

0 голосов
/ 22 мая 2009

Вы можете использовать проверку JavaScript, используя событие onkeypress, чтобы проверить, является ли последний символ действительным, а если нет, просто удалить его и, возможно, даже высветить сообщение о том, что введен недопустимый символ. Таким образом, неверные номера никогда не вводятся. Он также может автоматически вводить символ пробела (пробел или -) в нужном формате.

0 голосов
/ 25 мая 2009

Решение 1. Как насчет того, чтобы просто поместить в 4 текстовых поля, которые могут принимать 4-значные числа. Например, как вводятся лицензионные ключи для программного обеспечения. Вы можете активировать переключатели для перехода к следующей строке после ввода пробела или символа табуляции.

Решение 2. Используйте регулярные выражения, как указано в одном из комментариев, описанных выше. Проблема в том, что вы будете подвержены инъекционным атакам, если это веб-приложение.

0 голосов
/ 25 мая 2009

Java TM отлично подходит для программирования на стороне сервера, тогда как JavaScript может быть полезен на стороне клиента; например, во время проверки.

Длина действительного номера кредитной карты варьируется от 12 (например, Maestro) до 19 (например, Solo, Switch). Клиентский javascript может выяснить, является ли номер карты действительным (только цифры (с тире или пробелами), соответствует ли полномочия эмитента, контрольная сумма в порядке, ...) и выполнить сопоставление 1: 1 из «читабельного» человека. (например,

American Express    3400 0100 2000 009

) для внутреннего представления, например

<input ... id="ccid" value="340001002000009">
<input ... id="ccissuer" value="AMEX">

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

Пример простой функции javascript, которая выполняет некоторые проверки по этому вопросу, можно найти в сети, например, здесь http://www.braemoor.co.uk/software/creditcard.shtml.

Вот вам и описание ответа.

0 голосов
/ 18 мая 2009

Конечно. Сжать пробелы. Есть, вероятно, миллион способов сделать это; Я хотел бы использовать String.split (), чтобы разбить его на пробелы, а затем объединить четыре строки в результате. Или используйте StringBuffer.indexOf () и .delteCharAt ().

... или, как сказал Клетус, используйте replaceAll ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...