通过 Braintree PayPal 付款总是失败 iOS

Posted

技术标签:

【中文标题】通过 Braintree PayPal 付款总是失败 iOS【英文标题】:Payment via Braintree PayPal always fails iOS 【发布时间】:2018-11-20 11:36:27 【问题描述】:

我已经在Braintree ios's GITHub. 上开了一张关于这个的票,只是希望能快速得到一些帮助。问题来了:

正如标题所说,我的付款(在 iOS 中)总是失败。虽然显然,我同事的工作(android)中的付款成功。

我从这里彻底遵循了示例代码和指南:https://developers.braintreepayments.com/guides/paypal/client-side/ios/v4

在 iOS 中,经过所有过程(来自我们服务器的客户端令牌 --> BT SDK --> PayPal 浏览器 --> 应用程序 --> 将 nonce 发送到我们的服务器),我从我们的服务器得到的错误总是:

不支持 PayPal 待付款。

我的后端人也不知道这背后的原因,他只显示并给了我这个日志:


   "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

以下是我在设置 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)
            )

        
    

所以...知道这背后的原因是什么吗?谢谢!

编辑:我不久前发现的附加信息。 SFSafari 浏览器过早关闭,这就是为什么我得到的 nonce 总是无效的。这是为什么呢?

【问题讨论】:

【参考方案1】:

全面披露:我在 Braintree 工作。如果您还有其他问题,请随时联系 support.

根据您在问题中发布的付款方式 nonce,我能够查看我们的服务器端日志以了解问题所在。

在不提供任何特定API Credentials 的情况下,您的设置中负责generating a client token 的服务器似乎传递了一个与负责使用该付款方式nonce 创建交易的服务器不同的沙箱merchant ID,即导致错误。

您的服务器负责生成客户端令牌,其中包含您的客户端初始化客户端 SDK 所需的授权和配置详细信息。创建付款方式随机数时,它与客户端令牌授权中指定的商家 ID 相关联。 merchant ID passed during the Transaction Sale call or other API Calls 必须与与该特定付款方式 nonce 相关联的商家 ID 匹配,因此您需要在后端代码中修复此差异。

【讨论】:

非常感谢您的回答。我正在检查这个答案是否真的回答/帮助了这个问题......尽管在我的应用程序中与我的两个项目的 Android 等效项相比,我观察到的是 BT SDK 打开的 Safari 浏览器关闭得太早。在 Android 中,还有最后一个屏幕(稍后我会截图)。 Android 中出现的最后一个屏幕看起来像一个电子邮件确认页面,它也出现在 iOS 中,但只有一秒钟。这会导致问题吗? 赏金将给你,莱伦。感谢您抽出宝贵时间回答这个问题。【参考方案2】:

为了其他遇到相同问题的人的利益,请查看我在 Braintree 的 Github 上提交的已关闭票证(上面的链接或此链接:https://github.com/braintree/braintree_ios/issues/405)

这是我的同事,我发现了:

    我们可以使用这种信用社付款方式成功付款。 但我们无法使用 PAYPAL BALANCE 付款。 以下错误发生在 PayPal 余额选项中。

不支持 PayPal 待付款

所以这个问题的答案是:确保您的客户端中的所有内容都正常工作,并且您使用正确且相同的帐户来存放 clientToken 和您用来支付的 PayPal 帐户。

【讨论】:

以上是关于通过 Braintree PayPal 付款总是失败 iOS的主要内容,如果未能解决你的问题,请参考以下文章

Braintree 的 PayPal 付款中未显示金额

Braintree 中的 PayPal 按钮无法使用定期付款

Paypal vs Braintree 用户对用户付款

贝宝 Braintree 订阅付款

Braintree 花时间打开 PayPal

在 Braintree 付款中搜索客户的有效订阅