swift - заполняет STPPaymentCardTextField программно
Я занимаюсь разработкой приложения и использую Stripe SDK и Card.io SDK. То, что я хочу, это заполнить STPPaymentCardTextField
Номер карты, месяц истечения и год с Card.io
отсканированная стоимость кредитной карты. Я старался:
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
добавить. Как вы думаете, что я могу сделать с этим? Спасибо!
1 ответ
Отсюда я получил более чистый ответ
let cardParams = STPCardParams()
cardParams.number = "4242424242424242"
cardParams.expMonth = 07 // this data type is UInt and *not* Int
cardParams.expYear = 19 // this data type is UInt and *not* Int
cardParams.cvc = "123"
let paymentField = STPPaymentCardTextField()
paymentField.cardParams = cardParams //the paymentTextField will now show the cc #, exp, and cvc from above
Вы можете получить другие номера тестовых карт, такие как Mastercard, Amex и Discover, здесь, в Stripe.
Поля 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)
}
Обновление Может быть правильным ответом на ваш вопрос.
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 для встроенной поддержки в будущем.