一套 API 打通小程序、SaaS 平台与内容管理:图片 / 语音 / 视频直传公众号素材库, 单号图片容量上限 10 万;下载与回流不产生额外节点流量费。 支持多租户桶隔离、批量上传、批量删除与 HMAC-SHA256 签名鉴权。
从上传、路由、鉴权到防盗链,链路上每个容易踩坑的地方都处理好了
文件直接写入公众号【永久素材库】,不占本地磁盘;直链走公众号官方域名,加载快、稳定性由平台保障。
只有为桶配置了正确且已认证的公众号才允许上传:未配置 / 配置错误 / 账号未认证时直接阻断,文件既不进素材库也不落本地存储。
桶即租户:一个桶可绑定多个公众号,一个 Key 可关联多个桶。上传按「Key → 关联桶 → 桶内公众号」自动路由,凭证彼此隔离。
按素材类型与已用额度自动挑选桶内账号(图片 10 万 / 语音 1000 / 视频 1000),避免单个公众号被打满。
后台支持多选与整面板拖拽、实时进度条与逐文件结果;接口侧一次请求传多个 files[] 即可批量处理。
微信素材 CDN 带 Referer 防盗链,第三方页面引用会显示占位图。开启转发后由本站服务器回源取图,正常显示且隐藏微信真实地址。
小程序、SaaS 平台、内容管理、素材管理、企业业务系统
图片语音直传素材库,小程序端可直接渲染
每个租户一个桶,凭证与配额彻底隔离
富文本配图统一走一套上传与直链
批量上传 + 公众号额度可视化
独立部署在自己服务器,数据自持可控
从部署到第一次上传成功,只需要下面这四步
把程序上传到站点根目录,浏览器访问 /install.php。系统自动建库建表(含 SaaS 四表)、创建管理员、生成默认桶与默认 Key。
进入「桶列表 → 新增」,填桶名称与公众号 AppID / AppSecret(可勾选保存时测试连接)。一个桶可添加多个公众号,用于容量与配额均衡。
进入「Key 管理 → 新增」,填备注并多选要开放的桶,即得到 AccessKey 与 SecretKey;一个 Key 可以同时关联多个桶。
用 SecretKey 对固定格式的签名串做 HMAC-SHA256 得到十六进制签名,带上三个请求头调用上传接口即可。右侧是可直接复制运行的示例。
AK="你的AccessKey"; SK="你的SecretKey"; CODE="开放标识"
TS=$(date +%s)
SIG=$(printf '%s\n%s\n%s' "$TS" "$AK" "$CODE" \
| openssl dgst -sha256 -hmac "$SK" | sed 's/^.* //')
curl -F "file=@demo.jpg" \
-H "X-Access-Key: $AK" \
-H "X-Timestamp: $TS" \
-H "X-Signature: $SIG" \
"https://你的域名/api/upload.php?code=$CODE"
以下为公众号素材库的官方规格,超出会返回明确错误原因,不会静默失败
| 素材类型 | 支持格式 | 单文件上限 | 单公众号容量 |
|---|---|---|---|
| 图片 | bmp / png / jpeg / jpg / gif | 10 M | 100000 |
| 语音 | mp3 / wma / wav / amr | 2 M · 时长 ≤ 60s | 1000 |
| 视频 | MP4 | 10 M | 1000 |
| 缩略图 | JPG | 64 K | — |
批量上传上限:单批数量 = min(程序设定 30, PHP max_file_uploads),整批体积之和受
post_max_size 限制。超出部分会被 PHP 静默丢弃,因此后台会按上限提前提醒,大批量请分批提交。
强制公众号:v22.9 起文件只进公众号素材库,不落本地服务器;上表规格即公众号素材库规格,未配置公众号或推送失败时上传会被直接阻断。
上传、删除、下载、图片转发、预签名直链与微信 OAuth 授权,全部走同一套密钥
除文档与下载直链外,接口均需携带三个请求头。用 SecretKey 对签名串做 HMAC-SHA256,结果取十六进制。
{
"code": 0,
"msg": "已上传到公众号素材库",
"data": {
"key": "wx_9f3c1a20b7d4",
"url": "https://mmbiz.qpic.cn/……",
"wx_url": "https://mmbiz.qpic.cn/……",
"type": "image",
"size": 1284471,
"media_id": "……",
"original_name": "demo.jpg",
"bucket": "默认桶",
"account": "公众号A"
}
}
// 批量上传时返回 data.files[] 逐文件结果:
// { "total": 3, "success": 2, "failed": 1, "files": [ … ] }
// code=0 表示「至少一个成功」,失败项含 ok=false 与 msg
更完整的排查清单见后台「常见问题」页与「系统诊断」页