1、WebServiceAPI Key配置中的域名白名单如何使用?
域名白名单适用于浏览器端JSONP方式调用WebserviceAPI服务:
(1)仅白名单中的域名才可使用此key调用WebService服务
(2)留空则不限制调用来源
(3)每行填写一个域名,填写的域名及其子域名都会同时得到授权,如:qq.com,则qq.com下的子域名map.qq.com也可以使用此key
非授权域名使用您的key调用WebServiceAPI时会被拒绝,同时会返回本次请求来源域名,以便您更正配置:
{
"status": 110,
"message": "请求来源未被授权(本次请求来源为:lbs.qq.com),请检查key配置。"
}
2、WebServiceAPI Key配置中的授权IP如何使用?
用于限制此key的调用来源IP,以防key被盗用,优点:配置简单,无需开发,但IP地址有变化时,必须同时修改配置。
(1)配置填写方法:
进入Key管理界面,找到要设置的Key进入设置界面,启用产品勾选WebServiceAPI后,会出现相应安全设置,点击“授权IP”进行设置
a. 每行填写一条,留空则不限制。
b. 支持填写单一授权IP,例:202.106.0.99
c. 支持授权IP段,起始IP-结束IP。例(IPv4):202.106.0.20-202.106.0.26
(2)如何准确得知我的IP地址:
首先您可询问您的网络供应商获悉,另外您可以通过IP定位接口,在接口返回结果中会包含您的服务器IP
(3)非授权IP使用您的key调用WebServiceAPI时会被拒绝,同时会返回本次请求来源IP,以便更正配置:
{
"status": 112,
"message": "IP未被授权(本次请求来源IP为:202.106.0.20),请检查key配置。"
}
3、WebServiceAPI Key配置中签名校验如何使用?
与授权IP方式比较,使用SN校验稍有开发量,但不必担心服务器换IP的问题。
选中SN校验后,会生成SecretKey (SK),用于请求地图WebServiceAPI时计算签名,将签名做为参数(sig)附带到请求中,腾讯服务器会在收到请求后,使用相同的方式生成签名,并与请求中附带的签名进行比对,当一致时即为校验通过,反之则拒绝。
SecretKey (SK) 要注意保密,如有泄漏应尽快重新生成。
4、WebServiceAPI(GET方法)签名计算
(1)通用概念:
a. 请求路径:调用接口时的路径,如:/ws/geocoder/v1,末尾是否带 / 均可,不做要求,但需要保持一致,比如调用路径用了/ws/geocoder/v1,签名计算的时候也要用/ws/geocoder/v1
b. SecretKey (SK):在腾讯位置服务控制台 > Key配置中,勾选WebServiceAPI的 SN校验时自动生成的随机字串,用于计算签名(sig)
c. sig:签名计算结果
通过以下示例讲解(本例为调用逆地址解析请求的url):
(2)GET请求分为:域名,请求路径和参数三个部分,用于签名计算的有:
请求路径:/ws/geocoder/v1
请求参数:location=28.7033487,115.8660847&key=5Q5BZ-5EVWJ-SN5F3-K6QBZ-B3FAO-*****
a. 首先对参数进行排序:按参数名升序(本例结果为key在前,location在后):
key=5Q5BZ-5EVWJ-SN5F3-K6QBZ-B3FAO-*****&location=28.7033487,115.8660847
b. 签名计算(sig):
请求路径+”?”+请求参数+SK进行拼接,并计算拼接后字符串md5值(字符必须为小写),即为签名(sig):
要求:请求参数必须是未进行任何编码(如urlencode)的原始数据
md5("/ws/geocoder/v1?key=5Q5BZ-5EVWJ-SN5F3-*****&location=28.7033487,115.8660847SWvT26ypwq5Nwb5RvS8cLi6NSoH8HlJX")
本例计算得到结果为:90da272bfa19122547298e2b0bcc0e50
c. 生成最终请求:将计算得到的签名sig,放到请求中(参数名即为:sig):
https://apis.map.qq.com/ws/geocoder/v1?key=5Q5BZ-5EVWJ-SN5F3-K6QBZ-B3FAO-*****&location=28.7033487,115.8660847&sig=90da272bfa19122547298e2b0bcc0e50
注意:计算 sig 要使用原始参数值,不要进行任何编码,但最终发送时的参数,是需要对接口传入的参数值做url编码的,如果入参中有特殊字符,如:&、#等,需要在请求时在header中增加 x-legacy-url-decode:no
url编码方式:
以地点检索接口位例:
请求:...域名省略.../place/v1/search?boundary=region(北京)&keyword=美食
错误方式:"...域名省略.../place/v1/search?"+urlencode("boundary=region(北京)&keyword=美食")
正确方式:"...域名省略.../place/v1/search?boundary="+urlencode("region(北京)")+"&keyword="+urlencode("美食")
注:示例中的urlencode()代表url编码函数,不同开发语言的存在不同,以您实际为准
5、WebServiceAPI和地点云API 的 POST接口(application/json)如何计算签名?
(1)通用概念:
a. 请求路径:调用接口时的路径,如:/place_cloud/data/create,末尾是否带 / 均可,不做要求
b. SecretKey (SK):在腾讯位置服务控制台 > Key配置中,勾选WebServiceAPI的 SN校验时自动生成的随机字串,用于计算签名(sig)
c. sig:签名计算结果
(2)下文以地点云API的 [创建地点数据接口] 为例计算签名:
// POST请求地址
https://apis.map.qq.com/place_cloud/data/create
// 请求头:content-type:application/json
//Post方法提交数据
{
"key":"5Q5BZ-5EVWJ-SN5F3-K6QBZ-*****",
"table_id":"5d405395d230bf1*****",
"data":[
{
"ud_id":"156985",
"title":"海淀区苏州街营业部",
"location":{
"lat":39.983988,
"lng":116.307709
},
"x":{
"price":15.5
}
}
]
}
a. 参数排序:按JSON对象中的一级属性名字符升序排序,本例结果为:data,key,table_id
再将每个一级属性的 Value 转成最短JSON string形式:
data | [{“ud_id”:“156985”,“title”:“海淀区苏州街营业部”,“location”:{“lat”:39.983988,“lng”:116.307709},“x”:{“price”:“no price”}}] |
key | 5Q5BZ-5EVWJ-SN5F3-K6QBZ-***** |
table_id | 5d405395d230bf1d***** |
b. 拼接成Querystring型的字符串:
data=[{"ud_id":"156985","title":"海淀区苏州街营业部","location":{"lat":39.983988,"lng":116.307709},"x":{"price":15.5}}]&key=5Q5BZ-5EVWJ-SN5F3-K6QBZ-*****&table_id=5d405395d230bf1d9416be10
c. 签名计算(sig):
请求路径+”?”+请求参数+SK进行拼接,并计算拼接后字符串md5值(字符必须为小写),即为签名(sig):
要求:请求参数必须是未进行任何编码(如urlencode)的原始数据
md5('/place_cloud/data/create?data=[{"ud_id":"156985","title":"海淀区苏州街营业部","location":{"lat":39.983988,"lng":116.307709},"x":{"price":15.5}}]&key=5Q5BZ-5EVWJ-SN5F3-K6QBZ-*****&table_id=5d405395d230bf1d94******KIpUE64TiqLuF2vBJCLOvkFVy0we0Ypp')
本例计算得到结果为:782f2ca97e6592741049823787203e9c
d. 发送请求:
//URL与请求头
POST /place_cloud/data/create?sig=782f2ca97e6592741049823787203e9c HTTP/1.1
Host: sdkgw.noscan.sparta.html5.qq.com
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 257
Content-Type: application/json
//Post Body
{
"key": "5Q5BZ-5EVWJ-SN5F3-K6QBZ-B3FAO-******",
"table_id": "5d405395d230bf1*****",
"data": [{
"ud_id": "156985",
"title": "\u6d77\u6dc0\u533a\u82cf\u5dde\u8857\u8425\u4e1a\u90e8",
"location": {"lat": 39.983988, "lng": 116.307709},
"x": {"price": 15.5}
}]
}
发送的data里的JSON并不需要是最小形式,可以使用空格。
e. 返回结果:
{
'status': 0,
'message': '成功',
'request_id': 'a98aec8aa0de7a2905ad347d85b188',
'result': {
'count': 1,
'failure': [],
'success': [
{
'id': '5d405d2918d433170478b790',
'row_idx': 0,
'ud_id': '156985'
}
]
}
}
6、WebServiceAPI和地点云API 的接口返回签名失败如何排查?
接口验签失败大概率是您的md5加密方式错误,可通过接口md5加密工具验证,结合如下进行排查:
(1) md5加密前的拼接串儿是否有按照参数名称首字母排序(a-z),根据接口的字段名进行排序,如首字母一致则向后顺位从第二个字母做比较,以此类推。
(2) md5加密前的拼接串儿参数与实际发起请求的参数是否一致,每次接口参数发生变更,都需要重新进行md5加密获取新的sig。
(3) md5加密的参数是否是原始未进行编码的参数。
(4) 对应key 的 Secret key 是否发生变更,可在控制台中进行查看。