当前位置: 移动技术网 > IT编程>开发语言>.net > c# 百度地图api APP SN校验失败

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

2018年10月18日  | 移动技术网IT编程  | 我要评论

3887小游戏,858藏宝阁搜索,2nd house

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

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

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

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

 

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

这里是完整的签名代码

 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

 

这里是调用代码

 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

 

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网