0
点赞
收藏
分享

微信扫一扫

php 接收微信推送事件demo代码

以下是一个简单的 PHP 接收微信事件推送的 Demo 代码,包含基础验证和事件处理:

<?php
// 填写微信公众号后台配置的 Token
$token = 'YOUR_TOKEN';

// 验证签名(微信首次验证接口时使用)
function checkSignature($token)
{
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode($tmpArr);
    $tmpStr = sha1($tmpStr);
    
    return $tmpStr == $signature;
}

// 处理接收到的消息
function handleMessage()
{
    // 获取微信推送的POST数据
    $postStr = file_get_contents("php://input");
    
    // 记录日志(调试用)
    file_put_contents('wechat_log.txt', $postStr, FILE_APPEND);
    
    if (!empty($postStr)) {
        // 解析XML数据
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        
        // 消息类型判断
        switch ($postObj->MsgType) {
            case 'event':
                // 事件处理
                handleEvent($postObj);
                break;
            case 'text':
                // 文本消息处理(可选)
                break;
            // 其他消息类型...
        }
    }
}

// 处理事件消息
function handleEvent($postObj)
{
    switch ($postObj->Event) {
        case 'subscribe':
            // 关注事件
            $content = "欢迎关注!";
            replyText($postObj, $content);
            break;
        case 'unsubscribe':
            // 取消关注事件
            break;
        case 'CLICK':
            // 菜单点击事件
            handleClickEvent($postObj);
            break;
        // 其他事件处理...
    }
}

// 回复文本消息
function replyText($postObj, $content)
{
    $toUser = $postObj->FromUserName;
    $fromUser = $postObj->ToUserName;
    $time = time();
    
    $template = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                </xml>";
    
    echo sprintf($template, $toUser, $fromUser, $time, $content);
    exit;
}

// 主逻辑
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    // 验证接口
    if (checkSignature($token)) {
        echo $_GET['echostr'];
        exit;
    }
} else {
    // 处理消息
    handleMessage();
}

// 示例日志函数
function logMessage($msg) {
    file_put_contents('wechat.log', date('Y-m-d H:i:s')." - ".$msg.PHP_EOL, FILE_APPEND);
}

// 示例点击事件处理
function handleClickEvent($postObj) {
    $eventKey = $postObj->EventKey;
    switch ($eventKey) {
        case 'MENU_KEY_1':
            replyText($postObj, "您点击了菜单1");
            break;
        case 'MENU_KEY_2':
            replyText($postObj, "您点击了菜单2");
            break;
    }
}

使用说明:

  1. 将代码部署到服务器,确保可以通过外网访问
  2. 在微信公众号后台配置:
  • URL:填写你的服务器地址
  • Token:与代码中的 $token 保持一致
  • 选择明文模式(如果要使用加密模式需要额外处理)

主要功能说明:

  1. 签名验证:处理微信服务器的验证请求
  2. 事件处理:
  • 关注/取消关注事件
  • 菜单点击事件
  • 文本消息处理(需自行扩展)
  1. 自动回复文本消息功能
  2. 基础日志记录功能

注意事项:

  1. 需要开启 PHP 的 SimpleXML 扩展
  2. 确保服务器可以接收 POST 请求
  3. 微信服务器要求在5秒内响应,建议:
  • 不要进行复杂耗时的操作
  • 复杂操作建议使用异步处理
  1. 正式环境需要添加错误处理和日志记录
  2. 如果需要处理加密消息,需使用微信提供的加解密库

可以根据具体需求扩展 handleEvent 和 handleClickEvent 函数来处理更多事件类型。

举报

相关推荐

0 条评论