Razorpay安卓集成UPI支付出现Receiver not registered崩溃错误
问题根因
该崩溃是Razorpay Android SDK的已知内部逻辑问题:仅UPI支付流程会触发SDK注册专门用于监听UPI应用跳转、支付结果的广播接收器,在部分场景下(用户跳转UPI应用后快速切回、支付完成后立刻关闭页面、系统后台主动回收页面),SDK内部会先执行一次接收器注销操作,等CheckoutActivity生命周期走到onDestroy阶段时又重复触发注销逻辑,就抛出了接收器未注册的异常。银行卡支付流程不需要用到这个UPI专属监听接收器,所以不会触发崩溃。
解决方案
分为临时规避方案和永久修复方案:
- 临时规避方案1:修改你项目
AndroidManifest.xml中Razorpay CheckoutActivity的配置,增加configChanges属性避免页面不必要的销毁重建:
<activity android:name="com.razorpay.CheckoutActivity" android:configChanges="keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout" android:exported="true" />
- 临时规避方案2:在支付结果回调中增加延迟再关闭页面,避免SDK还未完成内部清理就触发Activity销毁:
@Override public void onPaymentSuccess(String paymentId) { new Handler(Looper.getMainLooper()).postDelayed(() -> { // 你的原有支付成功后页面关闭逻辑 finish(); }, 500); } @Override public void onPaymentError(int errorCode, String errorMsg) { new Handler(Looper.getMainLooper()).postDelayed(() -> { // 你的原有支付失败后页面关闭逻辑 finish(); }, 500); }
- 临时规避方案3:注册全局异常捕获器过滤该专属异常,避免应用崩溃:
// 先保存原有默认异常处理器 private Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); // 初始化时设置自定义异常处理器 Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { // 匹配Razorpay UPI流程专属的接收器未注册异常 if (throwable instanceof IllegalArgumentException && throwable.getMessage() != null && throwable.getMessage().contains("Receiver not registered: null") && Arrays.stream(throwable.getStackTrace()) .anyMatch(stackTraceElement -> stackTraceElement.getClassName().contains("com.razorpay.CheckoutPresenterImpl"))) { // 直接忽略该异常,不触发崩溃 return; } // 其余异常走原有处理逻辑 defaultHandler.uncaughtException(thread, throwable); });
- 永久修复方案:将项目依赖的Razorpay Android SDK升级到1.6.30及以上版本,官方已经在该版本修复了UPI流程重复注销广播接收器的问题,修改
build.gradle依赖配置即可:
dependencies { implementation 'com.razorpay:checkout:1.6.30' }
升级后清理项目缓存重新构建即可彻底解决该崩溃问题。
内容的提问来源于stack exchange,提问作者Sneha
相关产品推荐
相关产品推荐

