调用美团AI视觉平台必须使用带签名的POST请求,签名需基于app_key、app_secret、timestamp、nonce及业务参数按字典序拼接后加app_secret做sha256 HMAC;图像须传base64编码(不含data:前缀),支持jpg/png,单图≤4MB;接口要求Content-Type和Accept均为application/json,超时设为30秒。

调用美团AI视觉平台前必须确认的认证方式
美团AI视觉平台不支持直接用 PHP 的 file_get_contents() 或简单 curl 发起请求——它强制要求带签名(sign)的 POST 请求,且签名基于 app_key、app_secret、时间戳和请求参数拼接后做 sha256 加密。漏掉任意一环都会返回 {"code":401,"msg":"invalid sign"}。
实操建议:
- 用
time()生成当前秒级时间戳(不是毫秒),作为timestamp参数传入 -
app_secret绝对不能硬编码在代码里,应从环境变量或配置文件读取 - 签名原文按字典序拼接所有非空请求参数(包括
app_key、timestamp、nonce、业务参数如image的 base64 值),再拼上app_secret,最后hash_hmac('sha256', $str, $app_secret) - 别用
md5()替代sha256,接口只认前者
菜品识别接口(/vision/food/detect)的图像传入要点
这个接口不接受图片 URL,只收 base64 编码后的图像数据(且要求去掉 data:image/jpeg;base64, 这类前缀)。如果传了 URL 或带前缀的 base64,会直接返回 {"code":400,"msg":"image format error"}。
实操建议:
- 用
file_get_contents($path)读图,再用base64_encode()编码,**不要**用data_uri方式构造字符串 - 图像尺寸建议控制在 1280×960 以内;超大图(如 4K)可能触发服务端截断或超时,但不会报错,只会识别结果变差
- 支持
jpg、png,不支持webp或 GIF;传 webp 会静默失败,返回空results数组 - 单次请求最大允许 4MB,PHP 默认
post_max_size可能卡在这里,需检查 php.ini
门店招牌识别(/vision/shop_sign/detect)的字段差异与响应解析
和菜品识别不同,招牌识别返回的 results 是一个对象数组,每个元素含 text(识别出的文字)、confidence(置信度)、bounding_box(坐标)。很多人直接 json_decode($res, true) 后遍历 $data['results'] 却拿不到 text,是因为美团返回的字段名是 content 而非 text。
实操建议:
- 务必检查响应结构:用
var_dump(array_keys($data['results'][0] ?? []))确认键名,实际是content、score、box -
score是 float 类型,范围 0–1,低于 0.6 的结果大概率不准,建议过滤 - 该接口对背光、反光招牌鲁棒性差;若图中有多块招牌,它只返回置信度最高的一块(不是全部)
- 不支持 batch 请求,一次只能传一张图
PHP cURL 调用时最容易被忽略的 header 和超时设置
美团接口要求 Content-Type: application/json,且必须带 Accept: application/json。少任何一个 header,可能返回 406 或 500 错误,而不是明确提示。
实操建议:
- 显式设置
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Accept: application/json']) - 必须设
curl_setopt($ch, CURLOPT_TIMEOUT, 30);默认 0(无限等待)会导致请求卡死,尤其在图像较大时 - 禁用
CURLOPT_SSL_VERIFYPEER是危险操作,但美团生产环境证书有时会因中间 CA 更新不及时导致验证失败;稳妥做法是更新系统 CA 包,或临时加curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem') - 别用
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1)的简写形式(如true),某些旧版 PHP 会误判为整数 1 导致返回资源句柄而非字符串
签名逻辑和图像编码稍有偏差,整个请求就废;而错误响应往往不报具体原因,只给模糊 code。与其反复试错,不如先用 Postman 拉通一次标准请求,再把 header、body、sign 规则一一对齐到 PHP 实现里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











