簡體   English   中英

在iPhone應用程序中驗證信用卡公式

[英]Validate Credit Card Formula in Iphone App

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

所以我在找到一些公式和測試之后在網上四處看看。 我發現了一個有效的公式。 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

我的.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個)。

提前致謝!

我能夠回答我自己的問題,在“更新”區域上面分享了它。

以下是一些可能有效的代碼(使用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 );
}

感謝Donald Bellenger的這種方法。

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

}

如果您從應用程序內部銷售產品,除非您使用應用程序內銷售,否則蘋果可能會拒絕它(在這種情況下,您不需要任何信用卡驗證)。

回答您關於應用內購買和購買電影票的問題,即使您確實使用應用內購買,Apple也可能會拒絕它,因為您銷售的是現實世界的商品,而不是可以在應用內使用的商品。 它在審查指南中說明了這一點。 此外,你想要蘋果30%?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM