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

集成Google Pay点击支付按钮崩溃,废弃方法求替代方案

Google Pay支付崩溃修复方案

崩溃根因

  • startActivityForResult方法自AndroidX API 29开始已被官方废弃,高版本系统调用会触发兼容问题甚至崩溃
  • 未适配Android 11(API 30)及以上系统的应用可见性规则,系统会拦截应用对Google Pay的启动请求,找不到目标Activity直接崩溃
  • 未做Google Pay可用性校验,用户未安装Google Pay或设备不支持时,启动意图直接抛出ActivityNotFoundException异常
  • 支付意图未设置ACTION_VIEW动作,系统无法正确匹配支付处理方,触发异常
  • 原有回调逻辑未做异常判断,无法处理无效返回场景

具体修复步骤

1. 新增清单文件适配配置

在AndroidManifest.xml根节点下添加应用可见性声明,适配Android 11+系统的包可见性规则:

<queries>
    <package android:name="com.google.android.apps.nbu.paisa.user" />
</queries>

同时提前定义所需常量:

// Google Pay包名
private static final String GOOGLE_PAY_PACKAGE_NAME = "com.google.android.apps.nbu.paisa.user";

2. 替换废弃的回调方法

使用官方推荐的Activity Result API替换已废弃的startActivityForResult,在Activity类中注册支付结果回调:

private final ActivityResultLauncher<Intent> googlePayLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            int resultCode = result.getResultCode();
            Intent data = result.getData();
            if (resultCode == RESULT_OK && data != null) {
                String payResponse = data.getStringExtra("response");
                // 自行解析支付返回参数判断支付状态
                Log.d("GooglePay", "支付结果:" + payResponse);
            } else if (resultCode == RESULT_CANCELED) {
                Log.d("GooglePay", "用户取消支付");
            } else {
                Log.d("GooglePay", "支付失败");
            }
        }
);

原来的onActivityResult方法可以直接删除,不需要保留。

3. 修改支付按钮点击逻辑

增加意图可用性校验,避免异常:

mBoutonCommandeFinale.setOnClickListener(view -> {
    Uri infos = new Uri.Builder()
            .scheme("upi")
            .authority("pay")
            .appendQueryParameter("pa", "test@axisbank")
            .appendQueryParameter("pn", "Test Merchant")
            .appendQueryParameter("mc", "1234")
            .appendQueryParameter("tr", "123456789")
            .appendQueryParameter("tn", "test transaction note")
            .appendQueryParameter("am", "10.01")
            .appendQueryParameter("cu", "INR")
            .appendQueryParameter("url", "https://test.merchant.website")
            .build();
    // 新增ACTION_VIEW动作
    Intent payView = new Intent(Intent.ACTION_VIEW);
    payView.setData(infos);
    payView.setPackage(GOOGLE_PAY_PACKAGE_NAME);

    // 先校验当前设备是否可处理该支付意图
    if (payView.resolveActivity(getPackageManager()) != null) {
        googlePayLauncher.launch(payView);
    } else {
        // 自定义不支持时的提示逻辑
        Toast.makeText(this, "当前设备不支持Google Pay支付,请先安装Google Pay", Toast.LENGTH_SHORT).show();
    }
});

注意事项

  • 测试阶段请使用官方测试参数,避免触发真实交易
  • 支付最终结果需以商户后台收到的官方回调为准,客户端回调仅用作前端页面提示,不可作为入账依据
  • 交易流水号(tr参数)每次请求需生成唯一值,不可重复使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:36:07