自定义菜单
自定义菜单可以更加了解一个公众号。自定义菜单包括3个一级菜单,每个一级菜单只能包含5个二级菜单。一级菜单最多4个字,二级菜单最多7个字。了解完这些我们就可以去自己自定义一个菜单了。
因为自定义菜单的接口为 https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN,所以我们需要获取到access_token。这是很重要的。每个人用来获取access_token的方法不同。在这里我写一个我获取access_token的方法。
<?php
define('APPID', "wxf255b4e969112087");
define('SECRET', "1f9cc54a8921598ec9e4ea9f683b4305");
define('FILE', "file.txt");
function gettoken(){
//判断文件是否存在
if (file_exists(FILE)) {
//读取文件得到字符串
$str = file_get_contents(FILE);
//字符串变成数组
$arr = json_decode($str,true);
//如果文件存在那么判断是否过时
if (time() - $arr['create_time'] > $arr['expires_in']-300) {
//如果过时的话,就去获取新的token
return access();
}else{
//如果没有过时的话就去用原来文件里的
return $arr['access_token'];
}
}else{
//如果文件不存在就去获取
return access();
}
}
//获取access_token,返回给调用者,把微信api返回的串写入到文件中把当前时间加进去方便比较
function access(){
$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".SECRET;
// 创建一个新cURL资源
$ch = curl_init ();
// 设置URL和相应的选项
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_HEADER , false );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
// 抓取URL并把它传递给浏览器
$token=curl_exec ( $ch );
//关闭cURL资源,并且释放系统资源
curl_close ( $ch );
// echo $token;
//将json转换为数组
$arr = json_decode($token,true);
// print_r($arr);
if (isset($arr['access_token'])) {
$create_time=time();
// echo $create_time;
//将时间追加入数组中
$arr['create_time']=$create_time;
// print_r($arr);
//从数组转化为json
$json=json_encode($arr);
//写入文件里
file_put_contents(FILE, $json);
}else{
return false;
}
}
?>
curl_setopt,设置一个curl传输选项。它可以有三个参数。第一个是由curl_in返回的句柄。第二个是需要设置的curlopt选项。第三个是将设置在第二个选项的值。第二个curlopt选项是非常多的,这里就不为大家列举了,大家可以去查一下资料。
注:appid和secret需要真实有效!
正常情况写会返回一个json数据
{"access_token":"ACCESS_TOKEN","expires_in":7200}
因为我们需要给一个与微信公众平台官方一样的xml形式的数据。
$menu=<<< MENU
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
MENU;
这个数据的格式,大家需要看清楚。如果格式是错误的那么菜单就会出错误。它是一个以{}开始的,里边是“button”:[]。这是一个固定的格式。而button里边则是以{}分割,每一个{},就代表了一个菜单。
上边我们已经获得了access_token。那么我们直接去调用自定义菜单的接口就可以了。大家看一下代码。
<?php
//获取access_token
include 'access.php';
$access_token=gettoken();
//创建接口
$url= "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$access_token";
// echo $url;
$menu=<<< MENU
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
MENU;
// echo $menu;
$ch = curl_init ();
// 设置URL和相应的选项
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_HEADER , false );
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_POSTFIELDS, $menu);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
// 抓取URL并把它传递给浏览器
$token=curl_exec ( $ch );
//关闭cURL资源,并且释放系统资源
curl_close ( $ch );
echo $token;
?>
这样自定义菜单就完成了。快去看一看你的菜单有没有完成呢!