Android Braintree SDK - onPaymentMethodNonce() 从未调用

Dev*_*vin 5 android paypal credit-card in-app-purchase braintree

我们在我们的应用程序中使用 Braintree SDK 和 PayPal,使用户能够进行应用程序内购买。不幸的是,我们无法使用 Braintree 从 PayPal 付款信息或用户输入的信用卡信息创建随机数。

以下是我们具体实现的一些背景:

我们通过以下方式使用我们的客户端令牌初始化 Braintree 对象:

Braintree braintree = Braintree.getInstance(context, token);
Run Code Online (Sandbox Code Playgroud)

我们还为实现 Braintree.PaymentMethodNonceListener 的 Fragment 设置了 Braintree 侦听器。在 activityCreated() 上,我们使用上述代码初始化 Braintree 对象。onPause() 我们删除了监听器,而 onResume() 我们添加了监听器。

在应用程序中,我们允许用户通过 PayPal 或信用卡付款。

如果用户选择使用 PayPal,我们会使用唯一的请求代码启动 PayPal 活动的意图。使用以下代码块,我们收到来自 PayPal 活动完成的响应。

@Override
public void onActivityResult(int requestCode, int responseCode, Intent data) {
    if (requestCode == PAYPAL_REQUEST_CODE) {
        if (responseCode == FragmentActivity.RESULT_OK) {
            braintree.finishPayWithPayPal(getActivity(), responseCode, data);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据此处看到的 Braintree SDK 文档,

此外,我们为用户提供了输入信用卡信息的能力,然后我们用它来构造一个 CardBuilder 对象,该对象通过“tokenize”方法传递给 Braintree 对象,如下面的代码片段所示:

 CardBuilder cardBuilder = new CardBuilder()
                .cardNumber(cardNumber)
                .expirationDate(expirationDate);
        braintree.tokenize(cardBuilder);
Run Code Online (Sandbox Code Playgroud)

根据 Braintree 开发人员文档,在此处看到,在调用 tokenize 后,应该期待 onPaymentMethodNonce 回调;此时,会收到用户输入的信用卡信息的随机数。


TL/DR:

根据我们上述的实施,我们目前有 (2) 个无法解决的问题:

1) onActivityResult()

尽管在 PayPal 活动窗口中输入了有效的 PayPal 凭据并已恢复到我们的应用程序,但从未调用方法。在网上搜索之后,我们发现了 Android 中的一个潜在错误,关于父 Activity 到 Fragment 的片段没有调用 super.onActivityResult()。 onActivityResult 没有在 Fragment 中被调用 onActivityResult() 当 Activity 从 Fragment onActivityResult 开始时没有被调用在片段 android 中没有被调用https://code.google.com/p/android/issues/detail?id=15394 不幸的是,这些帖子中的任何建议似乎都不允许在我们的 Fragment 中调用 onActivityResult。作为回报,这会导致永远不会在 Braintree 对象上调用 finishPayWithPaypal()。最后,导致 onPaymentMethodNonce 永远不会为我们的 nonce 侦听器 Fragment 触发。

更新 onActivityResult() 回调问题:

根据 Luke 在评论部分的建议,我已经实施了 onActivityResult() 回调问题的解决方案:

在 Payment Activity 中,我们覆盖 onActivityResult(),然后调用 Fragment 的 onActivityResult 方法。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.payment_fragment);
    if (fragment != null){
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}
Run Code Online (Sandbox Code Playgroud)

onActivityResult() 方法现在在 PayPal 活动完成时被调用。感谢您的帮助卢克。

*注意:确保您尝试引用的 Fragment 与 findFragmentById() 返回的 Fragment 类型相同!如果 Fragment 是 android.app.Fragment,则使用 Activity 的 getFragmentManager().findFragmentById() 返回 app Fragment。如果 Fragment 是 android.support.v4.app.Fragment,则使用 Activity 的 getSupportFragmentManager().findFragmentId() 返回 v4 Fragment。否则,片段类型不匹配将导致返回空值。虽然这看起来很直观,但鉴于类型的细微差别,调试起来非常烦人!

2) onPaymentMethodNonce()

方法永远不会被调用。在调用 tokenize() 或 finishWithPayPal() 之后,在 Braintree 对象上,该调用似乎在“Braintree world”中迷路了。在设置断点并逐步执行实施后,我们无法找到任何关于 Braintree 失败或成功标记卡或处理 PayPal 活动结果的痕迹。


环境

Gradle 构建信息:

  • compileSdkVersion 19
  • 构建工具版本 20.0.0
  • minSdk 版本 11
  • 目标SDK版本19
  • 版本代码 5
  • 版本名称 1.4.1

测试硬件:

  • 三星双核
  • 型号 GT-S7582
  • 安卓版本 4.2.2

提前谢谢你的帮助。