在iPhone应用程序中验证信用卡公式

Lou*_*uie 7 iphone iphone-sdk-3.0

//////////// 更新! //////////////////

所以我在找到一些公式和测试之后在网上四处看看.我发现了一个有效的公式.1.反转卡号2.对于每隔一个数字加倍数字3.对于没有加倍的数字,将它们添加到新的"加倍"字符串中4.将所有数字加在一起 ​​- 一个一个5.除以十,如果没有余数,卡号有效 - 可能不会被"批准",但数字至少是正确的顺序.

例如,取卡号"4866 3060 7833 1744"

  1. 反向 - 4471 3387 0603 6684
  2. 创建一个包含所有其他数字的字符串,以第二个数字"47376364"开头
  3. 现在创建一个字符串,每个 数字加倍"814617126128"
  4. 现在将一个字符串与您在步骤1中未使用的数字附加到字符串中,数字加倍"41380068"(新字符串将为81461712612841380068)
  5. 现在使用每个单独的字符(总计77)对字符串求和
  6. 现在将总和(77)除以10.如果有余数,则该卡无效(77/10 = 7.7)无效卡

以下是http://www.brainjar.com/js/validation/default2.asp的来源

因为我爱你们所有人,而且你们在很多方面都帮助过我,我想我会分享我为了这个公式而共同编写的代码.再次感谢Mike Crandall,他帮助我扭转了第一根弦,我从那里拿走了它.

这是使用Luhn公式

我的.h文件

#import <UIKit/UIKit.h>

@interface CCValidatorViewController : UIViewController {

    NSString * ccNumber;
    NSString * validCard;
    NSString * isAMEX;


}
@property (nonatomic, retain)NSString * ccNumber;
@property (nonatomic, retain)NSString * isAMEX;
@property (nonatomic, retain)NSString * validCard;
- (NSString *) validateCard:(NSString *)ccNumberString;

@end
Run Code Online (Sandbox Code Playgroud)

我的.m文件

- (void)viewDidLoad {
    [super viewDidLoad];
    ccNumber = @"4866306078331744"; //invalid card number
    ccNumber = [self validateCard:ccNumber];
    NSLog(@"%@",validCard);
}

- (NSString *) validateCard:(NSString *)ccNumberString{
    validCard = @"";
    NSString * ccNumberReversed = @"";
    NSString * doubleNumbers = @"";
    NSString * everyOtherNumber = @"";
    NSString * lastChar = @"";
    NSString * intDoubled;
    NSString * stringToSum;
    NSUInteger count = [ccNumberString length];
    NSUInteger len = 1;
    NSRange r;

    //since American Express is American Express....., we have to do something special for them.... assholes....
    r = NSMakeRange( 0, 1);
    lastChar = [ccNumberString substringWithRange:r];
    if ([lastChar compare:@"3"] ==0) {

        isAMEX = @"YES";

    }
    else {
        isAMEX = @"NO";
    }



    //reverse the string

    for ( int i=0; i<count; i++){
        r = NSMakeRange( count-i-1, len);
        lastChar = [ccNumberString substringWithRange:r];
        ccNumberReversed = [ccNumberReversed stringByAppendingString:lastChar];
    }

    //double every other number

    int loc = 1;
    int ttr = ccNumberReversed.length/2;
    for ( int i=0; i<ttr; i++){

        r = NSMakeRange( loc, len);
        loc = loc+2;
        lastChar = [ccNumberReversed substringWithRange:r];
        int dv = [lastChar intValue];
        dv = (dv * 2);
        intDoubled = [NSString stringWithFormat:@"%d",dv];
        doubleNumbers = [doubleNumbers stringByAppendingString:intDoubled];
    }

    // get every other number starting at index 0
    loc = 0;
    if ([isAMEX compare:@"YES"] ==0) {
    ttr = ccNumber.length/2+1;
    }
    else {
        ttr = ccNumber.length/2;
    }


    for ( int i=0; i<ttr; i++){

        r = NSMakeRange( loc, len);
        loc = loc+2;
        lastChar = [ccNumberReversed substringWithRange:r];
        everyOtherNumber = [everyOtherNumber stringByAppendingString:lastChar];
    }

    //combine both strings so we can sum them up
    stringToSum = [doubleNumbers stringByAppendingString:everyOtherNumber];

    // add all the numbers up one by one and divide by 10... if no remainder - its a valid card

    loc = 0;
    ttr = stringToSum.length;
    int stringSum = 0;
    for ( int i=0; i<ttr; i++){

        r = NSMakeRange( loc, len);
        lastChar = [stringToSum substringWithRange:r];
        int cc = [lastChar intValue];
        stringSum = stringSum+cc;

        loc ++;
    }

    if (stringSum%10 == 0) {

        validCard = @"YES";
    }
    else {

        validCard = @"NO";
    }

    return validCard;

}
Run Code Online (Sandbox Code Playgroud)

**********原帖*******************

在发布到API之前,是否有人可以共享任何可以验证信用卡号的代码?

我问,如果我在我的应用程序中销售电影院的门票,苹果会不会有任何问题?

这个应用程序非常类似于fandango,但对于私人连锁影院(总共约13个).

提前致谢!

Lou*_*uie 6

我能够回答我自己的问题,在"更新"区域上面分享了它.