我们在应用程序中使用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
提前谢谢你的帮助 .