如何将Paypal信息发送到Firebase Swift代码?

问题描述

我想通过使用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对象并将其存储,但我不建议使用该路径。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...