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

来源:互联网 发布:刀锋洗眼 知乎 编辑:程序博客网 时间:2024/06/06 06:37

官方公众号权限

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

官方自定义菜单栏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 0
原创粉丝点击