////////////ОБНОВЛЕНИЕ!//////////////////
Таким образом, я озирался в сети и после нахождения нескольких формул и тестирования. Я нашел формулу, которая работает. 1. Инвертируйте номер карты 2. Поскольку любая цифра удваивает номер 3. Для цифр, которые Вы не удвоили, добавьте их в новой "удвоенной" строке 4. Сложите все числа вместе - ОДИН ЗА ДРУГИМ 5. Разделитесь на десять, если нет никакого остатка, номер карты действителен - не мог бы быть "утвержден", но числа находятся по крайней мере в корректной последовательности.
Например, возьмите номер карты "4866 3060 7833 1744"
Вот источник для этого http://www.brainjar.com/js/validation/default2.asp
Поскольку я люблю Вас всех, и Вы все помогли мне таким количеством способов, я думал идентификационная доля код, который я соединил, чтобы сделать эту формулу. Благодаря Mike Crandall снова, который помог мне инвертировать первую строку и я взял ее оттуда.
Это использует Формулу Luhn
Мой.h файл
#import
@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
********** Исходное сообщение *******************
У кого-либо есть какой-либо код, который они могут совместно использовать, который проверит номер кредитной карты прежде, чем отправить на API?
В то время как я спрашиваю, там будут какими-либо проблемами от яблока, если я продаю билеты кинотеатру в рамках моего приложения?
Это приложение очень похоже на фанданго, но для частной цепочки театров (приблизительно 13 всего).
Заранее спасибо!
Я смог ответить на свой собственный вопрос, поделился им выше в "обновленной" области.
Вот код, который, вероятно, будет работать (использует алгоритм Луна ):
-(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 );
}
Благодарим Дональда Белленжера за этот метод.
Если вы продаете вещи внутри своего приложения, очень вероятно, что apple отклонит его, если только вы не используете продажи внутри приложения (в этом случае вам не нужно подтверждение кредитной карты).