向https提交post数据的问题,请指点

「已注销」 2013-04-15 11:23:03
在做微信的自定义菜单,一直不成功,希望能得到指点。

接口说明
通过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?
...全文
8475 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
e421083458 2013-11-09
  • 打赏
  • 举报
回复
我已经解决: 向https提交post数据的问题,{"errcode":40016,"errmsg":"invalid button size"} http://blog.csdn.net/e421083458/article/details/14649129
pan_yong_feng 2013-08-20
  • 打赏
  • 举报
回复
我开始是用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.
li361111523 2013-08-08
  • 打赏
  • 举报
回复
PHP代码找到了。 http://liyandong.duapp.com/?m=study
布飞 2013-08-07
  • 打赏
  • 举报
回复
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这个包哦
涵宇菲子 2013-08-07
  • 打赏
  • 举报
回复
唉,我也遇上这个问题了
elaine_xiaoyu 2013-08-07
  • 打赏
  • 举报
回复
me too!!!
nick1365 2013-08-07
  • 打赏
  • 举报
回复
我也是。。。
lishuyan93 2013-08-06
  • 打赏
  • 举报
回复
你好!我也遇到这个问题了,请问您解决了吗?能指点一下吗?谢谢!
wypzxy 2013-06-29
  • 打赏
  • 举报
回复
这个好弄,我是北京程序员之家的技术,具体联系我qq吧:651732826
hewy0526 2013-06-05
  • 打赏
  • 举报
回复
请问楼主解决了么?我也报同样错误。菜单个数应该是没有问题的
改一下昵称 2013-04-16
  • 打赏
  • 举报
回复
你的程序环境没问题,问题在于POST的数据格式,没接触过,所以不能提供什么有用的信息,这个错误说明你的json中多了或少了按钮,建议你可以尝试增加或减少button元素看看
ImN1 2013-04-16
  • 打赏
  • 举报
回复
从提示看不像是curl的错误,像是api的返回,如果这样的话说明发过去了,只是数据格式不对 但这就有另一个疑问,https能直接发么?
黄袍披身 2013-04-16
  • 打赏
  • 举报
回复
这个提示应该很明晰了 "{"errcode":40016,"errmsg":"invalid button size"}" 不合法的按钮个数

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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