2015-09-16 3 views
0

Я разрабатываю приложение и использую Stripe SDK и Card.io SDK. Я хочу, чтобы заполнить STPPaymentCardTextField номер карты, месяц истечения и год с Card.io отсканированное значение кредитной карты. Я пробовал:swift - Populate STPPaymentCardTextField Programmatically

var paymentField = STPPaymentCardTextField() 

func userDidProvideCreditCardInfo(cardInfo: CardIOCreditCardInfo!, inPaymentViewController paymentViewController: CardIOPaymentViewController!) { 
    var scanViewController: CardIOPaymentViewController = CardIOPaymentViewController(paymentDelegate: self) 
    paymentField.cardNumber = cardInfo.cardNumber 
    paymentField.expirationMonth = cardInfo.expiryMonth 
    paymentField.expirationYear = cardInfo.expiryYear 

    paymentViewController.dismissViewControllerAnimated(true, completion: nil) 
} 

У меня ошибка Cannot assign to the result of this expression для каждого paymentField добавления. Как вы думаете, что я могу с этим сделать? Благодаря!

+0

Да? Я не вижу причин, почему это не должно работать ... Какова ваша проблема, точно? – mattt

+0

У меня возникла ошибка 'Невозможно присвоить результат этого выражения' для каждого добавления« paymentField ». –

ответ

0

Поля STPPaymentCardTextField доступны только для чтения, и вы можете только «получить» от этих свойств.

STPPaymentCardTextField используется для сбора данных кредитной карты. В вашем случае вы уже делаете это с помощью CardIOCreditCardInfo. После того, как у вас есть данные кредитной карты, вы можете собрать данные в объект STPCardParams.

После того, как вы собрали номер карты, срок действия и CVC, упакуйте их в объект STPCardParams и вызовите метод createTokenWithCard: класс STPAPIClient.

Теперь ваш метод может выглядеть следующим образом ...

func userDidProvideCreditCardInfo(cardInfo: CardIOCreditCardInfo!, inPaymentViewController paymentViewController: CardIOPaymentViewController!) { 

     let card: STPCardParams = STPCardParams() 
     card.number = info.cardNumber 
     card.expMonth = info.expiryMonth 
     card.expYear = info.expiryYear 
     card.cvc = info.cvv 

     STPAPIClient.sharedClient().createTokenWithCard(card, completion: {(result, error) -> Void in 
      if error == nil { 
       // Either save the card token with your customer data or charge them right away 
       //createBackendChargeWithToken(token) 
      } 
      else { 
       //handleError(error) 
      } 
     }) 
    } 
    paymentViewController?.dismissViewControllerAnimated(true, completion: nil) 
} 

Update Может быть правильный ответ на ваш вопрос.

import Stripe 
class PaymentCardEditorField: STPPaymentCardTextField { 
    func setExistingCard(card: STPCardParams) { 
     replaceField("numberField", withValue: card.number!) 
     replaceField("expirationField", withValue: String(format: "%02d/%02d", card.expMonth, (card.expYear % 100))) 
     replaceField("cvcField", withValue: card.cvc!) 
    } 

    func replaceField(memberName: String, withValue value: String) { 
     let field = self.valueForKey(memberName) as! UITextField 
     let delegate = self as! UITextFieldDelegate 
     let len = field.text?.characters.count 
     if delegate.textField?(field, shouldChangeCharactersInRange: NSMakeRange(0, len!), replacementString: value) ?? false { 
     field.text = value 
     } 
    } 
} 

, а затем вызвать setExistingCard

func userDidProvideCreditCardInfo(cardInfo: CardIOCreditCardInfo!, inPaymentViewController paymentViewController: CardIOPaymentViewController!) { 

    let card: STPCardParams = STPCardParams() 
    card.number = info.cardNumber 
    card.expMonth = info.expiryMonth 
    card.expYear = info.expiryYear 
    card.cvc = info.cvv 
    paymentTextField.setExistingCard(card) 
} 

работает как шарм.

Следуйте за этой лентой для потенциального обновления Stripe SDK для встроенной поддержки в будущем.

https://github.com/stripe/stripe-ios/issues/127

Смежные вопросы