You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android集成Braintree+Google Pay:onActivityResult未触发求助

排查Google Pay+Braintree集成中onActivityResult未触发的问题

我帮你梳理下几个大概率导致这个问题的点,结合你的代码来看:

1. Fragment的onActivityResult回调依赖宿主Activity转发

你是在Fragment中实现的onActivityResult,但Google Pay的AutoResolveHelper.resolveTask传入的是getActivity(),这时候宿主Activity必须正确转发回调给Fragment。

如果你的宿主Activity重写了onActivityResult方法,但没有调用super.onActivityResult(requestCode, resultCode, data);,那么Fragment的onActivityResult根本收不到回调。先去检查宿主Activity的这个方法,确保super调用存在。

2. 改用Activity Result API替代旧的onActivityResult(推荐)

从AndroidX开始,旧的onActivityResult机制已经被废弃,Fragment中使用它很容易出现回调丢失的问题。换成ActivityResultLauncher会更可靠,不需要依赖Activity转发:

修改后的代码示例:

// 在Fragment的onCreate中初始化Launcher
private ActivityResultLauncher<IntentSenderRequest> googlePayLauncher;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mPaymentsClient = Wallet.getPaymentsClient(
            getActivity(), 
            new Wallet.WalletOptions.Builder()
                .setEnvironment(WalletConstants.ENVIRONMENT_TEST)
                .build()
    );

    // 初始化ActivityResultLauncher
    googlePayLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(), 
        result -> {
            switch (result.getResultCode()) {
                case Activity.RESULT_OK:
                    if (result.getData() != null) {
                        PaymentData paymentData = PaymentData.getFromIntent(result.getData());
                        String token = paymentData.getPaymentMethodToken().getToken();
                        // 拿到token后继续Braintree的支付流程
                    }
                    break;
                case Activity.RESULT_CANCELED:
                    // 用户取消支付
                    break;
                case AutoResolveHelper.RESULT_ERROR:
                    Status status = AutoResolveHelper.getStatusFromIntent(result.getData());
                    // 处理错误,比如打印日志或提示用户
                    break;
            }
        }
    );
}

// 替换原来的AutoResolveHelper.resolveTask调用
private void launchGooglePay() {
    PaymentDataRequest request = createPaymentDataRequest();
    if (request != null) {
        Task<PaymentData> loadTask = mPaymentsClient.loadPaymentData(request);
        loadTask.addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                IntentSender intentSender = task.getResult().getIntentSender();
                try {
                    googlePayLauncher.launch(
                        new IntentSenderRequest.Builder(intentSender).build()
                    );
                } catch (IntentSender.SendIntentException e) {
                    e.printStackTrace();
                }
            } else {
                // 处理支付数据加载失败的情况
            }
        });
    }
}

3. 检查Google Pay请求的Tokenization参数

你的createPaymentDataRequest里,gatewayMerchantId填的是"replace me",这个必须换成Braintree提供的真实测试商户ID。如果参数错误,Google Pay的tokenization流程会失败,可能导致回调异常(虽然一般会返回RESULT_ERROR,但也可能出现无回调的情况)。

4. 确认Manifest的Google Pay配置是否完整

确保你的AndroidManifest.xml里配置了必要的meta-data和权限:

<!-- 必要权限 -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- 启用Google Pay API -->
<meta-data
    android:name="com.google.android.gms.wallet.api.enabled"
    android:value="true" />

先按这几个步骤排查,最可能的问题是Fragment的回调转发或者旧API的兼容性问题,换成Activity Result API应该能解决大部分回调丢失的情况。

内容的提问来源于stack exchange,提问作者uma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:52:32