💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 自定义菜单 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013 ![](https://box.kancloud.cn/1611d5c2f7433ae43670becbf7121779_651x262.png) 微信公众号默认没有开通底部是没有菜单功能,需要使用者自行来创建开通。 注意点: * 自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 * 一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。 * 创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。 5分钟后更新,如果要实时,测试时可以尝试取消关注公众账号后再次关注 # 按钮事件 ![](https://box.kancloud.cn/b9821efee346878135c3c4f67eee2bc0_1412x403.png) ![](https://box.kancloud.cn/688e1fd70b7f60425c493e1c534b2dbe_1413x77.png) 注: * 最常用的自定义类型按钮为:view 它相当有html中的a作用 * view想跳转到指定的URL,需要认证后的公众号才可以 # 自定义菜单的创建 [https://mp.weixin.qq.com/wiki?t=resource/res\_main&id=mp1421141013](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013) ![](https://box.kancloud.cn/754cb6969037a5a26102105f1aca02b9_1108x625.png) 创建menu.php 用到这个来创建菜单 ![](https://box.kancloud.cn/3ed4c7b4eafd4f99d94f3d26dc4acd38_562x288.png) ~~~ <?php return '{ "button":[ { "type":"click", "name":"首页", "key":"index001" }, { "name":"最新活动", "sub_button":[ { "type":"view", "name":"搜索", "url":"http://m.baidu.com/" }, { "type":"click", "name":"客服", "key":"kefu001" },{ "type": "pic_sysphoto", "name": "系统拍照", "key": "photo001" },{ "name": "发送位置", "type": "location_select", "key": "rselfmenu_2_0" }] }, { "type":"view", "name":"个人中心", "url":"http://m.itcast.cn/" } ] }'; ~~~ 在代码中写 (省略curl那个方法) ~~~ <?php /** * 主动模式 */ $wx = new Wechat(); $menuList = include './menu.php'; echo $wx->createMenu($menuList); class Wechat { // appid const APPID = 'wx77c58459abaf8ad6'; // appsecret const SECRET = '8074c29bdfa71fdbe9debc19060275dc'; /** * 得到access_token access_token是全局唯一有效的 * @return [type] [description] */ public function getAccessToken(){ # 缓存的文件 $cacheFile = self::APPID.'_cache.log'; // 判断文件是否存在,要是不存在则表示没有缓存 // 存在判断修改的时间是否过了有效期,如果没有过,则不进行url网络请求 if (is_file($cacheFile) && filemtime($cacheFile)+7000 > time()) { return file_get_contents($cacheFile); } // 第1次或缓存过期 $surl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s'; $url = sprintf($surl,self::APPID,self::SECRET); // 发起GET请求 http_request是我们封装的函数 $json = $this->http_request($url); // 把json转为数组 $arr = json_decode($json,true); $access_token = $arr['access_token']; // 写缓存 file_put_contents($cacheFile,$access_token); // 返回数据 return $access_token; } /** * 创建自定义菜单 * @param array|string $menu [description] * @return [type] [description] */ public function createMenu($menu){ if(is_array($menu)){ // 因为菜单有中文,所以一定要写json_encode第2个参数,让中文不乱码 $data = json_encode($menu,JSON_UNESCAPED_UNICODE); # 256 }else{ $data = $menu; } // 创建自定义菜单URL $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->getAccessToken(); // 发起请求 $json = $this->http_request($url,$data); return $json; } /** * 发起请求 * @param strin $url url地址 * @param string|array $ret 请求体 * @param string $file 上传的文件绝对地址 * @return [type] [description] */ private function http_request($url,$ret='',$file=''){ ~~~ 我们自己执行下这个代码 成功后会返回 ~~~ { "errcode": 0, "errmsg": "ok" } ~~~ # 删除自定义菜单 ![](https://box.kancloud.cn/408e4b28b3e820c27bcee8de4677fdf4_1116x344.png) ~~~ /** * 删除自定义菜单 * @return [type] [description] */ public function delMenu(){ $url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='.$this->getAccessToken(); // 发起请求 $json = $this->http_request($url); return $json; } ~~~ ~~~ $wx = new Wechat(); //$menuList = include './menu.php'; //echo $wx->createMenu($menuList); # 删除菜单 echo $wx->delMenu(); ~~~ 会全部删除 我们自己执行下这个代码 成功后会返回 ~~~ { "errcode": 0, "errmsg": "ok" } ~~~ 用处是,全部删除,创建新的 # 点击事件的处理 `"type":"click"` 点击事件需要捕获是个event ![](https://box.kancloud.cn/a8525fab354f930bb3e37b3faccb0173_888x199.png) 我们写到另一个文件,被动回复的那边 他会自动调用我们的方法的 `echo $ret = call_user_func([$this,$fun],$obj);` ~~~ /** * 事件处理 */ private function eventFun($obj){ // 事件的名称 $Event = $obj->Event; switch ($Event) { case 'CLICK': // 关于点击事件 return $this->clickFun($obj); break; } } // 按钮的点击事件 private function clickFun($obj){ $EventKey = $obj->EventKey; //字符串就是你定义的菜单那边的key if ('index001' == $EventKey) { return $this->createText($obj,'你点击首页按钮'); }elseif('kefu001' == $EventKey){ return $this->createText($obj,'你点击找客服小姐姐!'); } return $this->createText($obj,'我解决不了!'); } ~~~ 我们判断点击事件,然后根据key来返回东西 # 自定义菜单事件推送 click和view很常用,**只有认证的公众号使用view事件才能跳转到任意url中**