2015-10-15 91 views
2

我開始將Stripe整合到我正在製作的iOS應用程序中,並且我已經到了需要驗證卡信息的地步。使用Stripe與iOS驗證信用卡

我想:

#pragma mark - My Actions 

- (IBAction)buyButtonTapped:(id)sender { 

    //Populate STPCard property 
    self.stripeCard = [[STPCard alloc]init]; 
    self.stripeCard.name = self.txtFieldCardHolderName.text; 
    self.stripeCard.number = self.txtFieldCardNumber.text; 
    self.stripeCard.cvc = self.txtFieldCardCvc.text; 
    self.stripeCard.expMonth = [self.selectedMonth integerValue]; 
    self.stripeCard.expYear = [self.selectedYear integerValue]; 

    //Validate Customer info 
    if ([self validateCustomerInfo]) { 
    [self performStripeOperation]; 
    } 

} 

-(BOOL)validateCustomerInfo{ 

    //Create Alert 

    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Please, try again!" 
                   message:@"Please, enter all required information." 
                  preferredStyle:UIAlertControllerStyleAlert]; 

    UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" 
                style:UIAlertActionStyleDefault 
               handler:^(UIAlertAction * _Nonnull action) { 

                //Add some action 

               }]; 

    //Add its action 
    [alert addAction:action]; 


    //Validate text fields 
    if (self.txtFieldCardHolderName.text == 0 || self.txtFieldCardNumber.text == 0 || self.txtFieldCardExpDate.text == 0 || self.txtFieldCardCvc.text == 0) { 

    [self presentViewController:alert animated:true completion:nil]; 
    return NO; 
    } 

    //Validate card number, CVC, expMonth, expYear 
    NSError *error = nil; 

    [self.stripeCard validateCardReturningError:&error]; 

    //3 
    if (error) { 
    alert.message = [error localizedDescription]; 
    [self presentViewController:alert animated:true completion:nil]; 
    return NO; 
    } 

    return YES; 

} 

我查了幾個其他的問題在這裏StackOverflow上,每個人都似乎使用validateCardReturningError方法,並且它已經廢棄了iOS9。

Xcode抱怨並要求我改用STPCardValidator。

任何人都可以幫助我一個使用STPCardValidator卡驗證的例子嗎?

我發現我可以使用下面的類方法,以及:

[STPCardValidator validationStateForNumber:self.txtFieldCardNumber.text validatingCardBrand:true]; 

但我不知道如何使用我的方法validateCustomerInfo裏面。

+0

現在,STPCard沒有這些屬性呢? –

回答

3
- (IBAction)buyButtonTapped:(id)sender{ 

    param = [[STPCardParams alloc]init]; 
    param.number = txt_cc_no.text; 
    param.cvc = txt_cc_cvvno.text; 
    param.expMonth =[self.selectedMonth integerValue]; 
    param.expYear = [self.selectedYear integerValue]; 


    if ([self validateCustomerInfo]) { 
     [self performStripeOperation]; 
    } 

} 
- (BOOL)validateCustomerInfo { 

    //2. Validate card number, CVC, expMonth, expYear 
    [STPCardValidator validationStateForExpirationMonth:[self.selectedMonth stringValue]]; 
    [STPCardValidator validationStateForExpirationYear:[self.selectedYear stringValue] inMonth:[self.selectedMonth stringValue]]; 
    if ([txt_cc_type.text isEqualToString:@"visa"]) { 
     [STPCardValidator validationStateForCVC:txt_cc_cvvno.text cardBrand:STPCardBrandVisa]; 
     [STPCardValidator validationStateForNumber:txt_cc_no.text validatingCardBrand:STPCardBrandVisa]; 
    } 
    else if ([txt_cc_type.text isEqualToString:@"MasterCard"]){ 
     [STPCardValidator validationStateForCVC:txt_cc_cvvno.text cardBrand:STPCardBrandMasterCard]; 
     [STPCardValidator validationStateForNumber:txt_cc_no.text validatingCardBrand:STPCardBrandMasterCard]; 
    } 
    else if ([txt_cc_type.text isEqualToString:@"American Express"]){ 

     [STPCardValidator validationStateForCVC:txt_cc_cvvno.text cardBrand:STPCardBrandAmex]; 
     [STPCardValidator validationStateForNumber:txt_cc_no.text validatingCardBrand:STPCardBrandAmex]; 
    } 
    else if ([txt_cc_type.text isEqualToString:@"Discover"]){ 
     [STPCardValidator validationStateForCVC:txt_cc_cvvno.text cardBrand:STPCardBrandDiscover]; 
     [STPCardValidator validationStateForNumber:txt_cc_no.text validatingCardBrand:STPCardBrandDiscover]; 
    } 
    else if ([txt_cc_type.text isEqualToString:@"Diners Club"]){ 
     [STPCardValidator validationStateForCVC:txt_cc_cvvno.text cardBrand:STPCardBrandDinersClub]; 
     [STPCardValidator validationStateForNumber:txt_cc_no.text validatingCardBrand:STPCardBrandDinersClub]; 
    } 
    else if ([txt_cc_type.text isEqualToString:@"JCB"]){ 
     [STPCardValidator validationStateForCVC:txt_cc_cvvno.text cardBrand:STPCardBrandJCB]; 
     [STPCardValidator validationStateForNumber:txt_cc_no.text validatingCardBrand:STPCardBrandJCB]; 
    } 
    else if ([txt_cc_type.text isEqualToString:@"Unknown"]){ 
     [STPCardValidator validationStateForCVC:txt_cc_cvvno.text cardBrand:STPCardBrandUnknown]; 
     [STPCardValidator validationStateForNumber:txt_cc_no.text validatingCardBrand:STPCardBrandUnknown]; 
    } 


    return YES; 
} 
- (void)performStripeOperation { 
    [[STPAPIClient sharedClient] createTokenWithCard:param 
              completion:^(STPToken *token, NSError *error) { 
               if (error) { 
                //           [self handleError:error]; 
                NSLog(@"ERRRRR = %@",error); 
                UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Please try again" 
                            message:[NSString stringWithFormat:@"%@",error.localizedDescription] 
                            delegate:nil 
                         cancelButtonTitle:@"OK" 
                         otherButtonTitles:nil]; 
                [alert show]; 
               } else { 

               //when credit card details is correct code here 
               } 
              }]; 
} 
+0

我們可以檢查卡是借記卡還是信用卡? –

+0

是的,我們可以檢查卡是否是信用卡,但是如果我們使用的是stp,那麼他們爲我們提供了驗證方法,我們只需要實現它。 –

+0

@FeminaBrahmbhatt,你可以提供代碼級別指南來檢查該卡是借記卡還是信用卡? –

1

Swift 2.1 Femina的答案的版本。注:validateCardType()是一個正則表達式的功能,如果你想,太多,你可以在這裏找到它How do you detect Credit card type based on number?

func validateCustomerInfo() -> Bool { 
    // Validate card number, CVC, expMonth, expYear 
    STPCardValidator.validationStateForExpirationMonth(self.expMonth.text!) 
    STPCardValidator.validationStateForExpirationYear(self.expYear.text!, inMonth: self.expMonth.text!) 

    if (self.validateCardType(creditCardField.text!) == "Visa") { 
     STPCardValidator.validationStateForCVC(self.securityField.text!, cardBrand: STPCardBrand.Visa) 
     STPCardValidator.validationStateForNumber(self.creditCardField.text!, validatingCardBrand: true) 
    } 
    else if (self.validateCardType(creditCardField.text!) == "MasterCard") { 
     STPCardValidator.validationStateForCVC(self.securityField.text!, cardBrand: STPCardBrand.MasterCard) 
     STPCardValidator.validationStateForNumber(self.creditCardField.text!, validatingCardBrand: true) 
    } 
    else if (self.validateCardType(creditCardField.text!) == "American Express") { 
     STPCardValidator.validationStateForCVC(self.securityField.text!, cardBrand: STPCardBrand.Amex) 
     STPCardValidator.validationStateForNumber(self.creditCardField.text!, validatingCardBrand: true) 
    } 
    else if (self.validateCardType(creditCardField.text!) == "Discover") { 
     STPCardValidator.validationStateForCVC(self.securityField.text!, cardBrand: STPCardBrand.Discover) 
     STPCardValidator.validationStateForNumber(self.creditCardField.text!, validatingCardBrand: true) 
    } 
    else if (self.validateCardType(creditCardField.text!) == "Diners Club") { 
     STPCardValidator.validationStateForCVC(self.securityField.text!, cardBrand: STPCardBrand.DinersClub) 
     STPCardValidator.validationStateForNumber(self.creditCardField.text!, validatingCardBrand: true) 
    } 
    else if (self.validateCardType(creditCardField.text!) == "JCB") { 
     STPCardValidator.validationStateForCVC(self.securityField.text!, cardBrand: STPCardBrand.JCB) 
     STPCardValidator.validationStateForNumber(self.creditCardField.text!, validatingCardBrand: true) 
    } 
    else if (self.validateCardType(creditCardField.text!) == "Unknown") { 
     STPCardValidator.validationStateForCVC(self.securityField.text!, cardBrand: STPCardBrand.Unknown) 
     STPCardValidator.validationStateForNumber(self.creditCardField.text!, validatingCardBrand: true) 
    } 

    return true 
} 
1

這樣做,而不是做所有的計算,最簡單的方法。

您可以使用以STPCardParams實例作爲參數的STPCardValidatorvalidationStateForCard方法。

- (IBAction)buyButtonTapped:(id)sender{ 

    param = [[STPCardParams alloc]init]; 
    param.number = txt_cc_no.text; 
    param.cvc = txt_cc_cvvno.text; 
    param.expMonth =[self.selectedMonth integerValue]; 
    param.expYear = [self.selectedYear integerValue]; 


    if ([self validateCustomerInfo]) { 
     [self performStripeOperation]; 
    } 

} 

func validateCustomerInfo() -> Bool { 

    // Validate card number, CVC, expMonth, expYear 
    return STPCardValidator.validationStateForCard(param) == .Valid 
} 
0

爲SWIFT 3

// Validate all params at once 
    let cardSate = STPCardValidator.validationState(forCard: cardParams) 
    // Validate card number, CVC, expMonth, expYear one by one 
    let numberState = STPCardValidator.validationState(forNumber: cardParams.number, validatingCardBrand: true) 
    let cvcState = STPCardValidator.validationState(forCVC: cardParams.cvc ?? "", cardBrand: STPCardValidator.brand(forNumber: cardParams.number ?? "")) 
    let expMonthState = STPCardValidator.validationState(forExpirationMonth: String(cardParams.expMonth ?? 0)) 
    let expYearState = STPCardValidator.validationState(forExpirationYear: String(cardParams.expYear ?? 0), inMonth: String(cardParams.expMonth ?? 0))