微信公众号开发之素材管理

因公司项目需求,需要开发一套微信公众后台管理系统,因为个人能力和时间限制,这里选择了SDK开发。

选用的SDK是:Gaoming13/wechat-php-sdk

github地址:https://github.com/gaoming13/wechat-php-sdk

(之后发现这个SDK太老了,不过有些还可以用。建议使用EasyWeChat,官网:https://www.easywechat.com/)

这里主要做了永久素材的操作:素材新增、素材列表的获取、单个素材的获取、删除单个素材的功能

 一、首先,看一下sdk中api的初始化

//api对象
$this->api = new Api(array(
    'appId' => $this->AppID,
    'appSecret' => 	$this->AppSecret,
    'get_access_token' => function(){
    // 用户需要自己实现access_token的返回
        return cache('wechat_token');
     },
     'save_access_token' => function($token) {
     // 用户需要自己实现access_token的保存
         cache('wechat_token', $token);
     }
));

access_token的存储我这里用的是缓存的形式。常用的还有两种方式就是文件存储形式和数据表存储。

还有一点,我这里碰到的点小坑:

更换微信公众号配置(APPID,secret等)后 ,可能用的还是之前的access_token,所以这里需要清一下缓存,方法是:

cache('wechat_token',null)

这里强调这一点的原因是,我用cache('wechat_token'," ")是清不掉的

 二、添加永久素材

//上传文件及获取文件路径
$file = $this->request->file('file');

$filepath = \Env::get('root_path') . 'public' . DIRECTORY_SEPARATOR . 'wechat'.DIRECTORY_SEPARATOR.'img';

$info = $file->move($filepath);

$path = $filepath . DIRECTORY_SEPARATOR . $info->getSaveName();

// 使用SDK上传素材到微信素材库
$res=$this->api->add_material('image',$path);

图片、语音的上传方法是一样的,上传语音只需把image改为voice即可

这里需要注意的点是:

1、上传到微信的文件路径,即$path不能直接用缓存文件的路径,需要将文件暂存到本地某个路径下,然后再去上传

2、上传完后为了节省内存,需要将暂存的文件删除,删除的时候也有坑,就是删除文件之前,先需要解除绑定

unset($info);//解除绑定
unlink($path);//删除文件

至于视频的添加,跟图片语音有点区别

视频的话,一般需要加标题和描述,所以SDK的添加素材方法不知道为啥不能用了,项目紧急,就还换了curl包做了

包地址:https://curl.haxx.se/download.html

方法如下:

 $describe = array(
            'title'=>$title,
            'introduction'=>$introduction
        );

        $describe = json_encode($describe);
        $postPath = 'https://api.weixin.qq.com/cgi-bin/material/add_material?type=video&access_token='.$this->api->get_access_token();

        $curl = new \Curl\Curl();
        $curl->setOpt(CURLOPT_SSL_VERIFYPEER, false);
        $curl->setOpt(CURLOPT_SSL_VERIFYHOST, false);
        $curl->post($postPath, [
            'media' => new \CURLFile($path),
            'description' => $describe
        ]);

添加的问题大概就这些

三、获取素材列表

$this->api->get_materials('news', 0, 20);
$this->api->get_materials('image', 0, 20);
$this->api->get_materials('voice', 0, 20);
$this->api->get_materials('video', 0, 20);

分别获取的是图文、图片、语音、视频的列表

问题:防盗链问题

获取的素材列表就是需要在项目的后台展示的,但是因为防盗链,素材是无法展示的

网上查了查,有些说可以直接在html页面加

加了之后发现的确可以,但是有时候又不行,所以没办法,就在本地服务器存了一份,用media_id关联起来,后台显示直接用项目服务器上的媒体即可

其他获取单个素材和删除素材的,基本没啥大问题,这里就不赘述了

你可能感兴趣的:(微信开发)