微信公众号开发--自定义菜单

代码在最下面,转载请在明显位置加入本篇博客地址

需要注意的:

1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

自定义菜单接口可实现多种类型按钮,如下:

1、click:点击推事件
2、view:跳转URL
3、scancode_push:扫码推事件
4、scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框
5、pic_sysphoto:弹出系统拍照发图
6、pic_photo_or_album:弹出拍照或者相册发图
7、pic_weixin:弹出微信相册发图器
8、location_select:弹出地理位置选择器
9、media_id:下发消息(除文本消息)
10、view_limited:跳转图文消息URL

一般常用1与2,其余或详细解说请到官方网站查看(http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html)

先获取acces_token

接口地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

请求方式:GET

参数说明:

参数 是否必须 说明
grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,即appsecret

正常返回的数据格式:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

access_token 获取到的凭证,自定义菜单会用到

expires_in 过期时间,用于缓存access_token,避免每次都获取。

错误时微信会返回错误码等信息:

{"errcode":40013,"errmsg":"invalid appid"}

errcode  错误码

errmsg 错误信息

创建自定义菜单

接口地址: https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN   (此处的access_token上面已经获取到直接用)

请求方式: POST

提交数据(click与view示例,其余类型请查看官方文档):

{
     "button":[
     {  
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {    
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
               "type":"view",
               "name":"视频",
               "url":"http://v.qq.com/"
            },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }

参数说明:

参数 是否必须 说明
button 一级菜单数组,个数应为1~3个
sub_button 二级菜单数组,个数应为1~5个
type 菜单的响应动作类型
name 菜单标题,不超过16个字节,子菜单不超过40个字节
key click等点击类型必须 菜单KEY值,用于消息接口推送,不超过128字节
url view类型必须 网页链接,用户点击菜单可打开链接,不超过1024字节
media_id media_id类型和view_limited类型必须 调用新增永久素材接口返回的合法media_id

返回结果:

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

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

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

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

源码:

$appid        = '123456';
$appsecret    = '123456';
$apiUrlPrefix = 'https://api.weixin.qq.com/cgi-bin';

//注意,获取access_token有调用次数限制,请自行做缓存
$result = httpget($apiUrlPrefix.'/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret);
if($result) {
    $json = json_decode($result,true);
    if (!$json || isset($json['errcode'])) {
        //获取失败,业务处理
        exit;
    }
    $expire = intval($json['expires_in'])-100; //过期时间
    $access_token = $json['access_token'];
} else {
    //获取失败,业务处理
    exit;
}


$data = ' {
     "button":[
     {  
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {    
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
               "type":"view",
               "name":"视频",
               "url":"http://v.qq.com/"
            },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }';

$result = httppost($apiUrlPrefix.'/menu/create?access_token='.$access_token,$data);
if ($result) {
    $json = json_decode($result,true);
    if (!$json || !empty($json['errcode'])) {
        //失败,业务处理
        exit;
    }
    //成功
} else {
    //失败,业务处理
    exit;
}


function httpget($url){
    $oCurl = curl_init();
    if(stripos($url,"https://")!==FALSE){
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
    }
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if(intval($aStatus["http_code"])==200){
        return $sContent;
    }else{
        return false;
    }
}

function httppost($url,$param,$post_file=false){
    $oCurl = curl_init();
    if(stripos($url,"https://")!==FALSE){
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
    }
    if (is_string($param) || $post_file) {
        $strPOST = $param;
    } else {
        $aPOST = array();
        foreach($param as $key=>$val){
            $aPOST[] = $key."=".urlencode($val);
        }
        $strPOST =  join("&", $aPOST);
    }
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($oCurl, CURLOPT_POST,true);
    curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if(intval($aStatus["http_code"])==200){
        return $sContent;
    }else{
        return false;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章