欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c# 百度地图api APP SN校验失败

程序员文章站 2022-03-26 09:28:01
在使用c#调用百度地图Web服务api遇到的签名(sn校验)问题,在此记录一下,(ip白名单校验的请忽略) 1.首先获取ak与sk,这个两个东西可以从控制台中获取到 2.在这个地址:sn签名算法,里面提供了java,php,c#,python2.7的参考代码 在百度提供的参考代码中,其中c#的代码中 ......

在使用c#调用百度地图web服务api遇到的签名(sn校验)问题,在此记录一下,(ip白名单校验的请忽略

1.首先获取ak与sk,这个两个东西可以从控制台中获取到

2.在这个地址:,里面提供了java,php,c#,python2.7的参考代码

在百度提供的参考代码中,其中c#的代码中md5加密方法是有问题的,(在笔者写随笔时,代码还是有问题的,之后希望百度官方修复此问题)

c# 百度地图api APP SN校验失败

 

把百度的md5方法修改一下,签名就正确了,api正常调用了,开心!!

这里是完整的签名代码

c# 百度地图api APP SN校验失败
 1 using system;
 2 using system.collections.generic;
 3 using system.linq;
 4 using system.text;
 5 using system.web;
 6 
 7 namespace ipservice.code
 8 {
 9     public class baiduaksncaculater
10     {
11         private static string md5(string password)
12         {
13             try
14             {
15                 system.security.cryptography.hashalgorithm hash = system.security.cryptography.md5.create();
16                 byte[] hash_out = hash.computehash(system.text.encoding.utf8.getbytes(password));
17 
18                 var md5_str=bitconverter.tostring(hash_out).replace("-", "");
19                 return md5_str.tolower();
20 
21             }
22             catch
23             {
24                 
25                 throw;
26             }
27         }
28 
29         private static string urlencode(string str)
30         {
31             str = system.web.httputility.urlencode(str);
32             byte[] buf = encoding.ascii.getbytes(str);//等同于encoding.ascii.getbytes(str)
33             for (int i = 0; i < buf.length; i++)
34                 if (buf[i] == '%')
35                 {
36                     if (buf[i + 1] >= 'a') buf[i + 1] -= 32;
37                     if (buf[i + 2] >= 'a') buf[i + 2] -= 32;
38                     i += 2;
39                 }
40             return encoding.ascii.getstring(buf);//同上,等同于encoding.ascii.getstring(buf)
41         }
42 
43         private static string httpbuildquery(idictionary<string, string> querystring_arrays)
44         {
45 
46             stringbuilder sb = new stringbuilder();
47             foreach (var item in querystring_arrays)
48             {
49                 sb.append(urlencode(item.key));
50                 sb.append("=");
51                 sb.append(urlencode(item.value));
52                 sb.append("&");
53             }
54             sb.remove(sb.length - 1, 1);
55             return sb.tostring();
56         }
57 
58         public static string caculateaksn(string ak, string sk, string url, idictionary<string, string> querystring_arrays)
59         {
60             var querystring = httpbuildquery(querystring_arrays);
61 
62             var str = urlencode(url + "?" + querystring + sk);
63            
64             return md5(str);
65         }
66     }
67 }
view code

 

这里是调用代码

c# 百度地图api APP SN校验失败
 1 public static string getipareas()
 2         {
 3             var ip = "你要查询的ip地址";
 4             var ak = "从百度控制台获取到应用ak";
 5             var sk = "从百度控制台获取到签名sk";
 6             var uri = "http://api.map.baidu.com";
 7             var path = "/location/ip";
 8             var param = new dictionary<string, string>();
 9             param.add("ip", ip);
10             param.add("ak", ak);
11 
12             //注意:签名的url参数,并非完整地址
13             var sn = baiduaksncaculater.caculateaksn(ak, sk, path, param);
14 
15             var url = string.format("{0}{1}?ip={2}&ak={3}&sn={4}",
16                 uri,
17                 path,
18                 ip,
19                 ak,
20                 sn);
21 
22             var str = code.httpservice.get(url);
23             return str;
24         }
view code

 

写在最后,希望百度官方尽快修改示例中的代码,这样也方便别人拿来用