微信公众号_02 菜单素材客服消息

微信开发微信公众号_02 菜单素材客服消息已关闭评论字数 5480阅读18分16秒

文件路径:全栈教程/9微信开发/Day-2_公众号开发

一、接口调用凭证access_token

1.1、curl发起get和post请求.

PHP如何来发起网络请求文章源自国强极客生活-https://tagqwl.com/3462.html

file_get_contents

fsockopen

curl

curl实现get、post和文件上传
get文章源自国强极客生活-https://tagqwl.com/3462.html

post请求文章源自国强极客生活-https://tagqwl.com/3462.html

文件上传文章源自国强极客生活-https://tagqwl.com/3462.html

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步走
初始化
相关设置
发送请求
关闭资源文章源自国强极客生活-https://tagqwl.com/3462.html

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文章源自国强极客生活-https://tagqwl.com/3462.html

推荐使用 memcache缓存文章源自国强极客生活-https://tagqwl.com/3462.html

使用文件缓存access_token

效果文章源自国强极客生活-https://tagqwl.com/3462.html

/**
     * 得到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文章源自国强极客生活-https://tagqwl.com/3462.html

微信公众号默认没有开通底部是没有菜单功能,需要使用者自行来创建开通。
注意点:
自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单
一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
按钮事件文章源自国强极客生活-https://tagqwl.com/3462.html

最常用的自定义类型按钮为:view 它相当有html中的a作用文章源自国强极客生活-https://tagqwl.com/3462.html

view想跳转到指定的URL,需要认证后的公众号才可以文章源自国强极客生活-https://tagqwl.com/3462.html

2.2、自定义菜单创建.

自定义菜单数据准备
方式1
方式2 推荐第2种文章源自国强极客生活-https://tagqwl.com/3462.html

方式三 heredoc方式 可以解析变量文章源自国强极客生活-https://tagqwl.com/3462.html

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;

生成菜单文件文章源自国强极客生活-https://tagqwl.com/3462.html

执行文章源自国强极客生活-https://tagqwl.com/3462.html

/**
     * 创建自定义菜单
     * @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中文章源自国强极客生活-https://tagqwl.com/3462.html

效果文章源自国强极客生活-https://tagqwl.com/3462.html

三、新增素材.

公众号经常有需要用到一些多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。文章源自国强极客生活-https://tagqwl.com/3462.html

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格式文章源自国强极客生活-https://tagqwl.com/3462.html

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步:实现客服主动发消息功能

编写接口代码

实现互通

效果

继续阅读
我的微信
有任何问题请与我直接联系(备注:国强极客生活)
weinxin
我的微信
我的微信公众号
关注【国强极客生活】微信公众号,及时获取内容更新
weinxin
我的公众号