文件路径:全栈教程/9微信开发/Day-2_公众号开发
一、接口调用凭证access_token
1.1、curl发起get和post请求.
PHP如何来发起网络请求
file_get_contents
fsockopen
curl
curl实现get、post和文件上传
get
post请求
文件上传
curl终极函数
function http_request($url,$ret='',$file=''){
if (!empty($file)) { // 有文件上传
# php5.5之前 '@'.$file;就可以进地文件上传
# $ret['pic'] = '@'.$file;
# php5.6之后用此方法
$ret['pic'] = new CURLFile($file);
}
// 初始化
$ch = curl_init();
// 相关设置
# 设置请求的URL地址
curl_setopt($ch,CURLOPT_URL,$url);
# 请求头关闭
curl_setopt($ch,CURLOPT_HEADER,0);
# 请求的得到的结果不直接输出,而是以字符串结果返回 必写
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
# 设置请求的超时时间 单位秒
curl_setopt($ch,CURLOPT_TIMEOUT,30);
# 设置浏览器型号
curl_setopt($ch,CURLOPT_USERAGENT,'MSIE001');
# 证书不检查
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
# 设置为post请求
if($ret){ # 如果 $ret不为假则是post提交
# 开启post请求
curl_setopt($ch,CURLOPT_POST,1);
# post请求的数据
curl_setopt($ch,CURLOPT_POSTFIELDS,$ret);
}
// 发起请求
$data = curl_exec($ch);
// 有没有发生异常
if(curl_errno($ch) > 0){
// 把错误发送给客户端
echo curl_error($ch);
$data = '';
}
// 关闭请求
curl_close($ch);
return $data;
}
# GET调用
#echo http_request('https://wx.1314000.cn/');
#post+文件上传
$file = __DIR__.'/1.jpg';//必须是绝对路径
echo http_post_file('http://localhost:8080/post.php',['id'=>1,'name'=>'张三'],$file);
总结:4步走
初始化
相关设置
发送请求
关闭资源
7.2、获取access_token. 应用于主动发送请求
access_toke是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用它。
access_token的存储至少要保留512个字符空间。mysql vchar
access_token的有效期目前为2个小时。
access_token的每天请求的次数为2000次。
根据官方所提的要求,那么我们在实现工作,一定要缓存起来我们access_token。
缓存的方案
数据库、redis、mongodb、memcache、文件缓存
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
推荐使用 memcache缓存
使用文件缓存access_token
效果
/**
* 得到access_token access_token是全局唯一有效的
* @return [type] [description]
*/
private function getAccessToken(){
# 缓存的文件
$cacheFile = self::APPID.'_cache.log';
// 判断文件是否存在,要是不存在则表示没有缓存
// 存在判断修改的时间是否过了有效期,如果没有过,则不进行url网络请求
if (is_file($cacheFile) && filemtime($cacheFile)+7000 > time()) {
echo '缓存了<hr>';
return file_get_contents($cacheFile);
}
// 第1次或缓存过期
$surl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';
$url = sprintf($surl,self::APPID,self::SECRET);
// 发起GET请求
$json = $this->http_request($url);
// 把json转为数组
$arr = json_decode($json,true);
$access_token = $arr['access_token'];
// 写缓存
file_put_contents($cacheFile,$access_token);
// 返回数据
echo '2222<hr>';
return $access_token;
}
推荐使用 memcache缓存
/**
* 缓存到memcache中
* @return [type] [description]
*/
private function getAccessTokenMem(){
# 缓存的key值
$cachekey = self::APPID.'_key';
$mem = new Memcache();
$mem->addServer('localhost',11211);
// 添加 如果存在则返回false
#$mem->add('b','bbb',0,3);
#$mem->set('d','ddd',0,5);
# 有缓存 读缓存
if (false != ($access_token = $mem->get($cachekey))) {
return $access_token;
}
// 第1次或缓存过期
$surl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';
$url = sprintf($surl,self::APPID,self::SECRET);
// 发起GET请求
$json = $this->http_request($url);
// 把json转为数组
$arr = json_decode($json,true);
$access_token = $arr['access_token'];
// 写缓存
$mem->set($cachekey,$access_token,0,7000);
// 返回数据
return $access_token;
}
二、自定义菜单
2.1、自定义菜单概述
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013
微信公众号默认没有开通底部是没有菜单功能,需要使用者自行来创建开通。
注意点:
自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替。
创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
按钮事件
最常用的自定义类型按钮为:view 它相当有html中的a作用
view想跳转到指定的URL,需要认证后的公众号才可以
2.2、自定义菜单创建.
自定义菜单数据准备
方式1
方式2 推荐第2种
方式三 heredoc方式 可以解析变量
return <<<EOL
{
"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"
}]
}]
}
EOL;
生成菜单文件
执行
/**
* 创建自定义菜单
* @param array|string $menu [description]
* @return [type] [description]
*/
public function createMenu($menu){
//如果传过来的菜单是数组,就要转成json,如果是字符串,直接副职
if(is_array($menu)){
// 因为菜单有中文,所以一定要写json_encode第2个参数,让中文不乱码
$data = json_encode($menu,JSON_UNESCAPED_UNICODE); # 256
}else{
$data = $menu;
}
// 创建自定义菜单URL
$url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->getAccessTokenMem();
// 发起请求
$json = $this->http_request($url,$data);
return $json;//返回结果正确还是错误
}
```
###2.3、自定义菜单删除接口
![图片57](media/15736580403174/%E5%9B%BE%E7%89%8757.png)
![图片58](media/15736580403174/%E5%9B%BE%E7%89%8758.png)
![图片59](media/15736580403174/%E5%9B%BE%E7%89%8759.png)
删除成功
![图片60](media/15736580403174/%E5%9B%BE%E7%89%8760.png)
![图片61](media/15736580403174/%E5%9B%BE%E7%89%8761.png)
```php
/**
* 删除自定义菜单
* @return [type] [description]
*/
public function delMenu(){
$url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='.$this->getAccessTokenMem();
// 发起请求
$json = $this->http_request($url);
return $json;
}
2.4、自定义菜单事件推送.
事件,大家一定要牢记 click和view 只有认证的公众号使用view事件才能跳转到任意url中。
效果
三、新增素材.
公众号经常有需要用到一些多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。
3.1、新增临时素材
1、临时素材media_id是可复用的。
2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。
3、上传临时素材的格式、大小限制与公众平台官网一致。
图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
语音(voice): 2M,播放长度不超过60s,支持AMR\MP3格式
视频(video): 10MB,支持MP4格式
缩略图(thumb):64KB,支持JPG格式
3.2、新增永久素材
对于常用的素材,开发者可通过本接口上传到微信服务器,永久使用。
如:企业logo,小图标,公众号有些场景,规定只能使用永久素材。
1、最近更新:永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
2、公众号的素材库保存总数量有上限:图文消息素材、图片素材上限为5000,其他类型为1000。
3、素材的格式大小等要求与公众平台官网一致:
图片(image): 2M,支持bmp/png/jpeg/jpg/gif格式
语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr格式
视频(video):10MB,支持MP4格式
缩略图(thumb):64KB,支持JPG格式
永久素材的使用一定要谨慎,用于公众号规则我们必须用的地方和企业LOGO。
临时素材我们可以随便用。
说明:永久素材上传时,它的上传的文件域的名称必须为 media
首先第1步:制作出文件上传的表单html
第2步:接受表单数据实现文件上传功能
第3步:实现把本服务器中的图片资源上传到公众号平台去
临时接口说明
永久素材接口说明
编写实现上传到公众号平台的接口代码
实现上传
第3步:入库
效果
四、客服消息.
客服消息是一种主动发送的消息模式,这个就是说微信用户给公众号发信息,在发送消息后,公众号可以点对点的进行回复!!
但是也是有条件的限制,只有激活用户在48小时之内,可以无限制,发送消息。
4.1、发送客服消息
如何让用户激活
第1步:制作表单页
第2步:接受数据
第3步:实现客服主动发消息功能
编写接口代码