Проверьте формулу кредитной карты в приложении Iphone - PullRequest
7 голосов
/ 20 мая 2010

//////////// ОБНОВЛЕНИЕ! //////////////////

Итак, я оглянулся в сети и, найдя несколько формул и тестирований. Я нашел формулу, которая работает. 1. Поменять номер карты 2. Для каждой другой цифры удвойте число 3. Для цифр, которые вы не удвоили, добавьте их в новую строку «удвоение» 4. Сложите все числа вместе - ОДИН ПО ОДНОМУ 5. Разделите на десять, если нет остатка, номер карты действителен - может быть не «утвержден», но номера по крайней мере в правильной последовательности.

Например, взять номер карты "4866 3060 7833 1744"

  1. реверс - 4471 3387 0603 6684
  2. создать строку с каждым другим номер, начинающийся со 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

Поскольку я люблю вас всех, и вы все помогали мне во многих отношениях, я подумал, что поделюсь кодом, который я собрал для создания этой формулы. Еще раз спасибо Майку Крэндаллу, который помог мне перевернуть первую строку, и я взял ее оттуда.

Используется формула Луна

Мой .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?

Пока я спрашиваю, будут ли какие-либо проблемы с яблоком, если я продаю билеты в кинотеатр в моем приложении?

Это приложение очень похоже на фанданго, но для частной сети кинотеатров (всего около 13).

Заранее спасибо!

Ответы [ 5 ]

6 голосов
/ 24 мая 2010

Я смог ответить на свой вопрос, поделился им выше в «обновленной» области.

1 голос
/ 20 мая 2010

Вот код, который, вероятно, будет работать (использует алгоритм Luhn ):

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

Кредит Дональду Белленгеру за этот метод.

0 голосов
/ 18 сентября 2012
-(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;
    }

}
0 голосов
/ 16 июля 2011

в ответ на ваш вопрос о покупках в приложении и покупке билетов в кино, даже если вы используете покупки в приложении, Apple, скорее всего, отклонит его, поскольку вы продаете товары реального мира, а не вещи, которые можно использовать В приложении. Об этом говорится в Руководстве по рассмотрению. Кроме того, вы хотите, чтобы Apple брала 30%?

0 голосов
/ 20 мая 2010

Если вы продаете вещи из своего приложения, вполне вероятно, что откажется от Apple, если вы не используете продажи в приложении (в этом случае вам не нужно проверять кредитную карту) ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...