代码在最下面,转载请在明显位置加入本篇博客地址
需要注意的:
1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
自定义菜单接口可实现多种类型按钮,如下:
1、click:点击推事件
2、view:跳转URL
3、scancode_push:扫码推事件
4、scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框
5、pic_sysphoto:弹出系统拍照发图
6、pic_photo_or_album:弹出拍照或者相册发图
7、pic_weixin:弹出微信相册发图器
8、location_select:弹出地理位置选择器
9、media_id:下发消息(除文本消息)
10、view_limited:跳转图文消息URL
一般常用1与2,其余或详细解说请到官方网站查看(http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html)
先获取acces_token
接口地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
请求方式:GET
参数说明:
参数 | 是否必须 | 说明 |
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证 |
secret | 是 | 第三方用户唯一凭证密钥,即appsecret |
正常返回的数据格式:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
access_token 获取到的凭证,自定义菜单会用到
expires_in 过期时间,用于缓存access_token,避免每次都获取。
错误时微信会返回错误码等信息:
{"errcode":40013,"errmsg":"invalid appid"}
errcode 错误码
errmsg 错误信息
创建自定义菜单
接口地址: https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN (此处的access_token上面已经获取到直接用)
请求方式: POST
提交数据(click与view示例,其余类型请查看官方文档):
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"view",
"name":"视频",
"url":"http://v.qq.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
button | 是 | 一级菜单数组,个数应为1~3个 |
sub_button | 否 | 二级菜单数组,个数应为1~5个 |
type | 是 | 菜单的响应动作类型 |
name | 是 | 菜单标题,不超过16个字节,子菜单不超过40个字节 |
key | click等点击类型必须 | 菜单KEY值,用于消息接口推送,不超过128字节 |
url | view类型必须 | 网页链接,用户点击菜单可打开链接,不超过1024字节 |
media_id | media_id类型和view_limited类型必须 | 调用新增永久素材接口返回的合法media_id |
返回结果:
正确时的返回JSON数据包如下:
{"errcode":0,"errmsg":"ok"}
错误时的返回JSON数据包如下(示例为无效菜单名长度):
{"errcode":40018,"errmsg":"invalid button name size"}
源码:
$appid = '123456';
$appsecret = '123456';
$apiUrlPrefix = 'https://api.weixin.qq.com/cgi-bin';
//注意,获取access_token有调用次数限制,请自行做缓存
$result = httpget($apiUrlPrefix.'/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret);
if($result) {
$json = json_decode($result,true);
if (!$json || isset($json['errcode'])) {
//获取失败,业务处理
exit;
}
$expire = intval($json['expires_in'])-100; //过期时间
$access_token = $json['access_token'];
} else {
//获取失败,业务处理
exit;
}
$data = ' {
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"view",
"name":"视频",
"url":"http://v.qq.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}';
$result = httppost($apiUrlPrefix.'/menu/create?access_token='.$access_token,$data);
if ($result) {
$json = json_decode($result,true);
if (!$json || !empty($json['errcode'])) {
//失败,业务处理
exit;
}
//成功
} else {
//失败,业务处理
exit;
}
function httpget($url){
$oCurl = curl_init();
if(stripos($url,"https://")!==FALSE){
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
$sContent = curl_exec($oCurl);
$aStatus = curl_getinfo($oCurl);
curl_close($oCurl);
if(intval($aStatus["http_code"])==200){
return $sContent;
}else{
return false;
}
}
function httppost($url,$param,$post_file=false){
$oCurl = curl_init();
if(stripos($url,"https://")!==FALSE){
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
if (is_string($param) || $post_file) {
$strPOST = $param;
} else {
$aPOST = array();
foreach($param as $key=>$val){
$aPOST[] = $key."=".urlencode($val);
}
$strPOST = join("&", $aPOST);
}
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($oCurl, CURLOPT_POST,true);
curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
$sContent = curl_exec($oCurl);
$aStatus = curl_getinfo($oCurl);
curl_close($oCurl);
if(intval($aStatus["http_code"])==200){
return $sContent;
}else{
return false;
}
}