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

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

Ответы [ 18 ]

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

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

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

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

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

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

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-реализация этой подпрограммы.

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

Итак, в короткой версии есть два простых правила:

  1. Будьте как можно более прощающими с пользовательским вводом; и
  2. Сделайте абсолютно все возможное, чтобы проверить данные кредитной карты перед отправкой.
19 голосов
/ 18 мая 2009

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

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

убирает все не-цифры из String input.

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

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

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

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

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

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

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

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

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

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

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

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

4 голосов
/ 20 мая 2009

Легко.

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

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

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

  1. Преобразовать пространство ввода в пространство пальца
  2. Преобразовать пространство пальца в пространство вывода

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

Хитрость в том, чтобы это работало со всеми наборами символов. Я не выяснил, как определить, соответствует ли определенный символ члену в моем наборе пальцев. Может быть, я должен опубликовать это как вопрос.

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

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

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

2 голосов
/ 21 мая 2009

Tom

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

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

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

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

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

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

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

Удачи,

-Роберт

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

похоже, что только один человек упомянул алгоритм Luhn или mod 10

http://en.wikipedia.org/wiki/Luhn_algorithm

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

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

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

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

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

или

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

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