必须通过OAuth 2.0获取access_token才能调用百度网盘API;需在开放平台创建应用获取client_id/client_secret,用code换取token,scope至少含basic,netdisk,token30天过期且不可刷新。

PHP 调用百度网盘 API 前必须搞清鉴权方式
百度网盘开放平台不支持直接用账号密码调用,必须走 OAuth 2.0 授权流程获取 access_token。跳过这步,所有请求都会返回 {"error":"invalid_access_token","error_description":"The access token is invalid."}。
你得先在 百度网盘开放平台 创建应用,拿到 client_id 和 client_secret,再引导用户访问授权地址(带 response_type=code),拿到临时 code 后,用它向 https://openapi.baidu.com/oauth/2.0/token 换取 access_token。
- 注意
scope至少要包含basic,netdisk,否则上传会报insufficient_scope -
access_token有效期只有 30 天,且不能刷新(百度没提供refresh_token),得重新走授权流程 - 调试时建议用 Postman 先手动走通 OAuth 流程,再写 PHP 逻辑,避免把鉴权和上传逻辑混在一起排查
上传文件必须用 upload 接口,不是 upload_chunk
百度网盘 API 文档里有 upload(简单上传)和 upload_chunk(分片上传)两个接口。95% 的小文件场景(upload,它是一次性 POST 表单,不用预处理、不分片、不校验 MD5,最直接。
用错成 upload_chunk 会导致:请求返回 {"error_code":31072,"error_msg":"param error"},因为该接口要求先调 precreate,再传多个 chunk,还强制校验 content-md5 和 content-crc32,对普通上传纯属增加复杂度。
立即学习“PHP免费学习笔记(深入)”;
-
upload接口地址是https://pan.baidu.com/rest/2.0/xpan/file,method=upload - 必须用
multipart/form-data提交,file字段名固定为file,不能改 -
path参数要以/开头,比如/test/photo.jpg,否则返回invalid param path - PHP 中用
cURL上传时,curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data)的$post_data必须是数组,不能是 JSON 字符串
PHP cURL 上传常见失败原因和绕过方法
即使参数都对,PHP 的 cURL 仍可能因底层配置失败:比如上传大文件时超时、SSL 验证失败、或服务器禁用了 curl_file_create()。
- 如果报
SSL certificate problem: unable to get local issuer certificate,别直接关CURLOPT_SSL_VERIFYPEER,先确认系统 CA 证书路径是否正确,或用curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem') - 上传超过 2MB 文件时,PHP 默认
post_max_size和upload_max_filesize会拦截,需提前检查ini_get('post_max_size') - PHP 5.5+ 推荐用
CURLFile构造上传项:new CURLFile('/tmp/a.jpg', 'image/jpeg', 'a.jpg');PHP 5.4 及以下只能拼 raw body + boundary,容易出错 - 百度接口对 User-Agent 有校验,空 UA 或非常规 UA(如
php-curl)可能被拒,加一句curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0')
上传成功后返回的 fs_id 是关键,但别依赖它做后续操作
上传成功响应体里有 fs_id 字段,看起来像文件唯一 ID,但它**不能用于分享、下载或删除接口**。百度网盘真正的文件标识是 path(即你传入的路径)+ access_token 组合,所有后续操作(如生成分享链接、获取下载直链)都得靠这个 path。
- 想获取下载直链?得调
https://pan.baidu.com/rest/2.0/xpan/file?method=download,传path和access_token,不是fs_id - 分享接口
share/create也只认path,传fs_id会返回file not exist -
fs_id在百度内部可能随同步、重命名等操作失效,它只是上传瞬间的快照,不是稳定标识
真正容易被忽略的是:百度网盘 API 对同一 path 重复上传默认覆盖,不会报错也不会提示。如果你没在 path 里加时间戳或随机后缀,下次上传同名文件,旧文件就没了,连回收站都不进。











