
本文共 2252 字,大约阅读时间需要 7 分钟。
因公司项目需求,需要开发一套微信公众后台管理系统,因为个人能力和时间限制,这里选择了SDK开发。
选用的SDK是:Gaoming13/wechat-php-sdk
github地址:
(之后发现这个SDK太老了,不过有些还可以用。建议使用,官网:)
这里主要做了永久素材的操作:素材新增、素材列表的获取、单个素材的获取、删除单个素材的功能
一、首先,看一下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包做了
包地址:
方法如下:
$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关联起来,后台显示直接用项目服务器上的媒体即可
其他获取单个素材和删除素材的,基本没啥大问题,这里就不赘述了
发表评论
最新留言
关于作者
