推荐用 curl 发起高德 api 请求,需设超时、正确编码参数、手动设置 content-type,签名须按字典序拼接非 key 参数并 md5(utf-8 小写),注意 location 格式、key 位置及缓存策略。

怎么用 PHP 发起高德 API 的 HTTP 请求
高德地图 API 是纯 HTTP 接口,PHP 本身不提供专用 SDK,直接用 file_get_contents() 或 curl 就能调;但别图省事用 file_get_contents() 直接读 URL——它默认不支持超时和错误码捕获,线上一抖就挂。
推荐用 curl,可控性强,也方便加签名、处理重定向和编码问题:
-
curl_setopt($ch, CURLOPT_TIMEOUT, 5)必设,高德公开接口 SLA 是 1s 内响应,设 5s 防网络毛刺 - 必须手动设置
Content-Type: application/x-www-form-urlencoded(POST)或不设(GET),高德不认application/json - 所有参数要
urlencode(),尤其是address或keywords含中文时,rawurlencode()更稳妥 - 返回是 JSON,记得用
json_decode($res, true),高德的status字段是字符串"1"而非整数,别用=== 1判成功
PHP 签名怎么算才不被高德拒绝
高德要求对请求参数(除 key 外)按字典序拼接后加 key 做 MD5,但很多人卡在“排序对象”和“编码一致性”上:不是所有参数都要参与签名,比如 extensions、callback 这类可选字段漏了或多了都会验签失败。
关键点:
- 只对实际发起请求时带上的参数签名(不含
key),空值参数(如city=)也要参与排序和拼接 - 拼接格式是
key1=value1&key2=value2&key3=value3&key=xxx,注意&是 & 符号,不是&实体 - MD5 前必须用
utf-8编码,如果原始地址来自 GBK 表单,先mb_convert_encoding($addr, 'UTF-8', 'GBK') - 签名结果转小写,高德校验严格,
MD5(...)返回大写会失败
定位接口返回 "status":0 或 "infocode":"10005" 怎么排查
"status":0 表示服务端拒绝,不是网络失败;"infocode":"10005" 是“参数非法”,但高德不告诉你哪个参数错了。常见真实原因比文档写的更琐碎:
-
location参数格式错:必须是"116.481499,39.990410"(经度在前,逗号英文半角,不能有空格),写成"39.990410,116.481499"就返回 0 -
key放错位置:不能放在 POST body 里再额外带 query string,必须统一在 URL 上,否则签名和 key 不匹配 - IP 白名单没生效:即使控制台开了“任意 IP”,也要确认是否绑定了“Web 服务”类型 key,移动端 SDK key 和 Web 服务 key 不通用
- QPS 超限返回的是
infocode:10021,但有时和 10005 混淆,用curl -v看响应头里的X-Request-ID去高德控制台查日志更准
PHP 里缓存高德响应要不要做、怎么做
高德对相同参数的请求有缓存策略(比如同一地址转坐标,10 分钟内重复请求可能走内部缓存),但 PHP 层不做本地缓存,意味着每次都要发网路请求——尤其做批量导入时,很容易触发 QPS 限流。
轻量缓存建议直接用文件(不用 Redis 增加部署复杂度):
- 缓存键用
md5($api_url),避免路径含特殊字符;文件内容存完整 JSON 响应 + 时间戳 - 读缓存前检查文件修改时间,高德 POI 搜索类接口建议缓存 1 小时,地理编码(地址转坐标)建议缓存 7 天(地址变动极少)
- 注意并发写冲突:用
flock()包住file_put_contents(),否则多个请求同时写一个缓存文件会丢数据 - 别缓存
status != 1的响应,比如infocode:10003(请求过于频繁)这种临时错误,缓存它会让问题持续更久
签名逻辑、URL 构造、缓存键生成这三处最容易随业务迭代出错,改之前最好拿一组已知成功的请求参数打个 log 快照,不然上线后定位慢得难受。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











