[签名校验]业务身份和业务签名 最后更新时间: 2024年01月16日
1. 业务Token
任意接口都必须传递业务Token参数用于业务安全身份验证,以QueryString形式传递,即作为url参数传递,参数名为:bizToken,具体值由高德服务端提供。
2. 业务签名
2.1 sig 签名参数
如果在请求过程中报以下错误,则证明url 传参的sig 错误。
处理方式有两种:
a.为每次请求正确的生成 sig 签名参数,可参照:https://lbs.amap.com/faq/quota-key/key/41181
b.关闭当前key 的sig 签名参数校验,在开发者后台、key 设置中操作,如下图;
2.2 bizSign签名参数
任意接口都必须进行业务签名,业务方在调用接口时根据接口指定的签名参数和密钥(由高德服务端提供)通过指定算法生成签名,注意点如下:
- 签名以QueryString形式传递,即作为url参数传递,参数名为:bizSign。
- 参与签名的参数以QueryString形式传递,即作为url参数传递,参数名见各个接口。请求类型ContenType为application/x-www-form-urlencoded时,参与签名的参数也可以放在body里。
- 签名算法:
- 按照接口签名参数的定义,按序拼接参数值,获取到字符串a。
- 上述拼接的参数字符串a后追加@符号再拼接密钥,获取到字符串b。
- 对上述字符串b进行url编码,获取到字符串c。
- 对c进行md5,获取到utf编码的大写字符串即为bizSign。
- 签名算法示例:Java语言。
package com.amap.wia.openapi.test.lib;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SignatureHelper {
/**
* 签名值计算。
*
* @param bizSecret 业务密钥。
* @param argValues 待签名的业务参数,按接口指定的参数顺序传值。
* @return bizSign签名值。
*/
public static String calcSign(String bizSecret, String[] argValues) {
StringBuilder sb = new StringBuilder();
for (String argValue : argValues) {
if (argValue == null || "".equals(argValue)) {
continue;
}
sb.append(argValue);
}
sb.append("@").append(bizSecret);
try {
byte[] bys = URLEncoder.encode(sb.toString(), StandardCharsets.UTF_8.name()).getBytes(StandardCharsets.UTF_8);
MessageDigest md = MessageDigest.getInstance("MD5");
return encodeHex(md.digest(bys));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
private static final char[] DIGITS_UPPER = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
public static String encodeHex(byte[] bytes) {
StringBuilder sb = new StringBuilder(2 * bytes.length);
for (byte b : bytes) {
sb.append(DIGITS_UPPER[(b >> 4) & 0xf]).append(DIGITS_UPPER[b & 0xf]);
}
return sb.toString();
}
}
- python 代码实例
import hashlib
import urllib.parse
class SignatureHelper:
@staticmethod
def calc_sign(biz_secret, arg_values):
concatenated_values = ''.join(filter(None, arg_values))
concatenated_values += "@" + biz_secret
url_encoded_string = urllib.parse.quote_plus(concatenated_values)
return SignatureHelper.encode_hex(hashlib.md5(url_encoded_string.encode('utf-8')).digest())
@staticmethod
def encode_hex(bytes_value):
return ''.join(['{:02X}'.format(b) for b in bytes_value])
# 使用示例:
biz_secret = "5dc151e1-4301-456e-bfec-2db1e83d4407"
arg_values = ["4PHnOd70BHSpB2"]
signature = SignatureHelper.calc_sign(biz_secret, arg_values)
print(signature)