微信订阅号如何实现不将用户输入的历史数据存入数据库而实现连续对话

Author: 陌小雨Date: 2023-07-08View: 146

在微信订阅号后台使用PHP实现连续对话,而不将用户输入的历史数据存入数据库,可以采用以下方法:

会话状态管理:在不存储历史数据的情况下,可以使用会话状态来跟踪用户的连续对话。每当用户发送消息到订阅号时,后台应该检查是否存在先前的会话状态。如果存在,则根据先前的会话状态进行响应;否则,创建一个新的会话状态。

使用Session对象:PHP中的Session对象可以用于在服务器上跟踪用户会话状态。通过使用Session对象,可以将用户会话状态保存在服务器的内存中,而不是存储在数据库中。在PHP中,可以使用session_start()函数来启动会话,并使用$_SESSION数组来存储和访问会话数据。

处理会话过期:为了避免服务器内存溢出,应该设置会话的过期时间。可以使用session_set_cookie_params()函数设置会话的过期时间,或者使用session.gc_maxlifetime配置项来定义会话的最大生命周期。

下面是一个简单的示例代码,演示如何使用PHP会话来实现连续对话:

<?php
// 启动会话
session_start();

// 获取用户发送的消息
$userInput = $_POST['message'];

// 检查会话状态
if (isset($_SESSION['conversation'])) {
    // 根据先前的会话状态进行响应
    $previousConversation = $_SESSION['conversation'];
    $response = processUserInput($userInput, $previousConversation);
} else {
    // 创建新的会话状态
    $response = processUserInput($userInput);
}

// 更新会话状态
$_SESSION['conversation'] = $response['conversation'];

// 返回响应给微信订阅号
echo $response['message'];

// 处理用户输入,并返回响应和会话状态
function processUserInput($input, $previousConversation = null) {
    // 初始化默认的会话状态
    $conversation = [
        'step' => 1,
        // 其他需要存储的会话数据
    ];

    // 根据先前的会话状态进行响应
    if ($previousConversation !== null) {
        $conversation = $previousConversation;
    }

    // 根据当前的会话状态进行不同的处理步骤
    switch ($conversation['step']) {
        case 1:
            // 处理第一步逻辑,根据用户输入生成响应消息
            $responseMessage = "欢迎来到订阅号,请告诉我您的姓名。";
            $conversation['step'] = 2; // 进入下一步
            break;

        case 2:
            // 处理第二步逻辑,根据用户输入生成响应消息
            $name = $input;
            $responseMessage = "你好,{$name}!请问有什么可以帮到你的?";
            $conversation['step'] = 3; // 进入下一步
            break;

        case 3:
            // 处理第三步逻辑,根据用户输入生成响应消息
            $responseMessage = "感谢您的反馈!我们会尽快处理。";
            $conversation['step'] = 4; // 进入下一步
            break;

        // 可根据需要添加更多的步骤

        default:
            // 处理未知步骤或其他情况
            $responseMessage = "对不起,我无法理解您的请求。";
    }

    return [
        'message' => $responseMessage,
        'conversation' => $conversation
    ];
}

?>

每个用户的 $_SESSION['conversation'] 值都是独立的,并且在不同用户之间是隔离的。PHP 的 Session 对象会为每个访问网站的用户创建一个唯一的会话标识符(Session ID),并将会话数据与该标识符关联起来。

当一个用户发送请求到服务器时,服务器会根据用户提交的 Session ID 来找到对应的会话数据,并将其加载到 $_SESSION 数组中。这样,每个用户的会话数据都是独立存储的,不同用户之间的会话状态不会相互干扰。

例如,如果有两个用户同时与订阅号进行交互,他们分别拥有自己的 $_SESSION['conversation'] 数组,存储着各自的会话状态信息。这样,即使他们同时发送消息,也不会出现混淆或冲突。

需要注意的是,为了确保每个用户的会话数据正确地被加载和保存,需要在 PHP 文件的开头使用 session_start() 函数启动会话。这样,每个用户的 Session ID 就能被识别和关联到正确的会话数据。

总之,通过使用 PHP 的 Session 对象,可以实现每个用户独立的会话状态管理,保证不同用户的 $_SESSION['conversation'] 值是不同的。

最后 如果你发现你获取不到session,可以将上面的逻辑改用wordpress的设置选项来弄,因为$fromusername是唯一的,所以道理是一样的。