目前微信服务号自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

目前自定义菜单接口可实现两种类型按钮,如下:

click:
用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event  的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
view:
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值    (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。

接口调用请求说明

http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

请求示例(JSON数据请使用UTF-8编码)

{"button":[{"type":"click","name":"我的信息","sub_button":[{"type":"click","name":"拇指查询","key":"BUTTON_1"},
        {"type":"click","name":"拇指请假","key":"BUTTON_2"},
        {"type":"view","name":"工号绑定","url":"http://XXXXXXXXXXXXXXXXX"}]
    },{"type":"click","name":"业务流程","key":"BUTTON_3"},{"name":"员工建议","sub_button":[{"type":"view","name":"思想火花","url":"http://XXXXXXXXXXXXXXXXXX"},{"type":"view","name":"奖品兑换","url":"http://XXXXXXXXXXXXXXXXXX"},{"type":"click","name":"赞一下我们","key":"BUTTON_ZAN"}]}]
}

参数说明

参数 是否必须 说明
button 一级菜单数组,个数应为1~3个
sub_button 二级菜单数组,个数应为1~5个
type 菜单的响应动作类型,目前有click、view两种类型
name 菜单标题,不超过16个字节,子菜单不超过40个字节
key click类型必须 菜单KEY值,用于消息接口推送,不超过128字节
url view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节

返回结果

正确时的返回JSON数据包如下:

{"errcode":0,"errmsg":"ok"}

错误时的返回JSON数据包如下(示例为无效菜单名长度):

{"errcode":40018,"errmsg":"invalid button name size"}

以下是示例代码(PHP)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="author" content="Chris Mao" /></head><body><?php$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";$ch = curl_init($url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 0);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);$output = curl_exec($ch);curl_close($ch);if (empty($output)) { var_dump($output); exit; }$result = json_decode($output);$token = $result->access_token;//创建菜单$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$token";$jsonData = file_get_contents("menu.json");$ch = curl_init($url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);$output = curl_exec($ch);curl_close($ch); var_dump($output);?></body>
</html>

menu.json

{"button":[{"type":"click","name":"我的信息","sub_button":[{"type":"click","name":"拇指查询","key":"BUTTON_1"},{"type":"click","name":"拇指请假","key":"BUTTON_2"},{"type":"view","name":"工号绑定","url":"http://XXXXXXXXXXXXXXXXX"}]},{"type":"click","name":"业务流程","key":"BUTTON_3"},{"name":"员工建议","sub_button":[{"type":"view","name":"思想火花","url":"http://XXXXXXXXXXXXXXXXXX"},{"type":"view","name":"奖品兑换","url":"http://XXXXXXXXXXXXXXXXXX"},{"type":"click","name":"赞一下我们","key":"BUTTON_ZAN"}]}]
}

响应自定义菜单事件

    $wechatObj = new wechatCallbackAPI();if (isset($_GET["echostr"])) { $wechatObj->valid(); } else { $wechatObj->responseMsg();}class wechatCallbackAPI {private $token = "WEIXIN";private $appId = "APPID";private $appSecret = "APPSECRET";private function checkSignature() {$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];    $tmpArr = array($this->token, $timestamp, $nonce);sort($tmpArr);$tmpStr = implode($tmpArr);$tmpStr = sha1($tmpStr);if($tmpStr == $signature) {return true;} else {return false;}}private function getAccessToken() {$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";$ch = curl_init($url);$curl_setopt($ch, CURLOPT_HEADER, 0);$curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$curl_setopt($ch, CURLOPT_POST, 0);$curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);$curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);$output = curl_exec($ch);curl_close($ch);if (empty($output)) { return ""; }$result = json_decode($result);return $result->access_token;}public function valid() {$echoStr = $_GET["echostr"];//valid signature, optionif($this->checkSignature()){echo $echoStr;exit;}}public function responseMsg() {//get post data, May be due to the different environments$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];if (empty($postStr)){echo "";exit;}//extract post data$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$fromUsername = $postObj->FromUserName;$toUsername = $postObj->ToUserName;$time = time();//文本消息模板$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";switch (strtolower(trim($postObj->MsgType))) {case "text": //文本消息$keyword = trim($postObj->Content);if(!empty($keyword)) {$msgType = "text";$contentStr = "$fromUsername, 您发送了文本信息: $keyword ";if (strtolower($keyword) == "time") {$contentStr = date("Y-m-d H:i:s", $time);}$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);} else {$resultStr = "Input something...";}break;case "image": //图片消息$msgType = "text";$contentStr = "$fromUsername, 您发送了图片信息";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);break;case "voice": //声音消息$msgType = "text";$contentStr = "$fromUsername, 您发送了声音信息";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);break;case "video": //视频消息$msgType = "text";$contentStr = "$fromUsername, 您发送了视频信息";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);break;case "location": //位置消息$msgType = "text";$contentStr = "$fromUsername, 您发送了位置信息";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);break;case "link": //链接消息$msgType = "text";$contentStr = "$fromUsername, 您发送了链接信息";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);break;case "event": //事件switch (strtolower(trim($postObj->Event))) {case "subscribe": //关注事件$msgType = "text";$contentStr = "欢迎您关注XXXXXXX";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);break;case "unsubscribe": //取消关注事件break;case "scan": //用户已关注时扫描二维码事件$msgType = "text";$contentStr = "$fromUsername, 您扫描了二维码";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);break;case "location": //上传地理位置事件$msgType = "text";$contentStr = "$fromUsername, 您上传地理位置";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);break;case "click": //自定义菜单事件$msgType = "text";$contentStr = "$fromUsername, 您点击了自定义菜单 $postObj->EventKey ";if ("BUTTON_ZAN" == $postObj->EventKey) {$contentStr = "感谢您的赞,我们会继续提供更优质的服务。";}$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);;break;default:$resultStr = "";}break;default:$resultStr = "";}echo $resultStr;}}
?>

自定义菜单查询

使用接口创建自定义菜单后,开发者还可使用接口查询自定义菜单的结构。

请求说明

http请求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN

返回说明

对应创建接口,正确的Json返回结果:
 {"menu":{"button":[{"name":"我的信息","sub_button":[{"type":"click","name":"拇指查询","key":"BUTTON_1","sub_button":[]},{"type":"click","name":"拇指请假","key":"BUTTON_2","sub_button":[]},{"type":"view","name":"工号绑定","url":"http:\/\/XXXXXXXX","sub_button":[]}]},{"type":"click","name":"业务流程","key":"BUTTON_3","sub_button":[]},{"name":"员工建议","sub_button":[{"type":"view","name":"思想火花","url":"http:\/\/XXXXXXXX","sub_button":[]},{"type":"view","name":"奖品兑换","url":"http:\/\/XXXXXXXX","sub_button":[]},{"type":"click","name":"赞一下我们","key":"BUTTON_ZAN","sub_button":[]}]}]}}

自定义菜单删除

使用接口创建自定义菜单后,开发者还可使用接口删除当前使用的自定义菜单。

请求说明

http请求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

返回说明

对应创建接口,正确的Json返回结果:
{"errcode":0,"errmsg":"ok"}

微信开发 -- 自定义菜单相关推荐

  1. 【wechat】微信开发——自定义菜单

    1.无后台管理的自定义菜单 ①根据appId和appSecret获取acessToken a.向服务器发送请求 httpRequst(url,method,outPutStr)  返回jsonObje ...

  2. 微信开发自定义菜单获取OpenID

    OpenID: 每个微信用户对于每个公众号,有一个唯一的OpenID.对于其它公众号,OpenID是不同的 用途: 通过 OpenID,能访问到用户的基本信息 跟后台应用(比如商品销售)配合,可以管理 ...

  3. 微信开发--自定义菜单

    一.定义几个实体类 public class AccessToken {//这里定义一个AccessToken的实体类,用来保存获取到的accesstokenprivate String token; ...

  4. java自定义菜单跳转页面_微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解...

    微信公众号开发 自定义菜单 请先读完本文再进行配置开发 请先前往微信平台开发者文档阅读"网页授权获取用户基本信息"的接口说明 在微信公众账号开发中,往往有定义一个菜单,然后用户点击 ...

  5. 微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例

    微信开发公众平台自定义菜单需要花钱认证才能实现,不想花钱只能玩测试账号了,不过这并不影响开发.我的开发都是基于柳峰老师的微信公众平台应用开发做的. 只要我们使用公众平台测试账号就可以开发自定义菜单了, ...

  6. 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)

    之前写过一篇微信公众号开发–自定义菜单跳转页面并获取用户信息 由于当时是刚学习微信公众号开发当时的思路虽然可行,不过不是最好的,最近也用到了需要获取用户信息的地方,再次整理一下. 流程 注意点 ### ...

  7. 公众号如何跳转到页面php,图文详解微信公众号开发自定义菜单跳转页面并获取用户信息实例...

    这篇文章主要介绍了微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解的相关资料,需要的朋友可以参考下 微信公众号开发 自定义菜单 请先读完本文再进行配置开发 请先前往微信平台开发者文档阅读&qu ...

  8. 微信企业号开发:自定义菜单

    开发微信企业号可以通过程序自定义菜单,只需要调用相关的接口就可以实现. 其实这个菜单也就是微信底部的菜单,目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单.一级菜单最多4个汉字,二 ...

  9. 微信公众号开发---自定义菜单的创建及菜单事件响应(java)

    微信5.0发布 2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号: 2)服务号可以申请自定义菜单: 3 ...

最新文章

  1. 人工智能的另一方向:基于忆阻器的存算一体技术
  2. 面试:说说你对 Java 中 final 的理解?
  3. 袁绍困局与张朝阳的雄心——类微博的狐友能让搜狐重回主战场吗
  4. nginx 缓存配置及报错解决
  5. 利用键盘钩子捕获Windows键盘动作
  6. 如何读取FoxPro(dbf)打删除标记的记录
  7. php裁剪图片白边,php缩略图填充白边的示例代码
  8. php首页遍历出商品详情页,ECSHOP首页/分类页/详情页各页面调用显示销量
  9. 怎样直接在列表修改数据html,谈谈yii2-GridView如何实现列表页直接修改数据
  10. 大数据学习笔记03:安装配置CentOS7虚拟机
  11. Log4j配置学习文档之二 处理日滚文件-实现原理
  12. SVN-功能介绍之切换
  13. Silverlight 获得鼠标位置
  14. java 清屏函数_c++清屏函数是什么
  15. java graphics类_java_关于Graphics类
  16. 【吐血推荐】什么是领域驱动设计?DDD?
  17. 如何快速推广引流?利用微博截流疯狂获取流量
  18. matlab 图像 whos函数,matlab图像处理常用函数
  19. 案例分享-21款奔驰S450L升级原厂夜色饰条套件
  20. 学习表——受任于败军之际,奉命于危难之间(2.20--2.26)

热门文章

  1. 计算机找不到 bitlocker,win10中找不到bitlocker驱动器的解决方法介绍
  2. 用Python每天自动给女朋友免费发短信,谁说程序员不懂浪漫?
  3. RobotSim机器人快速成型-离线编程仿真软件
  4. 如何批量合并Excel文件和工作表 - Excel合并器使用教程
  5. 如何做好描述统计分析?
  6. 第7课 微信小程序实现图片搜索器案例:
  7. CAST和VALIDATE_CONVERSION函数 db官方例子
  8. 训练ChatGPT的必备资源:语料、模型和代码库完全指南
  9. 从 sketch 中获取颜色、字体组件内容
  10. 10亿数据找出前100大的数据(网易大数据面试算法题)