deepseek:如何用php写微信公众号订阅回复事件

以下是使用 PHP 重写的微信公众号订阅事件回复的示例代码。这个代码实现了用户订阅(关注)公众号时,自动回复一条欢迎消息。


PHP 实现代码

<?php
// 微信公众平台的Token
define("TOKEN", "your_token");

// 验证消息的确来自微信服务器
function checkSignature() {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];

    $tmpArr = array(TOKEN, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode($tmpArr);
    $tmpStr = sha1($tmpStr);

    if ($tmpStr == $signature) {
        return true;
    } else {
        return false;
    }
}

// 处理用户订阅事件并回复消息
function responseMsg() {
    // 获取POST数据
    $postStr = file_get_contents("php://input");

    // 如果数据不为空
    if (!empty($postStr)) {
        // 解析XML数据
        libxml_disable_entity_loader(true);
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

        $msgType = $postObj->MsgType; // 消息类型
        $event = $postObj->Event; // 事件类型

        // 如果是订阅事件
        if ($msgType == "event" && $event == "subscribe") {
            $fromUser = $postObj->FromUserName; // 用户OpenID
            $toUser = $postObj->ToUserName; // 公众号原始ID

            // 回复的文本内容
            $content = "欢迎关注我们的公众号!";

            // 构造回复的XML消息
            $response = "<xml>
                        <ToUserName><![CDATA[$fromUser]]></ToUserName>
                        <FromUserName><![CDATA[$toUser]]></FromUserName>
                        <CreateTime>" . time() . "</CreateTime>
                        <MsgType><![CDATA[text]]></MsgType>
                        <Content><![CDATA[$content]]></Content>
                        </xml>";
            echo $response;
        }
    } else {
        echo "";
        exit;
    }
}

// 主逻辑
if (checkSignature()) {
    if ($_SERVER['REQUEST_METHOD'] == 'GET') {
        // 验证服务器地址有效性
        echo $_GET['echostr'];
    } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        // 处理用户消息
        responseMsg();
    }
} else {
    echo "Invalid signature.";
}
?>

代码说明

  1. Token 配置

    • TOKEN 是你在微信公众号后台配置的 Token,需要与代码中的 define("TOKEN", "your_token"); 一致。
  2. 签名验证

    • checkSignature() 函数用于验证消息是否来自微信服务器。
    • 微信服务器会发送 signaturetimestampnonceechostr 参数,通过校验签名确认请求的合法性。
  3. 处理订阅事件

    • 当用户关注公众号时,微信服务器会发送一个 XML 格式的事件消息。
    • 解析 XML 数据,判断 MsgType 是否为 event,且 Event 是否为 subscribe
    • 如果是订阅事件,构造一个文本消息回复用户。
  4. 回复消息

    • 回复的消息是一个 XML 格式的文本消息,包含用户的 OpenID、公众号的原始 ID、消息类型和内容。
  5. GET 和 POST 请求处理

    • GET 请求用于验证服务器地址有效性。
    • POST 请求用于处理用户消息和事件。

部署与测试

  1. 将代码上传到你的服务器,确保可以通过公网访问。
  2. 在微信公众号后台配置服务器地址(URL)和 Token。
    • URL 是你的服务器地址,例如:https://yourdomain.com/wechat.php
    • Token 需要与代码中的 TOKEN 一致。
  3. 关注你的公众号,测试是否能收到欢迎消息。

注意事项

  1. 服务器响应时间

    • 微信服务器会在 5 秒内等待响应,如果超时会重试 3 次。因此,确保你的服务器能够快速处理请求。
  2. 安全性

    • 确保代码中的 Token 与微信公众号后台配置一致,避免被恶意请求攻击。
  3. 日志记录

    • 可以在代码中添加日志记录功能,方便调试和排查问题。

通过以上代码,你可以实现微信公众号的订阅事件回复功能。如果有更复杂的需求(如图文消息、菜单事件等),可以在此基础上扩展。

posted @ 2025-03-03 12:54  充实地生活着  阅读(131)  评论(0)    收藏  举报