美团AI门店识别API无官方PHP SDK,需手动构造HMAC-SHA256签名、multipart/form-data请求(file字段上传)、严格校验图片格式/尺寸/时间戳,返回shop_name和address可能为空,confidence<0.5应丢弃。

美团AI门店识别API没有官方PHP SDK
直接调用美团开放平台的门店识别接口,得自己写HTTP请求,不能靠composer require meituan/ai-sdk这种东西——它根本不存在。美团只提供了Java、Python的示例代码,PHP得手动拼签名、构造multipart/form-data请求体、处理返回JSON。
常见错误现象:401 Unauthorized(签名错)、400 Bad Request(图片没传对字段)、500 Internal Error(图片太大或格式不被支持)。
- 必须用
POST方法,且Content-Type不能设成application/json,得让cURL自动处理边界(即不显式设置Content-Type头) - 图片文件必须通过
file字段上传,不是image、不是photo,就是file - 签名参数
timestamp和nonce要和服务端时间误差在5分钟内,否则拒绝 - 图片限制:JPG/PNG,≤5MB,宽高≥100px,推荐尺寸1080×1920以内
签名生成必须用HMAC-SHA256 + URL编码拼接
美团要求把所有请求参数(含app_key、timestamp、nonce、sign_method)按字典序排序后,用=连接键值、&连接参数对,再对整个字符串做HMAC-SHA256,最后Base64编码。漏掉URL编码任意一个参数值,签名就失效。
容易踩的坑:http_build_query()默认不编码+号,但美团要求空格转%20而非+;urlencode()又会把/、:也编码,而美团只要求对参数值做urlencode(),不包括键名。
立即学习“PHP免费学习笔记(深入)”;
- 正确做法:遍历参数数组,对每个
$value单独urlencode(),再拼"{$key}={$value}" -
sign_method固定填HMAC-SHA256,大小写敏感 - 生成签名前,确保
app_secret是原始密钥,没被base64_decode过、也没被trim过空格
cURL上传图片必须用CURLFile(PHP 5.5+)
老式@/path/to/file语法在PHP 5.6+已被废弃,且在某些cURL版本里会直接导致400。必须用CURLFile对象,否则美团服务端解析不到file字段。
典型错误:Notice: Use of undefined constant CURLFile(PHP版本太低)、curl_setopt(): CURLOPT_POSTFIELDS with array containing <code>string keys requires CURLFile for files(混用了字符串键和@语法)。
- 检查PHP版本:
php -v≥ 5.5,推荐7.4+ - 构造上传字段:
'file' => new CURLFile(realpath('/tmp/photo.jpg'), 'image/jpeg') - 不要用
file_get_contents()读图再塞进数组——这传的是二进制内容,不是文件句柄,服务端收不到MIME头 - 如果服务器禁用了
curl_file_create(),就用new CURLFile(...),别试图绕过
返回结果里shop_name和address可能为空
美团识别不是OCR通用引擎,它是专为门店招牌优化的模型。如果照片里没有清晰招牌、文字太小、反光、角度倾斜超过30度,或者商户名本身没出现在招牌上(比如只有Logo),shop_name大概率是null或空字符串。地址字段更是依赖招牌上的完整信息,缺字、模糊、多行堆叠都会导致识别失败。
真实使用场景中,约35%的合格照片(尺寸/格式合规)仍无法提取出有效地址,confidence低于0.6的基本不可信。
- 务必检查返回里的
code字段:200 ≠ 成功,得看data.result.shop_name是否非空 -
data.result.confidence低于0.5时,建议丢弃结果,别硬用 - 没有
address不等于没识别到店,有时shop_name准确但地址字段缺失,可结合地图逆地理编码兜底 - 别在循环里高频调用——QPS限制严格,超限直接封IP段,且无预警











