Search code examples
iosswiftpaypalbraintree

Payment via Braintree PayPal always fails iOS


I have opened a ticket about this on Braintree iOS's GITHub. Just hoping to get some help fast. Here goes the issue:

As the title says, my payment (in iOS) always fails. While apparently, the payment in my colleague's work (Android) succeeds.

I followed thoroughly the sample codes and guidelines from here: https://developers.braintreepayments.com/guides/paypal/client-side/ios/v4

In iOS, after all the process (Client Token from our Server --> BT SDK --> PayPal browser --> App --> send nonce to our server), the error I get from our server is always:

PayPal pending payments are not supported.

My backend guy does not know the reason behind this too, he only showed and gave me this log:

{
   "errors": {},
   "params": {
       "transaction": {
           "type": "sale",
           "amount": "1",
           "merchantAccountId": "USD",
           "paymentMethodNonce": "80823f63-5ea9-0b8b-67da-0710bd7d9ff1",
           "orderId": "333",
           "descriptor": {
               "name": "company name*myurl.com"
           },
           "options": {
               "submitForSettlement": "true",
               "paypal": {
                   "customField": "custom",
                   "description": "description"
               }
           }
       }
   },
   "message": "Unknown or expired payment_method_nonce.",
   "creditCardVerification": null,
   "transaction": null,
   "subscription": null,
   "merchantAccount": null,
   "verification": null
}

And here's what I do in setting up my SDK:

private func processPayPalClientToken(_ clientToken: String) {
        SVProgressHUD.show(withStatus: "Please wait...")

        self.braintreeClient = BTAPIClient(authorization: clientToken)

        let payPalDriver = BTPayPalDriver(apiClient: self.braintreeClient)
        payPalDriver.viewControllerPresentingDelegate = self
        payPalDriver.appSwitchDelegate = self

        let request = BTPayPalRequest(amount: self.bookingViewModel.getTotalAmount())
        payPalDriver.requestOneTimePayment(request) { (nonce, error) in
            SVProgressHUD.dismiss(completion: {
                if let error = error {
                    self.showAlert(title: "title...", message: "Error: \(error.localizedDescription).", okayButtonTitle: "OK") { _ in }
                    return
                }

                guard let nonce = nonce else { return }

                self.processNonceToServer(nonce)
            })

        }
    }

So... any idea what's the reason behind this? Thanks!

EDIT: Additional info that I found a while ago. The SFSafari browser dismisses itself too soon that's why the nonce I get is always invalid. Why is that?


Solution

  • For the benefits of the others who are experiencing the same issue, check out my closed ticket I filed on Braintree's Github (link above or this: https://github.com/braintree/braintree_ios/issues/405)

    Here's my colleague and I have discovered:

    1. We can pay successfully using this CREDIT UNION payment method.
    2. BUT we can't pay using PAYPAL BALANCE.
    3. The errors like below happens in PayPal Balance option.

    PayPal pending payments are not supported

    So the answer in this issue would be: make sure that everything in your client is working and you're using correct and same accounts for the clientToken and the PayPal account you're using to pay.