素材管理分为临时素材和永久素材
首先介绍的是临时素材
注意点:
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格式
4、需使用https调用本接口。
接口调用:
"https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
type | 是 | 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb) |
media | 是 | form-data中媒体文件标识,有filename、filelength、content-type等信息 |
正确情况下的返回JSON数据包结果如下:
{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
错误情况下的返回JSON数据包示例如下(示例为无效媒体类型错误):
{"errcode":40004,"errmsg":"invalid media type"}
下面是上传图片的一个例子:
// 图片上传公众号服务器
public function image_submit(){
$url = I('post.url');//图片在本地服务器上的路径
//相对路径->绝对路径
$file = realpath('.' . $url);
// echo $file;
// exit;
$staus_type = I('post.status_type'); //临时,永久
$access_token = getAccess_token();
include APP_PATH . 'LaneWeChat/lanewechat.php';
if($status_type == 0){
//临时素材
$api = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=$access_token&type=image";
}else{
//永久素材
$api = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";
}
$data['media'] = Curl::addFile($file);
$ret = Curl::callWebServer($api,$data,'post',true,false);
if(isset($ret['media_id'])){
$mp = $this->mp;
$data['mp_id'] = $mp['id'];
$data['url'] = $url;
$data['type'] = 'image';
$data['media_id'] = $ret['media_id'];
$data['create_time'] = time();
M('material')->add($data);
$this->ajaxReturn(array('msg'=>'上传成功'));
}else{
$this->ajaxReturn(array('msg'=>$ret));
}
}
这段代码里面调用了两个外部的方法
/**
* 调用外部url
* @param $queryUrl
* @param $param 参数
* @param string $method
* @return bool|mixed
*/
public static function callWebServer($queryUrl, $param='', $method='get', $is_json=true, $is_urlcode=true) {
if (empty($queryUrl)) {
return false;
}
$method = strtolower($method);
$ret = '';
$param = empty($param) ? array() : $param;
self::_init();
if ($method == 'get') {
$ret = self::_httpGet($queryUrl, $param);
} elseif($method == 'post') {
$ret = self::_httpPost($queryUrl, $param, $is_urlcode);
}
if(!empty($ret)){
if($is_json){
return json_decode($ret, true);
}else{
return $ret;
}
}
return true;
}
/**
* 上传文件
* @param $filename 文件名+路径
* @return \CURLFile|string 返回可直接用于Curl发送的模式
* PHP5.5以后,将废弃以@文件名的方式上传文件。
*/
public static function addFile($filename){
return class_exists('\CURLFile') ? new \CURLFile($filename) : '@'.$filename;
}
下面是永久素材:
请注意:
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格式
4、图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过"上传图文消息内的图片获取URL"接口上传图片获取。
5、"上传图文消息内的图片获取URL"接口所上传的图片,不占用公众号的素材库中图片数量的5000个的限制,图片仅支持jpg/png格式,大小必须在1MB以下。
6、图文消息支持正文中插入自己帐号和其他公众号已群发文章链接的能力。
接口调用:
"https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN"
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
title | 是 | 标题 |
thumb_media_id | 是 | 图文消息的封面图片素材id(必须是永久mediaID) |
author | 否 | 作者 |
digest | 否 | 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前64个字。 |
show_cover_pic | 是 | 是否显示封面,0为false,即不显示,1为true,即显示 |
content | 是 | 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。 |
content_source_url | 是 | 图文消息的原文地址,即点击“阅读原文”后的URL |
{ "media_id":MEDIA_ID }
上传图文消息内的图片获取URL,返回:
{
"url": "http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYs CNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0"
}
新增其他类型永久素材,返回:
{
"title":VIDEO_TITLE,
"introduction":INTRODUCTION
}
错误情况下的返回JSON数据包示例如下(示例为无效媒体类型错误):
{"errcode":40007,"errmsg":"invalid media_id"}
下面是一个上传永久图文的一个例子:
//图文上传公众号服务器
public function news_submit(){
$url = I('post.url');//图片在本地服务器上的路径
//相对路径->绝对路径
$file = realpath('.' . $url);
$title = I('post.title');
$content = I('post.content');
$link = I('post.link');
$access_token = getAccess_token();
include APP_PATH . 'LaneWeChat/lanewechat.php';
//上传永久图片api
$api = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";
$data['media'] = '@' . $file;
$ret = Curl::callWebServer($api,$data,'post',true,false);
// $this->ajaxReturn($ret);
// exit;
if(isset($ret['media_id'])){
$arr = array(
"title"=>$title,
"thumb_media_id"=>$ret['media_id'],
"author"=>'tss',
"digest"=>'aaa',
"show_cover_pic"=>1,
"content"=>$content,
"content_source_url"=>$link
);
$data['articles'][] = $arr;
$data = json_encode($data,JSON_UNESCAPED_UNICODE);
$api = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=$access_token";
$ret = Curl::callWebServer($api,$data,'post',true,false);
if(isset($ret['media_id'])){
$mp = $this->mp;
$arr['mp_id'] = $mp['id'];
$arr['url'] = $url;
$arr['link'] = $link;
$arr['create_time'] = time();
$arr['content'] = $content;
M('material')->add($arr);
$this->ajaxReturn(array('msg'=>'上传成功'));
}else{
$this->ajaxReturn(array('msg'=>$ret));
}
}else{
$this->ajaxReturn($ret);
}
}
注意:获取素材是通过media_id来获取的!!!
永久素材和临时素材的api不一样!!!