Introduction
Here is my payment class for doing basic credit/debit card validation checks in C#. It includes the following functions:
- LUHN check
- Card type lookup
Background
The LUHN check was taken from another example, however I do not remember where to give credit; please let me know if you find it elsewhere so I can give credit.
The card type lookup is fairly rudimentary. It follows some simple rules as found in Wikipedia
for identifying the card type. These are not exhaustive and may not always be valid as there is no defined standard, but they will give a fairly accurate lookup facility
for checking against a user submitted type.
Using the code
The class contains two static methods which can be called from your routines to aid with your validation, all you need to do is pass in the card number.
LUHN check
public static bool IsLUHNValid(string ccNo)
{
bool isValid = false;
int indicator = 1;
int firstNumToAdd = 0;
int secondNumToAdd = 0;
string num1;
string num2;
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)
{
firstNumToAdd += ccAdd;
indicator = 0;
}
else
{
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
{
secondNumToAdd += ccAdd + ccAdd;
}
indicator = 1;
}
}
if ((firstNumToAdd + secondNumToAdd) % 10 == 0)
{
isValid = true;
}
else
{
isValid = false;
}
}
else
isValid = false;
return isValid;
}
Get card type
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(" ", "");
if (strCardNumber.Substring(0, 2)=="34" ||
strCardNumber.Substring(0, 2)=="37")
{
if (strCardNumber.Length==15)
return CardType.AmericanExpress;
else
return CardType.Invalid;
}
if (strCardNumber.Substring(0, 3).ToUpper() == "DNE")
return CardType.Bankcard;
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;
if (strCardNumber.Substring(0, 2) == "55")
return CardType.DinersClubUSandCanada;
if (strCardNumber.Substring(0, 4) == "6011")
if (strCardNumber.Length==16)
return CardType.Bankcard;
else
return CardType.Invalid;
if (strCardNumber.Substring(0, 4) == "2131" ||
strCardNumber.Substring(0, 4) == "1800" )
if (strCardNumber.Length==15)
return CardType.JCB;
else
return CardType.Invalid;
if (strCardNumber.Substring(0, 4) == "5020")
if (strCardNumber.Length==16)
return CardType.Maestro;
else
return CardType.Invalid;
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;
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;
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;
if (strCardNumber.Substring(0, 6) == "417500")
if (strCardNumber.Length==16)
return CardType.VisaElectron;
else
return CardType.Invalid;
if (strCardNumber.Substring(0, 1) == "4")
if (strCardNumber.Length==16)
return CardType.Visa;
else
return CardType.Invalid;
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;
}
History
- 1.0 - 22 August 2006 - Checks are appropriate to prefixes dictated on Wikipedia on this date.