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

我很久以前就这样做了,抱歉代码在 C 中。很容易转换。希望这会帮助你。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int CardNoChecker(unsigned long long int Number)
{
        int dijts=0;
        int Ans=0;
        {
            unsigned long long int k=1;
            while(Number%k!=Number)
            {
                    dijts=dijts+1;
                    k=k*10;
            }
        }
    {
        int i=1;
        int Product=0;
        int Sum=0;
        for(i=dijts;i>=1;i--)
        {
                if(i%2==0)
                {
                    if((Number%10)*2<10)
                    Product = Product + (  Number % 10  ) * 2 ;
                    else
                    {
                        int No=(Number%10)*2;
                        Product = Product + No/10;
                        Product = Product + No%10;
                    }
                }
                else
                {
                    Sum = Sum + (  Number  % 10     ) ;
                }
                Number=Number /10;
        }
        Ans = Sum + Product ;
    }
    if(Ans%10==0)
    return (1);
    else
    return (0);
}

int main()
{
    unsigned long long int CardNO;
    int valid=0;
    while(!valid)
    {
        int CnV=0;
        int VC=0;
        int AE=0;
        int MC=0;
        printf("Enter Card NO : ");
        scanf("%llu",&CardNO);
        if(CardNO/1000000000000==4 || CardNO/1000000000000000==4)
        {
            VC=1;
        }
        else if(CardNO/10000000000000==34 ||CardNO/10000000000000==37)
        {
            AE=1;
        }
        else if(CardNO/100000000000000==51 || CardNO/100000000000000==52 || CardNO/100000000000000==53 || CardNO/100000000000000==54 || CardNO/100000000000000==55)
        {
            MC=1;
        }
        CnV=CardNoChecker(CardNO);
        if(CnV && MC )
         printf("This is a Valid Master Card\n\n");
         else if(CnV && VC )
         printf("This is a Valid Visa Card\n\n");
         else if(CnV && AE )
         printf("This is a Valid American Express Card\n\n");
         else
        printf("Card is Not Valid'\n\n");
    }

    return (0);
}
于 2013-10-22T06:50:41.347 回答
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 回答
0

您可以在此处找到信用卡验证器的自定义植入,它同时进行信用卡号验证和信用卡类型检测,

http://www.esupu.com/credit-card-validator-java/

于 2013-10-23T09:10:00.643 回答