问题描述
我想通过使用PayPal访问用户付款后必须保存的合法信息。这是当用户选择通过PayPal付款时的代码,但是在用户完成付款后如何获取PayPal提供的信息。以及如何将它们发送到Firebase?
@IBAction func btnPaypal(_ sender: UIButton) {
let payPalDriver = BTPayPalDriver(apiClient: braintreeClient)
payPalDriver.viewControllerPresentingDelegate = self
payPalDriver.appSwitchDelegate = self // Optional
// Specify the transaction amount here. "2.32" is used in this example.
let request = BTPayPalRequest(amount: lblSubtotal.text!)
request.currencyCode = "USD" // Optional; see BTPayPalRequest.h for more options
payPalDriver.requestOneTimePayment(request) { (tokenizedPayPalAccount,error) in
if let tokenizedPayPalAccount = tokenizedPayPalAccount {
print("Got a nonce: \(tokenizedPayPalAccount.nonce)")
// Access additional information
print("------------ paypal receipt -------------")
self.payPal = true
let email = tokenizedPayPalAccount.email
debugPrint(email!)
let firstName = tokenizedPayPalAccount.firstName
debugPrint(firstName!)
let lastName = tokenizedPayPalAccount.lastName
debugPrint(lastName!)
let phone = tokenizedPayPalAccount.phone
debugPrint(phone as Any)
// ....
let postalAddress = tokenizedPayPalAccount.billingAddress
// Access the properties of the address
debugPrint(postalAddress as Any)
let streetAddress = postalAddress?.streetAddress
debugPrint(streetAddress as Any)
let extendedAddress = postalAddress?.extendedAddress
debugPrint(extendedAddress as Any)
let locality = postalAddress?.locality
debugPrint(locality as Any)
let countryCodeAlpha2 = postalAddress?.countryCodeAlpha2
debugPrint(countryCodeAlpha2 as Any)
let postalCode = postalAddress?.postalCode
debugPrint(postalCode as Any)
let region = postalAddress?.region
debugPrint(region as Any)
// See BTPostalAddress.h for details
// let billingAddress = tokenizedPayPalAccount.billingAddress
// debugPrint(billingAddress as Any)
let shippingAddress = tokenizedPayPalAccount.shippingAddress
debugPrint(shippingAddress!)
for obj in self.arrayCart {
let invoiceID = self.ref.childByAutoId().key
let userID = Auth.auth().currentUser?.uid
let invoice = [
"invoiceID" : invoiceID,"buyerID" : userID,"payPal info" : ["payPal email" : email,"first name" : firstName,"last name" : lastName,"phone" : phone,"postalAddress" : postalAddress,"streetAddress" : streetAddress,"extendedAddress" : extendedAddress,"locality" : locality,"countryCodeAlpha2" : countryCodeAlpha2,"postalCode" : postalCode,"region" : region,"shippingAddress" : shippingAddress]
] as [String : Any]
self.ref.child("invoice").child(invoiceID!).setValue(invoice)
}
print("------------ paypal receipt end -------------")
} else if let error = error {
// Handle error here...
print("error -------- \(error)")
} else {
// Buyer canceled payment approval
// alert
}
错误:
'InvalidFirebaseData',原因:'(setValue :)无法将类型为BTPostalAddress的对象存储在payPal info.shippingAddress。只能存储NSNumber,NSString,NSDictionary和NSArray类型的对象。
解决方法
错误消息非常清楚;您正在尝试在Firebase实时数据库中存储不是Firebase接受的对象的对象。
这是您要存储的对象
let shippingAddress = tokenizedPayPalAccount.shippingAddress
,Firebase仅支持NSNumber,NSString,NSDictionary和NSArray。有关更多信息,请参见Basic Write Operations。
要修复此问题,您将需要将该对象解构为原始值,这可能最容易将其所有属性转换为字符串并将其存储在子节点中
payPal info
payPal email: "some email"
first name: "some first name"
shippingAddressWithChildData:
streetAddress: "some street address" //from the `tokenizedPayPalAccount.billingAddress` object
extended: "some additional street address info"
如果您确实需要存储该特定对象,则Firebase确实支持NSData,因此您可以将整个对象转换为NSData对象并将其存储,但我不建议使用该路径。