微信开发者工具操作自定义菜单_微信开发者 自定义菜单 - CSDN
  • 获取token微信官方文档明确指出: access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token” 根据微信官方文档,获取token接口的url是...

    获取token

    微信官方文档明确指出:

    access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token”

    根据微信官方文档,获取token接口的url是https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,请求方式是GET。

    创建自定义菜单

    我们知道,微信公众号中的菜单可以通过后台手工自定义,一旦开发者启用服务器配置,用户发给公众号的消息以及开发者需要的事件推送,将被微信转发到该URL中,手工定义功能也将随之失效。那么问题来了,我们该如何通过代码自定义菜单呢?

    使用代码自定义菜单的方法其实很简单,只需根据微信的接口规范向微信服务器发送POST请求即可,一旦你按接口规范发送了POST请求,微信服务器会把你定义的菜单存储在微信服务器,只要你发送更新或删除菜单的请求,这个菜单将一直存在。

    自定义菜单的接口规定url是
    https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN,请求方式是POST,POST数据是json格式,这个json格式的数据描述了菜单的具体内容。其中ACCESS_TOKEN要换成你的access_token。
    例如:下面就是一个菜单的例子,你可以把这个数据通过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":"click",
                       "name":"赞一下我们",
                       "key":"V1001_GOOD"
                    }]
               }]
         }

    查询已定义的自定义菜单

    前一节说到,一旦我们把自定义的菜单发送到微信服务器,微信服务器就把菜单保存并使用,只要我们不主动删除或修改,菜单将一直保持不变。那么,我们该如何通过代码查看已经定义的菜单呢?很简单,只需要调用微信的一个查询接口即可:
    请求url为https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN,请求方式为GET。
    详细请参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141014

    展开全文
  • 微信打开开发者模式后,以前通过微信后台配置的菜单就失效了,需要通过我们自己服务器后台配置(需要开发),还有一种比较简单的方法,就是通过微信提供的“微信公众平台接口测试工具”进行配置。下面重点说一下通过...

    借鉴于:https://blog.csdn.net/u014740338/article/details/79670779

    微信打开开发者模式后,以前通过微信后台配置的菜单就失效了,需要通过我们自己服务器后台配置(需要开发),还有一种比较简单的方法,就是通过微信提供的“微信公众平台接口测试工具”进行配置。下面重点说一下通过微信提供的测试工具进行配置的过程。

    一、进入微信接口调试页面

    接口参数:

    access_token: 是公众号访问接口用的,需要填写要修改的公众号access_token。

    body: 创建菜单的JSON串。示例如下:(创建一级菜单+二级菜单

     

    {
    	"button": [{
    		"type": "view",
    		"name": "技术查看",
    		"url": "https://blog.csdn.net/weixin_43229729"
    	},
    	{
    		"name": "学习",
    		"sub_button": [{
    			"type": "view",
    			"name": "遇到的问题",
    			"url": "https://blog.csdn.net/weixin_43229729"
    		},
    		{
    			"type": "view",
    			"name": "学习记录",
    			"url": "https://blog.csdn.net/weixin_43229729"
    		}]
    	},
    	{
    		"type": "view",
    		"name": "我的博客",
    		"url": "https://blog.csdn.net/weixin_43229729"
    	}]
    
    }

    body写好之后点击“检查问题”按钮。若创建成功会返回一下信息:

     

    二,通过调用微信api进行设置(自定义菜单创建/查询/删除)

    关于自定义菜单的查询和删除,直接看微信官方文档。

    微信官网文档:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Deleting_Custom-Defined_Menu.html

    展开全文
  • 微信开发越来越火,好多公司有自己的运营帐号需要管理,那么随之而来的就是微信开发的大量需求,和微信开发者需求旺盛。 今天开始第一课,微信自定义菜单开发。 在微信公众号页面打开,看到功能有个自定义开发,二级...

    微信开发越来越火,好多公司有自己的运营帐号需要管理,那么随之而来的就是微信开发的大量需求,和微信开发者需求旺盛。

    今天开始第一课,微信自定义菜单开发。

    在微信公众号页面打开,看到功能有个自定义开发,二级菜单是自定义菜单,默认最多三个菜单



    然后添加这些菜单,在线票务,资金管理,我三个栏目



    运行后效果如下




    展开全文
  • 微信开发 -- 自定义菜单

    万次阅读 2014-02-10 10:18:49
    微信开发 自定义菜单 菜单事件推送

    目前微信服务号自定义菜单最多包括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, option
                if($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"}


    展开全文
  • 微信开发系列之自定义菜单实现

    万次阅读 2019-11-01 10:10:45
    不过现在个人订阅号是不可以使用高级开发者模式的,如自定义菜单,不过我们还是可以通过测试号来测试一下,然后移代码到服务号。 自定义类型包括如下: 1、click:点击推事件 • 用户点击click类型按钮后,微信...
  • 微信开发模式下自定义菜单配置

    千次阅读 2018-03-24 12:27:54
    微信打开开发者模式后,以前通过微信后台配置的菜单就失效了,需要通过我们自己服务器后台配置(需要开发),还有一种比较简单的方法,就是通过微信提供的“微信公众平台接口测试工具”进行配置。下面重点说一下通过...
  • 此时,我们要通过接口来配置微信自定义菜单微信自定义菜单接口链接 先查看官方文档的自定义菜单: 然后,我们打开微信公众平台接口调试工具 接口调试工具 首先,通过appid以及secret来获取access_token: 获取到...
  • 微信开发者工具的快捷键

    万次阅读 2017-08-30 17:51:05
    微信开发者工具的快捷键
  • 不过现在个人订阅号是不可以使用高级开发者模式的,如自定义菜单,不过我们还是可以通过测试号来测试一下,然后移代码到服务号。 自定义类型包括如下: 1、click:点击推事件 • 用户点击click类型按钮后,微信...
  • 此时,我们要通过接口来配置微信自定义菜单微信自定义菜单接口链接首先,我们打开微信公众平台接口调试工具 接口调试工具 1.通过appid以及secret来获取access_token, 2.组织创建菜单内容。微
  • java版微信公众号开发之自定义菜单的创建

    万次阅读 多人点赞 2016-05-11 19:33:49
    java版微信公众号开发之自定义菜单的创建
  • 事件还原:前段时间想添加几个关键字回复然后发现...原因:哪怕再开发者模式下配置了自定义菜单,每次关闭开发者模式在开启后都需要重新生成一次自定义菜单接口 解决方案:https://blog.csdn.net/weixin_39696369/...
  • 微信企业号开发:自定义菜单

    万次阅读 2015-07-21 11:11:36
    开发微信企业号可以通过程序自定义菜单,只需要调用相关的接口就可以实现。其实这个菜单也就是微信底部的菜单,目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级...
  • 以下是微信公众平台对 添加自定义菜单 的文档说明:1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。 3、创建...
  • 微信公众号之开发者工具

    万次阅读 2020-04-06 16:49:32
    一、前言 这次的项目主要是关于微信...在开发过程中会设计到微信接口的调测,这里使用的微信公众号中提供的开发者工具中的在线接口调测和公众平台测试账号。注:微信支付功能不能使用公众平台测试账号测试,必须部署...
  • JAVA微信公众号开发之自定义菜单

    千次阅读 2019-05-06 16:07:46
    微信上文档说明: 1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的...
  • 微信开发(1)自定义菜单

    千次阅读 2015-08-10 09:24:53
    微信开发(1)自定义菜单自定义菜单属于高级API,订阅号没有(成为开发者也不行)。因此需要服务号或者企业号。 此外,也可以申请测试号。点击“开发者中心”中的“接口测试申请系统”。 然后用你的微信扫描一下...
  • 微信公众号开发生成自定义菜单
  • 原本在菜单栏有上角有个腾讯云,上传测试代码之类的: 新版本在 工具--工具栏管理--自定义工具栏管理 都在这里了 新版本会默认把腾讯云隐藏的还有个素材管理    ...
  • 微信企业号开发之自定义菜单

    千次阅读 2017-03-22 12:53:38
    一、登录到开放平台,进入开发者中心。二、点击自定义菜单选择创建菜单,发现需要 access_token 和 应用 id。三、去获取 access_token,应用 id 在 微信企业号开发平台《应用中心》的对应应用里。但是获取 access_...
1 2 3 4 5 ... 20
收藏数 8,771
精华内容 3,508
关键字:

微信开发者工具操作自定义菜单