Telegram Bot Webhook调用时PHP Session ID持续变化问题求助
解决Telegram Bot Webhook调用时PHP Session ID变化的问题
问题根源
Telegram的Webhook请求由Telegram服务器主动发起,并非来自用户的客户端(如浏览器),所以请求中不会携带用户的Session Cookie。PHP的Session依赖Cookie识别会话,因此每次Webhook调用都会生成新的Session ID,导致无法复用之前的Session数据。
解决方案:基于Chat ID的文件存储替代Session
既然暂不想用数据库,可以利用Telegram消息中唯一的chatId作为标识,将用户状态存储到本地文件中,实现类似Session的持久化效果。
修改步骤
- 移除Session相关代码:删掉
session_start()和$_SESSION的所有调用,改用文件读写处理状态。 - 创建状态存储目录:在项目根目录新建
user_states文件夹,确保PHP拥有该目录的读写权限。 - 封装状态读写函数:编写两个函数分别负责读取、保存用户状态。
修改后的webhook.php代码示例
<?php require 'vendor/autoload.php'; require 'variables.php'; // 确保状态存储目录存在,不存在则创建 $stateDir = __DIR__ . '/user_states'; if (!is_dir($stateDir)) { mkdir($stateDir, 0755, true); } // 读取指定用户的状态 function getUserState($chatId) { global $stateDir; $stateFile = $stateDir . '/' . $chatId . '.json'; if (file_exists($stateFile)) { return json_decode(file_get_contents($stateFile), true); } return []; } // 保存指定用户的状态 function saveUserState($chatId, $state) { global $stateDir; $stateFile = $stateDir . '/' . $chatId . '.json'; file_put_contents($stateFile, json_encode($state)); } $bot = new TelegramBot\Api\BotApi($apiToken); $update = json_decode(file_get_contents('php://input'), true); if(isset($update['message'])) { $message = $update['message']; $chatId = $message['chat']['id']; // 读取当前用户的状态 $userState = getUserState($chatId); $statusNewAsta = $userState["statusNewAsta"] ?? null; if (isset($message['text'])) switch ($message['text']) { case '/start': commandStart($chatId); // 如需重置用户状态,可在此处调用 saveUserState($chatId, []); break; case '/newAsta': if(in_array($chatId,$adminIds)) { commandNewAsta($chatId); // 保存状态为等待输入名称 $userState["statusNewAsta"] = "waiting_name"; saveUserState($chatId, $userState); } else { $bot->sendMessage($chatId,'Non puoi eseguire questo comando!'); } break; default: if(in_array($chatId,$adminIds) && isset($statusNewAsta)) { switch ($statusNewAsta) { case "waiting_name": getNameNewAsta($chatId,$message['text']); // 完成当前步骤后,清空或更新状态 $userState["statusNewAsta"] = null; saveUserState($chatId, $userState); break; } } break; } }
注意事项
- 确保
user_states目录权限正确,可通过chmod 755 user_states命令设置权限。 - 每个用户的状态以
[chatId].json文件名存储,JSON格式支持结构化保存复杂状态数据。 - 用户完成流程后,建议清空对应状态文件或重置状态,避免无用数据堆积。
内容的提问来源于stack exchange,提问作者Cesare Diodato
相关产品推荐
相关产品推荐

