在做微信的自定义菜单,一直不成功,希望能得到指点。接口说明
通过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"
            }]
       }]
 }我的代码如下:
$xjson = ' {
     "button":[
     {
          "type":"click",
          "name":"todaymusic",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "type":"click",
           "name":"singer",
           "key":"V1001_TODAY_SINGER"
      },
      {
           "name":"menu",
           "sub_button":[
            {
               "type":"click",
               "name":"hello word",
               "key":"V1001_HELLO_WORLD"
            },
            {
               "type":"click",
               "name":"best",
               "key":"V1001_GOOD"
            }]
       }]
 }';$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=******";
$context = json_decode($xjson,true);
$data = http_build_query($context);
$result = vpost($url,$data);
var_dump($result);function vpost($url,$data){ // 模拟提交数据函数
    $curl = curl_init(); // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); // 模拟用户使用的浏览器
    // curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    // curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    $tmpInfo = curl_exec($curl); // 执行操作
    if (curl_errno($curl)) {
       echo 'Errno'.curl_error($curl);//捕抓异常
    }
    curl_close($curl); // 关闭CURL会话
    return $tmpInfo; // 返回数据
}
一直不成功,提示"{"errcode":40016,"errmsg":"invalid button size"}" 
想问下,
1. 这个代码本身有问题吗?
2. 是不是本机的环境需要支持https?

解决方案 »

  1.   

    你的程序环境没问题,问题在于POST的数据格式,没接触过,所以不能提供什么有用的信息,这个错误说明你的json中多了或少了按钮,建议你可以尝试增加或减少button元素看看
      

  2.   

    这个提示应该很明晰了
    "{"errcode":40016,"errmsg":"invalid button size"}" 不合法的按钮个数
      

  3.   

    从提示看不像是curl的错误,像是api的返回,如果这样的话说明发过去了,只是数据格式不对
    但这就有另一个疑问,https能直接发么?
      

  4.   

    import java.io.IOException;import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpException;
    import org.apache.commons.httpclient.methods.PostMethod;
    public class wx_menu
    {
      
    public static void main(String[] args){
    String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=Sv1MA_nwKURUfNUWEusf0IOu6DpAJTQIuR0kLZ4xnj283_o9wDTS8WsLRM-AQ9q36OoWj09gbLgJit5LCZwfV9eHpbn3f4ARrlUsU-JaOxn_khR4Qnm0UDXz6NCG06PP6J3U4rP-x-kJvl87Nzb87Q";
    /**
     * 设置菜单
     * 在为什么用\"你懂得,这是java代码
     */
    String responeJsonStr = "{"+
    "\"button\":["+
    "{\"name\":\"菜单名称1\","+
    "\"type\":\"click\"," +
    "\"key\":\"V01_S01\"" +
    "},"+
    "{\"name\":\"菜单名称2\","+
    "\"type\":\"click\"," +
    "\"key\":\"V02_S01\"" +
    "},"+
    "{\"name\":\"菜单名称1\","+
    "\"type\":\"click\"," +
    "\"key\":\"V03_S01\"" +
    "}"+
    "]"+
    "}";


    HttpClient client = new HttpClient();
    PostMethod post = new PostMethod(url);
    post.setRequestBody(responeJsonStr);
    post.getParams().setContentCharset("utf-8");
    //发送http请求
    String respStr = "";
    try {
    client.executeMethod(post);
    respStr = post.getResponseBodyAsString();
    } catch (HttpException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    System.out.println(responeJsonStr);
    System.out.println(respStr);
    }

    }这段代码亲测可用。记得导入commons-httpclient-3.0.1.jar这个包哦
      

  5.   

    PHP代码找到了。http://liyandong.duapp.com/?m=study
      

  6.   

    我开始是用php写的,可一直解决不了,后来换成linux下直接用curl可以解决,但是要注意中文编码。我是这么做的: 把json string 写好,然后得到一个没有空格和回车的版本,然后在linux下用curl, 代码如下:curl -d '{ "button":[ { "name":"健康查询", "sub_button":[ { ".....' https://api.weixin.qq.com/cgi-bin/menu/create?access_token=xxxx注意-d后面的是单引号,否则就是invlide button size 40016.
    hoping this can help.
      

  7.   

    我已经解决:
    向https提交post数据的问题,{"errcode":40016,"errmsg":"invalid button size"} 
    http://blog.csdn.net/e421083458/article/details/14649129