素材管理

在微信里的图片,音乐,视频等等都需要先上传到微信服务器作为素材才可以在消息中使用。

请注意:

  1. 1. 限制:
  2. - 图片(image): 1M,支持 bmp/png/jpeg/jpg/gif 格式
  3. - 语音(voice):2M,播放长度不超过 60s,支持 mp3/wma/wav/amr 格式
  4. - 视频(video):10MB,支持MP4格式
  5. - 缩略图(thumb):64KB,支持JPG格式
  6. 2. `media_id` 是可复用的;
  7. 3. 素材分为 `临时素材` `永久素材` 临时素材媒体文件在后台保存时间为3天,即 3 天后 `media_id` 失效;
  8. 4. 新增的永久素材也可以在公众平台官网素材管理模块中看到;
  9. 5. 永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000

获取实例

  1. <?php
  2. use EasyWeChat\Foundation\Application;
  3. $app = new Application($options);
  4. // 永久素材
  5. $material = $app->material;
  6. // 临时素材
  7. $temporary = $app->material_temporary;

永久素材 API:

上传图片:

注意:微信图片上传服务有敏感检测系统,图片内容如果含有敏感内容,如色情,商品推广,虚假信息等,上传可能失败。

  1. $result = $material->uploadImage("/path/to/your/image.jpg"); // 请使用绝对路径写法!除非你正确的理解了相对路径(好多人是没理解对的)!
  2. var_dump($result);
  3. // {
  4. // "media_id":MEDIA_ID,
  5. // "url":URL
  6. // }

url 只有上传图片素材有返回值。

上传声音

语音大小不超过 5M长度不超过 60 秒,支持 mp3/wma/wav/amr 格式。

  1. $result = $material->uploadVoice("/path/to/your/voice.mp3"); // 请使用绝对路径写法!除非你正确的理解了相对路径(好多人是没理解对的)!
  2. $mediaId = $result->media_id;
  3. // {
  4. // "media_id":MEDIA_ID,
  5. // }

上传视频

  1. $result = $material->uploadVideo("/path/to/your/video.mp4", "视频标题", "视频描述"); // 请使用绝对路径写法!除非你正确的理解了相对路径(好多人是没理解对的)!
  2. $mediaId = $result->media_id;
  3. // {
  4. // "media_id":MEDIA_ID,
  5. // }

上传缩略图

用于视频封面或者音乐封面。

  1. $result = $material->uploadThumb("/path/to/your/thumb.jpg"); // 请使用绝对路径写法!除非你正确的理解了相对路径(好多人是没理解对的)!
  2. $mediaId = $result->media_id;
  3. // {
  4. // "media_id":MEDIA_ID,
  5. // }

上传永久图文消息

图文消息没有临时一说。

  1. use EasyWeChat\Message\Article;
  2. // 上传单篇图文
  3. $article = new Article([
  4. 'title' => 'xxx',
  5. 'thumb_media_id' => $mediaId,
  6. //...
  7. ]);
  8. $material->uploadArticle($article);
  9. // 或者多篇图文
  10. $material->uploadArticle([$article, $article2, ...]);

修改永久图文消息

有三个参数:

  • $mediaId 要更新的文章的 mediaId
  • $article 文章内容,Article 实例或者 全字段数组
  • $index 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义,单图片忽略此参数),第一篇为 0;
  1. $result = $material->updateArticle($mediaId, new Article(...));
  2. $mediaId = $result->media_id;
  3. // or
  4. $result = $material->updateArticle($mediaId, [
  5. 'title' => 'xxx',
  6. 'thumb_media_id' => 'xxx',
  7. // ...
  8. ]);
  9. // 指定更新多图文中的第 2 篇
  10. $result = $material->updateArticle($mediaId, new Article(...), 1); // 第 2 篇

上传永久文章内容图片

注意:微信图片上传服务有敏感检测系统,图片内容如果含有敏感内容,如色情,商品推广,虚假信息等,上传可能失败。

返回值中 url 就是上传图片的 URL,可用于后续群发中,放置到图文消息中。

  1. $result = $material->uploadArticleImage($path);
  2. $url = $result->url;
  3. //{
  4. // "url": "http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYsCNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0"
  5. //}

获取永久素材

  1. $resource = $material->get($mediaId);

如果请求的素材为图文消息,则响应如下:

  1. {
  2. "news_item": [
  3. {
  4. "title":TITLE,
  5. "thumb_media_id"::THUMB_MEDIA_ID,
  6. "show_cover_pic":SHOW_COVER_PIC(0/1),
  7. "author":AUTHOR,
  8. "digest":DIGEST,
  9. "content":CONTENT,
  10. "url":URL,
  11. "content_source_url":CONTENT_SOURCE_URL
  12. },
  13. //多图文消息有多篇文章
  14. ]
  15. }

如果返回的是视频消息素材,则内容如下:

  1. {
  2. "title":TITLE,
  3. "description":DESCRIPTION,
  4. "down_url":DOWN_URL,
  5. }

其他类型的素材消息,则响应的直接为素材的内容,开发者可以自行保存为文件。例如

  1. $image = $material->get($mediaId);
  2. file_put_contents('/foo/abc.jpg', $image);

获取永久素材列表

参考:微信公众平台开发者文档:获取永久素材列表

  • $type 素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news
  • $offset 从全部素材的该偏移位置开始返回,可选,默认 0,0 表示从第一个素材 返回
  • $count 返回素材的数量,可选,默认 20, 取值在 1 到 20 之间
  1. $material->lists($type, $offset, $count);

example:

  1. $lists = $material->lists('image', 0, 10);

图片、语音、视频 等类型的返回如下

  1. {
  2. "total_count": TOTAL_COUNT,
  3. "item_count": ITEM_COUNT,
  4. "item": [{
  5. "media_id": MEDIA_ID,
  6. "name": NAME,
  7. "update_time": UPDATE_TIME,
  8. "url":URL
  9. },
  10. //可能会有多个素材
  11. ]
  12. }

永久图文消息素材列表的响应如下:

  1. {
  2. "total_count": TOTAL_COUNT,
  3. "item_count": ITEM_COUNT,
  4. "item": [{
  5. "media_id": MEDIA_ID,
  6. "content": {
  7. "news_item": [{
  8. "title": TITLE,
  9. "thumb_media_id": THUMB_MEDIA_ID,
  10. "show_cover_pic": SHOW_COVER_PIC(0 / 1),
  11. "author": AUTHOR,
  12. "digest": DIGEST,
  13. "content": CONTENT,
  14. "url": URL,
  15. "content_source_url": CONTETN_SOURCE_URL
  16. },
  17. //多图文消息会在此处有多篇文章
  18. ]
  19. },
  20. "update_time": UPDATE_TIME
  21. },
  22. //可能有多个图文消息item结构
  23. ]
  24. }

获取素材计数

  1. $stats = $material->stats();
  2. // {
  3. // "voice_count":COUNT,
  4. // "video_count":COUNT,
  5. // "image_count":COUNT,
  6. // "news_count":COUNT
  7. // }

删除永久素材;

  1. $material->delete($mediaId);

临时素材 API

上传的临时多媒体文件有格式和大小限制,如下:

  • 图片(image): 1M,支持 JPG 格式
  • 语音(voice):2M,播放长度不超过 60s,支持 AMR\MP3 格式
  • 视频(video):10MB,支持 MP4 格式
  • 缩略图(thumb):64KB,支持 JPG 格式

上传图片

注意:微信图片上传服务有敏感检测系统,图片内容如果含有敏感内容,如色情,商品推广,虚假信息等,上传可能失败。

  1. $temporary->uploadImage($path);

上传声音

  1. $temporary->uploadVoice($path);

上传视频

  1. $temporary->uploadVideo($path, $title, $description);

上传缩略图

用于视频封面或者音乐封面。

  1. $temporary->uploadThumb($path);

获取临时素材内容

比如图片、视频、声音等二进制流内容。

  1. $content = $temporary->getStream($mediaId);
  2. file_put_contents('/tmp/abc.jpg', $content);// 请使用绝对路径写法!除非你正确的理解了相对路径(好多人是没理解对的)!

下载临时素材到本地

其实就是上一个 API 的封装。

  1. $temporary->download($mediaId, "/tmp/", "abc.jpg");

参数说明:

  • $directory 为目标目录,
  • $filename 为新的文件名,可以为空,默认使用 $mediaId 作为文件名。

更多请参考 微信官方文档 素材管理 章节