美团无官方PHP SDK,所有第三方SDK均不可靠;应自行实现签名(字典序拼接非空参数+secret后sha256)、JSON请求体(UTF-8、无空格)、timestamp(NTP同步)、cURL配置(生产环境启用SSL验证)。

美团开放平台 PHP SDK 不是官方维护的
美团开放平台没有发布过官方 PHP SDK,所有所谓“美团官方 PHP SDK”都是第三方封装,稳定性、更新及时性、签名逻辑准确性都存疑。直接抄用容易在 sign 计算、timestamp 时区、body 序列化方式上出错,导致 401 或 “签名错误”。
建议自己实现核心调用逻辑,控制签名、请求头、参数拼接三个关键环节:
-
sign必须按文档要求:对除sign外所有非空请求参数(含 URL query 和 JSON body 字段)做字典序排序后拼接key=value,再拼上secret,最后用sha256哈希 - POST 请求必须带
Content-Type: application/json; charset=utf-8,且body是严格 UTF-8 编码的 JSON 字符串(不能有多余空格或换行) -
timestamp用time()即可,但需确保服务器时间与 NTP 同步,偏差超过 5 分钟会拒收
订单同步接口要用 POST + JSON,不是 GET
美团外卖订单同步接口(如 /api/v1/order/query 或事件回调验证用的 /api/v1/webhook/verify)全部要求 POST 方法,且请求体为 JSON。用 file_get_contents('php://input') 拿不到原始 body —— 那是给 Webhook 回调用的;主动调用时得自己构造 JSON 并传给 curl_setopt($ch, CURLOPT_POSTFIELDS, $json)。
常见翻车点:
立即学习“PHP免费学习笔记(深入)”;
- 把参数写在 URL 上当 GET 请求发,返回
{"code":405,"msg":"Request method not supported"} - 用
http_build_query()发送,服务端解析失败,返回{"code":400,"msg":"Invalid json format"} - JSON 中中文没转义或编码不一致,比如用了 GBK 写字符串再
json_encode(),导致签名和实际 body 不一致
签名计算前必须规范参数键名和值类型
美团签名不是只对业务参数做,而是对「所有参与签名的字段」——包括 app_key、timestamp、sign(此时为空)、以及业务参数(如 start_time、end_time)——统一小写、去空格、过滤 null 值后排序拼接。PHP 里最容易漏的是:
-
json_encode()后再json_decode($json, true)会把数字字符串(如"123")转成整型123,签名时类型不一致导致验签失败 - 业务参数里有嵌套数组(如
"foods": [{"id":"1","num":2}]),不能直接丢进签名拼接,必须 flatten 或按文档说明跳过(通常只签一级参数) -
app_secret末尾有换行或空格,复制时没注意,trim($secret)忘加
cURL 调用要关掉 SSL 验证仅限测试环境
生产环境必须用系统 CA 或指定 curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'),否则可能遇到 SSL certificate problem: unable to get local issuer certificate。开发时临时关 SSL 验证可以加:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
但上线前必须删掉这两行,且确认服务器已安装最新 CA 包。另外注意:CURLOPT_TIMEOUT 建议设为 15 秒以上,美团部分接口响应较慢,超时会导致订单查漏。
签名、编码、时钟、证书——这四个点只要一个没对齐,就会卡在“请求成功但返回签名错误”或者“连通但数据为空”,调试时优先打日志看最终拼出的待签名字符串和实际发出的 JSON 是否完全一致。



















