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

Razorpay支付网关onPaymentError方法内Intent跳转不生效问题求助

问题根因排查&解决方案

最常见的触发原因是支付失败场景下PaymentData返回空值,直接调用paymentData.getData().toString()会触发空指针异常,代码逻辑进入catch块,后续的页面跳转代码不会执行。

排查步骤

  • 先查看onPaymentError回调的catch块日志,确认是否有NullPointerException抛出,你当前仅写了e.printStackTrace(),可以在异常捕获逻辑中增加本地日志或者调试断点验证。
  • 确认回调逻辑执行在主线程:虽然Toast正常弹出已经可以大概率确认回调在主线程,也可以额外增加日志验证线程状态。

修复代码

调整onPaymentError逻辑,增加空判断、异常场景兜底跳转:

@Override
public void onPaymentError(int errorCode, String errorMsg, PaymentData paymentData) {
    String paymentStatus = "{}";
    try {
        Utility.showToastMessage(this, errorMsg);
        // 先对PaymentData做非空判断
        if (paymentData != null && paymentData.getData() != null) {
            paymentStatus = paymentData.getData().toString();
        }
    } catch (Exception e) {
        e.printStackTrace();
        paymentStatus = "{\"error\":\"" + e.getMessage() + "\"}";
    } finally {
        // 跳转逻辑放到finally块,无论是否抛异常都能执行
        Intent intent = new Intent(PaymentActivity.this, PaymentStatusActivity.class);
        // 本页面是Activity上下文,无需添加FLAG_ACTIVITY_NEW_TASK,可直接移除
        intent.putExtra("payment_status", paymentStatus);
        startActivity(intent);
        finish();
    }
}

额外可选优化

如果担心回调线程问题,可以将跳转逻辑包裹在runOnUiThread中保证主线程执行:

runOnUiThread(() -> {
    Intent intent = new Intent(PaymentActivity.this, PaymentStatusActivity.class);
    intent.putExtra("payment_status", paymentStatus);
    startActivity(intent);
    finish();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 21:54:01