- 自定义菜单要求
- 自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
- 一级菜单最多4个汉字,二级菜单最多7+个汉字,多出来的部分将会以“...”代替。
- 创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
- 按钮类型
- click:用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
- view:用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息;
- scancode_push:扫码推事件 用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息;
- scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息;
- pic_sysphoto:弹出系统拍照发图用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息;
- pic_photo_or_album:弹出拍照或者相册发图用户点击按钮后,微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程;
- pic_weixin:弹出微信相册发图器用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息;
- location_select:弹出地理位置选择器用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息;
- media_id:下发消息(除文本消息)用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片(image)、音频(voice)、视频(video)、缩略图(thumb)、图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id;
- view_limited:跳转图文消息URL用户点击view_limited类型按钮后,微信客户端将打开开发者在按钮中填写的永久素材id对应的图文消息URL,永久素材类型只支持图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id;
请注意,3到8的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。9和10,是专门给第三方平台旗下未微信认证(具体而言,是资质认证未通过)的订阅号准备的事件类型,它们是没有事件推送的,能力相对受限,其他类型的公众号不必使用。
- 接口调用
- 接口调用请求说明
http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN |
- 获取access_token 需要调用接口
https请求方式: GET
|
- access_token每天限量2000个 7200秒(默认)更换 主动请求不算
- 建议将access_token 存储在Redis|Memcached(nosql 非关系型数据库)中
- Redis支持 持久化 会周期性的把数据写入到硬盘
- Memcached一旦关闭系统数据清空
- 长期保存的数据 推荐redis
- 存储临时数据 推荐Memcached
- Redis安全性好
- Memcached是没有密码的
- 此处测试 将调用接口返回access_token 封装
- GetToken.class.php
- 调用自定义菜单接口 https://api.weixin.qq.com/cgi-bin/menu/create?access_token=
- 设计所需菜单类型
- 调用 cURL ---post
- 删除菜单
- 获取access_token
- 调用接口
http请求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
- 官方文档
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
注意:
所有类型的素材上传(临时素材库) 都是通过access_token(凭证 【传入appid/appsecret调用接口返回的】 和文件类型【image|video...】)
返回json格式字符串 {type:,mediaId:,created_at:}
<?php
/*
菜单删除
*/
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=XXXX&secret=XXXXXXXX" ;
include "Http.class.php" ;
$res = Http::get($url) ;
$arr = json_decode($res,true) ;
$token = $arr['access_token'] ;
/*
删除菜单
*/
$url1 = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=".$token ;
$res = Http::get($url1) ;
$arr = json_decode($res,true) ;
if($arr['errcode'] == '0') {
echo '删除成功!' ;
}
<!DOCTYPE html>
<html>
<head>
<title>二维码测试</title>
<meta charset="utf-8">
</head>
<body>
<img src="http://qr.liantu.com/api.php?text=二维码测试&gc=ff0000"/>
</body>
</html>
<?php
/*
获取access_token
*/
/*class GetToken
{*/
const APPID = 'XXXX' ;
const APPSECRET = 'XXXXXXXXX' ;
// echo APPID . '<br />' ;
// echo APPSECRET .'<br />' ;
function getToken()
{
include "Http.class.php" ;
// 调用接口 curl返回access_token
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET ;
// echo $url .'<br />' ;
$res = Http::get($url) ;
$arr = json_decode($res,true) ;
$access_token = $arr['access_token'] ;
// var_dump($arr) ;
return $access_token ;
}
/*}
$a = new GetToken ;
echo $a->getToken() ;*/
//echo getToken() ;
<?php
/*
cURL get|post方法 封装
*/
// 微信兼容方法
class Http
{
public static function get($url)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//将返回结果进行转换
$res = curl_exec($ch);//发送请求
return $res;//将结果返返回
}
public static function post($url, $filedata)
{
$curl = curl_init();
if(class_exists('./CURLFile'))//php5.5跟php5.6中的CURLOPT_SAFE_UPLOAD的默认值不同
{
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
}else
{
if(defined('CURLOPT_SAFE_UPLOAD'))
{
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, false);
}
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
if(!empty($filedata))
{
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $filedata);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
}
<?php
/*
自定义菜单 测试
*/
include "Http.class.php" ;
include "GetToken.class.php" ;
/*
自定义菜单创建接口
*/
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".getToken() ;
/*$filedata = '{
"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"
}]
},
{
"type":"click",
"name":"原创专栏",
"key":"V1001_TODAY_MUSIC"
}]
}' ;*/
$data = array() ;
$data["button"] = array(
array(
'name'=>"今天吃啥",
'sub_button'=>array(
array(
"type"=>"click",
"name"=>"推荐菜品",
"key"=>"tuijiancai"
) ,
array(
"type"=>"view",
"name"=>"菜品图文",
"url"=>"http://www.baidu.com"
) ,
array(
"type"=>"scancode_push",
"name"=>"扫码推送",
/*
草料二维码 生成静态二维码 扫码之后跳转
二维码 api
http://qr.liantu.com/api.php?text=
页面引用<img src="http://qr.liantu.com/api.php?text=x"/>进行引用
text=可以是连接 http://www.baidu.com
可以是文字等
*/
"key"=>"saomatuisong"
)
)
) ,
array(
'name'=>"原创专栏",
'sub_button'=>array(
array(
"type"=>"scancode_waitmsg",
"name"=>"扫码带提示",
"key"=>"saomadaitishi"
) ,
array(
"type"=>"pic_sysphoto",
"name"=>"系统拍照发图",
"key"=>"xitongpaizhaofatu"
) ,
array(
"type"=>"pic_photo_or_album",
"name"=>"拍照或者相册发图",
"key"=>"paizhaohuozhexiangce"
)
)
) ,
array(
'name'=>"联系我们",
'sub_button'=>array(
array(
"type"=>"pic_weixin",
"name"=>"微信相册发图",
"key"=>"weixinxiangcefatu"
) ,
array(
"type"=>"location_select",
"name"=>"发送位置",
"key"=>"fasongweizhi"
) ,
/* array(
"type"=>"media_id",
"name"=>"图片",
"media_id"=>"MEDIA_ID1"
),
array(
"type"=>"view_limited",
"name"=>"图文消息",
"media_id"=>"MEDIA_ID2"
)*/
)
)
) ;
//汉字不转义
$filedata = json_encode($data,JSON_UNESCAPED_UNICODE) ;
var_dump($filedata) ;
// include "Http.class.php" ;
$res = Http::post($url, $filedata) ;
$arr = json_decode($res,true) ;
//var_dump($arr) ;
if($arr['errcode'] == '0') {
echo "菜单创建成功" ;
}