微信开发之开发者模式下自定义菜单


    获得ACCESS_TOKEN

    一个简单的方法是直接使用网页调试工具调试该接口。进入网页接口填入你的AppId还有AppSecret。即可以得到ACCESS_TOKEN


    编写代码

    新建一个php文件并写入下面的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <?php
    header("Content-type: text/html; charset=utf-8");
    define("ACCESS_TOKEN", '填入你刚刚得到的ACCESS_TOKEN');
    //创建菜单
    function createMenu($data){
    //利用curl函数发送post请求
    $ch = curl_init();
    //post该接口,https://api.weixin.qq.com/cgi-bin/menu/create即为微信创建菜单的接口
    curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".ACCESS_TOKEN);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $tmpInfo = curl_exec($ch);
    if (curl_errno($ch)) {
    return curl_error($ch);
    }
    curl_close($ch);
    return $tmpInfo;
    }
    //自定义菜单内容,必须是json格式,button为第一层菜单,sub_button为二级菜单,name为对应值
    //注意其类型常用的有两种,一种是直接跳转到URL页面,即view类型;另一种,是发送指令,即click类型,这个click类型相当于发送关键字。
    $data = ' {
    "button":[
    {
    "name":"博客",
    "sub_button":[
    {
    "type":"click",
    "name":"我的博客",
    "key":"jsxw"
    },
    {
    "type":"click",
    "name":"沐歌的博客",
    "key":"cjzc"
    }]
    },
    {
    "name":"推荐",
    "sub_button":[
    {
    "type":"click",
    "name":"技术文章",
    "key":"jrkp"
    },
    {
    "type":"view",
    "name":"段子",
    "url":"http://XX/index.php/market/index"
    },
    {
    "type":"click",
    "name":"公号推荐",
    "key":"jycl"
    },
    {
    "type":"click",
    "name":"生活",
    "key":"tztd"
    }]
    },
    {
    "name":"留言",
    "sub_button":[
    {
    "type":"view",
    "name":"关于我",
    "url":"http://www.index.php/article/index/id/114"
    },
    {
    "type":"view",
    "name":"留言",
    "url":"http://www.index.php/article/index/id/115"
    }
    ]
    }
    ]
    }';
    echo createMenu($data);//创建菜单
    ?>

    最后执行这个文件就可以啦。
    通过POST方式把菜单的数据发送到微信服务器,在浏览器中看到的返回提示中,你看到OK的字眼,那么就证明已经成功了。创建完菜单之后,由于微信客户端的缓存要24小时才清理一次,所以你要马上看到效果就需要重新关注你的公众账号。(我测试的时候可以不需要重新关注(仅限于菜单))


    解释一下curl是什么?

    cURL利用URL语法规定来传输文件和数据的工具,因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等协议都可以很好的支持,包括一些:HTTPS认证,HTTP POST方法,HTTP PUT方法,FTP上传,keyberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上传文件断点续传,http代理服务器管道,甚至它还支持IPv6,scoket5代理服务器,通过http代理服务器上传文件到FTP服务器等等。

    使用curl的步骤

    1.初始化,创建一个新cURL资源 curl_init()

    2.设置URL和相应的选项 curl_setopt()

    3.抓取URL并把它传递给浏览器 curl_exec()

    4.关闭cURL资源,并且释放系统资源 curl_close()

    我们来采集一个页面,通常情况下,我们会使用file_get_contents()函数来获取:

    1
    2
    3
    4
    5
    6
    7
    <?php
    $str = file_get_contents('http://****');
    //或者是:
    $str = file("http://****");
    //或者是:
    readfile("http://****");
    ?>

    这样我们会发现,我们没有办法有效地进行错误处理,更重要的是我们没有办法完成一些高难度的任务:如:处理cookies,验证,表单提交,文件上传等等。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    //1.初始化,创建一个新cURL资源
    $ch = curl_init();
    //2.设置URL和相应的选项
    curl_setopt($ch, CURLOPT_URL, "http://*****/");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    //3.抓取URL并把它传递给浏览器
    curl_exec($ch);
    //4.关闭cURL资源,并且释放系统资源
    curl_close($ch);
    ?>

    上面用到了两个高级选项:CURLOPT_URL和CURLOPT_HEADER,分别代表“需要获取的URL地址”和“启用时会将头文件的信息作为数据流输出”。这样一个简单的就完成了,实际上它还有很多可选项。并且它的效率远远高于file_get_contents().