首页 /

微信订阅号

/ 用php开发创建微信公众号自定义菜单

用php开发创建微信公众号自定义菜单


  使用“微信公众平台接口调试工具创建菜单”的方法可以实现创建自定义菜单,但是,用这个工具创建不够灵活性,如果我们的项目是需要用户创建自己的微信公众号菜单,难道让用户去找个工具的网址,然后,输入各项参数吗?这样显示不够灵活,而且,一般用户也不会去掉json格式的菜单,这样接口调试工具就有很大的局限性了。

  假设我们要实现的是让用户在一个浏览器上面输入一个网址,程序就自动创建一个预先设置好的菜单,也可以增加一些选项,让用户选择创建的菜单的选项而不是让他们写json代码,这样创建菜单就简单多了,适合普通大众。

php开发创建自定义菜单

开发步骤:

  假设实现用户在浏览器输入一个网址,就可以创建一个菜单的要求的步骤分为为三步:

  1)获取创建菜单的接口url:http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

  这个url是腾讯官方提供给我们的,所以,直接拿过来用就行了。

  2)获取access_token:这是创建菜单时用到的一个关键,是区别其它微信公众号的“身份证”,因为,使用上面的url创建菜单的开发者非常多,要区别出是在你的公众号里面创建的菜单,而不是在别的公众号里面创建的菜单的一个id就是access_token,通过上面的url也可以看出创建菜单的参数就这一个,也是最重要的。

  3)编写json格式的菜单代码:上面准备好了url和识别id的access_token,接下来就是把json菜单代码发送给url,然后,通过这个url腾讯服务器就帮我们创建好菜单了。

  4)在浏览器打开编写好的文件,即可完成菜单的创建,如果代码没有问题,到这一步就已经成功创建好了自定义的菜单了。


自定义菜单开发开始

  开发前的准备:在开发公众号菜单前先建立二个文件,一个是用来获取access_token的文件get_token.php;另一个是创建菜单的文件cre_menu.php。

获取access_token:

  获取access_token的原理是使用函数curl库,这个库里面的几个函数可以模拟url在浏览器传输,简单来讲curl可以把一个url以http等协的方式在浏览器打开,相当于一个地址在浏览器里面打开。

access_token.php文件代码如下所示:

    $appid = 'wx140b1767991b6c80';
    $appsecret = '488571aeb401c9e9b56b5861a1f6ac4a';
    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";

    //这里我们将使用PHP的curl函数
    //初识化
    $ch = curl_init();

    //设置变量
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    //执行
    $output = curl_exec($ch);
       
        //释放资源
    curl_close($ch);

    //对返回的结果进行json解码
    $jsoninfo = json_decode($output, true);
    $access_token = $jsoninfo['access_token'];


对上面代码的解释:

  上面文件access_token.php里面的代码中$appid指的是微信公众号里面的appid,$appsecret指的是微信公众号里面的appsecret,如下图所示:
appid
  因为,我用的是我申请的测试号,所以,肯定跟您的不一样,如果您在开发时要在上面的文件里面写上自己的公众号的appid和appsecret。

  对于curl系列函数这里不作过多讲解,这完全是php里面的基础知识,可以查看手册讲的非常详细。不过要注意的是这里面的代码curl_exec($ch)得到的结果$output是一个json数据,如下所示:

{"access_token":"YYW-btUSa2jbcFDWz_7qzvfr0Lc4uUYNCbcsFr3ScqI2N0VZnAwoMEr9wVe7QA1ODD74ku3e3AiGwMAtp9nXUKHAQWoUXTr1T5KdkEoq4i1i0WgnSi0zjHaQr7_Mtp8JAIObADAVDJ","expires_in":7200}


  然后,再通过php函数json_decode把这个json数据“转换”成如下数组:
array (size=2)
  'access_token' => string 'YYW-btUSa2jbcFDWz_7qzvfr0Lc4uUYNCbcsFr3ScqI2N0VZnAwoMEr9wVe7QA1ODD74ku3e3AiGwMAtp9nXUKHAQWoUXTr1T5KdkEoq4i1i0WgnSi0zjHaQr7_Mtp8JAIObADAVDJ' (length=138)
  'expires_in' => int 7200


  然后,再通过下面的代码获取access_token值:
$access_token = $jsoninfo['access_token'];



编写cre_menu.php文件代码:

  1)在这个文件里面我们要写引入access_token.php文件:require_once "get_token.php";

  引入这个文件的目的是为了获取创建菜单的url里面的access_token。

  2)获取创建菜单的url:
https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}


  请注意这个创建菜单的url和上面获取access_token的url是不同的两个url,上面那个url是获取access_token的url,而这个url是创建菜单的url。

  把这个url定义成一个字符串便于后面的使用:
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}";


  3)编写创建菜单具体内容的代码:

    
$jsonmenu = '{
     "button":[
     {    
          "type":"click",
          "name":"儿童歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"网站建设",
           "sub_button":[
           {    
               "type":"view",
               "name":"微信开发",
               "url":"http://www.phpos.net/"
            },
            {
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
               "type":"click",
               "name":"为我们点赞",
               "key":"V1001_GOOD"
            }]
       }]
 }';


  这段json代码就是我们创建的菜单的具体内容,上面的代码表示创建二个一级菜单“儿童歌曲”和“网站建设”,在“网站建设”里面创建三个子菜单分别是“信微开发”、“搜索”和“为我们点赞”。

  4)创建菜单:上面三步相当于完全了“使用微信公众平台接口调试工具创建菜单”所有选择和填写,接下来就是点击“检查问题”,即提交表单创建菜单。所以,这一步就是把上面的菜单内容发送给创建菜单的url,然后,创建菜单。

  如何发送给创建菜单的url呢?这又用到curl库来模拟把菜单内容发送给创建菜单的url,并且在浏览器打开创建菜单的url创建菜单。

  所以我们要编写一个函数http_request($url, $jsonmenu),这个函数的作用是通过http请求来创建菜单,要实现这个函数的功能就要使用curl函数库,代码如下所示:
   
function  http_request($url, $data = null)
    {
        //初识化
        $ch = curl_init();
        //设置变量
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        if(!empty($data))
        {
            curl_setopt($ch,  CURLOPT_POST, 1);
            curl_setopt($ch,  CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //执行
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }


  这段代码跟获取access_token类似,不作解释了。

  然后,我们在cre_menu.php里面调用这个函数:$result = http_request($url, $jsonmenu);

  5)运行文件cre_menu.php:当把上面两个文件代码写完后,把这两个文件上传服务器然后运行一下看看是不是在微信公众号里面已经创建好了菜单了。

  下面就是我们在浏览器打开cre_menu.php文件(这是我服务器在浏览器打开的url:http://1.wxlian.applinzi.com/cre_menu.php)后程序自动创建的菜单:

创建测试结果