IOS Credit Card Number, CVV validation & its type check methods,
1)Credit card number validation using Luhn algorithm
#define AE_CARD @"AE_CARD"
#define VISA_CARD @"VISA_CARD"
#define MASTER_CARD @"MASTER_CARD"
#define DISC_CARD @"DISC_CARD"
- (NSMutableArray *) toCharArray :(NSString *)cardNo{
NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[cardNo length]];
for (int i=0; i < [cardNo length]; i++) {
NSString *ichar = [NSString stringWithFormat:@"%c", [cardNo characterAtIndex:i]];
[characters addObject:ichar];
}
return [characters autorelease];
}
- (NSString *) luhnCheck:(NSString *)creditCardSTR {
NSMutableArray *stringAsChars = [self toCharArray:creditCardSTR];
BOOL isOdd = YES;
int oddSum = 0;
int evenSum = 0;
for (int i = [creditCardSTR length] - 1; i >= 0; i--) {
int digit = [(NSString *)[stringAsChars objectAtIndex:i] intValue];
if (isOdd)
oddSum += digit;
else
evenSum += digit/5 + (2*digit) % 10;
isOdd = !isOdd;
}
if((oddSum + evenSum) % 10 == 0){
return [self getCreditCardType:creditCardSTR];
}else{
return @"Unknown";
}
}
- (NSString *)getCreditCardType:(NSString *)cardNo
{
// I checked here for only 4 card you can add more ref
NSString *theNumber = cardNo;
if ([theNumber hasPrefix:@"34"] || [theNumber hasPrefix:@"37"])
return AE_CARD;
else if ([theNumber hasPrefix:@"60"] ||
[theNumber hasPrefix:@"62"] ||
[theNumber hasPrefix:@"64"] ||
[theNumber hasPrefix:@"65"])
return DISC_CARD;
/*
else if ([theNumber hasPrefix:@"35"])
return @"JCB";
else if ([theNumber hasPrefix:@"30"] ||
[theNumber hasPrefix:@"36"] ||
[theNumber hasPrefix:@"38"] ||
[theNumber hasPrefix:@"39"])
return @"Diners Club"; */
else if ([theNumber hasPrefix:@"4"])
return VISA_CARD;
else if ([theNumber hasPrefix:@"5"])
return MASTER_CARD;
else
return @"Unknown";
}
Calling method as follows,
/*
if card is valid then it will return proper card name else return “Unknown”
Visa 4788250000028291
MC 5454545454545454
Amex 371449635398431
Discover 6011000995500000
JCB 3566002020140006
MC 5454545454545454
Amex 371449635398431
Discover 6011000995500000
JCB 3566002020140006
*/
NSString *cardType=[self luhnCheck:@"371449635398431"];
2)Credit card CVV validation using Luhn algorithm
//user above #1 methods to detect card type if it is AE_CARD use 4 digits as CVV else 3 Digits.
NSString *cardType=[self luhnCheck:@"371449635398431"];
int CVV_DIGITS=0;
if([cardType isEqualToString:AE_CARD]){
CVV_DIGITS=4;
}else{
CVV_DIGITS=3;
}