【微信公众号开发】自我学习第七章:公众号自定义菜单栏

官方公众号权限

首先明确一个问题:我之前申请的是未认证订阅号,能调用的接口权限有限,我们需要申请测试公众号 (注:在开发者工具里面的公众平台测试帐号),申请完毕了之后配置成和我们之前的订阅号一样的配置!这样我们的公众平台测试账号是有权限调用自定义菜单栏的接口的!

官方自定义菜单栏API

规范:
1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。

2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替。

//接口请求地址 POST传值
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN   
//传值形式
 {
     "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"
            }]
       }]
 }

代码实现:

private function curl_http($url, $type = 'get', $res = 'json', $arr=array())
  {
      //获取百度
      //1.初始化curl
      $ch = curl_init();
      //2.设置curl的参数
      curl_Setopt( $ch,CURLOPT_URL,$url );
      curl_Setopt( $ch,CURLOPT_RETURNTRANSFER,1 );
      curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Expect:' ) );
      if($type == 'post') {
          curl_setopt($ch, CURLOPT_POST, 1);
          curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
      }
      //3.采集
      $output	= curl_exec($ch);
      //4.关闭


      if($res == 'json'){
          //【这里是处理curl错误的】
          if(curl_errno($ch)){ //成功错误码是0
              return curl_errno($ch);
          }

          curl_close($ch);
          return json_decode($output, true);
      }
  }

  /**
   * @Route("/accesstoken", name="system_share_accesstoken", methods={"POST", "GET"})
   */
  private function accesstokenAction()
  {
      if(isset($_SESSION['accessToken']) && isset($_SESSION['expires_time'] ) && $_SESSION['expires_time'] > time()){

          return $_SESSION['accessToken'];
      }else{
          $appid ='申请的测试appid';
          $secret = '申请的测试secret';
          $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;

          $data = $this->curl_http($url);
          $_SESSION['accessToken'] = $data['access_token'];
          $_SESSION['expires_time'] = time()+7200;

          return $data['access_token'];
      }
  }

  /**
   * @Route("/config", name="system_share_config", methods={"POST", "GET"})
   */
  public function configAction(Request $request)
  {
      $accesstoken = $this->accesstokenAction();
      $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$accesstoken;
      //准备参数
      $configData = array(
          'button' => array(
              array(
                  "name" => urlencode("开发"),
                  "sub_button" => array(
                      array(
                          "name" => urlencode("微信开发"),
                          "key" => 'weixin',
                          "type" => "click"
                      ),
                      array(
                          "name" => urlencode("Ubuntu系统"),
                          "key" => 'ubuntu',
                          "type" => "click"
                      ),
                  ),
              ),
              array(
                  "name" => urlencode("娱乐"),
                  "sub_button" => array(
                      array(
                          "name" => "acfun",
                          "url" => urlencode("http://www.acfun.cn/"),
                          "type" => "view"
                      ),
                      array(
                          "name" => urlencode("百度"),
                          "url" => urlencode("http://www.baidu.cn/"),
                          "type" => "view"
                      )
                  ),
              ),
              array(
                  "name" => urlencode("关于自己"),
                  "sub_button" => array(
                      array(
                          "name" => urlencode("cndn博客"),
                          "url" => urlencode("http://blog.csdn.net/qq_31617637"),
                          "type" => "view"
                      ),
                      array(
                          "type" => "scancode_push",
                          "name" => urlencode("扫码自动跳转"),
                          "key" => "rselfmenu_0_1",
                          "sub_button" => [ ]
                      ),
                      array(
                          "type" => "scancode_waitmsg",
                          "name" => urlencode("扫码不自动跳转"),
                          "key" => "scan_url",
                          "sub_button" => [ ]
                      ),
                      array(
                          "type" => "location_select",
                          "name" => urlencode("地址定位"),
                          "key" => "area",
                          "sub_button" => [ ]
                      )
                  ),
              ),
          )
      );

      $configData = urldecode(json_encode($configData));
      $data = $this->curl_http($url, 'post', 'json', $configData);

      dump($data);die;
  }

注意

数组中的文字必须要通过URL编码处理,不然会报40033错误!

click等事件的处理机制,其实在我们触发事件之后,本质还是当前用户发送XML文件向微信平台请求,即自定义菜单事件推送 ,我们还是需要处理:

if( strtolower( $postObj->MsgType ) == 'event' ){
    if( strtolower( $postObj->Event ) == 'subscribe' ){
        $toUser   = $postObj->FromUserName;
        $fromUser = $postObj->ToUserName;
        $time     = time();
        $msgType  = 'text';
        $content  = '您好,欢迎关注:【踏凌霄】'."\n".'目前支持功能:'."\n".'【1】汉译英:(回复)翻译一+内容'."\n".'【2】英译汉:(回复)翻译二+内容'."\n".'【3】回复(微信开发)查看关于微信开发的博文'."\n".'【4】天气:(回复)天气+地区(拼音)例如(天气baoding)'."\n"."\n"."踏南天,碎凌霄!么么哒!鸡年大吉!";
        $info = $this->txtFormatForXml($toUser, $fromUser, $time, $msgType, $content);
        echo $info;
    }

    //点击事件触发
    if( strtolower( $postObj->Event ) == 'click' ){
        $toUser   = $postObj->FromUserName;
        $fromUser = $postObj->ToUserName;
        $time     = time();
        $msgType  = 'text';

        $content  = $postObj->EventKey;
        $info = $this->txtFormatForXml($toUser, $fromUser, $time, $msgType, $content);
        echo $info;
    }

    //扫码事件触发
    if( strtolower( $postObj->Event ) == 'scancode_waitmsg' ){
        $toUser   = $postObj->FromUserName;
        $fromUser = $postObj->ToUserName;
        $time     = time();
        $msgType  = 'text';

        $content  = '扫描信息'."\n".$postObj->ScanCodeInfo."\n".'扫描结果'."\n".$postObj->ScanResult;
        $info = $this->txtFormatForXml($toUser, $fromUser, $time, $msgType, $content);
        echo $info;
    }


}
//返回值:
array:2 [▼
  "errcode" => 0
  "errmsg" => "ok"
]

这里写图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值