You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:44:57