开发 地图小程序OPENAPI 实用工具 业务身份和业务签名

[签名校验]业务身份和业务签名 最后更新时间: 2024年08月30日

1. 业务Token

任意接口都必须传递业务Token参数用于业务安全身份验证,以QueryString形式传递,即作为url参数传递,参数名为:bizToken,具体值由高德服务端提供。

2. 业务签名

2.1  sig 签名参数

如果在请求过程中报以下错误,则证明url 传参的sig 错误。

infocode

info返回值

状态描述

问题排查策略

10007

INVALID_USER_SIGNATURE

数字签名未通过验证

开发者签名未通过开发者在key控制台中,开启了“数字签名”功能,但没有按照指定算法生成“数字签名”。

处理方式有两种:

a.为每次请求正确的生成 sig 签名参数,可参照:https://lbs.amap.com/faq/quota-key/key/41181

b.关闭当前key 的sig 签名参数校验,在开发者后台、key 设置中操作,如下图;

2.2 bizSign签名参数

任意接口都必须进行业务签名,业务方在调用接口时根据接口指定的签名参数和密钥(由高德服务端提供)通过指定算法生成签名,注意点如下:

  1. 签名以QueryString形式传递,即作为url参数传递,参数名为:bizSign。
  2. 参与签名的参数以QueryString形式传递,即作为url参数传递,参数名见各个接口。请求类型ContenType为application/x-www-form-urlencoded时,参与签名的参数也可以放在body里。
  3. 签名算法:
    1. 按照接口签名参数的定义,按序拼接参数值,获取到字符串a。
    2. 上述拼接的参数字符串a后追加@符号再拼接密钥,获取到字符串b。
    3. 对上述字符串b进行url编码,获取到字符串c。
    4. 对c进行md5,获取到utf编码的大写字符串即为bizSign。
  4. 签名算法示例: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();
    }
}
  1. 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)
  1. C# 代码实例
using System;
using System.Security.Cryptography;
using System.Text;
using System.Web;

namespace Amap.Wia.OpenApi.Test.Lib
{
    public static class SignatureHelper
    {
        /**
         * 签名值计算。
         *
         * @param bizSecret 业务密钥。
         * @param argValues 待签名的业务参数,按接口指定的参数顺序传值。
         * @return bizSign签名值。
         */
        public static string CalcSign(string bizSecret, string[] argValues)
        {
            StringBuilder sb = new StringBuilder();
            foreach (var argValue in argValues)
            {
                if (string.IsNullOrEmpty(argValue))
                {
                    continue;
                }
                sb.Append(argValue);
            }
            sb.Append("@").Append(bizSecret);
            
            string toEncode = HttpUtility.UrlEncode(sb.ToString(), Encoding.UTF8);
            byte[] bys = Encoding.UTF8.GetBytes(toEncode);
            using (MD5 md5 = MD5.Create())
            {
                return EncodeHex(md5.ComputeHash(bys));
            }
        }

        public static string EncodeHex(byte[] bytes)
        {
            StringBuilder sb = new StringBuilder(2 * bytes.Length);
            foreach (var b in bytes)
            {
                sb.AppendFormat("{0:X2}", b);
            }
            return sb.ToString();
        }
        
        static void Main(string[] args)
        {
          String bizSecret = "5dc151e1-4301-456e-bfec-2db1e83d4407";
          String[] argValues = {"4PHnOd70BHSpB2"};
  
          string sign = CalcSign(bizSecret, argValues);
          Console.WriteLine("Calculated Sign: " + sign);
        }
    }
}

返回顶部 示例中心 常见问题 智能客服 公众号
二维码