七牛云上传回调需服务端正确接收并响应POST请求、严格校验X-Qiniu-Callback-Signature签名,且callbackUrl、callbackBody等参数必须在uploadToken的policy中声明;v7+ SDK需用Qiniu\Auth\Authorization初始化,policy键名小写,返回200纯文本响应。

callbackUrl 就能跑通的,**服务端必须能正确接收并响应七牛的 POST 回调请求,且签名验证不能省**。否则前端看似上传成功,后端却收不到任何通知。
回调参数必须在 uploadToken 里声明,不能只靠前端传
七牛的回调行为完全由上传凭证(uploadToken)控制,不是靠前端表单或 JS SDK 的配置字段触发的。
-
callbackUrl必须是公网可访问、支持 HTTP POST 的地址(HTTPS 更稳妥),且服务器需开放该路径的 POST 方法 -
callbackBody决定了七牛回调时发什么数据,比如'filename=$(fname)&hash=$(etag)&size=$(fsize)'—— 这些变量名必须用$()包裹,不能手写成filename=xxx - 若指定了
saveKey(如video/$(year)/$(mon)/$(fname)),则callbackBody中的$(key)才能取到最终存储名;否则$(key)为空 - v7+ SDK 中,
uploadToken的第四个参数是关联数组,不是 JSON 字符串;传错类型会导致回调静默失效
回调接收端必须校验签名,否则可能被伪造请求打穿
七牛在回调时会在请求头中带上 X-Qiniu-Callback-Signature 和 X-Qiniu-Callback-Body-Sha1,不校验就直接入库 = 开门揖盗。
- 服务端收到回调后,先用相同
callbackBody+secretKey重新计算签名,比对X-Qiniu-Callback-Signature - 推荐用 SDK 自带的
Qiniu\Auth\Authorization::verifyCallback(),别自己拼 HMAC-SHA1 - 注意:
verifyCallback()第二个参数是原始$_POST或file_get_contents('php://input'),不是$_GET或 JSON 解析后的数组 - 必须返回 HTTP 200 状态码 + 纯文本(如
"success"),返回 JSON 或带 HTML 会被七牛判定为失败
v7+ SDK 的 Auth 类路径和初始化方式变了,老代码会直接报错
如果你用的是 composer show qiniu/php-sdk 显示 v7.x 或更高,new Qiniu\Auth(...) 会 fatal error。
- 必须改用
new Qiniu\Auth\Authorization($accessKey, $secretKey) - 命名空间要完整写,不能只
use Qiniu\Auth—— v7 已删掉这个 alias - 生成 token 时,
uploadToken($bucket, $key, $expires, $policy)的$policy数组键名要小写,比如callbackurl是错的,必须是callbackUrl - 若项目还混着 v6 的写法(比如
Qiniu\Storage\UploadManager配合旧 Auth),建议统一锁死版本:composer require qiniu/php-sdk:^6.1
回调收不到?先查这三件事
很多问题不是逻辑错,而是环境或配置卡住。
立即学习“PHP免费学习笔记(深入)”;
- 检查
callbackUrl是否被 Nginx/Apache 拦截(比如重写规则把/callback转成了/index.php/callback)—— 七牛只认你写的原始 URL - 用
curl -v -X POST [callbackUrl] -d 'xxx'模拟回调,看是否真能进脚本;再查 PHP 错误日志有没有Undefined index: HTTP_X_QINIU_CALLBACK_SIGNATURE - 确认服务器时间偏差 ≤15 分钟(
ntpdate -q pool.ntp.org),签名含时间戳,偏差大会直接拒收



















