【微信公众号开发】自我学习第七章:公众号自定义菜单栏
来源:互联网 发布:刀锋洗眼 知乎 编辑:程序博客网 时间: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
- 【微信公众号开发】自我学习第七章:公众号自定义菜单栏
- 【微信公众号开发】自我学习第六章:微信回复天气问题
- 【微信公众号开发】自我学习第二章:关注事件触发的自动回复
- 【微信公众号开发】自我学习第四章:消息回复之翻译回复
- 【微信公众号开发】自我学习第八章:群发信息
- 【微信公众号开发】自我学习第九章:消息模板
- 微信公众号开发--自定义菜单
- 【微信公众号开发】自我学习第五章:Curl的基础 / accessToken获取 / 微信服务器IP获取
- 【微信公众号开发】自我学习第一章:服务器配置的提交
- 微信公众号开发学习地址
- 微信公众号开发学习
- 微信公众号开发学习
- 【微信公众号开发】自我学习第三章:消息回复之文本回复和图文回复
- 微信公众号开发
- 微信公众号开发
- 微信公众号开发
- 微信公众号开发
- 微信公众号开发
- 机器学习十大常用算法
- linux查看java信息
- Spring系列之Spring常用注解总结
- identifier of an instance of was altered from to null
- Shader学习(一)
- 【微信公众号开发】自我学习第七章:公众号自定义菜单栏
- 调试操作系统-bochs使用入门
- Java元组Tuple介绍与使用
- hellochart详细讲解(二)饼状图
- python基础_1
- Codeforces Beta Round #7 D. Palindrome Degree —— hash
- 浅谈Three.js源码-render之WebGLShader.js
- NuttX实时操作系统
- jboss容器,web整站https环境下使用(spring mvc)redirect重定向到http协议问题