以下是一个简单的 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;
}
}
使用说明:
- 将代码部署到服务器,确保可以通过外网访问
- 在微信公众号后台配置:
- URL:填写你的服务器地址
- Token:与代码中的 $token 保持一致
- 选择明文模式(如果要使用加密模式需要额外处理)
主要功能说明:
- 签名验证:处理微信服务器的验证请求
- 事件处理:
- 关注/取消关注事件
- 菜单点击事件
- 文本消息处理(需自行扩展)
- 自动回复文本消息功能
- 基础日志记录功能
注意事项:
- 需要开启 PHP 的 SimpleXML 扩展
- 确保服务器可以接收 POST 请求
- 微信服务器要求在5秒内响应,建议:
- 不要进行复杂耗时的操作
- 复杂操作建议使用异步处理
- 正式环境需要添加错误处理和日志记录
- 如果需要处理加密消息,需使用微信提供的加解密库
可以根据具体需求扩展 handleEvent 和 handleClickEvent 函数来处理更多事件类型。