第三方购物车Webhook无法处理:PHP更新MySQL库存失败排查
问题排查:Windows共享服务器上PHP Webhook接收页面失效
代码层面的核心问题
错误的条件判断逻辑
原代码中if($notification == 'success')完全错误,$_POST是数组类型,永远不可能等于字符串'success',这会直接触发400 Bad Request响应。正确的判断应该是检查order字段是否存在且有效:if(isset($_POST['order']) && !empty($_POST['order'])) { // 后续处理逻辑 } else { header('HTTP/1.1 400 Bad Request'); exit; }JSON解码后的访问方式混淆
json_decode($notification['order'])默认返回对象,后续用数组方式$order['items']访问会抛出错误。两种修正方式:// 方式1:以对象形式访问 $order = json_decode($_POST['order']); $items = $order->items; foreach($items as $item) { $pid = $item->pid; } // 方式2:强制返回数组 $order = json_decode($_POST['order'], true); $items = $order['items']; foreach($items as $item) { $pid = $item['pid']; }SQL语法错误与注入风险
直接拼接字符串类型的pid到SQL语句中,会因为缺少引号导致语法错误,同时存在SQL注入风险。必须使用预处理语句:foreach($items as $item) { $pid = $item['pid']; // 对应数组解码方式,对象解码则用$item->pid $sql = "UPDATE posters SET stock_status='Sold' WHERE cartloom_ref = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "s", $pid); mysqli_stmt_execute($stmt); }缺失错误捕获机制
原代码没有任何错误日志或异常处理,无法定位执行失败原因,建议添加:// 数据库连接错误检查 $conn = mysqli_connect("主机地址", "用户名", "密码", "数据库名"); if(!$conn) { error_log("数据库连接失败: " . mysqli_connect_error()); header('HTTP/1.1 500 Internal Server Error'); exit; } // SQL执行错误检查 if(!mysqli_stmt_execute($stmt)) { error_log("库存更新失败: " . mysqli_stmt_error($stmt)); }
Windows共享服务器特有的排查点
PHP配置与扩展问题
- 确认服务器PHP版本支持
json_decode(需PHP5.2+),检查php.ini中mysqli扩展是否启用; - 核对
post_max_size、upload_max_filesize参数,确保POST数据大小未超过限制; - 部分Windows主机默认禁用
allow_url_fopen,需确认该配置不影响请求处理。
- 确认服务器PHP版本支持
文件与目录权限
Windows共享服务器上,PHP脚本所在目录需具备写入权限(如果添加了日志记录),同时确保数据库账号有足够的更新权限。IIS路由与拦截规则
若服务器使用IIS,需检查URL重写规则是否导致Webhook请求无法到达接收页面;同时查看主机商的防火墙规则,确认第三方购物车的IP未被拦截。日志排查
查看IIS访问日志(通常在C:\inetpub\logs\LogFiles目录),确认请求是否到达服务器,以及返回的状态码;同时查看PHP错误日志,定位脚本执行中的异常。
快速验证步骤
- 先修复代码中的逻辑错误,添加POST数据日志记录:
file_put_contents('webhook_debug.log', print_r($_POST, true) . "\n\n", FILE_APPEND); - 手动发送测试POST请求到接收页面,查看日志是否正常记录数据;
- 测试数据库连接与SQL语句执行,确认库存更新逻辑在服务器环境下可正常运行。
内容的提问来源于stack exchange,提问作者fredquimby
相关产品推荐
相关产品推荐

