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加密方法是有问题的,(在笔者写随笔时,代码还是有问题的,之后希望百度官方修复此问题)
把百度的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 }
这里是调用代码
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 }
写在最后,希望百度官方尽快修改示例中的代码,这样也方便别人拿来用
上一篇: Node.js的Event Loop详解
下一篇: ASP实现带进度条的测试网速的代码程序