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

PayUMoney支付网关PHP交易状态API集成报错排查

问题分析与解决方案

你遇到的这个错误核心原因很直白:你误以为$o是PHP数组,但实际上它是一个JSON格式的字符串。

为什么会出现这个误解?

看你代码里这段逻辑:

$valueSerialized = @unserialize($o);
if($o === 'b:0;' || $valueSerialized !== false) {
 print_r($valueSerialized);
}
print_r($o);

PayUMoney的交易状态API返回的是JSON字符串,不是PHP序列化后的结构化数据。unserialize()只能解析PHP自身序列化的内容,对JSON完全无效,所以$valueSerialized会返回false,代码最终执行了print_r($o)——而PHP打印JSON字符串时,会把它的键值结构显示得像数组,但本质上它还是字符串类型,不是真正的PHP数组。

这就是你用$o['transaction_details']访问时报错“Illegal string offset”的原因:你在试图把字符串当作数组来操作,这在PHP里是不允许的。

正确的解决步骤

把unserialize()替换成json_decode(),并且传入第二个参数true,让JSON直接转换成关联数组:

修改你的代码逻辑:

// 替换原有的unserialize解析逻辑
$response = json_decode($o, true);

// 先判断JSON解析是否成功
if ($response === null) {
    echo "JSON解析失败: " . json_last_error_msg();
    exit;
}

// 现在可以正常按数组方式访问数据了
$checkout_data = $response['transaction_details'][$var1];
print_r($checkout_data);

额外调试提示

  1. 你可以用var_dump($o)替代print_r($o),它会明确显示$o的类型是string,而不是array;
  2. 去掉@错误抑制符,它会掩盖unserialize()的失败信息,不利于排查问题;
  3. 生产环境建议开启CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER,关闭这两个选项会带来SSL安全风险。

内容的提问来源于stack exchange,提问作者Yogesh k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:26:18