【问题标题】:Validate Credit Card Formula in Iphone App在 Iphone App 中验证信用卡公式
【发布时间】:2010-05-19 22:18:43
【问题描述】:

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

所以我在网上环顾四周,找到了一些公式并进行了测试。我找到了一个有效的公式。 1.反转卡号 2.每隔一个数字加倍数字 3.对于你没有加倍的数字,将它们添加到新的“加倍”字符串中 4. 将所有数字加在一起 ​​- 一个接一个 5. 除以十,如果没有余数,则卡号有效 - 可能未“批准”,但数字至少按正确顺序排列。

例如取卡号“4866 3060 7833 1744”

  1. 反向 - 4471 3387 0603 6684
  2. 每隔一个创建一个字符串 从第二个数字开始的数字 “47376364”
  3. 现在用 every 创建一个字符串 数字翻倍“814617126128”
  4. 现在附加一个带有数字的字符串 您没有在步骤 1 中使用数字加倍的字符串 “41380068”(新字符串将是 81461712612841380068)
  5. 现在对字符串求和,使用 EACH 个人字符(共 77 个)
  6. 现在将总和 (77) 除以 10。如果 有余数,卡是 无效 (77/10 = 7.7)无效卡

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

因为我爱你们所有人,你们都在很多方面帮助了我,所以我想我应该分享我为完成这个公式而编写的代码。再次感谢 Mike Crandall,他帮我把第一个字符串倒过来,然后我就从那里拿走了它。

这是使用卢恩公式

我的 .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

我的 .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;

}

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

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

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

此应用与 fandango 非常相似,但适用于私人连锁影院(总共约 13 家)。

提前致谢!

【问题讨论】:

    标签: iphone iphone-sdk-3.0


    【解决方案1】:

    我能够回答我自己的问题,并在上​​面的“更新”区域中分享了它。

    【讨论】:

      【解决方案2】:

      下面是一些可能有效的代码(使用Luhn Algorithm):

      -(BOOL) validateCardNumber:(NSString *)cardNumber
      {
      
      const char *str = [cardNumber UTF8String];
      int n, i, alternate, sum;
      
      n = strlen(str);
      
      if ( n < 13 || n > 19 )
          return NO;
      
      for ( alternate = 0, sum = 0, i = n-1; i>-1; –i) {
          if ( !isdigit(str[i]))
              return NO;
      
          n = str[i] – ‘0′;
      
          if ( alternate ) {
              n*=2;
              if ( n > 9 )
                  n = ( n % 10 ) + 1;
          }
      
          alternate = !alternate;
      
          sum += n;
      }
      
      return ( sum % 10 == 0 );
      }
      

      将此方法归功于Donald Bellenger

      【讨论】:

        【解决方案3】:

        如果您在应用内销售商品,苹果很可能会拒绝它,除非您使用应用内销售(在这种情况下,您不需要任何信用卡验证)。

        【讨论】:

        • 它是一个非常类似于 fandango 的应用程序,但它是一个私人电影连锁店。你怎么看?
        • 嗯,实际上我在这一点上可能是错误的。查看 iPhone 协议(developer.apple.com/iphone/terms/program/…,请参阅第 25 页开始的附件 2,需要 ADC 登录)似乎暗示应用内购买仅适用于所购买的内容将在应用内使用时,这并不t 适用于此。
        • 这与 Chipotle 应用程序没有什么不同,它做得很好。
        • 谢谢kubi,我看了看那个应用程序,我现在感觉很舒服。 (不是我停止了,但很高兴知道它已经完成了)
        【解决方案4】:

        针对您关于应用内购买和购买电影票的问题,即使您确实使用应用内购买,Apple 也可能会拒绝它,因为您销售的是真实世界的商品,而不是可以在应用内使用的东西。它在审查指南中说明了这一点。再说了,你想让苹果拿 30%?

        【讨论】:

          【解决方案5】:
          -(void)validation_check:(NSString*)pass_value
          {
              NSMutableArray *character;
          
              unsigned long long odd_no;
              unsigned long long new_odd_no;
              unsigned long long even_no;
              unsigned long long new_even_no;
              unsigned long long multiplied_even_no;
              unsigned long long changed_even_no;
              unsigned long long final_value;
              unsigned long long revers_card_no;
              unsigned long long card_no;
              unsigned long long check_reverse;
              new_odd_no = 0;
              new_even_no = 0;
          
              card_no = [pass_value longLongValue];
          
              character = [[NSMutableArray alloc]init];
          
              //-------reversing order of entered card number---------
              for(int i = 0; i<[pass_value length];i++)
              {       
                  check_reverse =(card_no % 10);
                  card_no = (card_no / 10);
          
                  [character addObject:[NSString stringWithFormat:@"%qu",check_reverse]];
          
                  revers_card_no=revers_card_no*10+check_reverse;
                  check_reverse=card_no;
          
              }   
              pass_value = [NSString stringWithFormat:@"%qu",revers_card_no];
          
              //--------checking for even and odd numbers--------
              for(int j=0;j<[character count];j++)
              {
                  if(j % 2 == 0)
                  {
                      odd_no = [[character objectAtIndex:j]longLongValue];
          
                      new_odd_no = new_odd_no+odd_no;
                  }
                  else 
                  {     
                      //------doubling the value of even no's--------
                      even_no = [[character objectAtIndex:j]longLongValue];
                      multiplied_even_no=even_no*2;
          
                      NSLog(@"%qu",multiplied_even_no);
          
                      //-------if even is a single digit--------
                      if((multiplied_even_no % 10) == 0)
                      {
                          if(multiplied_even_no == 10)
                          {
                              new_even_no = 1+new_even_no;
                          }
                          else 
                          {
                              new_even_no = multiplied_even_no + new_even_no;
                          }
                      }
                      //----------if there is multiple digits in even no---------
                      else 
                      {
                          int x=(multiplied_even_no % 10);
                          int y=multiplied_even_no /10;
          
                          changed_even_no = x+y;
          
                          new_even_no = new_even_no + changed_even_no;
          
                      } 
                  }
              }
          
              //--------calculating final value--------
              final_value = new_even_no + new_odd_no;
          
              NSLog(@"%qu",final_value);
          
          
              if((final_value % 10) == 0)
              {
                   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Card No is valid" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
          
                  [alert show];
                  card_textField.text=nil;
              }
              else 
              {
                  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Card No is not valid" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Try again" ,nil];
          
                  [alert show];
                  card_textField.text=nil;
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-14
            • 2015-09-14
            • 2018-08-15
            • 2011-09-10
            • 2011-01-24
            • 2012-08-14
            • 2017-04-02
            • 2016-11-15
            相关资源
            最近更新 更多