在做微信的自定义菜单,一直不成功,希望能得到指点。接口说明
通过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?
通过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?
"{"errcode":40016,"errmsg":"invalid button size"}" 不合法的按钮个数
但这就有另一个疑问,https能直接发么?
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这个包哦
hoping this can help.
向https提交post数据的问题,{"errcode":40016,"errmsg":"invalid button size"}
http://blog.csdn.net/e421083458/article/details/14649129