商户应用UPI集成Intent功能失效,选择器无法识别任何支付应用
UPI Intent唤起失败解决方案
1. 优先适配Android 11+包可见性规则
Android 11(API Level 30)及以上版本对应用可见性做了限制,未在清单文件声明查询规则的情况下,你无法检测到设备上安装的其他UPI支付应用,这是90%以上同类问题的根因。
你需要在AndroidManifest.xml中添加如下查询配置:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="upi" /> </intent> <!-- 可按需添加主流支付应用包名提升查询效率 --> <package android:name="com.google.android.apps.nbu.paisa.user" /> <package android:name="net.one97.paytm" /> <package android:name="com.phonepe.app" /> <package android:name="com.razorpay" /> </queries>
2. 修正UPI Intent调用逻辑
你的现有代码硬编码了Google Pay的包名,会导致其他支付应用无法被识别,建议先使用通用选择器验证唤起逻辑,确认正常后再按需指定包名:
int UPI_REQUEST_CODE = 123; Uri uri = new Uri.Builder() .scheme("upi") .authority("pay") .appendQueryParameter("pa", "替换为你的有效VPA") .appendQueryParameter("pn", "商户名称") .appendQueryParameter("tr", "唯一交易流水号") .appendQueryParameter("tn", "交易备注") .appendQueryParameter("am", "10.00") // 金额必须保留两位小数,不得有其他字符 .appendQueryParameter("cu", "INR") .build(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(uri); // 不要直接指定包名,先使用选择器测试 Intent chooser = Intent.createChooser(intent, "选择支付应用"); if (chooser.resolveActivity(getPackageManager()) != null) { startActivityForResult(chooser, UPI_REQUEST_CODE); } else { Toast.makeText(this, "未检测到可用的支付应用", Toast.LENGTH_SHORT).show(); }
3. 参数合法性校验
- 金额
am参数必须为数字格式,且保留两位小数,例如1.00合法,1、¥1.00均不合法 - 货币单位
cu固定为INR,不得修改 - 商户VPA
pa必须符合UPI规范,不得包含特殊字符,测试阶段可先用个人VPA验证唤起逻辑,排除商户资质问题 - 商户代码
mc若使用测试值,需确认是NPCI官方发布的有效测试商户码,随意填写的无效值会被支付应用直接拦截请求
4. EasyUpiPayment库适配问题
- 确认使用的是库的最新稳定版本,旧版本未适配Android 12+的 intent 规则
- 若开启了R8/ProGuard混淆,需添加库对应的混淆规则,避免核心类被裁剪导致回调异常
- 库的商户ID校验逻辑较严格,若测试阶段始终报错,可先使用原生Intent逻辑验证,排除库本身的兼容问题
5. 支付应用状态适配
你遇到的未登录时可唤起、登录后无法唤起的问题,属于支付应用的风控拦截逻辑:
- 个人账号登录状态下,支付应用会拦截无有效资质的测试商户请求,避免欺诈交易
- 测试阶段可申请支付平台的官方测试商户资质,或使用支付平台提供的沙箱环境账号登录测试
- 正式环境下使用已通过NPCI认证的企业商户ID即可正常唤起
内容的提问来源于stack exchange,提问作者Jamid Deka
相关产品推荐
相关产品推荐

