vr-shopxo-uniapp/docs/map-api-key-configuration.md

311 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 地图 API Key 配置文档
> 创建时间2026-06-04
> 更新说明2026-06-04 新建文档,记录各平台地图配置机制及 H5 鉴权失败问题排查
---
## 一、概述
本项目 vr-shopxo-uniapp 支持多端部署APP、H5、微信小程序等不同平台使用不同的地图 SDK对应的 API Key 配置方式也不同。
**问题背景**:在 H5 本地预览模式下,打开地图时报错 "鉴权失败,请传入正确的 key",经排查是腾讯地图 JS SDK 的 Key 配置问题。
---
## 二、各平台地图配置对比
| 平台 | 地图SDK | Key 配置位置 | Key 来源 | 是否需要服务端配置 |
|------|---------|-------------|----------|------------------|
| **APP (Android)** | 高德地图原生 SDK | `manifest.json``app-plus.distribute.sdkConfigs.maps.amap.appkey_android` | 固定写死 | ❌ 不需要 |
| **APP (iOS)** | 高德地图原生 SDK | `manifest.json``app-plus.distribute.sdkConfigs.maps.amap.appkey_ios` | 固定写死 | ❌ 不需要 |
| **H5** | 腾讯地图 JS SDK | `manifest.json``h5.sdkConfigs.maps.tencent.key` | 固定写死 | ❌ 不需要 |
| **微信小程序** | 微信内置地图 (`uni.openLocation`) | 无需配置 | 无需 Key | ❌ 不需要 |
| **微信小程序** (插件模式) | 腾讯位置服务插件 | 服务端 `config.common_tencent_map_ak` | 动态读取 | ✅ 需要 |
---
## 三、各平台详细配置
### 3.1 APP 高德地图配置
**配置文件**`manifest.json`
```json
"app-plus": {
"distribute": {
"sdkConfigs": {
"maps": {
"amap": {
"name": "amapu9VF72Gg",
"appkey_ios": "f55e9099897821681f5c74051e4527bd",
"appkey_android": "ebe9f1d84f8ceb8b3c4ba6ead2bfa78b"
}
}
}
}
}
```
**说明**
- `name`:高德地图应用名称
- `appkey_android`Android 平台 Key
- `appkey_ios`iOS 平台 Key
**申请地址**[高德开放平台](https://lbs.amap.com/)
---
### 3.2 H5 腾讯地图配置
**配置文件**`manifest.json`
```json
"h5": {
"sdkConfigs": {
"maps": {
"tencent": {
"key": "XZHBZ-4OUKA-SMSKV-CXXHB-OKOGQ-FSF6U"
}
}
}
}
```
**说明**
- 使用腾讯位置服务 WebServiceAPI Key
- Key 需在腾讯位置服务控制台申请
- 支持 Web JS API 调用
**申请地址**[腾讯位置服务控制台](https://lbs.qq.com/)
**常见问题**
- "鉴权失败,请传入正确的 key" → Key 无效或未申请
- Key 的服务权限需包含 WebServiceAPI
- 生产环境需在控制台配置安全域名(可选)
---
### 3.3 微信小程序配置
#### 3.3.1 默认模式(推荐)
微信小程序默认使用 `uni.openLocation()` → 调用微信内置地图,**无需配置任何地图 API Key**。
```javascript
// App.vue open_location 函数中的默认逻辑
uni.openLocation({
name: name,
address: address,
scale: scale,
longitude: lng,
latitude: lat,
});
```
**优点**
- 无需申请地图 Key
- 用户体验流畅(调用微信原生地图)
- 无额外配置
**缺点**
- 功能受限(无路线规划等高级功能)
#### 3.3.2 插件模式(可选)
如果需要使用腾讯位置服务的路线规划功能,可在微信小程序后台添加插件:
**配置步骤**
1. 登录 [微信小程序后台](https://mp.weixin.qq.com/)
2. 设置 → 第三方设置 → 插件管理 → 添加插件
3. 搜索「腾讯位置服务路线规划」并添加
**manifest.json 配置**
```json
"mp-weixin": {
"plugins": {
"routePlan": {
"version": "1.0.19",
"provider": "wx50b5593e81dd937a"
}
}
}
```
**代码调用**(需开启 `is_weixin_open_location_use_plugins = 1`
```javascript
// App.vue L1737-1750
if (this.data.is_weixin_open_location_use_plugins == 1) {
var key = this.get_config('config.common_tencent_map_ak') || null;
if (key != null) {
var plugin = requirePlugin('routePlan');
var end_point = JSON.stringify({
name: name,
longitude: lng,
latitude: lat,
});
uni.navigateTo({
url: 'plugin://routePlan/route-plan?key=' + key + '&referer=' + appName + '&endPoint=' + end_point,
});
}
}
```
**Key 来源**:服务端配置 `config.common_tencent_map_ak`
---
## 四、open_location 函数解析
**文件**`App.vue` L1721-1760
```javascript
open_location(lng, lat, name, address, scale) {
// 参数校验
if (lng == undefined || lat == undefined || lng == '' || lat == '') {
this.showToast('位置信息不正确');
return false;
}
lat = parseFloat(lat);
lng = parseFloat(lng);
// #ifdef MP-WEIXIN
// 微信小程序插件模式
if (this.data.is_weixin_open_location_use_plugins == 1) {
var key = this.get_config('config.common_tencent_map_ak') || null;
// 使用腾讯位置服务插件...
}
// #endif
// 默认:调用 uni.openLocation
uni.openLocation({
name: name,
address: address,
scale: scale || 18,
longitude: lng,
latitude: lat,
});
}
```
**调用链路**
1. `app.globalData.open_location(lng, lat, name, address)`
2. 平台条件编译(`#ifdef MP-WEIXIN`
3. 判断是否使用插件模式
4. 调用地图原生 API
---
## 五、服务端配置读取机制
**配置数据流**
```
服务端 API /api/common/base
响应写入缓存 key: 'cache_config_info_key'
App.vue this.get_config('config.xxx') 读取
```
**关键代码**`App.vue`
```javascript
// 获取配置(从缓存读取)
get_config(key, default_value) {
var config = uni.getStorageSync(this.data.cache_config_info_key) || null;
// 解析 key.xxx.yyy 格式
var arr = key.split('.');
// ...
}
// 初始化配置(从服务端拉取)
init_config(num = 0, object, method, params) {
uni.request({
url: this.get_request_url('common', 'base'),
method: 'POST',
data: { is_key: 1 },
success: (res) => {
if (res.data.code == 0) {
var data = res.data.data;
uni.setStorageSync(this.data.cache_config_info_key, data);
}
}
});
}
```
---
## 六、常见问题排查
### Q1: H5 预览报错 "鉴权失败,请传入正确的 key"
**原因**H5 的腾讯地图 Key 无效或未配置
**排查步骤**
1. 检查 `manifest.json``h5.sdkConfigs.maps.tencent.key` 是否存在
2. 登录 [腾讯位置服务控制台](https://lbs.qq.com/) 验证 Key 状态
3. 确认 Key 已开通 WebServiceAPI 服务
4. 如 Key 无效,重新申请并更新 `manifest.json`
### Q2: 微信小程序地图无法打开
**原因**:可能是权限问题或未正确声明位置权限
**排查步骤**
1. 检查 `manifest.json``mp-weixin.requiredPrivateInfos` 是否包含 `chooseLocation` / `getLocation`
2. 检查 `mp-weixin.permission.scope.userLocation.desc` 是否配置
3. 用户首次使用时需授权位置权限
### Q3: APP 地图无法定位
**原因**:高德地图 Key 配置错误或未申请原生定位模块
**排查步骤**
1. 检查 `manifest.json``app-plus.modules.Geolocation` 是否启用
2. 检查 `app-plus.distribute.sdkConfigs.maps.amap.appkey_android` 是否正确
3. 检查 `AndroidManifest.xml` 是否配置定位权限(通常由云打包自动处理)
### Q4: 服务端配置 `config.common_tencent_map_ak` 未生效
**原因**:配置未同步或缓存问题
**排查步骤**
1. 确认服务端 `common/base` API 返回了 `config.common_tencent_map_ak` 字段
2. 清除小程序缓存,重新加载配置
3. 检查 `is_weixin_open_location_use_plugins` 是否设置为 1
---
## 七、配置检查清单
| 项目 | 检查点 | 状态 |
|------|--------|------|
| **H5 腾讯地图** | `manifest.json``h5.sdkConfigs.maps.tencent.key` 是否有效 | ✅ 已更新 |
| **APP 高德地图 Android** | `manifest.json``appkey_android` 是否有效 | ✅ 正常 |
| **APP 高德地图 iOS** | `manifest.json``appkey_ios` 是否有效 | ✅ 正常 |
| **微信小程序** | `manifest.json``requiredPrivateInfos` 包含位置权限 | ✅ 正常 |
| **微信小程序插件模式** | 服务端配置 `config.common_tencent_map_ak` | 可选功能 |
---
## 八、参考链接
| 资源 | 地址 |
|------|------|
| 腾讯位置服务控制台 | https://lbs.qq.com/ |
| 高德开放平台 | https://lbs.amap.com/ |
| uni.openLocation 文档 | https://uniapp.dcloud.net.cn/api/location/open-location.html |
| uni.getLocation 文档 | https://uniapp.dcloud.net.cn/api/location/get-location.html |
| 微信小程序地图组件 | https://developers.weixin.qq.com/miniprogram/dev/component/map.html |
---
## 九、更新记录
| 日期 | 更新内容 |
|------|---------|
| 2026-06-04 | 新建文档,记录各平台地图配置机制及 H5 鉴权失败问题排查 |
| 2026-06-04 | 更新 `manifest.json` 中的 H5 腾讯地图 Key`XZHBZ-4OUKA-SMSKV-CXXHB-OKOGQ-FSF6U` |