饿了么云接口返回标准JSON,PHP用json_decode($json, true)解析;POST需设Content-Type: application/json并json_encode()请求体;token需动态管理与刷新;回调签名须用hash_hmac('sha256', raw body, app_secret)验证。

饿了么云数据接口返回的是 JSON,PHP 用 json_decode() 解析就行
饿了么开放平台(如“饿了么云”或“蜂鸟配送 API”)返回的数据基本都是标准 JSON 格式,不是 XML 或自定义协议。PHP 原生的 json_decode() 就够用,不需要额外封装或第三方库。
常见错误是直接 echo $response 看到一串乱码,其实是没解码——服务端返回的是字符串,不是 PHP 数组。
- 务必检查 HTTP 响应状态码是否为
200,再调用json_decode();否则可能把{"code":401,"msg":"token expired"}当正常数据解析 - 推荐始终传第二个参数
true:json_decode($json, true),得到关联数组而非对象,避免后续写$data->data->order_id却报错 - 如果
json_decode()返回null,用json_last_error_msg()查原因,90% 是响应体含 BOM、HTML 错误页混入、或 gzip 未解压
POST 写数据到饿了么云要用 curl_setopt() 设置 Content-Type: application/json
饿了么大多数写接口(比如创建订单、回调确认、运单上报)要求请求体是 JSON 字符串,并且必须带正确的 Content-Type 头。只用 file_get_contents() + stream_context_create() 容易漏掉这点,导致返回 {"code":400,"msg":"invalid json"}。
- 用 cURL 更可控:设置
CURLOPT_HTTPHEADER包含"Content-Type: application/json"和"Authorization: Bearer xxx" - 请求体必须是 JSON 字符串,不是 PHP 数组:
json_encode($payload, JSON_UNESCAPED_UNICODE),否则中文变 \uXXXX - 饿了么部分接口校验
Content-Length,建议显式设置:curl_setopt($ch, CURLOPT_POSTFIELDS, $json),不要手动拼Content-Length头
饿了么 OAuth2 token 过期要重试逻辑,不能硬编码 access_token
饿了么云接口普遍依赖短期 access_token(通常 2 小时),且不支持 refresh token 自动续期。很多开发者把 token 存成常量或配置文件,结果跑半天突然全量失败。
立即学习“PHP免费学习笔记(深入)”;
- 必须把
access_token存在可更新的地方:Redis、数据库或文件(注意并发写冲突) - 每次调用前检查有效期,用
time() > $token['expires_at']判断,而不是依赖缓存 TTL - 获取新 token 的请求本身也要加锁(例如用 Redis
SET key val NX EX 30),防止高并发下重复刷新,触发限流
签名验证饿了么回调(如订单事件)要用 hash_hmac('sha256', $body, $secret)
饿了么推送订单、配送状态等事件时,会在请求头里带 X-Eleme-Signature,这是对原始请求体做的 HMAC-SHA256 签名。不是简单 MD5 拼接,也不是 Base64 编码后再比对。
- 必须用原始 raw body(PHP 中需
file_get_contents('php://input')),不能用$_POST或$_REQUEST,否则字段顺序/编码/空格差异导致签名不一致 - 密钥是你在开放平台配置的
app_secret,不是app_key,别填反 - 比对时用
hash_equals($expected, $actual)防时序攻击,不用===
var_dump($http_response_header) 和 strlen(file_get_contents('php://input')),比查文档快。



















