0)` 断逻辑(运算符优先级错误)。 * 3. 修复未定义变量 $tradeno;trade_do 仅在状态翻转成功(影响行数>0)时执行, * 已被先行进程完成(影响行=0)则跳过,防止重复补单。 * * 用法:配置您的监控服务/cron 定时访问: * http(s)://您的域名/api/monitor.php?key= * key 值可通过数据库查询:SELECT setvalue FROM sq_config WHERE setname='monitor_key'; */ //设置链接断开仍然处理 set_time_limit(0); ignore_user_abort(1); //调用核心文件 include __DIR__ . '/../function/function_core.php'; /* --- 鉴权 (P0-03):key 缺失或不匹配直接拒绝 --- */ $monitor_key = isset($G['config']['monitor_key']) ? (string)$G['config']['monitor_key'] : ''; if (strlen($monitor_key) < 32) { //尚未生成(如刚安装):生成一次并持久化(function_core 已保证 sq_config 中存在该键行) $monitor_key = bin2hex(random_bytes(32)); updateset('monitor_key', $monitor_key); } if (!isset($_GET['key']) || !hash_equals($monitor_key, (string)$_GET['key'])) { http_response_code(403); die('403 Forbidden'); } //获取已支付但未同步的订单信息 $error = array(); $log = array(); $result = $db->select_limit_row('sq_trade', '*', '', 5, array('status' => '2'), 'AND'); if (is_array($result) && count($result) > 0) { include __DIR__ . '/../function/trade.inc.php'; foreach ($result as $tradeinfo) { $tradeno = $tradeinfo['tradeno']; /* * 幂等补单 (P0-03):先把状态 2 -> 3(WHERE 带 status=2,翻转天然幂等), * 仅当影响行数 > 0(本进程确实完成了翻转)才执行补单逻辑。 */ if ($db->update('sq_trade', array('tradeno' => $tradeno, 'status' => '2'), 'AND', array('status' => 3))) { if ($db->affected_num() > 0) { $log[] = '[监控信息] 订单 ' . $tradeno . ' 状态翻转成功,开始补单'; trade_do($tradeinfo); } else { $log[] = '[监控信息] 订单 ' . $tradeno . ' 已由先行进程完成,跳过'; } } else { $error[] = '[监控信息]订单状态更新失败:' . $tradeno . '[Error:' . $db->geterror() . ']'; } } } //清理初始化后60分钟未操作的Token数据 if ($db->delete('sq_token', '`lastest` = 0 AND `addtime` < ' . (time() - 3600) . ' AND `start` = 0', '')) { $num = $db->affected_num(); if ($num > 0) { $log[] = '[监控信息] 清理初始化后60分钟未操作的Token数据' . $num . '条'; } } else { $log[] = '[监控信息] 清理过程中发生错误:' . $db->geterror(); } //清理心跳过期数据 $result = $db->select_all_row('sq_apps', 'ID,appname,onlinesecond'); if (false === $result) { $log[] = '[监控信息] 获取应用信息发生错误:' . $db->geterror(); } else { foreach ($result as $appinfo) { if ($appinfo['onlinesecond'] > 0) { $OutTime = intval($appinfo['onlinesecond'] * 3); if ($db->delete('sq_token', '`appid` = ' . intval($appinfo['ID']) . ' AND `lastest` < ' . $OutTime, '')) { $num = $db->affected_num(); if ($num > 0) { $log[] = '[监控信息] 清理 ' . $appinfo['appname'] . ' 过期Token数据' . $num . '条'; } } else { $log[] = '[监控信息] 清理 ' . $appinfo['appname'] . ' 过期数据发生错误:' . $db->geterror(); } } } } //输出执行结果,便于监控服务/调用方查看 header('Content-Type: application/json; charset=utf-8'); echo json_encode(array('code' => 1, 'log' => $log, 'error' => $error), JSON_UNESCAPED_UNICODE);