集成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
相关产品推荐
相关产品推荐

