首先明确一个问题:我之前申请的是未认证订阅号,能调用的接口权限有限,我们需要申请测试公众号 (注:在开发者工具里面的
公众平台测试帐号
),申请完毕了之后配置成和我们之前的订阅号一样的配置!这样我们的公众平台测试账号是有权限调用自定义菜单栏的接口的!
规范:
1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替。
//接口请求地址 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":"miniprogram",
"name":"wxa",
"url":"http://mp.weixin.qq.com",
"appid":"wx286b93c14bbf93aa",
"pagepath":"pages/lunar/index"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
代码实现:
private function curl_http($url, $type = 'get', $res = 'json', $arr=array())
{
//获取百度
//1.初始化curl
$ch = curl_init();
//2.设置curl的参数
curl_Setopt( $ch,CURLOPT_URL,$url );
curl_Setopt( $ch,CURLOPT_RETURNTRANSFER,1 );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Expect:' ) );
if($type == 'post') {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
}
//3.采集
$output = curl_exec($ch);
//4.关闭
if($res == 'json'){
//【这里是处理curl错误的】
if(curl_errno($ch)){ //成功错误码是0
return curl_errno($ch);
}
curl_close($ch);
return json_decode($output, true);
}
}
/**
* @Route("/accesstoken", name="system_share_accesstoken", methods={"POST", "GET"})
*/
private function accesstokenAction()
{
if(isset($_SESSION['accessToken']) && isset($_SESSION['expires_time'] ) && $_SESSION['expires_time'] > time()){
return $_SESSION['accessToken'];
}else{
$appid ='申请的测试appid';
$secret = '申请的测试secret';
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;
$data = $this->curl_http($url);
$_SESSION['accessToken'] = $data['access_token'];
$_SESSION['expires_time'] = time()+7200;
return $data['access_token'];
}
}
/**
* @Route("/config", name="system_share_config", methods={"POST", "GET"})
*/
public function configAction(Request $request)
{
$accesstoken = $this->accesstokenAction();
$url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$accesstoken;
//准备参数
$configData = array(
'button' => array(
array(
"name" => urlencode("开发"),
"sub_button" => array(
array(
"name" => urlencode("微信开发"),
"key" => 'weixin',
"type" => "click"
),
array(
"name" => urlencode("Ubuntu系统"),
"key" => 'ubuntu',
"type" => "click"
),
),
),
array(
"name" => urlencode("娱乐"),
"sub_button" => array(
array(
"name" => "acfun",
"url" => urlencode("http://www.acfun.cn/"),
"type" => "view"
),
array(
"name" => urlencode("百度"),
"url" => urlencode("http://www.baidu.cn/"),
"type" => "view"
)
),
),
array(
"name" => urlencode("关于自己"),
"sub_button" => array(
array(
"name" => urlencode("cndn博客"),
"url" => urlencode("http://blog.csdn.net/qq_31617637"),
"type" => "view"
),
array(
"type" => "scancode_push",
"name" => urlencode("扫码自动跳转"),
"key" => "rselfmenu_0_1",
"sub_button" => [ ]
),
array(
"type" => "scancode_waitmsg",
"name" => urlencode("扫码不自动跳转"),
"key" => "scan_url",
"sub_button" => [ ]
),
array(
"type" => "location_select",
"name" => urlencode("地址定位"),
"key" => "area",
"sub_button" => [ ]
)
),
),
)
);
$configData = urldecode(json_encode($configData));
$data = $this->curl_http($url, 'post', 'json', $configData);
dump($data);die;
}
注意:
数组中的文字必须要通过URL编码处理,不然会报40033错误!
click等事件的处理机制,其实在我们触发事件之后,本质还是当前用户发送XML文件向微信平台请求,即自定义菜单事件推送 ,我们还是需要处理:
if( strtolower( $postObj->MsgType ) == 'event' ){
if( strtolower( $postObj->Event ) == 'subscribe' ){
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$msgType = 'text';
$content = '您好,欢迎关注:【踏凌霄】'."\n".'目前支持功能:'."\n".'【1】汉译英:(回复)翻译一+内容'."\n".'【2】英译汉:(回复)翻译二+内容'."\n".'【3】回复(微信开发)查看关于微信开发的博文'."\n".'【4】天气:(回复)天气+地区(拼音)例如(天气baoding)'."\n"."\n"."踏南天,碎凌霄!么么哒!鸡年大吉!";
$info = $this->txtFormatForXml($toUser, $fromUser, $time, $msgType, $content);
echo $info;
}
//点击事件触发
if( strtolower( $postObj->Event ) == 'click' ){
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$msgType = 'text';
$content = $postObj->EventKey;
$info = $this->txtFormatForXml($toUser, $fromUser, $time, $msgType, $content);
echo $info;
}
//扫码事件触发
if( strtolower( $postObj->Event ) == 'scancode_waitmsg' ){
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$msgType = 'text';
$content = '扫描信息'."\n".$postObj->ScanCodeInfo."\n".'扫描结果'."\n".$postObj->ScanResult;
$info = $this->txtFormatForXml($toUser, $fromUser, $time, $msgType, $content);
echo $info;
}
}
//返回值:
array:2 [▼
"errcode" => 0
"errmsg" => "ok"
]