5

クレジット カード番号の検証を行う必要があります。

これをグーグルで検索したところ、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;
    }

私は知りたいです、

  1. org.apache以外のクレジットカードを検証するサードパーティクラスはありますか?
  2. 私のコードに問題はありますか?(私はそれを数回テストしました。今のところとても良いです。私が見つけられなかった何かを見つけられるかどうか知りたいだけです。)

参照 : 番号に基づいてクレジット カードの種類をどのように検出しますか?

4

3 に答える 3

1

Luhn アルゴリズムを ご覧ください https://en.wikipedia.org/wiki/Luhn_algorithm

 public static void main(String[] args) {
    boolean isValid = checkCC("4561 2612 1234 5467");
    System.out.println(isValid);
}

private static boolean checkCC(String input)  {
    String purportedCC = input.replaceAll(" ", "");
    int sum = 0;

    for (int i = 0; i < purportedCC.length(); i++) {
        int cardNum = Integer.parseInt(
                Character.toString(purportedCC.charAt(i)));

        if ((purportedCC.length() - i) % 2 == 0) {
            cardNum = cardNum * 2;

            if (cardNum > 9) {
                cardNum = cardNum - 9;
            }
        }

        sum += cardNum;
    }
    return sum % 10 == 0;
}
于 2020-05-09T13:10:42.743 に答える