独立部署 · 数据自持

把文件存进公众号
成本降到几乎为零

一套 API 打通小程序、SaaS 平台与内容管理:图片 / 语音 / 视频直传公众号素材库, 单号图片容量上限 10 万;下载与回流不产生额外节点流量费。 支持多租户桶隔离、批量上传、批量删除与 HMAC-SHA256 签名鉴权。

PHP 7.4 + MySQL 5.6 覆盖升级不丢数据 凭证隔离
大擎云 · 桶详情 / 文件管理
全部图片视频音频
IMG hero-banner.jpg1.2 MB · 图片 · 公众号A 素材库
MP4 demo-clip.mp48.6 MB · 视频 · 公众号B 素材库
MP3 voice-note.mp3540 KB · 语音 · 默认桶 本地
已存储 20 个文件 多租户路由正常
10
单公众号图片容量上限
10M
单文件上限 · 图片 / 视频
60s
语音时长上限 · 2M
HMAC
SHA-256 签名鉴权
核心能力

不只是存得下,还要存得省心

从上传、路由、鉴权到防盗链,链路上每个容易踩坑的地方都处理好了

公众号素材库直存

文件直接写入公众号【永久素材库】,不占本地磁盘;直链走公众号官方域名,加载快、稳定性由平台保障。

强制公众号素材库

只有为桶配置了正确且已认证的公众号才允许上传:未配置 / 配置错误 / 账号未认证时直接阻断,文件既不进素材库也不落本地存储。

多租户桶隔离

桶即租户:一个桶可绑定多个公众号,一个 Key 可关联多个桶。上传按「Key → 关联桶 → 桶内公众号」自动路由,凭证彼此隔离。

配额自动均衡

按素材类型与已用额度自动挑选桶内账号(图片 10 万 / 语音 1000 / 视频 1000),避免单个公众号被打满。

批量上传与批量删除

后台支持多选与整面板拖拽、实时进度条与逐文件结果;接口侧一次请求传多个 files[] 即可批量处理。

图片转发绕过防盗链

微信素材 CDN 带 Referer 防盗链,第三方页面引用会显示占位图。开启转发后由本站服务器回源取图,正常显示且隐藏微信真实地址。

适用场景

一套接口,覆盖五类业务

小程序、SaaS 平台、内容管理、素材管理、企业业务系统

🧩
小程序开发

图片语音直传素材库,小程序端可直接渲染

SaaS 平台

每个租户一个桶,凭证与配额彻底隔离

📄
内容管理

富文本配图统一走一套上传与直链

🗂
素材管理

批量上传 + 公众号额度可视化

🏢
企业业务系统

独立部署在自己服务器,数据自持可控

接入流程

四步接入,十分钟跑通

从部署到第一次上传成功,只需要下面这四步

部署并一键安装

把程序上传到站点根目录,浏览器访问 /install.php。系统自动建库建表(含 SaaS 四表)、创建管理员、生成默认桶与默认 Key。

建桶并绑定公众号

进入「桶列表 → 新增」,填桶名称与公众号 AppID / AppSecret(可勾选保存时测试连接)。一个桶可添加多个公众号,用于容量与配额均衡。

创建 Key 并勾选桶

进入「Key 管理 → 新增」,填备注并多选要开放的桶,即得到 AccessKey 与 SecretKey;一个 Key 可以同时关联多个桶。

按签名调用接口

用 SecretKey 对固定格式的签名串做 HMAC-SHA256 得到十六进制签名,带上三个请求头调用上传接口即可。右侧是可直接复制运行的示例。

上传文件 · cURL
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"
签名串为三行:时间戳 / AccessKey / 开放标识,与服务器时间偏差需 ≤ 300 秒。 批量上传把 file 换成多个 files[] 即可。
规格与配额

能存什么、能存多少

以下为公众号素材库的官方规格,超出会返回明确错误原因,不会静默失败

素材类型支持格式单文件上限单公众号容量
图片 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 起文件只进公众号素材库,不落本地服务器;上表规格即公众号素材库规格,未配置公众号或推送失败时上传会被直接阻断。

开放 API

七个接口,覆盖完整生命周期

上传、删除、下载、图片转发、预签名直链与微信 OAuth 授权,全部走同一套密钥

POST
/api/upload.php
上传文件,按 Key → 桶 → 桶内公众号自动路由。单文件用 file,多文件用 files[]
POST
/api/delete.php
删除文件,同步删除公众号素材库中的对应素材与图片转发缓存。
GET
/api/download.php
下载或预览文件。直链默认免鉴权,可在系统设置开启 dl_auth
GET
/api/img.php
图片转发,服务器回源取图,绕过微信素材 CDN 的 Referer 防盗链。
GET
/api/sign.php
生成带有效期的预签名直链,适合把私密文件临时开放给第三方。
GET
/api/doc.php
桶级接入文档,含当前桶真实接口地址、开放标识与签名串,可一键分享。
GET
/api/oauth.php
微信 OAuth 回调,获取用户信息;json=1 时返回 JSON。

签名鉴权

除文档与下载直链外,接口均需携带三个请求头。用 SecretKey 对签名串做 HMAC-SHA256,结果取十六进制。

请求头X-Access-Key
X-Timestamp
X-Signature
签名串{timestamp}\n{access_key}\n{code}
时间容差± 300 秒
响应示例 · 单文件上传成功
{
  "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
常见问题

接入前最常问的几件事

更完整的排查清单见后台「常见问题」页与「系统诊断」页

单次能上传多大的文件?超了会怎样?
图片与视频单文件 ≤ 10M,语音 ≤ 2M 且时长 ≤ 60 秒,缩略图 ≤ 64K。 超出时接口会返回具体错误码与原因,不会静默失败。
一次能批量传多少个文件?
单批上限 = min(程序设定 30, PHP max_file_uploads),整批体积之和受 post_max_size 限制。超过 max_file_uploads 的文件会被 PHP 直接丢弃, 所以后台会按实际生效的上限提前提醒,传大批量请分批提交。
图片在网页里显示成「此图片来自微信公众平台 未经允许不可引用」?
微信素材 CDN 存在 Referer 防盗链。到「桶详情 → 访问配置」开启图片地址转发, 上传接口返回的 url 会变成本站 /api/img.php?key=xxx, 由服务器回源取图,第三方页面即可正常显示,同时隐藏微信真实地址。小程序端不受该限制影响。
对公众号有什么要求?
需要能调用永久素材接口(服务号或已认证订阅号)。若返回 48001 表示该号没有素材管理权限;40164 表示服务器 IP 不在公众号白名单, 需到公众号后台「设置与开发 → 基本配置」添加。
刷新额度报 41001 access_token missing?
v22.4 之前的版本存在该缺陷(取 token 的返回值键名读错,导致请求未带上 token), 升级到 v22.4 及以上即可。若升级后仍失败,打开后台「系统诊断」页的公众号接口自检, 它会分「取 token」「取素材统计」两步真跑并打印结果,可直接定位是凭证问题还是权限问题。
文件会存到本地服务器吗?
不会。v22.9 起只支持公众号素材库直传:文件上传到桶绑定的公众号永久素材库,不落本地磁盘。 若桶未配置可用公众号,或微信推送失败(凭据错误 / 账号未认证 / 超限),上传会被直接阻断, 既不提交到素材库也不保存到本地;删除文件时会同步清理素材与图片转发缓存。