简体   繁体   English

java信用卡验证器

[英]Credit Card validator for java

I need to do a Credit card number validation.我需要做一个信用卡号验证。

When I googled this I found the org.apache.commons.validator.CreditCardValidator .当我用谷歌搜索时,我找到了org.apache.commons.validator.CreditCardValidator But seems like it is not working correctly.但似乎它不能正常工作。 When I pass a non-digit character also it porvides true.当我传递一个非数字字符时,它也为真。

Code for Apache 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!");

Then, I wrote following methods to validate credit card numbers based on the card type and the card number (using the luhn's algorithm).然后,我编写了以下方法来根据卡类型和卡号(使用 luhn 算法)验证信用卡号。

CardType validator (null if an invalid card type) 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;
    }

CardNumber validator using Luhn's algorithem.使用 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;
    }

I want to know,我想知道,

  1. Is there any other thrid party class to validate the credit cards other than the org.apache one?除了 org.apache 之外,还有其他第三方类可以验证信用卡吗?
  2. Is there any issue with the my code?我的代码有问题吗? (I tested it for several times. So far so good. I just want to know if you could spot something that I didn't.) (我测试了几次。到目前为止一切都很好。我只是想知道你是否能发现我没有发现的东西。)

References : How do you detect Credit card type based on number?参考资料: 如何根据号码检测信用卡类型?

I did this a long time ago, Sorry Code is in C. Easily Convertible.我很久以前就这样做了,抱歉代码是用 C 编写的。易于转换。 Hope this will help you.希望这会帮助你。

#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);
}

Have a look to Luhn algorithm https://en.wikipedia.org/wiki/Luhn_algorithm看看 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;
}

You can find custom implantation of credit card validator here which is doing both credit card number validation plus credit card type detection,您可以在这里找到信用卡验证器的自定义植入,它同时进行信用卡号验证和信用卡类型检测,

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM