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) 个无法解决的问题:
尽管在 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 触发。
根据 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。否则,片段类型不匹配将导致返回空值。虽然这看起来很直观,但鉴于类型的细微差别,调试起来非常烦人!
方法永远不会被调用。在调用 tokenize() 或 finishWithPayPal() 之后,在 Braintree 对象上,该调用似乎在“Braintree world”中迷路了。在设置断点并逐步执行实施后,我们无法找到任何关于 Braintree 失败或成功标记卡或处理 PayPal 活动结果的痕迹。
环境
Gradle 构建信息:
测试硬件:
提前谢谢你的帮助。
| 归档时间: |
|
| 查看次数: |
2355 次 |
| 最近记录: |