[英]Validate Credit Card Formula in Iphone App
//////////// 更新! //////////////////
所以我在找到一些公式和測試之后在網上四處看看。 我發現了一個有效的公式。 1.反轉卡號2.對於每隔一個數字加倍數字3.對於沒有加倍的數字,將它們添加到新的“加倍”字符串中4.將所有數字加在一起 - 一個一個5。除以十,如果沒有余數,卡號有效 - 可能不會被“批准”,但數字至少是正確的順序。
例如,取卡號“4866 3060 7833 1744”
以下是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.