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属性来源,再针对性处理。




