需要
本人开发的小程序,例如社区类、电商类、新闻、博客等类型小程序,会须要贮存很多图片,图片资源会给集体开发者带来很多老本,万一访问量大了,网站带宽、流量也会不堪重负,所以图片资源必然不适合贮存在本人的服务器外面,而很多厂商提供的弹性贮存也是按需付费的。
想法
微信公众平台提供了一个素材治理,外面能够上传图片、视频、音频等类型的素材,那么是否能够将图片素材上传上去,获取到url作为本人小程序我的项目的图片服务器呢?当然没问题!
依据开发文档的说法:永恒图片素材新增后,将带有URL返回给开发者,开发者能够在腾讯系域名内应用(腾讯系域名外应用,图片将被屏蔽)。简略来说就是你只能在腾讯的平台应用这个图片素材URL,否则无奈展现,因为有防盗链。
开发
依据微信公众平台开发文档提供的【新增永恒素材】接口可知,分为以下几个步骤实现上传图片素材到微信服务器。
- 获取access_token
- 调用新增永恒素材接口进行上传素材
- 获取到素材的永恒URL
代码如下:
<?php // 返回JSON header("Content-type:application/json"); // 容许上传的图片后缀 $allowedExts = array("jpeg", "jpg", "png"); // 后缀名 if ($allowedExts[0] == 'jpeg') { $hzm = 'jpg'; }else{ $hzm = $allowedExts[0]; } // 获取抉择的文件 $temp = explode(".", $_FILES["file"]["name"]); // 获取文件后缀名 $extension = end($temp); if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png")) && ($_FILES["file"]["size"] < 10485760) && in_array($extension, $allowedExts)){ if ($_FILES["file"]["error"] > 0){ $result = array( 'code' => 201, 'msg' => '上传失败'.$_FILES["file"]["error"] ); }else{ // 重命名 $new_file = date("Y-m-d")."-".rand(10000,99999).".".$hzm; // 上传到本人的服务器 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/".$new_file); // 获取实在地址 $filepath = realpath(dirname(__FILE__)); $upload_filepath = $filepath."/upload/".$new_file; // 上传到微信服务器 $imgurl = upload_img($upload_filepath); // 验证上传后果 if(strpos($imgurl,'http') !== false){ // 上传胜利 $result = array( 'code' => 200, 'msg' => '上传胜利', 'url' => $imgurl ); // 删除本地素材 unlink($upload_filepath); }else{ // 上传失败 $result = array( 'code' => 202, 'msg' => '上传失败' ); } } } // 获取access_token function getToken(){ // appid和secret $appid='填写你公众号的appid'; $appsecret='填写你公众号的appsecret'; // 读取access_token include './access_token.php'; // 判断是否过期 if (time() > $access_token['expires']){ // 如果曾经过期就得从新获取并缓存 $access_token = array(); $access_token['access_token'] = getNewToken($appid,$appsecret); $access_token['expires']=time()+7000; // 将数组写入php文件 $arr = '<?php'.PHP_EOL.'$access_token = '.var_export($access_token,true).';'.PHP_EOL.'?>'; $arrfile = fopen("./access_token.php","w"); fwrite($arrfile,$arr); fclose($arrfile); // 返回以后的access_token return $access_token['access_token']; }else{ // 如果没有过期就间接读取缓存文件 return $access_token['access_token']; } } // 获取新的access_token function getNewToken($appid,$appsecret){ $url = "https://<a href="https://www.gaodaima.com/tag/api" title="查看更多关于api的文章" target="_blank">api</a>.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}"; $access_token_Arr = https_request($url); return $access_token_Arr['access_token']; } // curl申请函数 function https_request ($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $out = curl_exec($ch); curl_close($ch); return json_decode($out,true); } // 上传图片素材到微信服务器 function upload_img($realpath){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.weixin.qq.com/cgi-bin/material/add_material?access_token='.getToken().'&type=image'); $data = array( 'media' => new CURLFile($realpath) ); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $upimg = curl_exec($ch); return json_decode($upimg)->url; curl_close($ch); } // 返回JSON对象 echo json_encode($result,JSON_UNESCAPED_UNICODE); ?>
申请返回
{"media_id":"8IZhZUPXxsG_omeA5giO5By8VyHnjk7_oy0Co9jVWwxpgm-sqhx_Hkz_9rLVF9Ws","url":"http:\/\/mmbiz.qpic.cn\/mmbiz_png\/5zLSKyuEW2Kt5ZGZg7XUx05QyGOVFCpHqKic74qQP4gxzQJYXjwN4aGEiadtfUXax4fCXXV5ia1UnvSwdqxuqLCqA\/0?wx_fmt=png","item":[]}
代码解释
- 首先要将图片从客户端(小程序端)上传到你本人的服务器的upload目录
- 而后调用新增永恒素材接口从upload目录上传到微信的服务器
- 须要配置公众号的appid和appsecret获取access_token
- 新增永恒素材接口须要传入access_token才能够调用
- access_token有效期是2小时,须要进行缓存
getToken()
这个函数就是缓存access_token的步骤(如果曾经超过2小时就获取新的并缓存到本地,如果还没超过2小时间接读取本地缓存) - 获取access_token接口须要在公众号后盾的平安核心配置白名单ip地址
留神
图片链接只能在腾讯域名的平台应用,在自建网站无奈显示,本文次要将的是小程序调用永恒图片素材,是能够用的!
小妙招
如果须要在非腾讯域名下应用永恒图片素材的URL,须要搭配反防盗链图片跳板,相似http://xxx.com/?imgurl=永恒图片素材URL
来绕过防盗链,简略来说就是一个图片服务器代理吧。
作者
TANKING