通过iOS使用Stripe验证信用卡
我开始将Stripe集成到我正在制作的iOS应用程序中,我需要验证卡信息 我试过:通过iOS使用Stripe验证信用卡,ios,objective-c,stripe-payments,Ios,Objective C,Stripe Payments,我开始将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.
#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方法中使用它。Femina答案的Swift 2.1版本。注意:validateCardType()是一个正则表达式函数,如果您也需要它,可以在这里找到
- (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
}
}];
}
最简单的方法是这样做,而不是做所有的计算 您可以使用
STPCardValidator
的validationStateForCard
方法,该方法将STPCardParams实例作为参数
- (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
}
斯威夫特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))
Swift 5.0+ 别忘了导入条带
func isCardDetailValid(cardNumber : String, month : UInt, year : UInt, cvv : String) -> Bool {
let params = STPCardParams()
params.number = cardNumber
params.expMonth = month
params.expYear = year
params.cvc = cvv
if STPCardValidator.validationState(forCard: params) == .valid {
return true
} else {
return false
}
}
这是@iOSArchitect.com完整且更恰当的快速回答
func paymentCardTextFieldDidChange(_ textField: STPPaymentCardTextField) {
let isValid = isValidCard(cardNumber: textField.cardNumber, month: textField.expirationMonth, year: textField.expirationYear, cvv: textField.cvc)
}
func isValidCard(cardNumber: String?, month: UInt, year: UInt, cvv: String?) -> Bool {
let params = STPCardParams()
params.number = cardNumber
params.expMonth = month
params.expYear = year
params.cvc = cvv
if STPCardValidator.validationState(forCard: params) == .valid {
return true
} else {
return false
}
}
是的,我们可以检查信用卡是否是信用卡,但要定制信用卡类,如果我们使用stp,那么他们会提供我们必须实现的验证方法it@FeminaBrahmbhatt,你能提供代码级别的指南来检查这张卡是借记卡还是信用卡吗?@AbidHussain你有没有找到检查这张卡是借记卡还是信用卡的方法?现在,STPCard没有这些属性?
func paymentCardTextFieldDidChange(_ textField: STPPaymentCardTextField) {
let isValid = isValidCard(cardNumber: textField.cardNumber, month: textField.expirationMonth, year: textField.expirationYear, cvv: textField.cvc)
}
func isValidCard(cardNumber: String?, month: UInt, year: UInt, cvv: String?) -> Bool {
let params = STPCardParams()
params.number = cardNumber
params.expMonth = month
params.expYear = year
params.cvc = cvv
if STPCardValidator.validationState(forCard: params) == .valid {
return true
} else {
return false
}
}