自定义菜单的创建
自定义菜单基本要求:
1.自定义菜单最多包含3个一级菜单,每个一级菜单最多包含5个二级菜单。
2.一级菜单最多4个汉字,二级菜单最多包含7个汉字,多出来的部分以"..."的形式来展现。
3.在创建自定义菜单后,微信不会立即生效,为了更快的看到效果,可以取消关注后,重新进行关注。
接口调用请求说明:
http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
下面简单介绍两种常用的请求:
click和view的请求示例
{
"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"
}]
}]
}
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
button | 是 | 一级菜单数组,个数应为1~3个 |
sub_button | 否 | 二级菜单数组,个数应为1~5个 |
type | 是 | 菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型 |
name | 是 | 菜单标题,不超过16个字节,子菜单不超过60个字节 |
key | click等点击类型必须 | 菜单KEY值,用于消息接口推送,不超过128字节 |
url | view、miniprogram类型必须 | 网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。 |
media_id | media_id类型和view_limited类型必须 | 调用新增永久素材接口返回的合法media_id |
appid | miniprogram类型必须 | 小程序的appid(仅认证公众号可配置) |
pagepath | miniprogram类型必须 | 小程序的页面路径 |
返回结果:
正确时的返回JSON数据包如下:
{"errcode":0,"errmsg":"ok"}
错误时的返回JSON数据包如下(示例为无效菜单名长度):
{"errcode":40018,"errmsg":"invalid button name size"}
示例代码:(thinkphp3.2.3)
/**
* 创建自定义菜单
* @return [type]
*/
public function defineditem(){
//创建微信菜单
//目前微信接口的调用都是通过curl post/get
header('content-type:text/html;charset=utf-8');
$access_token = $this->getWxAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;
$postArr = array(
'button'=>array(
array(
'name'=>urlencode('菜单一'),
'type'=>'click',
'key'=>'item1',
),//第一个一级菜单
array(
'name'=>urlencode('菜单二'),
'sub_button'=>array(
array(
'name'=>urlencode('二级菜单一'),
'type'=>'click',
'key'=>'songs',
),//第一个二级菜单
array(
'name'=>urlencode('二级出菜单二'),
'type'=>'view',
'url'=>'http://www.sunxiaoning.com',
)//第一个二级菜单
)
),//第二个一级菜单
array(
'name'=>urlencode('菜单三'),
'type'=>'view',
'url'=>'http://bbs.sunxiaoning.com',
)//第三个一级菜单
)
);
$postJson = urldecode(json_encode($postArr));
//echo "$postJson"."<br>";
$res = $this->http_curl($url,'post','json',$postJson);
//var_dump($res);
}
/**
* 返回access_token
* @return [type] [description]
*/
public function getWxAccessToken(){
//将access_token存在session/cookie中
if($_SESSION['access_token']&&$_SESSION['expire_time']>time()){
//如果access_token在session并未过期
return $_SESSION['access_token'];
}else{
//如果access_token不存在或者已经过期,重新获取access_token
$appid = 'wxde8d3eacc9f91cae';
$appsecret = '3ae10c48de0ec193a7cc695f098c2817';
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
$res = $this->http_curl($url,'get','json');
$access_token = $res['access_token'];
//将创新获取的access_token存到session
$_SESSION['access_token'] = $access_token;
$_SESSION['expire_time'] = time()+7000;
return $access_token;
}
}
/**
* @param url
* @param 获取方式
* @param 获取到的格式
* @param string
* @return [type]
*/
function http_curl($url,$type='get',$res='json',$arr=''){
//1.初始化curl
$ch = curl_init();
//2.设置curl的参数
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($type == 'post'){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
}
//3.采集
$output = curl_exec($ch);
//4.关闭
if($res == 'json'){
if(curl_errno($ch)){
return curl_error($ch);
}else{
return json_decode($output,true);
}
}
curl_close($output);
}
自定义菜单事件消息回复
点击菜单拉取消息时的事件推送
推送XML数据包示例:
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[FromUser] ]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType>< ![CDATA[event] ]></MsgType>
<Event>< ![CDATA[CLICK] ]></Event>
<EventKey>< ![CDATA[EVENTKEY] ]></EventKey>
</xml>
参数说明:
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 消息类型,event |
Event | 事件类型,CLICK |
EventKey | 事件KEY值,与自定义菜单接口中KEY值对应 |
点击菜单跳转链接时的事件推送
推送XML数据包示例:
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[FromUser] ]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType>< ![CDATA[event] ]></MsgType>
<Event>< ![CDATA[VIEW] ]></Event>
<EventKey>< ![CDATA[www.qq.com] ]></EventKey>
</xml>
参数说明:
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 消息类型,event |
Event | 事件类型,VIEW |
EventKey | 事件KEY值,设置的跳转URL |
示例代码(thinkphp3.2.3)
public function reponseMsg(){
if (strtolower($postObj->Event)=='click') {
//如果是自定义菜单中的event -> click
if(strtolower($postObj->EventKey)=='item1'){
$content = "您点击了自定义菜单item1";
}
if(strtolower($postObj->EventKey)=='songs'){
$content = "您点击了自定义菜单songs";
}
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$msgType = 'text';
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
echo $info;
}
}