クレジット カード番号の検証を行う必要があります。
これをグーグルで検索したところ、org.apache.commons.validator.CreditCardValidator
. しかし、それは正しく機能していないようです。数字以外の文字を渡すと、それも真になります。
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以外のクレジットカードを検証するサードパーティクラスはありますか?
- 私のコードに問題はありますか?(私はそれを数回テストしました。今のところとても良いです。私が見つけられなかった何かを見つけられるかどうか知りたいだけです。)