Подтвердить что ты не робот

Как использовать номера кредитных карт, содержащие пробелы?

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

4b9b3361

Ответ 1

Я считаю, что любое веб-приложение, которое отклоняет номер кредитной карты с пробелами, не выполняет свою работу. Когда вы получаете номер кредитной карты, достаточно легко сделать:

String ccNumber = ccNumber.replaceAll("[\\s-]+", "");

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

Что касается как для проверки, это зависит от многих вещей, например, от используемой вами веб-структуры и от того, какие параметры проверки вы выбрали. Например, Struts 1 может использовать или не использовать Apache Commons Validator, тогда как Spring MVC (возможно) использует валидацию Spring и так далее. Поэтому я не могу точно сказать, как проверить, но я могу сказать вам , что для проверки.

Во-первых, номер CC с пробелами должен быть отклонен not. Большинство людей найдут:

4123 0987 8876 2939

намного легче читать, чем:

4123098788762939

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

Во-вторых, вы показываете номер кредитной карты (даже если некоторые цифры заменены на X по соображениям безопасности) правильным образом. Я предлагаю вам прочитать Анатомия номеров кредитных карт.

Эта страница дает вам правила для количества цифр и действительных префиксов. Надежное веб-приложение будет внедрять эти , чтобы вы могли определить, недействителен ли номер кредитной карты, прежде чем пытаться использовать его. Чтобы отправить данные кредитной карты на платежный шлюз, может потребоваться до 30 секунд (или, возможно, больше), чтобы вы не делали этого, пока не убедитесь, что платеж будет принят. В противном случае мы создадим очень плохой пользовательский интерфейс. Есть все шансы, что пользователь откажется, если он потерпит неудачу в 1-2 раза, а не ждет.

Что касается отображения их, это зависит от количества цифр:

  • 16: 4 группы из 4 разделены пробелом;
  • 15: как карта American Express, т.е. 4-6-5 с пробелом между каждой группой;
  • 14: как карта Diners Club, т.е. 4-6-4 с пробелом между каждой группой;
  • 13: Никогда не видел 13, но 4-5-4 или 4-4-5 или 5-4-4 (или, возможно, 3-3-3-4), на ум.

Номер кредитной карты должен быть проверен в соответствии с алгоритмом контрольной суммы, указанным на странице, перед отправкой для обработки в рамках стандартной процедуры проверки. Эта страница имеет реализацию Java этой процедуры.

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

Итак, короткая версия - это два простых правила:

  • Будьте как можно более прощайте с пользовательским вводом; и
  • Сделайте все возможное, чтобы проверить данные кредитной карты перед отправкой.

Ответ 2

Я хотел бы удалить все нечисловые символы, а затем проверить, что длина действительна до запуска пользовательского ввода с помощью реальной проверки, например алгоритм Луна.

String ccNumber = input.replaceAll("\\D", "");

удаляет все цифры из String input.

Ответ 3

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

Эти люди неудобства для своих клиентов просто потому, что они (разработчики) ленивы. Нет причин не принимать такие вещи, как номера кредитных карт, номера телефонов и т.д. В любом формате, который им предоставляется. Единственное ограничение - это то, что ТРЕБУЕТСЯ, чтобы понять, как интерпретировать значение.

Вам не важно, вводите ли я 5555-4444-3333-2222 или 5555444433332222, просто разделите тире, если вам не нравятся - то же самое с пробелами. И с номерами телефонов, если вы не собираетесь автоматически набирать номер, вам, вероятно, даже не важно, какой формат его в нем, поэтому не раздражайте своих пользователей, если вам не нужно.

Ответ 4

К сожалению, нет. Java просто не может справиться с этими требованиями, поскольку в эмуляции виртуальной машины Java на х86-чипах так много накладных расходов, что не оставляет места для полезных конструкций, таких как регулярные выражения Perl, которые могут сделать это следующим образом:

$input =~ s/\D//g;

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

Мой совет - перейти на Perl. Известно также, что схема может справиться с этой ситуацией, а также дать огромное преимущество перед конкурентами, но Scheme работает только на машинах LISP.

Ответ 5

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

Почему, если только машина может выполнять "обработку данных", так что сам аппарат может изменить формат данных! Или, если бы не было такой вещи, как "неподготовленный" покупатель! Увы!

Ответ 6

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

Это довольно тривиально в любом современном языке с использованием или без использования регулярного выражения.

Ответ 7

Легко.

  • Ваше пространство ввода - это список символов из набора символов, содержащего все символы.
  • Ваше пространство вывода - это список символов из некоторого набора символов, содержащего только числа.

Чтобы решить эту проблему, мы создаем промежуточное пространство, содержащее только числа от 0 до 9. Мы можем создать новое перечисление для этого конечного множества. Мы будем называть это своим пальцем, так как он странно содержит такое же количество членов, как и пальцы.

Затем мы записываем две функции.

  • Преобразование пространства ввода в пространство пальца
  • Преобразование пространства пальца в пространство вывода

По мере того, как мы уменьшаем входное пространство до области пальца, мы просто бросаем символ, который не найден в пространстве пальца. Преобразование из пространства пальца в пространство вывода еще проще. Мы просто находим то же число в выходном пространстве.

Трюк заключается в том, чтобы это работало со всеми наборами символов. Я не понял, как определить, соответствует ли определенный персонаж члену моего набора пальцев. Возможно, я должен опубликовать его как вопрос.

Ответ 8

Том,

Проблема решена технически, позвольте говорить об этом теоретически.

Здесь есть две школы мысли. Я не думаю, что это приемлемый ответ, чтобы сказать "если пользователь не может понять, что это их проблема".

  • Будьте тверды в своем пользовательском вводе и принимайте только номера кредитных карт, которые хорошо сформированы. Это требует, чтобы пользователь находился на странице, пока все не получится правильно.
  • Будьте более мягкими, предполагая их намерения и настраивая их вход для них (просто обязательно дайте им экран подтверждения, чтобы проверить новый ввод).

По моему мнению, №2 - путь, вы можете использовать регулярные выражения (как указано выше), чтобы вытащить все пробелы, специальные символы и т.д. из поля cС# и не дать пользователю войти в их информация снова.

В любом случае вы должны сообщить пользователю о правильной форме ввода (т.е. xxxx-xx-xxxx)

как правило, я склонен оценивать сайты, которые более элегантны в отношении того, как они обрабатывают ввод пользователя.

Дополнительные советы по регулярным выражениям проверяют регулярные выражения. Информация

Удачи,

-Роберт

Ответ 9

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

Ответ 10

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

Ответ 11

Я собираюсь предположить, что это реальный вопрос, хотя он выглядит как какой-то тролль или шутка.

Вы должны моделировать свой интерфейс, чтобы пользователь инстинктивно выполнял ввод контролируемым образом. Проще говоря, сначала спросите их о карточке, а затем в форме входного формата введите вход для соответствия карте. Например, если принять 16-значную карточку, например Visa или Mastercard, отобразите 4 поля ввода, разделенные пробелами или тире, которые ограничивают ввод до 4 символов каждый и автоматически переходят к следующему полю в серии после того, как пользователь вводит четвертую цифру.

На странице должно выглядеть примерно так:

Номер карты:
[1234] - [1234] - [1234] - [1234]

или

Номер карты:
[1234] - [123456] - [12345]

Ответ 13

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

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

Ответ 14

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

Ответ 15

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

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.

Рант

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

Ответ 16

Если вы имеете в виду 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 поля, это облегчает ввод их количества, а для тех посетителей, которые думают "ах орехи, я должен использовать свою мышь для каждого номера" (или, по крайней мере, я ) рад, что страница достаточно умна, чтобы знать, чтобы перейти к следующему полю.

Ответ 17

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

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

Ответ 18

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">

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

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

Так много для описания ответа.