【发布时间】:2010-05-19 22:18:43
【问题描述】:
/////////// 更新! ////////////////
所以我在网上环顾四周,找到了一些公式并进行了测试。我找到了一个有效的公式。 1.反转卡号 2.每隔一个数字加倍数字 3.对于你没有加倍的数字,将它们添加到新的“加倍”字符串中 4. 将所有数字加在一起 - 一个接一个 5. 除以十,如果没有余数,则卡号有效 - 可能未“批准”,但数字至少按正确顺序排列。
例如取卡号“4866 3060 7833 1744”
- 反向 - 4471 3387 0603 6684
- 每隔一个创建一个字符串 从第二个数字开始的数字 “47376364”
- 现在用 every 创建一个字符串 数字翻倍“814617126128”
- 现在附加一个带有数字的字符串 您没有在步骤 1 中使用数字加倍的字符串 “41380068”(新字符串将是 81461712612841380068)
- 现在对字符串求和,使用 EACH 个人字符(共 77 个)
- 现在将总和 (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