Click here to Skip to main content
15,898,134 members
Articles / Programming Languages / C#

WDX C# Credit Card Validation Functions

Rate me:
Please Sign up or sign in to vote.
3.26/5 (8 votes)
23 Aug 2006CPOL 45.1K   403   31  
Various methods for validating credit card details.
using System;
using System.Collections;
using System.IO;
using System.Data;

namespace WDX.Utilities
{
    public class Payment
    {

        public static bool IsLUHNValid(string ccNo) 
        { 
            bool isValid = false;
            int indicator = 1; // will be indicator for every other number 
            int firstNumToAdd = 0; // will be used to store sum of first set of numbers 
            int secondNumToAdd = 0; // will be used to store second set of numbers 
            string num1; // will be used if every other number added is greater than 10, store the left-most integer here 
            string num2; // will be used if ever yother number added is greater than 10, store the right-most integer here 

            // Convert our creditNo string to a char array 
            char[] ccArr = ccNo.ToCharArray(); 

            if (IsNumeric(ccNo))
            {
                for (int i=ccArr.Length-1;i>=0;i--) 
                { 
                    char ccNoAdd = ccArr[i]; 
                    int ccAdd = Int32.Parse(ccNoAdd.ToString()); 
                    if (indicator == 1) 
                    { 
                        // If we are on the odd number of numbers, add that number to our total 
                        firstNumToAdd += ccAdd; 
                        // set our indicator to 0 so that our code will know to skip to the next piece 
                        indicator = 0; 
                    } 
                    else 
                    { 
                        // if the current integer doubled is greater than 10 
                        // split the sum in to two integers and add them together 
                        // we then add it to our total here 
                        if ((ccAdd + ccAdd) >= 10) 
                        { 
                            int temporary = (ccAdd + ccAdd); 
                            num1 = temporary.ToString().Substring(0,1); 
                            num2 = temporary.ToString().Substring(1,1); 
                            secondNumToAdd += (Convert.ToInt32(num1) + Convert.ToInt32(num2)); 
                        } 
                        else 
                        { 
                            // otherwise, just add them together and add them to our total 
                            secondNumToAdd += ccAdd + ccAdd; 
                        } 
                        // set our indicator to 1 so for the next integer we will perform a different set of code 
                        indicator = 1; 
                    } 
                } 
                // If the sum of our 2 numbers is divisible by 10, then the card is valid. Otherwise, it is not 
                if ((firstNumToAdd + secondNumToAdd) % 10 == 0) 
                { 
                    isValid = true; 
                } 
                else 
                { 
                    isValid = false; 
                }
            }
            else
                isValid = false;

            return isValid; 
        } 


        public enum CardType
        {
            Invalid,
            Unknown,
            AmericanExpress,
            Bankcard,
            DinersClubInternational,
            DinersClubUSandCanada,
            DiscoverCard,
            JCB,
            Maestro,
            MasterCard,
            SoloDebit,
            SwitchDebit,
            Visa,
            VisaElectron,
            enRoute
        }

        public static CardType GetCardType(string strCardNumber)
        {
            strCardNumber = strCardNumber.Replace(" ", "");

            // Check American Express
            if (strCardNumber.Substring(0, 2)=="34" || strCardNumber.Substring(0, 2)=="37")
            {
                if (strCardNumber.Length==15)
                    return CardType.AmericanExpress;
                else
                    return CardType.Invalid;
            }

            // Check Bankcard
            if (strCardNumber.Substring(0, 3).ToUpper() == "DNE") return CardType.Bankcard;

            // Check Diners Club Internationl
            if (strCardNumber.Substring(0, 2) == "36" || strCardNumber.Substring(0, 2) == "38" || (Convert.ToInt32(strCardNumber.Substring(0, 3)) >= 300 && Convert.ToInt32(strCardNumber.Substring(0, 3)) <= 305))
                if (strCardNumber.Length==14)
                    return CardType.DinersClubInternational;
                else
                    return CardType.Invalid;

            // Check Diners Club US and Canadaa
            if (strCardNumber.Substring(0, 2) == "55") return CardType.DinersClubUSandCanada;

            // Check Discover Card
            if (strCardNumber.Substring(0, 4) == "6011") 
                if (strCardNumber.Length==16)
                    return CardType.Bankcard;
                 else
                    return CardType.Invalid;

            // Check JCB Card
            if (strCardNumber.Substring(0, 4) == "2131" || strCardNumber.Substring(0, 4) == "1800" ) 
                if (strCardNumber.Length==15)
                    return CardType.JCB;
                else
                    return CardType.Invalid;

            // Check Maestro Card
            if (strCardNumber.Substring(0, 4) == "5020") 
                if (strCardNumber.Length==16)
                    return CardType.Maestro;
                else
                    return CardType.Invalid;

            // Check MasterCard
            if ((Convert.ToInt32(strCardNumber.Substring(0, 3)) >= 51 && Convert.ToInt32(strCardNumber.Substring(0, 3)) <= 55)) 
                if (strCardNumber.Length==16)
                    return CardType.MasterCard;
                else
                    return CardType.Invalid;

            // Check Solo Card
            if (strCardNumber.Substring(0, 2) == "63" || strCardNumber.Substring(0, 4) == "6767") 
                if (strCardNumber.Length==16 || strCardNumber.Length==18 || strCardNumber.Length==19)
                    return CardType.SoloDebit;
                else
                    return CardType.Invalid;

            // Check Switch Card
            if (strCardNumber.Substring(0, 4) == "4903" || strCardNumber.Substring(0, 4)== "4905" || strCardNumber.Substring(0, 4) == "4911" || strCardNumber.Substring(0, 4) == "4936" || strCardNumber.Substring(0, 6) == "564182" || strCardNumber.Substring(0, 6) == "633110" || strCardNumber.Substring(0, 4) == "6333" || strCardNumber.Substring(0, 4) == "6759") 
                if (strCardNumber.Length==16 || strCardNumber.Length==18 || strCardNumber.Length==19)
                    return CardType.SwitchDebit;
                else
                    return CardType.Invalid;

            // Check Visa Electron Card
            if (strCardNumber.Substring(0, 6) == "417500") 
                if (strCardNumber.Length==16)
                    return CardType.VisaElectron;
                else
                    return CardType.Invalid;

            // Check Visa Card
            if (strCardNumber.Substring(0, 1) == "4") 
                if (strCardNumber.Length==16)
                    return CardType.Visa;
                else
                    return CardType.Invalid;

            // Check enRoute Card
            if (strCardNumber.Substring(0, 4) == "2014" || strCardNumber.Substring(0, 4) == "2149") 
                if (strCardNumber.Length==15)
                    return CardType.enRoute;
                else
                    return CardType.Invalid;

            return CardType.Unknown;

        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
United Kingdom United Kingdom
Anthony Main started developing and designing web sites as far back as 1996 using traditional HTML. His skills have now grown and he is a professional .net developer, with skills in c#, vb.net, css, xhtml.

Running his own company Web DynamiX (in his spare time) he develops web solutions for small to medium size businesses and provides hosting and consultancy solutions.

His main occupation is of web developer where is works for Branded 3/a> developing .Net projects for medium to enterprise businesses.

You can read his personal blog at:
http://blog.anthonymain.com.

Comments and Discussions