Monday 9 December 2013



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
*/

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