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);
额外调试提示
- 你可以用
var_dump($o)替代print_r($o),它会明确显示$o的类型是string,而不是array; - 去掉
@错误抑制符,它会掩盖unserialize()的失败信息,不利于排查问题; - 生产环境建议开启
CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER,关闭这两个选项会带来SSL安全风险。
内容的提问来源于stack exchange,提问作者Yogesh k
相关产品推荐
相关产品推荐

