如何使用包含空格的信用卡号?

2022-09-04 23:42:25

一些花哨的网站会在检测到未经培训的购物者输入信用卡/借记卡号时显示错误对话框,因为它印在他们的卡上并带有空格。是否有可能以某种方式编写一个Java Web应用程序来处理这些带有空格的数字,就好像它们是正确的一样?


答案 1

我的观点是,任何拒绝带有空格的信用卡号的Web应用程序都没有完成其工作。当您收到信用卡号时,您可以轻松完成:

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

删除空格和短划线(有些人也使用它们)。然后验证结果。如果您强迫用户删除您可以很容易地删除的空间,您只会惹恼他们。

至于如何验证,这取决于很多事情,比如你使用的是哪个Web框架,以及你选择了什么验证选项。例如,Struts 1可能会或可能不会使用Apache Commons Validator,而Spring MVC(可能)会使用Spring验证等等。所以我不能确切地告诉你如何验证,但我可以告诉你要验证什么

第一件事是,不应拒绝带有空格的 CC 编号。大多数人会发现:

4123 0987 8876 2939

比以下内容更易于阅读:

4123098788762939

如果用户错过或输入错误的数字,并且需要找到他或她的信用卡号未通过验证的原因,这一点非常重要。本文顶部的 replaceAll() 涵盖了这种情况。

第二件事是,您以正确的方式显示信用卡号(即使出于安全原因将某些数字替换为X)。我建议你通读信用卡号码的剖析

该页面为您提供了位数和有效前缀的规则。一个健壮的Web应用程序将实现这些,因此您可以在尝试使用信用卡号之前判断它是否无效。将信用卡详细信息提交到支付网关可能需要长达30秒(或更长时间),因此在您确定付款将被接受之前,您不应该这样做。否则就是提供非常糟糕的用户体验。如果失败1-2次而不是等待,用户完全有可能放弃。

至于显示它们,这取决于数字的数量:

  • 16:4组,每组4个空格;
  • 15:像美国运通卡,即4-6-5,每组之间有一个空格;
  • 14:像大来俱乐部的牌,即4-6-4,每组之间有一个空格;
  • 13:从未见过13,但4-5-4或4-4-5或5-4-4(或可能的3-3-3-4)浮现在脑海中。

在作为标准验证例程的一部分提交处理之前,应根据页面中提到的校验和算法对信用卡号进行验证。该页面具有该例程的 Java 实现。

每个接受信用卡付款的网站都应该将上述所有操作作为绝对最低限度,否则您只是丢弃了业务,因为一定比例的用户感到沮丧。

所以简短的版本是两个简单的规则:

  1. 尽可能宽容用户输入;和
  2. 在提交之前,请尽一切可能验证信用卡详细信息。

答案 2

我甚至会去掉所有非数字字符,然后在通过实际验证(如Luhn的算法)运行用户输入之前检查长度是否有效。

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

从 中去除所有非数字。String input