Created
May 6, 2011 12:27
-
-
Save jamietre/958863 to your computer and use it in GitHub Desktop.
Credit card validator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace CreditCards | |
{ | |
public class CardValidation | |
{ | |
public bool VerifyDate = true; | |
public string CardName; | |
public string CCNumber; | |
public string CCCSV; | |
public string CCName; | |
public string CCExp; | |
public string ErrorMessage; | |
public string CCType | |
{ | |
get {return(_CCType);} | |
set { | |
switch(value) { | |
case "1": | |
case "vi": | |
_CCType="vi"; | |
break; | |
case "2": | |
case "mc": | |
_CCType="mc"; | |
break; | |
case "3": | |
case "am": | |
_CCType="am"; | |
break; | |
} | |
} | |
} protected string _CCType=""; | |
public string CCTypeName | |
{ | |
get { | |
switch(CCType) { | |
case "vi": | |
return("Visa"); | |
case "mc": | |
return("MasterCard"); | |
case "am": | |
return("American Express"); | |
default: | |
return(""); | |
} | |
} | |
} | |
public int CCTypeID | |
{ | |
get { | |
switch(CCType) { | |
case "vi": | |
return(1); | |
case "mc": | |
return(2); | |
case "am": | |
return(3); | |
default: | |
return(0); | |
} | |
} | |
set { | |
CCType=value.ToString(); | |
} | |
} | |
public bool Validate() | |
{ | |
string CCNum; | |
int CCNumberLeft; | |
int CCNumberLength; | |
int ShouldLength; | |
string CardType=""; | |
int Missing; | |
string YearPart; | |
string MonthPart; | |
bool DateValid; | |
ErrorMessage=""; | |
//# 1) Get rid of spaces and non-numeric characters. | |
CCNum = OnlyNumericSolution(CCNumber); | |
//# 2) Do the first four digits fit within proper ranges? | |
//# if so, who's the card issuer and how long should the number be? | |
CCNumberLeft = Convert.ToInt32(CCNum.Substring(0, 4)); | |
CCNumberLength = Convert.ToInt32(CCNum.Length); | |
if (CCType == "") { | |
ErrorMessage = "You must select the credit card type."; | |
return(false); | |
} | |
if (CCNumberLeft >= 3000 && CCNumberLeft <= 3059) { | |
CardName = "Diners Club"; | |
ShouldLength = 14; | |
} else if (CCNumberLeft >= 3600 && CCNumberLeft <= 3699) { | |
CardName = "Diners Club"; | |
ShouldLength = 14; | |
} else if (CCNumberLeft >= 3800 && CCNumberLeft <= 3889) { | |
CardName = "Diners Club"; | |
ShouldLength = 14; | |
} else if (CCNumberLeft >= 3400 && CCNumberLeft <= 3499) { | |
CardName = "American Express"; | |
CardType = "am"; | |
ShouldLength = 15; | |
} else if (CCNumberLeft >= 3700 && CCNumberLeft <= 3799) { | |
CardName = "American Express"; | |
CardType = "am"; | |
ShouldLength = 15; | |
} else if (CCNumberLeft >= 3528 && CCNumberLeft <= 3589) { | |
CardName = "JCB"; | |
ShouldLength = 16; | |
} else if (CCNumberLeft >= 3890 && CCNumberLeft <= 3899) { | |
CardName = "Carte Blache"; | |
ShouldLength = 14; | |
} else if (CCNumberLeft >= 4000 && CCNumberLeft <= 4999) { | |
CardName = "Visa"; | |
CardType = "vi"; | |
if (CCNumberLength > 14) { | |
ShouldLength = 16; | |
} else if (CCNumberLength < 14) { | |
ShouldLength = 13; | |
} | |
else { | |
ErrorMessage = "The number entered is not a valid Visa number."; | |
return(false); | |
} | |
} | |
else if (CCNumberLeft >= 5100 && CCNumberLeft <= 5599) { | |
CardName = "MasterCard"; | |
CardType = "mc"; | |
ShouldLength = 16; | |
} | |
else if (CCNumberLeft == 5610) { | |
CardName = "Australian BankCard"; | |
ShouldLength = 16; | |
} | |
else if (CCNumberLeft == 6011) { | |
CardName = "Discover/Novus"; | |
ShouldLength = 16; | |
} else { | |
ErrorMessage = "The number entered is not valid."; | |
return(false); | |
} | |
//'# 3) Is the number the right length? | |
if (CCNumberLength != ShouldLength) { | |
Missing = CCNumberLength - ShouldLength; | |
if (Missing < 0) | |
ErrorMessage = "The number entered is not a valid " + CCTypeName + " number."; | |
else | |
ErrorMessage = "<The number entered is not a valid " + CCTypeName + " number."; | |
return(false); | |
} | |
//'# 4) Does the number pass the Mod 10 Algorithm Checksum? | |
if (!((Mod10Solution(CCNum) && CCType == CardType))) { | |
ErrorMessage = "The credit card number entered is not valid."; | |
return(false); | |
} | |
//' Check date | |
if (VerifyDate) | |
{ | |
if (CCExp.Length != 7) | |
{ | |
ErrorMessage = "The date must be formatted like MM/YYYY."; | |
return (false); | |
} | |
YearPart = CCExp.Substring(3); | |
//Mid(CCExp, 4) | |
MonthPart = CCExp.Substring(0, 2); | |
//Left(CCExp, 2) | |
if (!(UserFunctions.IsNumeric(YearPart) && UserFunctions.IsNumeric(MonthPart))) | |
{ | |
ErrorMessage = "The expiration date isn't a valid date."; | |
return (false); | |
} | |
DateValid = true; | |
if (DateTime.Now.Year > Convert.ToInt32(YearPart)) | |
{ | |
DateValid = false; | |
} | |
if (DateTime.Now.Year == Convert.ToInt32(YearPart) && DateTime.Now.Month > Convert.ToInt32(MonthPart)) | |
{ | |
DateValid = false; | |
} | |
if (!DateValid) | |
{ | |
ErrorMessage = "The expiration date has passed."; | |
return (false); | |
} | |
} | |
return(true); | |
} | |
public string OnlyNumericSolution(string CCNumber) { | |
string result=""; | |
char s; | |
for (int i=0;i<CCNumber.Length;i++) { | |
s=CCNumber.Substring(i,1).ToCharArray()[0]; | |
if (s >='0' && s<='9') { | |
result+=s; | |
} | |
} | |
if (result.Length<13) { | |
result="0000000000000"; | |
} | |
if (result.Length > 19) | |
{ | |
result = result.Substring(0, 19); | |
} | |
return(result); | |
} | |
private bool Mod10Solution(string CCNumber) { | |
int CCNumberLength; | |
int Checksum=0; | |
int Location; | |
int Digit; | |
CCNumberLength = CCNumber.Length; | |
//'# Add even digits in even length strings | |
//'# or odd digits in odd length strings. | |
Location = 1 - (CCNumberLength % 2); | |
while (Location <= CCNumberLength) { | |
Checksum += Convert.ToInt32(CCNumber.Substring(Location, 1)); | |
Location += 2; | |
} | |
//'# Analyze odd digits in even length strings | |
//'# or even digits in odd length strings. | |
Location = (CCNumberLength % 2); | |
while (Location < CCNumberLength) { | |
Digit = Convert.ToInt32(CCNumber.Substring(Location, 1)) * 2; | |
if (Digit < 10) { | |
Checksum += Digit; | |
} else { | |
Checksum += Digit - 9; | |
} | |
Location += 2; | |
} | |
//'# Is the checksum divisible by ten? | |
if (((double)Checksum / 10) == (double)Math.Truncate((double)Checksum / 10)) { | |
return(true); | |
} else { | |
return(false); | |
} | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment