微信自定义菜单开发问题

wind_随 2013-04-22 09:16:15
接口说明

通过POST一个特定结构体,实现在微信客户端创建自定义菜单。

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

请求示例

{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SINGER"
},
{
"name":"菜单",
"sub_button":[
{
"type":"click",
"name":"hello word",
"key":"V1001_HELLO_WORLD"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}



http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E6%8E%A5%E5%8F%A3
这个是微信自定义菜单借口文档。

问下哪位大神知道微信那边接受post参数是什么?
...全文
30216 44 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
布谷2015 2014-12-10
  • 打赏
  • 举报
回复
post只需要将设计好的json字符串($jsonstr)直接发送给微信接口就可以了,不需要post数组形式array('body'=>$jsonstr) 我试过,成功..
烈焰冰镇 2014-12-04
  • 打赏
  • 举报
回复
自定义菜单 遇到一个问题就是 显示不出来了,在微信公众平台登陆后看到 自定义菜单停用了,这样:,然后 开发者中心 停用了服务器配置 后,服务器上面配置的 自定义菜单 就失效了 ,但是再次 在开发者中心 启用服务器配置 的话, 自定义菜单又显示停用了,如是那个图所示,有没有遇到过类似的情况的,哪里配置错了
Ansel-枫儿-Moe 2014-11-15
  • 打赏
  • 举报
回复
有没有人用java做的?
那个水水水 2014-08-03
  • 打赏
  • 举报
回复
呃请问弄明白了吗?我也不太清楚代码怎么用……
cshone 2014-01-08
  • 打赏
  • 举报
回复
弱弱的问下:有了代码怎么弄,将代码添加到index.php中,再上传到服务器上面?还是怎么弄啊。
sitephp163 2013-12-18
  • 打赏
  • 举报
回复
引用 32 楼 hua_lanyu 的回复:
能否给一下C#成功的案例看一下啊。捣鼓了好久,还没好。
顶一个 谁成功了 贴个案例出来
D- 2013-11-07
  • 打赏
  • 举报
回复
只有服务号才能开发自定义菜单么?可是我看到好多订阅号都有自定义菜单啊,,
终结i络 2013-10-29
  • 打赏
  • 举报
回复
其实没有多麻烦的 ;只要一个account_token ; 和一个json的字符串;往接口一扔。就可以了;
henrylin8 2013-10-21
  • 打赏
  • 举报
回复
JSON
{
    "button": [
        {
            "name": "线路查询",
            "type": "click",
            "key": "线路查询"
        },
        {
            "name": "热门推荐",
            "type": "click",
            "key": "热门推荐"
        },
        {
            "name": "服务网点",
            "sub_button": [
                {
                    "type": "click",
                    "name": "扬州直营店",
                    "key": "扬州直营店"
                },
                {
                    "type": "click",
                    "name": "江都直营店",
                    "key": "江都直营店"
                }
            ]
        }
    ]
}
PHP代码



$url='http://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$json->access_token;
$ret=$this->api_notice_increment($url,$data);
$json=json_decode($ret);
dump($json->errcode);exit;

function api_notice_increment($url, $data){
		 $ch = curl_init();//初始化curl 
		 $header = "Accept-Charset: utf-8";
		 //$header = "Content-type: text/xml";//定义content-type为xml
		 curl_setopt($ch, CURLOPT_URL, $url);//设置链接
		 //curl_setopt($ch, CURLOPT_POST, 1);//设置为POST方式
		 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
		 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
		 //curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头
		 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
		 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		 curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 
		 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//POST数据
		 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//设置是否返回信息

		 $tmpInfo = curl_exec($ch);
		 return $tmpInfo;
	}
以上代码总是返回45010,和上面测试成功的对比,应该没有问题。
hua_lanyu 2013-09-10
  • 打赏
  • 举报
回复
.net中如何获取到自定义菜单的key值啊。有没有会的。
xingfenxiaozhu 2013-09-06
  • 打赏
  • 举报
回复
一如既往的,关于微信公众平台的开发,不算出自大牛的代码,但是简单易懂适合刚入门的朋友。 首先先介绍一下逻辑,因为发现很多朋友都不能看懂微信官方的文档,当然啦,这跟你是否认真看有关的,认真看总能看懂的,废话不说了。此时,我当你已经有一个已经申请到自定义菜单开发权限的微信服务号。首先,你要在后台开发模式下面找到你的AppId 还有 AppSecret并且记下来,然后通过这两个官方发放给你的ID去获取一个ACCESS_TOKEN【官方解释是:第三方访问api资源的票据】,稍后会通过这个ACCESS_TOKEN,提交你的菜单。 下面教你怎么获取这个ACCESS_TOKEN: 访问这个链接 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 但是访问之前,把刚才让你记下来的AppId 还有 AppSecret 替换到链接里面,然后复制到浏览器地址栏,一访问,就返回几个数据,里面最长的那段就是我们要的ACCESS_TOKEN了。【当然,如果你还是不明白这个链接怎么替换,那我只能再写明白点了就是下面https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的APPID&secret=你的APPSECRET 】 要注意的是,这个ACCESS_TOKEN 是有时间限制的,超过了一定时间就会失效。就要重新获取;另外,如果你刚获取之后,又不小心获取了一次,那么前一次获取到的值会失效,第二次的值生效。 接下来教大家怎么创建菜单,代码如下: <?php header("Content-type: text/html; charset=utf-8"); define("ACCESS_TOKEN", 'NYD-0s6f4yBJecqJ6QAiH7Nivh_gnWhbjs5vY1BZ9zViZAkYfw0QL5cO5ILK7lS3BkUCUrwqlDqzU9OVMaDO44Vuju7ZhXjdpJk8PxHgNf7cTs7rp6dvm-KJSkdiufqbL5niZwHM0uWJVi0mnSLGZg'); //创建菜单 function createMenu($data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".ACCESS_TOKEN); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { return curl_error($ch); } curl_close($ch); return $tmpInfo; } $data = ' { "button":[ { "name":"时讯", "sub_button":[ { "type":"click", "name":"即时新闻", "key":"jsxw" }, { "type":"click", "name":"财经早餐", "key":"cjzc" }, { "type":"click", "name":"焦点话题", "key":"jdht" }, { "type":"view", "name":"财经日历", "url":"http://stock1.sina.cn/dpool/stockv2/universal_calendar.php?vt=4" }] }, { "name":"说市", "sub_button":[ { "type":"click", "name":"今日看盘", "key":"jrkp" }, { "type":"view", "name":"行情刷新", "url":"http://XX/index.php/market/index" }, { "type":"click", "name":"交易策略", "key":"jycl" }, { "type":"click", "name":"投资天地", "key":"tztd" }, { "type":"click", "name":"投资文库", "key":"tzwk" }] }, { "name":"北鼎在线", "sub_button":[ { "type":"view", "name":"关于我们", "url":"http://www.index.php/article/index/id/114" }, { "type":"view", "name":"最新活动", "url":"http://www.index.php/article/index/id/115" }, { "type":"view", "name":"参与爆料", "url":"http://www.index.php/message" } ] } ] }'; echo createMenu($data);//创建菜单 ?> 如代码所示,菜单有两种,一种是直接跳转到URL页面,即view;另一种,是发送指令,即click,说白了就是在客户端辅助用户的,可以看成一键发关键词。第一种很好做,填写好URL就完事了,用户点击菜单按钮,然后跳转到你填写的URL地址,缺点是URL地址不变,不够灵活。另一种就是发送指令,可以在公众账号接口开发(注意跟自定义菜单区别开)的时候,判断指令的内容,灵活处理并且动态输出不同的数据。 通过POST方式把菜单的数据发送到微信服务器,在浏览器中看到的返回提示中,你看到OK的字眼,那么就证明已经成功了。创建完菜单之后,由于微信客户端的缓存要24小时才清理一次,所以你要马上看到效果就需要重新关注你的公众账号。此时,你已经尝试到胜利的果实了。 下一次,我将告诉大家怎么利用自定义菜单动态获取图文。内容:1、一个THINKPHP搭建的微网站 2、自定义接口开发技术 3、自定义菜单 关键词:THINKPHP、 微网站、XML 微信自定义接口 微信自定义菜单 描述:用户在微信端选择指定栏目,自动获取微网站相关的若干条图文内容,每次更新都可以获取到不同的内容
flash20 2013-09-05
  • 打赏
  • 举报
回复
只有服务帐号有自定义菜单,订阅号没有,晕呀,之前开通测试时没申请
a8210397 2013-09-05
  • 打赏
  • 举报
回复
引用 10 楼 hedong37518585 的回复:
关键在于https改成http再post
真个真心有用
hua_lanyu 2013-09-05
  • 打赏
  • 举报
回复
引用 30 楼 tiansidehao 的回复:
返回成功的时候,是要等一段时间才能看到的,我的刚才也是,c#的自定义菜单,最简单的方法就是拼接字符串,把需要post的参数拼成字符串传过去,然后调用一个post请求的类,就可以了
能否给一下C#成功的案例看一下啊。捣鼓了好久,还没好。
12345987 2013-09-03
  • 打赏
  • 举报
回复
返回成功的时候,是要等一段时间才能看到的,我的刚才也是,c#的自定义菜单,最简单的方法就是拼接字符串,把需要post的参数拼成字符串传过去,然后调用一个post请求的类,就可以了
日志 2013-08-27
  • 打赏
  • 举报
回复
我开通了微信公众帐号开发者,怎么获取不到appid和appsecret,请大伙帮帮忙
「已注销」 2013-08-26
  • 打赏
  • 举报
回复
我用了楼上的代码试了一下。还是报错: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.apache.commons.httpclient.HttpClient.<clinit>(HttpClient.java:101) at Test.main(Test.java:37) Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 还有这个 post.getParams().setContentCharset("utf-8");是也报错:该方法getParams()是未定义的类型PostMethod 我的access_token是没有问题的。也导了commons-httpclient.jar
tancheng691 2013-08-24
  • 打赏
  • 举报
回复
我请问一下 我的自定义菜单 返回结果正确 为什么还是看不见菜单呢 24小时已经过了 取消重新关注也不看不见效果 返回结果是{"errcode":0,"errmsg":"ok"}
ArcCreator 2013-08-22
  • 打赏
  • 举报
回复
curl 版 url -d ' {"button":[{"type":"click", "name":"今日歌曲", "key":"V1001_TODAY_MUSIC"}, {"type":"click", "name":"歌手简介", "key":"V1001_TODAY_SINGER"}, {"name":"菜单", "sub_button":[{"type":"click", "name":"hello word", "key":"V1001_HELLO_WORLD"}, {"type":"click", "name":"赞一下我们", "key":"V1001_GOOD"}] }] }' https://api.weixin.qq.com/cgi-bin/menu/create?access_token=your_token.
bopchina 2013-08-21
  • 打赏
  • 举报
回复
你这个好像不行唷
引用 23 楼 wangzhiyuan_cebbank 的回复:
上面发布的有些问题再发一下,希望对大家有用,如果你不想写代码只是想用一下,可以访问下面的链接 http://www.vxinyun.com/public/cm.php 前台页面:
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Access-Control-Allow-Origin" content="*" />
    <title>微信自定义菜单发布</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">

    <!-- Le styles --把下面的两个链接换成你自己的>
   <link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
   <link href="../bootstrap/css/bootstrap.css" rel="stylesheet">
  <!-- <link href="../bootstrap-editable-1.4.4/bootstrap-editable/css/bootstrap-editable.css" rel="stylesheet">
    --><style type="text/css">
      body {
        padding-top: 60px;
        padding-bottom: 40px;
      }
      .sidebar-nav {
        padding: 9px 0;
      }

      @media (max-width: 980px) {
        /* Enable use of floated navbar text */
        .navbar-text.pull-right {
          float: none;
          padding-left: 5px;
          padding-right: 5px;
        }
      }
    </style>
    <style>
  
.table{
	margin-top: 10px;
}
.table th,.table td{
	text-align: center;
	vertical-align: middle;
	font-size: 12px;
}

.explain {
	background-color:  #FF9900;
}

  
	body{font-family:"微软雅黑",Arial,"宋体";-webkit-text-size-adjust:none;}
	
</style>
    <link href="../assets/css/bootstrap-responsive.css" rel="stylesheet">

    <!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
    <!--[if lt IE 9]>
      <script src="../assets/js/html5shiv.js"></script>
    <![endif]-->

    <!-- Fav and touch icons -->
  </head>
  <body>
<table width="90%" border="1" cellspacing="0" cellpadding="5" align ='center'>

  <!--<tr > <td align = "center" colspan = 2>欢迎加入微信公众号运行讨论群,群号码:8469496.</td></tr>-->
  <tr > <td align = "right">AppId:</td><td scope="col" align = "left"><input  name ="client" id = "appid" value ="" size="60" placeholder="AppID"></td></tr>
  <tr > <td align = "right">AppSecret:</td><td scope="col" align = "left"><input  name ="client" id = "appsecret" value ="" size="60"  placeholder="AppSecret"></td></tr>
  <tr > <td align = "right">菜单:</td><td scope="col" align = "left"><textarea  name ="client" id = "menu" cols="10" rows="20"  ></textarea></td></tr>
  <tr > <td align = "center" colspan = 2>
    <button  name ="fabu" class="btn btn-small btn-inverse">发布菜单</button>
    <button  name ="get" class="btn btn-small btn-inverse">获取菜单</button>
    <button  name ="delete" class="btn btn-small btn-inverse">删除菜单</button></td></tr>
 
 
</table>
 <body>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
<script src="http://libs.baidu.com/bootstrap/2.0.4/js/bootstrap.min.js"></script>
<script>
 
$(document).ready(function(){
  
  //发布菜单
  $('button[name="fabu"]').click(function(){
   
     var $appid=$("#appid").val();
     var $appsecret=$("#appsecret").val();
     var $menu=$("#menu").val();
                           
    if($appid == "" ){
      alert("APPID不能为空!");
      return false;
    }else if($appsecret == ""){
      alert("APPSECRET不能为空!");
      return false;
    }else if($menu == ""){
      alert("菜单内容不能为空!");
      return false;
    }
    var butt = $(this);
    butt.attr('disabled',true);
    var param = {
      action:'create',
	  appid: $appid,
      appsecret: $appsecret,
      menu:$menu
    };
    
    $.post("../public/proc_menu.php",param,function(data){
      if(data.success == true){
        alert ("发布成功,菜单将于二十四小时后生效。您也可以取消然后重新关注以查看菜单效果。");
        }
      else {
        alert ("发布失败,失败原因->"+data.msg+".");
      }
       butt.removeAttr("disabled");                                                   
    },"json");
  
   });
 
  //获取菜单
  $('button[name="get"]').click(function(){
   
     var $appid=$("#appid").val();
     var $appsecret=$("#appsecret").val();
                   
    if($appid == "" ){
      alert("APPID不能为空!");
      return false;
    }else if($appsecret == ""){
      alert("APPSECRET不能为空!");
      return false;
    }
    var butt = $(this);
    butt.attr('disabled',true);
    var param = {
      action:'get',
	  appid: $appid,
      appsecret: $appsecret
    };
   
    $.post("../public/proc_menu.php",param,function(data){//alert(data);
                                                         //var menu = eval("("+data+")");
                                                         //$("#menu").text(menu.menu);
       var menu = JSON.stringify(data.menu);
      if(menu != ""){
        alert("菜单获取成功!");
        $("#menu").text(menu);
        
      }else{
        alert ("菜单获取失败!");
      }
      /*
      if(data.success == true){
        alert ("获取成功。");alert(data.menu);
        $("#menu").val(data.menu);
        }
      else {
        alert ("获取失败,失败原因->"+data.msg+".");
      }*/
       butt.removeAttr("disabled");    

    },"json");
  
   });
  
   //删除菜单
  $('button[name="delete"]').click(function(){
   
     var $appid=$("#appid").val();
     var $appsecret=$("#appsecret").val();
                   
    if($appid == "" ){
      alert("APPID不能为空!");
      return false;
    }else if($appsecret == ""){
      alert("APPSECRET不能为空!");
      return false;
    }
    var butt = $(this);
    butt.attr('disabled',true);
    var param = {
      action:'delete',
	  appid: $appid,
      appsecret: $appsecret
    };
    
    $.post("../public/proc_menu.php",param,function(data){
      if(data.success == true){
        alert ("菜单删除成功。");
        }
      else {
        alert ("删除失败,失败原因->"+data.msg+".");
      }
       butt.removeAttr("disabled");                                                   
    },"json");
  
   });


  
});
</script>
后台逻辑: <?php header("Content-type: text/html; charset=utf-8"); $appid = $_POST["appid"]; $appsecret = $_POST["appsecret"]; $menu = $_POST["menu"]; $action = $_POST["action"]; $header = "Content-type: text/xml";//定义content-type为xml $token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret; $cu = curl_init(); //初始化curl curl_setopt($cu, CURLOPT_URL, $token_url); curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1); $access_token_json = curl_exec($cu); curl_close($cu); $access_token = json_decode($access_token_json); if($access_token->errcode != ""){//获取access_token失败 $s = "{\"success\": false,\"msg\":\"".$access_token->errmsg."\" }"; echo $s; }else{ if($action == "create"){//创建菜单 $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token->access_token; $ch = curl_init(); //初始化curl curl_setopt($ch, CURLOPT_URL, $url);//设置链接 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息 curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头 curl_setopt($ch, CURLOPT_POST, 1);//设置为POST方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $menu);//POST数据 $response_json = curl_exec($ch);//接收返回信息 if(curl_errno($ch)){//出错则显示错误信息 $s = "{\"success\": false,\"msg\":\"".curl_error($ch)."\" }"; echo $s; }else{ $response = json_decode($response_json); if($response->errcode != ""){//报错 $s = "{\"success\": false,\"msg\":\"".$response->errmsg."\" }"; echo $s; }else{ $s = "{\"success\": true}"; echo $s; } } curl_close($ch); //关闭curl链接 }elseif($action == "get"){//获取菜单 $url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=".$access_token->access_token; $cu = curl_init(); //初始化curl curl_setopt($cu, CURLOPT_URL, $url); curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1); $menu_json = curl_exec($cu); $menu = json_decode($menu_json); curl_close($cu); echo $menu_json ; }elseif($action == "delete"){//获取菜单 $url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=".$access_token->access_token; $cu = curl_init(); //初始化curl curl_setopt($cu, CURLOPT_URL, $url); curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1); $menu_json = curl_exec($cu); $menu = json_decode($menu_json); curl_close($cu); if($menu->errcode == "0"){ $s = "{\"success\": true}"; echo $s; }else{ $s = "{\"success\": false}"; echo $s; } }else{ } } ?>
加载更多回复(23)

20,397

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧