You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Midtrans SDK 1.0.1支付成功后无回调且触发类型转换错误求助

Midtrans SDK 1.0.1支付成功后无回调且触发类型转换错误求助

看起来你在使用Midtrans Flutter SDK 1.0.1时遇到了两个头疼的问题:支付成功后收不到正常回调,还触发了type 'Null' is not a subtype of type 'String' in type cast的类型转换错误。我帮你从代码和配置两个维度排查下可能的原因和解决办法:

一、先修复最致命的配置问题:merchantBaseUrl为空

你在初始化MidtransConfig时把merchantBaseUrl设成了空字符串'',这是核心错误!Midtrans SDK需要这个地址和支付网关建立通信,空值会导致SDK内部请求失败,进而让回调返回的result对象出现大量Null属性,最终触发类型转换报错。

根据你的测试/生产环境,替换为正确的地址:

  • 沙箱测试环境:https://api.sandbox.midtrans.com
  • 正式生产环境:https://api.midtrans.com

修改后的初始化代码片段:

_midtrans = await MidtransSDK.init(
  config: MidtransConfig(
    clientKey: 'SB-Mid-client-xxxx',
    // 替换为对应环境的地址
    merchantBaseUrl: 'https://api.sandbox.midtrans.com',
    colorTheme: ColorTheme(
      colorPrimary: Theme.of(context).colorScheme.primary,
      colorPrimaryDark: Theme.of(context).colorScheme.primary,
      colorSecondary: Theme.of(context).colorScheme.secondary,
    ),
    enableLog: true,
  ),
);

二、加强回调的Null安全处理,避免崩溃

错误日志显示类型转换问题出现在回调阶段,大概率是result对象的某些属性为Null,但代码直接尝试转换导致的。虽然你写了_s函数处理,但可以进一步强化Null安全,同时用try-catch包裹整个回调逻辑,避免单个属性的Null导致整个回调流程中断,保证_snapCompleter能正常完成。

修改后的回调代码:

_midtrans?.setTransactionFinishedCallback((result) {
  debugPrint(' [Midtrans] CALLBACK TERPANGGIL!');
  try {
    // 先判断result是否为空,避免空指针
    if (result == null) {
      debugPrint('[Midtrans] 回调结果为空');
      if (!(_snapCompleter?.isCompleted ?? true)) {
        _snapCompleter!.complete(PaymentResult('unknown', message: '回调结果为空'));
      }
      return;
    }

    // 打印时给Null属性加默认值,避免报错
    debugPrint(' result = ${result.toString()}');
    debugPrint(' transactionId=${result.transactionId ?? '未获取到'}');
    debugPrint(' status=${result.status ?? '未获取到'}');
    debugPrint(' message=${result.message ?? '未获取到'}');
    debugPrint(' paymentType=${result.paymentType ?? '未获取到'}');

    String? _s(Object? v) => v?.toString();
    final status = (_s(result.status) ?? 'unknown').toLowerCase();
    final pr = PaymentResult(
      status.isEmpty ? 'unknown' : status,
      transactionId: _s(result.transactionId),
      paymentType: _s(result.paymentType),
      message: _s(result.message),
      raw: result.toString(),
    );

    if (!(_snapCompleter?.isCompleted ?? true)) {
      debugPrint('✅ [Midtrans] Completer 通过回调完成');
      _snapCompleter!.complete(pr);
    }
  } catch (e) {
    debugPrint('[Midtrans] 回调处理失败: $e');
    // 即使回调逻辑出错,也要确保completer完成,避免流程阻塞
    if (!(_snapCompleter?.isCompleted ?? true)) {
      _snapCompleter!.complete(PaymentResult('error', message: '回调处理出错: $e'));
    }
  }
});

三、排查SDK版本的已知问题

你使用的1.0.1版本可能存在Null安全相关的遗留bug(比如回调返回的属性未做Null校验)。建议尝试升级到Midtrans Flutter SDK的最新稳定版,新版本通常会修复这类兼容性问题。

四、额外的调试小技巧

  • 利用enableLog: true查看更详细的SDK日志,重点关注支付完成后SDK和Midtrans网关的通信记录,看是否有请求失败或返回异常数据的情况。
  • 测试时使用Midtrans沙箱提供的虚拟支付方式(比如测试信用卡、虚拟银行),确保支付流程本身能正常走完,排除支付环节的异常。

先把merchantBaseUrl配置正确,这是最可能解决问题的第一步,再配合回调的Null安全优化,应该就能搞定无回调和类型转换错误的问题了。如果还是不行,升级SDK版本或者结合日志定位具体的Null属性来源,再针对性处理。

火山引擎 最新活动