自定义菜单的创建

自定义菜单基本要求:
1.自定义菜单最多包含3个一级菜单,每个一级菜单最多包含5个二级菜单。
2.一级菜单最多4个汉字,二级菜单最多包含7个汉字,多出来的部分以"..."的形式来展现。
3.在创建自定义菜单后,微信不会立即生效,为了更快的看到效果,可以取消关注后,重新进行关注。

接口调用请求说明:
http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

下面简单介绍两种常用的请求:
click和view的请求示例

 {
     "button":[
     {    
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {    
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
                 "type":"miniprogram",
                 "name":"wxa",
                 "url":"http://mp.weixin.qq.com",
                 "appid":"wx286b93c14bbf93aa",
                 "pagepath":"pages/lunar/index"
             },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }

参数说明

参数是否必须说明
button一级菜单数组,个数应为1~3个
sub_button二级菜单数组,个数应为1~5个
type菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型
name菜单标题,不超过16个字节,子菜单不超过60个字节
keyclick等点击类型必须菜单KEY值,用于消息接口推送,不超过128字节
urlview、miniprogram类型必须网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。
media_idmedia_id类型和view_limited类型必须调用新增永久素材接口返回的合法media_id
appidminiprogram类型必须小程序的appid(仅认证公众号可配置)
pagepathminiprogram类型必须小程序的页面路径

返回结果:

  • 正确时的返回JSON数据包如下:

    {"errcode":0,"errmsg":"ok"}

  • 错误时的返回JSON数据包如下(示例为无效菜单名长度):

    {"errcode":40018,"errmsg":"invalid button name size"}

示例代码:(thinkphp3.2.3)

  /**
     * 创建自定义菜单
     * @return [type]
     */
    public function defineditem(){
        //创建微信菜单
        //目前微信接口的调用都是通过curl  post/get
        header('content-type:text/html;charset=utf-8');
        $access_token = $this->getWxAccessToken();
        $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;
        $postArr = array(
                'button'=>array(
                    array(
                        'name'=>urlencode('菜单一'),
                        'type'=>'click',
                        'key'=>'item1',
                    ),//第一个一级菜单
                    array(
                        'name'=>urlencode('菜单二'),
                        'sub_button'=>array(
                            array(
                                'name'=>urlencode('二级菜单一'),
                                'type'=>'click',
                                'key'=>'songs',
                            ),//第一个二级菜单
                            array(
                                'name'=>urlencode('二级出菜单二'),
                                'type'=>'view',
                                'url'=>'http://www.sunxiaoning.com',
                            )//第一个二级菜单
                        )
                    ),//第二个一级菜单
                    array(
                        'name'=>urlencode('菜单三'),
                        'type'=>'view',
                        'url'=>'http://bbs.sunxiaoning.com',
                    )//第三个一级菜单
                )
            
        );
        $postJson = urldecode(json_encode($postArr));
        //echo "$postJson"."<br>";
        $res = $this->http_curl($url,'post','json',$postJson);
        //var_dump($res);
    }
    /**
     * 返回access_token
     * @return [type] [description]
     */
    public function getWxAccessToken(){
        //将access_token存在session/cookie中
        if($_SESSION['access_token']&&$_SESSION['expire_time']>time()){
            //如果access_token在session并未过期
            return $_SESSION['access_token'];
        }else{
            //如果access_token不存在或者已经过期,重新获取access_token
            $appid = 'wxde8d3eacc9f91cae';
            $appsecret = '3ae10c48de0ec193a7cc695f098c2817';
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
            $res = $this->http_curl($url,'get','json');
            $access_token = $res['access_token'];
            //将创新获取的access_token存到session
            $_SESSION['access_token'] = $access_token;
            $_SESSION['expire_time'] = time()+7000;
            return $access_token;
        }
    }
/**
     * @param  url
     * @param  获取方式
     * @param  获取到的格式
     * @param  string
     * @return [type]
     */
    function http_curl($url,$type='get',$res='json',$arr=''){
        //1.初始化curl
        $ch = curl_init();
        //2.设置curl的参数
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if($type == 'post'){
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
        }
        //3.采集
        $output = curl_exec($ch);
        //4.关闭
        if($res == 'json'){
            if(curl_errno($ch)){
                return curl_error($ch);
            }else{
                return json_decode($output,true);
            }
        }
        curl_close($output);
    }

自定义菜单事件消息回复

点击菜单拉取消息时的事件推送

推送XML数据包示例:

<xml>
    <ToUserName>< ![CDATA[toUser] ]></ToUserName>
    <FromUserName>< ![CDATA[FromUser] ]></FromUserName>  
    <CreateTime>123456789</CreateTime>
    <MsgType>< ![CDATA[event] ]></MsgType>
    <Event>< ![CDATA[CLICK] ]></Event>
    <EventKey>< ![CDATA[EVENTKEY] ]></EventKey>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,CLICK
EventKey事件KEY值,与自定义菜单接口中KEY值对应

点击菜单跳转链接时的事件推送

推送XML数据包示例:

<xml>
   <ToUserName>< ![CDATA[toUser] ]></ToUserName>
   <FromUserName>< ![CDATA[FromUser] ]></FromUserName>
   <CreateTime>123456789</CreateTime>
   <MsgType>< ![CDATA[event] ]></MsgType>
   <Event>< ![CDATA[VIEW] ]></Event>
   <EventKey>< ![CDATA[www.qq.com] ]></EventKey>
</xml> 

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,VIEW
EventKey事件KEY值,设置的跳转URL

示例代码(thinkphp3.2.3)

  public function reponseMsg(){
    if (strtolower($postObj->Event)=='click') {
        //如果是自定义菜单中的event -> click
        if(strtolower($postObj->EventKey)=='item1'){
             $content  = "您点击了自定义菜单item1";
        }
        if(strtolower($postObj->EventKey)=='songs'){
             $content  = "您点击了自定义菜单songs";
        }
            $toUser   = $postObj->FromUserName;
            $fromUser = $postObj->ToUserName;
            $time     = time();
            $msgType  =  'text';
            $template = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            </xml>";
             $info     = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
             echo $info;
    }
}
Last modification:June 24, 2018
If you think my article is useful to you, please feel free to appreciate