PHP无法直接调用小米运动健康API,因无官方SDK、接口未向普通开发者开放,仅限小米生态内审核通过的硬件厂商或预装应用;需通过米家IoT平台授权获取设备数据,且签名依赖设备上下文,本地直连极易失败。

小米运动健康 API 没有公开的 PHP 官方 SDK
直接调用小米运动健康数据,PHP 本身不提供封装好的库。你看到的所谓“SDK”基本是第三方非官方、未维护、甚至已失效的 GitHub 项目。小米从未开放过面向普通开发者的步数/卡路里拉取接口 —— 这类数据属于用户敏感健康信息,只对小米生态内严格审核的硬件厂商或预装应用开放。
常见错误现象:401 Unauthorized、403 Forbidden、{"code":40001,"msg":"invalid app_id"},本质都是因为没通过小米 OAuth2.0 授权体系,或根本没拿到对应权限(health.step.read、health.calorie.read)。
使用场景受限于:必须是已上架小米应用商店的 App,且在小米开发者后台完成「运动健康」能力申请,并签署数据合规协议。个人开发者、测试号、未备案域名一律无法通过审核。
PHP 能做的只有模拟登录 + 抓包解析(不推荐)
部分人尝试用 PHP 的 curl 模拟小米运动 App 的请求,走登录态 Cookie 或抓取手机抓包后的 https://api.health.xiaomi.com/v1/... 接口。这条路理论上可行,但极不稳定:
立即学习“PHP免费学习笔记(深入)”;
- 小米服务端频繁校验设备指纹、UA、TLS 指纹、请求签名(
X-App-Id、X-Signature等 header 必须动态生成) - 账号登录态有效期短,
refresh_token刷新逻辑复杂,且小米会主动踢掉异常登录 - 接口路径和参数随时变更,今天能跑通的代码下周大概率返回
{"code":5001,"msg":"invalid signature"} - 违反小米《开发者协议》第 4.2 条,存在封禁小米账号风险
真正可行的替代路径:走小米「米家」IoT 平台 + 授权设备数据
如果你的目标设备是小米手环、体重秤等已接入米家 App 的硬件,可改用小米 IoT 开放平台(miot-spec 协议),前提是该设备确实上报了步数/卡路里字段(多数手环仅上报 step_count,不报卡路里)。
实操要点:
- 在
https://dev.mi.com/console/创建项目,绑定设备型号,开通user:read和device:read权限 - 用 PHP 实现 OAuth2.0 授权码流程,获取
access_token(注意:不是小米账号 token,是米家平台 token) - 调用
https://api.home.mi.com/api/v2/user/get_user_device_data,传入did和type=step_count(卡路里字段名因设备而异,常见为calorie或energy_consumption) - 响应中数据是时间序列,需自己按天聚合;单位可能为「千步」或「大卡」,注意文档说明
为什么本地 PHP 直连失败率高?关键在签名与设备上下文
小米健康类接口强制要求请求头带 X-App-Id、X-App-Key、X-App-Sign、X-App-Timestamp,其中 X-App-Sign 是对请求体 + 时间戳 + 密钥做的 HMAC-SHA256,且密钥不对外暴露。PHP 无法从网页或普通后端还原这个签名过程 —— 因为它依赖客户端设备的唯一 ID(device_id)、系统版本、甚至屏幕密度参与计算。
容易踩的坑:
- 误把小米账号登录页的
set-cookie当作有效凭证,实际健康接口校验的是另一套 session - 用 Postman 测试成功就以为 PHP 也能复现,忽略了 PHP cURL 默认不携带 TLS 扩展、SNI、ALPN,被服务器识别为非正规客户端
- 忽略时区问题:
X-App-Timestamp必须是秒级 Unix 时间戳,且误差不能超过 300 秒,PHP 服务器时间不准会导致签名永久失效
事情说清了就结束。











