调用美团配送API前必须确认access_token有效、sign签名正确、app_key已开通跑腿权限;下单需用http_build_query拼参,必传字段含origin_id等,地址须为完整中文;验签失败主因是参数未字典序排序、secret错误或时间戳超15分钟。

调用美团配送 API 前必须确认的三件事
不能直接发请求就完事——access_token 过期、sign 签名错、app_key 权限没开,三个里中一个,401 Unauthorized 或 403 Forbidden 就稳稳报给你。
-
access_token不是静态值,得先用client_id+client_secret调/api/v1/token换,有效期 2 小时,必须缓存并自动刷新 - 所有业务接口(比如下单)的
sign是对「排序后的全部非空参数 + secret」做sha256,不是md5,也不是拼接后 base64 —— 美团文档写得模糊,但实测只有hash_hmac('sha256', $str, $secret)对得上 - 你在美团开放平台申请的
app_key得手动勾选「跑腿配送」权限,否则即使签名和 token 都对,也会返回{"code":10001,"msg":"非法应用"}
PHP 下单接口(/api/v1/order/create)典型写法
别自己手搓 cURL 头和 body,用 http_build_query() 拼参,再统一加签名和 token,不然字段漏传或类型错(比如 goods_price 传了字符串)会返回 "code":20003 这种无意义错误码。
- 必传字段:
app_key、timestamp(秒级时间戳)、sign、origin_id(你系统的订单号)、receiver_phone、receiver_address、goods_price(单位:分,必须是整数) -
receiver_address必须是完整中文地址,不能带坐标;如果要指定骑手,得额外传preferred_courier_id,但该字段依赖商家开通「指定骑手」权限 - cURL 请求头固定加:
Content-Type: application/x-www-form-urlencoded,少这个,直接415 Unsupported Media Type
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
验签失败(sign error)的三个高频原因
美团不返回具体哪一步错了,只甩个 "code":40001,实际八成是签名环节翻车。
- 参数没按字典序排序就拼串 ——
ksort($params, SORT_STRING)必须在生成sign前执行,且要array_filter($params)去掉空值 -
secret拿错了:开发环境用的是「测试 secret」,上线后忘了切到「正式 secret」,两者不通用 - 时间戳
timestamp和美团服务器时间差超 15 分钟,签名直接失效 —— 别用time(),改用date('U')并校准 NTP 时间
异步回调(notify_url)怎么防重放和伪造
美团推送的订单状态变更(如已接单、已完成)走 HTTP POST 回调,不验签等于裸奔。
立即学习“PHP免费学习笔记(深入)”;
- 美团回调带
sign字段,验证方式和你调它接口一样:取除sign外所有参数,字典序排序 + 拼接 +hash_hmac('sha256', $str, $secret),和回调里的sign对比 - 必须检查
timestamp,拒绝 5 分钟前的回调,防止重放攻击 - 别一收到就更新订单状态 —— 先查库确认该
origin_id是否已处理过此status,避免重复发货或扣款











