swift-以编程方式填充STPPaymentCardTextField
我正在开发一个应用程序,使用Stripe SDK和Card.io SDK。我想做的是用swift-以编程方式填充STPPaymentCardTextField,swift,stripe-payments,card.io,Swift,Stripe Payments,Card.io,我正在开发一个应用程序,使用Stripe SDK和Card.io SDK。我想做的是用Card.io扫描的信用卡值填充STPPaymentCardTextField卡号、到期月份和年份。我试过: var paymentField = STPPaymentCardTextField() func userDidProvideCreditCardInfo(cardInfo: CardIOCreditCardInfo!, inPaymentViewController paymentViewCont
Card.io
扫描的信用卡值填充STPPaymentCardTextField
卡号、到期月份和年份。我试过:
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)
}
我遇到一个错误,
无法为每个paymentField
追加分配此表达式的结果。
你觉得我能用这个做什么?谢谢 STPPaymentCardTextField字段是只读的,您只能从这些属性“获取”
STPPaymentCardTextField用于收集信用卡详细信息。在您的情况下,您已经在使用CardIOCreditCardInfo进行此操作。获得信用卡详细信息后,您可以将数据组装到STPCardParams对象中
收集了卡号、到期日和CVC后,将它们打包到STPCardParams对象中,并在STPAPIClient类上调用createTokenWithCard:方法
现在您的方法可能如下所示
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以获得内置支持
我得到了一个更清晰的答案
您可以获得其他测试卡号码,如万事达卡、美国运通卡和Discover卡是吗?我看不出有什么理由它不起作用。。。您到底有什么问题?我有一个错误,无法为每个paymentField
append分配此表达式的结果。
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