前言
在集成百度地图 API 时,若开启了 SN 权限校验,Java 开发者常会遇到签名生成的难题。本文结合搜索 2.0 接口,梳理 SN 签名的核心逻辑与 Java 实现细节,帮助解决常见的校验失败问题。
SN 签名简介
什么是 SN 签名
SN(Signature)是百度地图用于验证请求合法性的安全机制。相比仅使用 AK 的访问方式,启用 SN 校验能有效防止密钥泄露导致的滥用风险。在之前的开发中,我们可能仅申请了应用并分配了 AK,通过 AK 完成接口调用。但在使用部分高级服务或特定配置下,必须携带 SN 参数。
根据官方文档,当 AK 的校验方式为 SN 校验时,sn 和 timestamp 为必填参数。这确保了每次请求的唯一性和时效性。
如何开启 SN 签名
登录百度地图开放平台控制台,创建新应用或修改现有应用的校验方式。注意:
- 服务端 AK 不再支持浏览器端使用,请根据场景选择'服务端 AK'或'浏览器端 AK'。
- 请求校验方式默认使用 IP 限制,此处需选择 SN 校验。
提交后,系统会生成对应的 SK(Secret Key),请务必保存好,后续签名计算将用到它。
SN 签名算法
SN 的计算依赖于参数顺序。GET 请求建议使用 LinkedHashMap 保持插入顺序;POST 请求则可用 TreeMap 自动排序。核心流程如下:
- 将所有请求参数(不含 sn)按 key 排序拼接成字符串。
- 在字符串末尾追加 SK。
- 对整体字符串进行 UTF-8 URL 编码。
- 对编码后的字符串进行 MD5 加密,生成小写 32 位签名。
以检索接口为例,基础路径为 https://api.map.baidu.com/place/v2/search?,配合 query、region 等参数即可生成完整签名。
Java 中的应用
本节以地点搜索为例,展示如何在 Java 环境中实现 SN 签名的生成及具体调用。
请求 Map 参数化
首先定义一个数据请求参数 Map。由于 GET 请求依赖参数顺序,这里使用 LinkedHashMap。
Map<String, String> params = new LinkedHashMap<>();
String query = "邮政";
String region = "158"; // 158 表示长沙市
String scope = "2";
String output = "json";
String ret_coordtype = "WGS84";
;
;
params.put(, query);
params.put(, region);
params.put(, output);
params.put(, scope);
params.put(, ret_coordtype);
params.put(, String.valueOf(pageSize));
params.put(, String.valueOf(pageNum));
params.put(, AK);


