【问题标题】:Credit Card validator for javajava的信用卡验证器
【发布时间】: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;
    }

我想知道,

  1. 是否有任何其他第三方类来验证信用卡 除了 org.apache 吗?
  2. 我的代码有问题吗? (我测试了几次。到目前为止一切都很好。我只是想知道 如果你能发现我没有发现的东西。)

参考资料: How do you detect Credit card type based on number?

【问题讨论】:

  • 你能发布关于 Apache CreditCardValidator 的代码吗?解决这个问题比编写自己的恕我直言更容易。
  • 我添加了Thihara。我也在寻找经过彻底测试和验证的推荐第三方课程。
  • 贴出代码的信用卡号是有效还是无效?什么是失败的测试用例并导致您在其他地方寻找? Apache commons 被广泛使用,因此它是一个不错的选择,抱歉,我不知道有任何其他库可用于此类验证。
  • @Thihara :我使用的 Apache 验证器 jar 一定有错误,或者我的项目的构建问题(我的项目在 maven 下运行)。现在我得到了最新的,它工作正常。感谢您的支持。

标签: java validation credit-card


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我也在问题中提到过。您在参考资料中提到的类似实现也已在我正在使用的另一个项目中实现。但是我正在寻找经过测试推荐的第三方课程。
    • @Supun Sameera。很遗憾,您的链接现在已损坏
    【解决方案3】:

    我很久以前就这样做了,抱歉代码是用 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-12-08
    • 2011-09-10
    • 2014-08-14
    • 2011-01-24
    • 2012-08-14
    • 2017-04-02
    • 2016-11-15
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多