PHP开发微信服务号自定义菜单:创建、响应与查询指南
微信公众号服务号的交互体验很大程度上依赖于自定义菜单的功能设计。通过PHP后端脚本调用微信官方API,开发者可以灵活配置菜单结构,实现用户点击后的信息推送或网页跳转。本文将详细说明菜单创建的API参数、请求示例,以及核心部分——如何在接收到用户点击事件时进行正确的业务逻辑处理。
自定义菜单结构与规则
微信服务号自定义菜单有严格的层级和字数限制,开发前需确保符合以下规范:
- 层级结构:最多3个一级菜单,每个一级菜单下最多5个二级菜单。
- 字数限制:一级菜单名称不超过4个汉字,二级菜单不超过7个汉字。超出部分将以“...”显示。
- 缓存机制:创建成功后,微信客户端需24小时同步缓存。测试时可尝试取消关注后重新关注以立即生效。
菜单主要包含两种按钮类型:
click:用户点击后,微信服务器推送带有指定key值的EVENT事件消息给开发者,适用于触发后台交互逻辑(如查分、请假)。view:用户点击后直接打开指定的URL链接,适用于展示图文详情或H5页面。
第一步:准备环境与获取Token
在创建菜单前,必须通过公众号的AppID和AppSecret获取有效的访问令牌(Access Token)。所有菜单接口调用均需使用HTTPS协议并携带该Token。
1.1 获取 Access Token
通过GET请求获取Token是后续操作的基础。注意Token具有有效期(通常为7200秒),建议在生产环境中做好缓存策略,避免频繁刷新导致频率超限。
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$output = curl_exec($ch);
curl_close($ch);
$result = json_decode($output);
$token = $result->access_token;
第二步:构建JSON数据并创建菜单
创建菜单需要构造特定的JSON对象,并通过POST请求发送至微信服务器。
2.1 JSON结构示例
以下为标准的菜单定义结构,包含了一级菜单下的多个二级子菜单。
{
"button":[
{
"type":"click",
"name":"我的信息",
"sub_button":[
{"type":"click","name":"拇指查询","key":"BUTTON_1"},
{"type":"click","name":"拇指请假","key":"BUTTON_2"},
{"type":"view","name":"工号绑定","url":"http://example.com/bind"}
]
},
{
"type":"click",
"name":"业务流程",
"key":"BUTTON_3"
},
{
"name":"员工建议",
"sub_button":[
{"type":"view","name":"意见反馈","url":"http://example.com/suggest"},
{"type":"click","name:"赞一下我们","key":"BUTTON_ZAN"}
]
}
]
}
2.2 调用创建接口
将上述JSON内容作为POST Body发送。若成功,微信将返回 {"errcode":0,"errmsg":"ok"}。
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$token";
$jsonData = file_get_contents("menu.json"); // 假设已保存为文件
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$output = curl_exec($ch);
curl_close($ch);
var_dump($output); // 调试用
第三步:处理用户点击事件(核心逻辑)
当用户在微信客户端点击类型为 click 的菜单按钮时,微信服务器会将相关事件推送到开发者配置的回调URL。PHP后端需接收XML格式的消息包并进行解析处理。
3.1 事件推送结构
推送的核心字段包括:Event(值为 CLICK)和 EventKey(即菜单中定义的 key 值)。
3.2 PHP 事件响应代码示例
以下代码演示了如何解析XML输入,识别菜单点击事件,并根据不同的 EventKey 返回相应的文本回复。
// 接收原始POST数据
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)) {
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$time = time();
// 模板消息结构
$textTpl = "
<![CDATA[%s]]>
<![CDATA[%s]]>
%s
<![CDATA[%s]]>
<![CDATA[%s]]>
0
";
// 判断消息类型
switch (strtolower(trim($postObj->MsgType))) {
case "event":
if (strtolower($postObj->Event) == "click") {
$msgType = "text";
$eventKey = $postObj->EventKey;
// 根据Key返回不同内容
if ($eventKey == "BUTTON_ZAN") {
$contentStr = "感谢您的点赞,我们将继续努力!";
} else {
$contentStr = "您点击了菜单: {$eventKey}";
}
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
break;
default:
echo ""; // 其他类型暂不处理
}
} else {
echo "";
}
辅助操作:查询与删除菜单
在调试过程中,常需验证菜单是否生成正确或进行重置。
查询菜单结构
使用 GET 请求接口 https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN,可获取当前生效的完整菜单JSON结构,便于比对预期结果。
删除当前菜单
使用 GET 请求接口 https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN,可清除当前所有自定义菜单。删除后,原有菜单将失效,新菜单配置需等待24小时生效。
常见问题排查
- Errcode 40018:通常是因为菜单名称超长或JSON格式非法,请严格校验汉字数量及符号。
- 看不到菜单变化:检查是否在测试号或正式版账号中正确切换;尝试取消关注重注以清除本地缓存。
- 收不到事件推送:确认回调URL地址配置无误,且服务器能正常接收XML POST请求;同时检查代码中对
event类型的分支判断逻辑。
以上就是PHP开发微信服务号自定义菜单创建、配置及事件响应的详细内容,更多关于微信公众号高级接口开发及自动化交互的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









