我们在应用程序中使用Braintree SDK与PayPal结合使用,以便用户进行应用内购买 . 很遗憾,我们无法使用Braintree从PayPal付款信息或用户输入的信用卡信息创建nonce .

以下是我们具体实施的背景:

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

Braintree braintree = Braintree.getInstance(context, token);

我们还将Braintree监听器设置为Fragment,它实现了Braintree.PaymentMethodNonceListener . 在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);
        }
    }
}

按照看到here的Braintree SDK文档,

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

CardBuilder cardBuilder = new CardBuilder()
                .cardNumber(cardNumber)
                .expirationDate(expirationDate);
        braintree.tokenize(cardBuilder);

根据Braintree开发者文档,看到here,在调用tokenize之后,应该期待onPaymentMethodNonce回调;此时,接收用户输入的信用卡信息的随机数 .


TL/DR:

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

1)onActivityResult()

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

onActivityResult()回调问题的更新:

Per Luke在评论部分的建议,我已经解决了onActivityResult()回调问题:

在付款活动中,我们覆盖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);
    }
}

现在,当PayPal活动完成时,将调用onActivityResult()方法 . 谢谢你的帮助卢克 .

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

2)onPaymentMethodNonce()

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


Environment

Gradle构建信息:

  • compileSdkVersion 19

  • buildToolsVersion 20.0.0

  • minSdkVersion 11

  • targetSdkVersion 19

  • versionCode 5

  • versionName 1.4.1

测试硬件:

  • 三星DUOS

  • 型号GT-S7582

  • Android版本4.2.2

提前谢谢你的帮助 .