多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

高德地图API Key申请全流程:从账号注册到多平台配置避坑指南

高德地图API Key申请全流程:从账号注册到多平台配置避坑指南 1. 从零开始为什么每个做位置服务的团队都绕不开这一步做LBS基于位置的服务应用开发不管是做外卖配送、网约车、共享出行还是做门店选址、物流追踪、运动轨迹记录地图能力几乎是绕不开的基础设施。而在国内的技术选型里高德地图的开放平台是绝大多数团队的首选方案之一。原因很直接底图数据更新及时、POI兴趣点覆盖密度高、路径规划算法成熟、SDK对移动端和Web端的支持都比较完整而且免费额度对于中小型项目来说基本够用。但问题来了——很多刚接触这块的开发者包括一些已经写了几年业务代码但没碰过地图的同学第一次打开高德开放平台官网的时候往往会卡在第一步账号怎么注册开发者认证怎么做应用怎么创建Key怎么申请SHA1和包名怎么填这些看起来是“点几下”的事情实际操作起来坑不少。我见过有团队因为Key没配好调试了一整天以为是网络问题也见过有人把Web服务的Key填到Android项目里结果一直报“INVALID_USER_KEY”。这篇文章就是把这个流程彻底讲透。从账号注册、实名认证、创建应用、添加Key、配置SHA1和PackageName到不同平台Android、iOS、Web端、Web服务的Key有什么区别再到常见报错怎么排查我会按照一个真实项目的落地顺序一步一步拆开讲。每一段都会说清楚“为什么这么做”而不只是“点这个按钮”。适合刚接触地图开发的初学者也适合需要给团队新人做培训的Tech Lead直接拿去当参考材料。2. 账号注册与开发者认证地基没打好后面全是坑2.1 注册前的准备工作与账号类型选择高德开放平台的账号体系是跟阿里系的账号打通的你可以用手机号注册也可以用已有的账号体系快捷登录。这里我建议用手机号单独注册一个开发者账号不要图省事用个人社交账号直接授权登录。原因有两个第一后续企业认证的时候账号主体信息变更会比较麻烦第二团队协作场景下独立的开发者账号更方便做权限管理和交接。注册本身没什么难度打开高德开放平台官网找到注册入口填手机号、收验证码、设置密码两分钟搞定。但注册完之后你会面临第一个关键选择个人开发者还是企业开发者这个选择直接影响你后续能用的服务类型和配额。个人开发者认证流程简单身份证实名就行适合做个人项目、学习Demo、小型工具类应用。但个人开发者的调用配额相对有限而且部分高级服务比如某些精准定位能力、高精度的路径规划接口可能无法开通。企业开发者需要提供营业执照等信息审核周期稍长但配额更高、可用服务更全适合商业项目。我的建议很明确如果你做的是要上线的商业项目一开始就用企业认证。不要先用个人账号跑通再迁移因为Key和应用是绑定在账号下的迁移意味着重新创建应用、重新配置Key、重新测试纯属给自己找活干。2.2 实名认证的具体操作与审核要点注册完账号后的第一件事就是做实名认证。没有认证的账号创建应用时会受限很多服务根本调不通。个人认证的流程是进入控制台找到“账号管理”或“实名认证”入口选择个人认证上传身份证正反面照片填写真实姓名和身份证号然后进行人脸识别或者等待人工审核。通常几分钟到几小时就能通过。企业认证的流程稍微复杂一些需要填写企业名称、统一社会信用代码、法人信息上传营业执照扫描件可能还需要对公账户打款验证或者法人人脸识别。审核周期一般是1到3个工作日。这里有几个实操中容易踩的坑营业执照信息要跟账号注册信息一致。如果注册用的是个人手机号但认证的是企业需要确保企业信息填写准确否则审核会被打回。身份证照片要清晰、四角完整。我见过有人因为照片反光被退回三次白白等了好几天。认证通过后不要急着改账号信息。有些信息变更会触发重新审核期间服务可能会受影响。注意实名认证是调用所有高德开放平台服务的前提。没有完成认证你连创建应用的入口都找不到或者创建了也无法添加Key。这一步千万别跳过。2.3 控制台界面速览找到你该去的地方认证通过后你会进入高德开放平台的控制台。控制台的左侧导航栏通常包含这几个核心模块应用管理、Key管理、数据管理、配额管理、财务中心、账号设置。对于刚上手的开发者来说你只需要重点关注两个地方应用管理和Key管理。应用管理是你创建和管理应用的地方Key管理是查看和配置具体Key的地方。实际上在现在的版本里创建应用和添加Key是连贯的操作你创建一个应用后系统会引导你直接添加Key。控制台首页一般会显示你账号下的应用数量、Key数量、今日调用量、配额使用情况等概览信息。建议养成习惯上线后定期看这里的调用量曲线一旦发现异常飙升可能是Key泄露或者代码里有死循环调用能帮你快速定位问题。3. 创建应用与Key申请不同平台的Key完全不是一回事3.1 创建应用的完整流程与命名规范在控制台找到“应用管理”点击“创建新应用”。这时候会让你填两个东西应用名称和应用类型。应用名称随便填不这里有个经验之谈。应用名称要能让你在半年后还认得出来。我见过太多人创建了一堆叫“测试”“demo”“我的应用”的项目过两个月回来完全不知道哪个是哪个。建议的命名格式是项目名-平台-用途比如外卖用户端-Android-生产、物流后台-Web服务-测试。这样一眼就能看出这个应用是干什么的、跑在哪个端、是什么环境。应用类型一般选“出行”或“生活服务”之类的分类这个分类主要是给平台做统计用的不影响功能但尽量选贴近你实际业务的类别。创建完应用后你会进入应用详情页。这时候注意应用本身只是一个容器真正干活的是Key。一个应用下可以添加多个Key分别对应不同的平台和服务。3.2 Key的类型解析Android、iOS、Web端、Web服务到底怎么选这是整个流程里最容易出错的地方。高德的Key不是万能的每个Key绑定一种平台类型用错了平台接口直接报错。Key类型适用场景核心配置项常见误用Android平台Android App内嵌地图SDKSHA1、PackageName填了Web服务的Key报INVALID_USER_KEYiOS平台iOS App内嵌地图SDKBundle IdentifierBundle ID填错地图白屏Web端JS API浏览器网页地图域名白名单没配域名本地调试都调不通Web服务服务端HTTP接口调用IP白名单可选把服务端Key暴露在前端代码里微信小程序小程序内地图组件AppID跟公众号的AppID搞混选Key类型的时候问自己一个问题这个Key会在哪里被调用如果是Android App里选Android平台如果是浏览器里的JavaScript代码选Web端如果是你的后端服务器去调高德的REST API选Web服务。提示一个项目如果需要同时支持Android、iOS和Web那就需要创建三个Key分别配置。不要试图用一个Key打通所有平台这是不可能的。3.3 SHA1与PackageNameAndroid开发者最容易翻车的地方Android平台的Key需要填两个东西SHA1指纹和PackageName包名。这两个填错了地图SDK初始化就会失败通常表现为地图一片空白或者直接崩溃。先说PackageName。这个就是你Android项目的applicationId在build.gradle里能看到。比如com.example.myapp。注意调试包和发布包的包名可以不一样如果你在测试阶段用了com.example.myapp.debug这样的后缀那Key里填的包名也要对应上。再说SHA1。这是Android签名证书的指纹。获取方式有两种方式一用keytool命令行获取keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android这是获取调试版SHA1的命令。如果你用的是发布版签名把keystore路径和密码换成你自己的。方式二在Android Studio的Gradle面板里获取在Android Studio右侧的Gradle面板中找到Tasks android signingReport双击运行控制台会输出所有变体的SHA1和MD5。这里有个大坑很多开发者只填了调试版的SHA1上线后发现地图用不了。因为发布版用的是另一个签名文件SHA1完全不同。正确的做法是在Key配置里把调试版和发布版的SHA1都填上用分号隔开。这样开发和上线都能用同一个Key。还有一个坑如果你用了Google Play的App Signing功能Google会重新签名你的APK这时候你需要从Google Play Console里获取“应用签名证书”的SHA1而不是你本地keystore的SHA1。这个细节很多人不知道上线后地图挂了才到处找原因。3.4 iOS平台的Bundle Identifier配置要点iOS平台的Key配置相对简单只需要填Bundle Identifier也就是Xcode项目里的Bundle ID比如com.example.myapp。但这里也有一个常见问题如果你有多个Target或者多个环境Debug/Release用了不同的Bundle ID那Key里需要把这些Bundle ID都填上。高德支持一个Key绑定多个Bundle ID用逗号分隔。另外iOS的Key不需要填证书指纹但需要确保你的App在调用地图SDK时Bundle ID跟Key里配置的一致。如果用了TestFlight或者企业分发Bundle ID通常不变所以问题不大。3.5 Web端与Web服务Key的域名和IP白名单Web端的KeyJS API需要配置域名白名单。也就是说你指定哪些域名下的网页可以调用这个Key。比如你填了example.com那只有这个域名下的页面能正常加载地图。本地开发的时候可以填localhost或者127.0.0.1。但注意不要填*通配符虽然后台可能允许你这么填但这意味着任何网站都能盗用你的Key配额被刷爆是分分钟的事。Web服务的Key可以配置IP白名单限制只有特定IP的服务器能调用。这个对于服务端接口来说是很重要的安全措施。如果你的服务器有固定公网IP强烈建议配上。如果没有固定IP比如用了弹性伸缩的云服务那就不配但要做好Key的保密工作不要把它提交到公开的代码仓库里。注意Web服务的Key绝对不能放在前端代码里。我见过有人在JavaScript里直接调高德的REST API把Web服务的Key写在了前端结果被人扒出来刷了几百万次调用配额直接爆掉。服务端的Key就老老实实放在服务端。4. 从配置到调用完整实操流程与参数计算4.1 一个Android项目的完整Key配置实录假设我们现在要做一个Android端的外卖用户App包名是com.example.fooddelivery需要集成高德地图SDK。下面是完整的操作流程。第一步获取调试版SHA1在Android Studio的Terminal里执行keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android输出里找到SHA1:那一行复制冒号后面的40位十六进制字符串。第二步获取发布版SHA1如果你已经有发布版的keystore执行keytool -list -v -keystore /path/to/your/release.keystore -alias your_alias输入密码后同样找到SHA1。第三步在高德控制台创建Android Key进入应用详情页点击“添加Key”选择“Android平台”。填写Key名称外卖用户端-Android发布版安全码SHA1填入发布版SHA1调试版安全码SHA1填入调试版SHA1PackageNamecom.example.fooddelivery提交后系统会生成一个32位的Key字符串。第四步在Android项目中配置Key在AndroidManifest.xml里添加meta-data android:namecom.amap.api.v2.apikey android:value你申请到的Key/第五步验证在代码里初始化地图如果地图能正常显示说明Key配置成功。如果地图空白先检查SHA1和包名是否跟Key里填的一致。4.2 Web端JS API的域名配置与本地调试方案Web端的地图开发Key配置的核心是域名白名单。假设你的网站是https://www.example.com那就在Key配置里填这个域名。本地开发的时候你可能会用http://localhost:3000或者http://127.0.0.1:8080来调试。这时候需要在白名单里把localhost和127.0.0.1也加上。高德允许一个Key配置多个域名用英文逗号分隔。但这里有个细节域名白名单不支持端口号。也就是说你填localhost就行不用填localhost:3000。高德会自动匹配所有端口。还有一个常见问题如果你的网站同时有HTTP和HTTPS版本建议只保留HTTPS并在Key里配置HTTPS域名。HTTP版本的地图加载可能会被浏览器拦截。4.3 Web服务Key的调用示例与配额计算Web服务的Key用于服务端调用高德的REST API比如地理编码、路径规划、POI搜索等。下面是一个Python示例演示如何用Web服务Key调用地理编码接口import requests def geocode(address, key): url https://restapi.amap.com/v3/geocode/geo params { address: address, key: key, output: JSON } response requests.get(url, paramsparams) data response.json() if data[status] 1: return data[geocodes][0][location] else: return None # 调用示例 key 你的Web服务Key location geocode(北京市朝阳区某地址, key) print(location) # 输出116.481028,39.989643关于配额高德的免费配额是按“日调用量”计算的。不同服务的配额不一样比如地理编码的免费配额通常是每天几千次路径规划可能少一些。你可以在控制台的“配额管理”里看到具体数字。计算你的配额需求假设你的App日活是1万每个用户平均触发2次地理编码请求那你每天需要2万次调用。如果免费配额只有5000次那就需要提前申请提额或者考虑付费方案。提示配额是按Key计算的不是按账号。如果你有多个Key每个Key有独立的配额。但注意高德对账号下的总配额也有限制不是无限叠加的。4.4 多环境Key管理策略开发、测试、生产怎么隔离一个正规的项目通常有三个环境开发、测试、生产。对应的地图Key也应该有三套。为什么要隔离因为如果你用同一个Key开发环境的调试请求会消耗生产环境的配额而且一旦开发环境的Key泄露影响的是整个项目。建议的做法是开发环境每个开发者可以有自己的Key或者团队共用一个开发Key配额不用太高。测试环境独立的Key用于集成测试和QA验证。生产环境独立的Key配置严格的域名/IP白名单配额根据实际用户量申请。在代码里通过构建变体Build Variant或者环境变量来切换Key。Android项目可以在build.gradle里配置不同的manifestPlaceholdersWeb项目可以用环境变量注入。5. 常见报错与排查技巧实录5.1 高频错误码速查表错误码含义常见原因解决方法INVALID_USER_KEYKey无效Key填错、Key类型不匹配、Key被删除检查Key是否复制完整确认平台类型USER_KEY_PLATFORM_ERRORKey平台错误用Android Key调Web服务换成对应平台的KeyINVALID_USER_SCODESHA1或包名不匹配SHA1填错、包名不一致重新获取SHA1核对包名USER_KEY_QUOTA_EXCEEDED配额超限调用量超过免费额度申请提额或优化调用频率INVALID_USER_DOMAIN域名不匹配Web端Key的域名白名单没配添加当前域名到白名单SERVICE_NOT_AVAILABLE服务未开通未申请该服务或未认证完成认证申请对应服务5.2 地图白屏、定位失败、接口报错的排查思路地图白屏是最常见的现象。排查顺序是检查Key是否填对包括大小写和空格。检查SHA1和包名是否跟Key配置一致。检查网络权限是否在Manifest里声明。检查地图SDK的初始化代码是否在setContentView之前调用。查看Logcat里有没有AMap相关的错误日志。定位失败通常是权限问题。Android 6.0以上需要动态申请定位权限而且高德定位SDK还需要额外的后台定位权限如果需要后台定位。另外检查是否在AndroidManifest.xml里声明了ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION。接口报错先看错误码对照上面的速查表。如果错误码是INVALID_USER_KEY先确认Key有没有复制错。我遇到过有人把Key末尾的空格也复制进去了结果一直报错找了半天才发现。5.3 独家避坑经验那些文档里不会写的东西坑一SHA1获取时的默认密码。调试版keystore的默认密码是android但有些同学在创建自己的keystore时改了密码然后用默认密码去获取SHA1当然会失败。记住获取SHA1时的密码是你创建keystore时设置的密码。坑二Key的复制粘贴。高德的Key是32位字符串包含数字和小写字母。复制的时候很容易多复制一个空格或者少复制一个字符。建议复制后粘贴到文本编辑器里确认长度是32位。坑三Web端Key的域名白名单不支持通配符。你不能填*.example.com来匹配所有子域名必须把每个子域名都列出来。如果子域名很多考虑用一个统一的域名做代理。坑四配额是按自然日重置的。高德的配额重置时间是每天凌晨0点北京时间。如果你在晚上11点发现配额用完了等一个小时就恢复了。但不要养成卡点调用的习惯万一有延迟呢。坑五Key泄露的后果。如果你的Key被人恶意使用轻则配额被刷爆重则账号被限制。所以生产环境的Key一定要配好白名单不要图省事填*。坑六Android的SHA1有调试版和发布版之分。很多开发者只填了一个结果要么开发时能用上线不能用要么上线能用开发时不能用。正确的做法是两个都填。坑七iOS的Bundle ID区分大小写。com.example.MyApp和com.example.myapp是两个不同的Bundle ID填错了Key就无效。坑八Web服务的Key不要提交到Git。我见过有人在GitHub上开源了一个项目把高德的Web服务Key硬编码在代码里结果被人扒出来刷了几百万次调用。正确的做法是用环境变量或者配置文件并且把配置文件加入.gitignore。6. 上线前的最后检查确保你的Key配置万无一失6.1 上线检查清单在正式发布之前对照这个清单过一遍[ ] 生产环境的Key已经创建并且配置了正确的平台类型[ ] Android的发布版SHA1已经填入Key配置[ ] iOS的Bundle ID已经填入Key配置[ ] Web端的域名白名单已经配置且不包含*[ ] Web服务的IP白名单已经配置如果有固定IP[ ] 代码里的Key已经切换为生产环境的Key[ ] 配额已经根据预估用户量申请了足够的额度[ ] Key没有硬编码在公开的代码仓库里[ ] 监控告警已经配置调用量异常时能及时收到通知6.2 配额监控与告警设置高德控制台提供了配额使用情况的查看但告警功能可能需要你自己实现。建议的做法是在你的服务端代码里记录每次调用高德API的返回状态如果连续出现USER_KEY_QUOTA_EXCEEDED就触发告警。另外可以定期比如每天通过高德的配额查询接口获取当前用量跟阈值对比。如果用量超过80%就提前申请提额。6.3 团队协作中的Key管理规范如果是团队开发Key的管理需要有一套规范不要共享个人账号。每个团队应该有一个公共的开发者账号由专人管理。Key的创建和修改要有记录。谁在什么时候创建了什么Key用于什么项目都要有文档记录。离职交接时要检查Key。离职人员如果知道Key的信息应该及时更换Key或者修改白名单。测试环境和生产环境的Key要严格隔离。不要为了省事用同一个Key。我在实际项目中踩过最深的坑就是早期没有做环境隔离开发同学在本地调试时写了个死循环把生产环境的配额刷爆了导致线上服务中断了半个小时。从那以后我们团队就严格执行三套Key的策略再也没有出现过类似问题。6.4 后续扩展从单Key到多Key架构的演进当项目规模变大你可能会遇到单Key不够用的情况。比如你的App有多个业务线每个业务线的调用量都很大共用一个Key会导致配额竞争。这时候可以考虑多Key架构按业务线拆分Key每个业务线独立配额。按地域拆分Key比如国内和海外用不同的Key。按调用类型拆分Key比如地图展示和路径规划用不同的Key。但多Key也带来了管理复杂度。建议在项目初期就用配置化的方式管理Key不要硬编码。这样后续拆分的时候只需要改配置不用改代码。这个内容后续还可以这样扩展如果你需要做海外业务高德也提供了海外地图服务但Key的申请流程和配置方式跟国内略有不同需要单独申请。另外高德的小程序地图组件也有独立的Key体系如果你做微信小程序或者支付宝小程序需要单独创建对应平台的Key。这些我都会在后续的文章里单独展开讲。
返回列表