ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

EasyWeChat 5.x 微信公众号永久素材管理指南:上传、图文、列表与下载实战

EasyWeChat 5.x 微信公众号永久素材管理指南:上传、图文、列表与下载实战 后端即时通讯【免费下载链接】easywechat 一个 PHP 微信 SDK项目地址https://gitcode.com/gh_mirrors/ea/easywechat点击查看免费下载微信公众号中的图片、语音、视频等多媒体资源并不能直接拿来就用于消息发送而是需要先上传到微信服务器由微信生成对应的media_id素材标识之后才能在群发消息、客服消息、图文消息等场景中引用。本指南基于 EasyWeChat一个 PHP 微信 SDK5.x 版本围绕官方文档 docs/src/5.x/official-account/material.md 展开完整讲解永久素材的「上传、修改、查询、列表、计数、删除与下载」全流程 API并结合仓库源码揭示其底层文件上传、鉴权与响应处理机制。读完本文你将能够在业务中熟练管理公众号永久素材并理解media_id的流转与复用方式。素材体系概览永久素材与临时素材微信的素材体系分为两类本文聚焦的是永久素材对应$app-material永久素材长期有效media_id可复用适合图片、图文、视频等需要反复使用的资源新增的永久素材也可以在公众平台官网「素材管理」模块中看到。临时素材媒体文件在微信后台仅保存 3 天3 天后media_id失效适合一次性场景如客服消息中的图片。临时素材的 API 对应$app-media可参考 docs/src/5.x/basic-services/media.md。media_id是可复用的永久素材的数量有上限图文消息素材和图片素材上限为 5000其他类型为 1000请谨慎新增、按需清理。准备工作初始化应用实例所有素材接口都挂在公众号应用实例的material属性上先完成应用初始化use EasyWeChat\OfficialAccount\Application; $config [ app_id wx3cf0f39249eb0exx, // 公众号 AppID secret f1c242f4f28f735d4687abb469072axx, // AppSecret token your-token, // Token aes_key , // EncodingAESKey安全模式下必填 response_type array, // 响应类型array(默认)/collection/object/raw/自定义类名 http [ // HTTP 请求配置 max_retries 1, // 失败重试次数 retry_delay 500, // 重试延迟(ms) timeout 5.0, ], ]; $app new Application($config);完整的配置项说明见 docs/src/5.x/official-account/configuration.md。从源码 src/OfficialAccount/Application.php 可以看出SDK 内部通过createClient()构建AccessTokenAwareClient它会自动携带access_token发起请求base_uri固定为https://api.weixin.qq.com/且当响应中出现errcode非 0 时按失败处理——这意味着素材上传、查询等请求你无需关心 token 的获取与刷新细节。上传永久素材素材上传方法接收文件路径作为参数建议使用绝对路径写法除非你完全理解相对路径的解析规则。上传图片注意微信图片上传服务有敏感检测系统图片内容如果含有敏感内容如色情、商品推广、虚假信息等上传可能失败。$result $app-material-uploadImage(/path/to/your/image.jpg); // { // media_id: MEDIA_ID, // url: URL // }url只有上传图片素材有返回值。上传语音语音大小不超过 5M长度不超过 60 秒支持mp3/wma/wav/amr格式。$result $app-material-uploadVoice(/path/to/your/voice.mp3); // { // media_id: MEDIA_ID, // }上传视频视频素材需要同时提供标题与描述$result $app-material-uploadVideo(/path/to/your/video.mp4, 视频标题, 视频描述); // { // media_id: MEDIA_ID, // }上传缩略图缩略图用于视频封面或音乐封面$result $app-material-uploadThumb(/path/to/your/thumb.jpg); // { // media_id: MEDIA_ID, // }上传文件的底层实现从源码看SDK 的多媒体上传并不依赖扩展包而是基于 Symfony Mime 组件自行封装。核心类位于 src/Kernel/Form/File.phpFile::from($pathOrContents, $filename, $contentType)静态工厂方法若传入的是已存在的文件路径则按路径读取否则将字符串内容作为文件内容处理当未指定contentType时SDK 会根据文件扩展名自动推断 MIME 类型如.jpg→image/jpeg推断失败时回退为application/octet-stream对纯内容上传场景SDK 会写入临时文件以猜测 MIME 类型并以内容md5作为文件名。因此在调用uploadImage(/path/to/your/image.jpg)时SDK 会读取该文件并自动设置正确的 MIME 类型再以 multipart/form-data 形式提交到微信素材接口这也是上述方法统一接受路径参数即可完成上传的原因。图文消息素材图文消息是公众号运营中最常用的素材类型它没有「临时」一说全部走永久素材接口。上传图文消息通过EasyWeChat\Kernel\Messages\Article构建文章对象use EasyWeChat\Kernel\Messages\Article; // 上传单篇图文 $article new Article([ title xxx, thumb_media_id $mediaId, //... ]); $app-material-uploadArticle($article); // 或者多篇图文数组形式 $app-material-uploadArticle([$article, $article2, ...]);其中thumb_media_id需要是之前通过uploadThumb()上传缩略图得到的media_id。从源码 src/Kernel/Message.php 可以看到Article等消息类继承自抽象的Message其构造函数接收属性数组并实现了JsonSerializable与Arrayable接口因此既可以传入Article实例也可以直接传入全字段数组SDK 会统一序列化为微信要求的 JSON 结构。修改图文消息updateArticle有三个参数$mediaId要更新的文章的mediaId$article文章内容Article实例或者全字段数组$index要更新的文章在图文消息中的位置多图文消息时此字段才有意义单篇图文可忽略第一篇为 0$result $app-material-updateArticle($mediaId, new Article(...)); // 或者直接使用全字段数组 $result $app-material-updateArticle($mediaId, [ title EasyWeChat 4.0 发布了, thumb_media_id qQFxUQGO21Li4YrSn3MhnrqtRp9Zi3cbM9uBsepvDmE, // 封面图片 mediaId author overtrue, // 作者 show_cover 1, // 是否在文章内容显示封面图片 digest 这里是文章摘要, content 这里是文章内容你可以放很长的内容, source_url https://easywechat.com, ]); // 指定更新多图文中的第 2 篇 $result $app-material-updateArticle($mediaId, new Article(...), 1); // 第 2 篇上传图文消息图片图文消息正文中的图片不能直接使用普通图片素材的url需要单独通过此接口上传返回值中的url就是可放入图文正文的图片地址$result $app-material-uploadArticleImage($path); //{ // url: http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYsCNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0 //}获取永久素材$resource $app-material-get($mediaId);返回值取决于素材类型图文消息素材返回 JSON 数组结构如下{ news_item: [ { title: TITLE, thumb_media_id: THUMB_MEDIA_ID, show_cover_pic: SHOW_COVER_PIC(0/1), author: AUTHOR, digest: DIGEST, content: CONTENT, url: URL, content_source_url: CONTENT_SOURCE_URL }, //多图文消息有多篇文章 ] }视频素材返回标题、描述与下载地址{ title: TITLE, description: DESCRIPTION, down_url: DOWN_URL }图片、语音等其他类型的素材响应为二进制流SDK 返回流式响应对象开发者可以自行保存为文件。例如$stream $app-material-get($mediaId); if ($stream instanceof \EasyWeChat\Kernel\Http\StreamResponse) { // 以内容 md5 为文件名保存 $stream-save(保存目录); // 自定义文件名不需要带后缀 $stream-saveAs(保存目录, 文件名); }流式响应的底层机制在 5.x 源码中流式响应的落盘能力由EasyWeChat\Kernel\HttpClient\Response提供文件位于 src/Kernel/HttpClient/Response.php。该类同时实现了ResponseInterface与StreamableInterface其saveAs(string $filename)方法内部通过file_put_contents()将响应内容写入指定路径若写入失败会抛出BadResponseException并携带响应体内容便于排查。相关行为在测试 tests/Kernel/HttpClient/ResponseTest.php 中得到了验证正常场景下内容被正确写入文件异常场景getContent抛错会抛出带有原始 JSON 错误信息的BadResponseException。获取永久素材列表分页获取某类素材的列表$type素材类型图片image、视频video、语音voice、图文news$offset从全部素材的该偏移位置开始返回可选默认00 表示从第一个素材返回$count返回素材数量可选默认20取值在 1 到 20 之间$app-material-list($type, $offset, $count);示例$list $app-material-list(image, 0, 10);图片、语音、视频等类型的返回结构如下{ total_count: TOTAL_COUNT, item_count: ITEM_COUNT, item: [ { media_id: MEDIA_ID, name: NAME, update_time: UPDATE_TIME, url: URL } //可能会有多个素材 ] }永久图文消息素材列表的响应如下{ total_count: TOTAL_COUNT, item_count: ITEM_COUNT, item: [ { media_id: MEDIA_ID, content: { news_item: [ { title: TITLE, thumb_media_id: THUMB_MEDIA_ID, show_cover_pic: SHOW_COVER_PIC(0 / 1), author: AUTHOR, digest: DIGEST, content: CONTENT, url: URL, content_source_url: CONTENT_SOURCE_URL } //多图文消息会在此处有多篇文章 ] }, update_time: UPDATE_TIME } //可能有多个图文消息 item 结构 ] }total_count是全部素材总数item_count是本次返回的素材数量配合offset/count即可实现素材库的分页管理。获取素材计数统计各类永久素材的数量常用于展示素材库概况或触发清理逻辑$stats $app-material-stats(); // { // voice_count: COUNT, // video_count: COUNT, // image_count: COUNT, // news_count: COUNT // }删除永久素材删除后media_id立即失效请谨慎操作$app-material-delete($mediaId);文章预览素材上传/修改完成后正式群发之前建议先做预览。文章预览请参阅「消息群发」章节相关方法见 docs/src/5.x/official-account/broadcasting.md例如按 openId 预览图文$app-broadcasting-previewNews($mediaId, $openId); // 或按微信号预览 $app-broadcasting-previewNewsByName($mediaId, $wxname);请求层的自动鉴权与重试素材相关接口虽未在仓库src/中单独暴露实现类但从 src/OfficialAccount/Application.php 的createClient()实现可以确认整个公众号 API 的请求链路所有请求经由AccessTokenAwareClient发出它会自动将access_token注入请求参数同时支持http.retry配置开启RetryableHttpClient重试默认最大重试次数为 2。getRetryStrategy()中还内置了对42001 access_token expired错误的识别遇到 access_token 过期时会自动刷新后重试。这意味着你在反复调用素材上传、列表接口时无需关心 token 生命周期SDK 会在请求层统一兜底。注意事项小结上传方法统一传入文件路径建议使用绝对路径避免相对路径解析歧义语音素材限制不超过 5M、时长不超过 60 秒支持mp3/wma/wav/amr图片上传存在敏感内容检测涉及色情、商品推广、虚假信息的内容可能上传失败只有uploadImage返回url字段其他类型仅返回media_id永久素材数量有上限图文与图片 5000其他类型 1000建议定期用stats()统计、用list()巡检、用delete()清理图文正文图片需使用uploadArticleImage()获取专用url不能直接使用图片素材的url素材下载get()返回流式响应时先判断响应是否为流式对象再通过save()/saveAs()落盘避免对 JSON 响应误调保存方法。赞分享后端即时通讯【免费下载链接】easywechat 一个 PHP 微信 SDK项目地址https://gitcode.com/gh_mirrors/ea/easywechat点击查看免费下载相关推荐RR引导实操手册45分钟装好黑群晖启动盘制作与虚拟化部署一篇讲透RR引导实操手册45分钟装好黑群晖启动盘制作与虚拟化部署一篇讲透 如果你问老玩家黑群晖部署难在哪十有八九会得到一个答案不是装系统本身而是 引导 。固件操作系统嵌入式EasyWeChat 5.x 公众号卡券Card模块开发实战指南EasyWeChat 5.x 公众号卡券Card模块开发实战指南 本篇技术指南聚焦 EasyWeChat 5.x 中公众号「卡券」模块的完整使用覆盖从实例后端即时通讯CANN Ascend C浮点转bfloat16Castfloat转bfloat16\_ta nameZH CN_TOPIC_0000001623365980 /a 产品支持情况a name人工智能深度学习算子库CANNAscend上一篇Android-StepsView 开源项目教程下一篇SolidityPy全课程智能合约日志与事件分析终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表