PHP解析WooCommerce Webhooks JSON数据遇阻,求解决方案
嘿,我来帮你搞定这个WooCommerce Webhook JSON解析的问题!
解决WooCommerce Webhook JSON解析故障
从你给出的JSON片段来看,这是标准的WooCommerce订单格式,但解析失败通常逃不过这几个常见原因,咱们一步步排查:
1. 先确保正确获取Webhook原始数据
WooCommerce的Webhook数据是通过POST请求体发送的,不是存在$_POST数组里,你得直接读取原始请求内容:
// 读取POST请求体里的原始JSON $json_raw = file_get_contents('php://input'); if (empty($json_raw)) { die("无法获取Webhook传输的数据"); }
2. 验证JSON格式的完整性
你提供的JSON末尾是"disco...,看起来是被截断了的状态。如果实际接收到的JSON不完整,json_decode会直接返回null。可以先加个验证步骤:
// 解析JSON为关联数组 $order_data = json_decode($json_raw, true); // 检查解析是否出错 if (json_last_error() !== JSON_ERROR_NONE) { die("JSON解析失败: " . json_last_error_msg()); }
如果确实是JSON截断,那要检查两个点:一是WooCommerce的Webhook配置是否正常发送完整数据;二是服务器的post_max_size和upload_max_filesize参数,可能需要调整php.ini里的数值来支持更大的请求体。
3. (可选但推荐)验证Webhook签名
为了确保数据真的来自你的WooCommerce站点,同时也能间接确认数据完整性,建议加上签名验证:
// 获取Webhook签名头 $signature = $_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE']; // 替换成你在WooCommerce后台设置的Webhook密钥 $webhook_secret = '你的Webhook密钥'; // 验证签名(用hash_equals避免时序攻击) if (!hash_equals(base64_encode(hash_hmac('sha256', $json_raw, $webhook_secret, true)), $signature)) { die("无效的Webhook签名,数据可能被篡改"); }
4. 解析后正确访问数据
解析成功后,就可以像操作普通数组一样获取订单信息了:
// 获取订单号 $order_number = $order_data['number']; // 获取订单状态 $order_status = $order_data['status']; // 遍历商品列表 foreach ($order_data['line_items'] as $item) { $product_name = $item['name']; $quantity = $item['quantity']; // 这里可以添加生成PDF需要的商品信息处理逻辑 }
如果还是卡壳,把json_last_error_msg()返回的具体错误信息贴出来,或者提供完整的JSON数据(敏感信息记得打码),就能更精准定位问题啦。
内容的提问来源于stack exchange,提问作者brambil
相关产品推荐
相关产品推荐

