基于Laravel与Telegram Bot SDK的经销商注册验证交互问题
在Laravel + Telegram Bot SDK中实现验证步骤的用户输入捕获
核心思路
Telegram Bot是无状态服务,必须通过跟踪用户会话状态来判断当前需要收集的验证信息。比如用户点击「validate」按钮后,标记该用户处于「等待提交钱包地址」状态,后续用户发送的消息就会被路由到对应的验证逻辑。
实现步骤
1. 会话状态管理
用Laravel的Cache(或Redis)存储用户的当前验证状态,键格式为telegram:user:{chat_id}:verification_step,值为当前等待的验证类型(如wallet_address、site_user_id等)。
2. 处理「validate」按钮的回调
当用户点击验证按钮时,在回调处理器中发送提示消息,并设置会话状态:
use Telegram\Bot\Api; use Telegram\Bot\Objects\CallbackQuery; public function handleCallbackQuery(CallbackQuery $callbackQuery, Api $telegram) { $chatId = $callbackQuery->getMessage()->getChat()->getId(); $callbackData = $callbackQuery->getData(); // 匹配第一步验证(钱包地址)的按钮回调 if ($callbackData === 'validate_wallet_address') { // 发送提示消息 $telegram->sendMessage([ 'chat_id' => $chatId, 'text' => '请发送你的Metamask钱包公钥地址完成验证。' ]); // 设置会话状态:标记用户当前需提交钱包地址 Cache::put("telegram:user:{$chatId}:verification_step", 'wallet_address', now()->addHour()); // 标记回调已处理,避免用户重复触发 $telegram->answerCallbackQuery(['callback_query_id' => $callbackQuery->getId()]); } // 其他验证步骤的回调逻辑(如站点用户ID、发票ID)可依此类推 }
3. 处理用户发送的验证内容
在普通消息处理器中,先检查用户的会话状态,根据状态执行对应验证逻辑:
use Telegram\Bot\Api; use Telegram\Bot\Objects\Message; public function handleMessage(Message $message, Api $telegram) { $chatId = $message->getChat()->getId(); $userInput = $message->getText(); // 获取当前用户的验证状态 $currentStep = Cache::get("telegram:user:{$chatId}:verification_step"); if (!$currentStep) { // 用户不在验证流程中,处理商品选择、注册入口等其他逻辑 return; } // 根据状态分发验证逻辑 switch ($currentStep) { case 'wallet_address': $isValid = $this->checkWalletAddressFormat($userInput); if ($isValid) { $telegram->sendMessage([ 'chat_id' => $chatId, 'text' => '钱包地址验证成功!可进入下一步注册流程。' ]); // 验证通过后清除状态,或设置为下一步状态(如需自动推进) Cache::forget("telegram:user:{$chatId}:verification_step"); } else { $telegram->sendMessage([ 'chat_id' => $chatId, 'text' => '钱包地址格式错误,请发送以0x开头的42位十六进制地址。' ]); } break; case 'site_user_id': $isValid = $this->verifySiteUserIdExists($userInput); // 类似上述反馈逻辑 break; case 'invoice_id': $isValid = $this->checkInvoiceValidity($userInput); // 类似上述反馈逻辑 break; } } // 示例:钱包地址格式校验 private function checkWalletAddressFormat(string $address): bool { return preg_match('/^0x[a-fA-F0-9]{40}$/', $address) === 1; }
4. 多步骤验证扩展
针对你的4步经销商注册流程,可为每个验证按钮设置唯一的callback_data(如validate_step_1、validate_step_2),在回调中设置对应的会话状态(step_1_wallet、step_2_user_id等),再在消息处理器中分别处理不同步骤的验证逻辑。
注意事项
- 给会话状态设置过期时间,避免用户长时间未操作导致状态残留。
- 验证失败时给出明确的错误提示,引导用户正确提交。
- 如需保存用户验证进度,可将已完成的验证信息关联用户Telegram Chat ID存储到数据库中。
内容的提问来源于stack exchange,提问作者hosein in jast
相关产品推荐
相关产品推荐

