【发布时间】:2013-10-30 21:12:09
【问题描述】:
我需要进行信用卡号验证。
当我用谷歌搜索时,我找到了org.apache.commons.validator.CreditCardValidator。但似乎它无法正常工作。
当我传递一个非数字字符时,它也为 true。
Apache 代码CreditCardValidator:
String ccNumber = "378282246310005";
CreditCardValidator creditCardValidator = new CreditCardValidator();
if(!creditCardValidator.isValid(ccNumber)) throw new Exception("Credit Card Number is not a valid one!");
然后,我编写了以下方法来根据卡类型和卡号验证信用卡号(使用 luhn 算法)。
CardType 验证器(如果卡类型无效,则为 null)
public String getCCType(String ccNumber){
String visaRegex = "^4[0-9]{12}(?:[0-9]{3})?$";
String masterRegex = "^5[1-5][0-9]{14}$";
String amexRegex = "^3[47][0-9]{13}$";
String dinersClubrRegex = "^3(?:0[0-5]|[68][0-9])[0-9]{11}$";
String discoverRegex = "^6(?:011|5[0-9]{2})[0-9]{12}$";
String jcbRegex = "^(?:2131|1800|35\\d{3})\\d{11}$";
String commonRegex = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$";
try {
ccNumber = ccNumber.replaceAll("\\D", "");
return (ccNumber.matches(visaRegex) ? "VISA" : ccNumber.matches(masterRegex) ? "MASTER" :ccNumber.matches(amexRegex) ? "AMEX" :ccNumber.matches(dinersClubrRegex) ? "DINER" :ccNumber.matches(discoverRegex) ? "DISCOVER" :ccNumber.matches(jcbRegex) ? "JCB":null);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
使用 Luhn 算法的 CardNumber 验证器。
public boolean isValidCardNumber(String ccNumber){
try {
ccNumber = ccNumber.replaceAll("\\D", "");
char[] ccNumberArry = ccNumber.toCharArray();
int checkSum = 0;
for(int i = ccNumberArry.length - 1; i >= 0; i--){
char ccDigit = ccNumberArry[i];
if((ccNumberArry.length - i) % 2 == 0){
int doubleddDigit = Character.getNumericValue(ccDigit) * 2;
checkSum += (doubleddDigit % 9 == 0 && doubleddDigit != 0) ? 9 : doubleddDigit % 9;
}else{
checkSum += Character.getNumericValue(ccDigit);
}
}
return (checkSum != 0 && checkSum % 10 == 0);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
我想知道,
- 是否有任何其他第三方类来验证信用卡 除了 org.apache 吗?
- 我的代码有问题吗? (我测试了几次。到目前为止一切都很好。我只是想知道 如果你能发现我没有发现的东西。)
【问题讨论】:
-
你能发布关于 Apache CreditCardValidator 的代码吗?解决这个问题比编写自己的恕我直言更容易。
-
我添加了Thihara。我也在寻找经过彻底测试和验证的推荐第三方课程。
-
贴出代码的信用卡号是有效还是无效?什么是失败的测试用例并导致您在其他地方寻找? Apache commons 被广泛使用,因此它是一个不错的选择,抱歉,我不知道有任何其他库可用于此类验证。
-
@Thihara :我使用的 Apache 验证器 jar 一定有错误,或者我的项目的构建问题(我的项目在 maven 下运行)。现在我得到了最新的,它工作正常。感谢您的支持。
标签: java validation credit-card