翼度科技»论坛 编程开发 .net 查看内容

C#百度地图开放平台211sn校验失败解决方法

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
个人认为百度地图开放平台确实很好用但就是C#的SN校验会出现以下几个问题
一、官方的示例代码说的不清不楚

获取SN函数的Uri应该使用不带域名的Uri
比如:最终请求地址为https://api.map.baidu.com/location/ip?ip=119.126.10.15&coor=gcj02&ak=123456&sn=654321
AKSNCaculater.CaculateAKSN中的uri参数应该使用https://api.map.baidu.com/location/ip?ip=119.126.10.15&coor=gcj02&ak=123456&sn=654321,而不可以是https://aspi.map.baidu.com/location/ip?coor=gcj02&ip=119.126.10.15&ak=123456&sn=654321
获取SN的时候参数的顺序是怎么样的,发送请求的时候参数的顺序就必须是怎么样
比如:获取SN的时候参数顺序是ip=119.126.10.15&coor=gcj02&ak=123456,那么最终请求地址就应该是https://api.map.baidu.com/location/ip?ip=119.126.10.15&coor=gcj02&ak=123456&sn=654321,而不可以是https://aspi.map.baidu.com/location/ip?coor=gcj02&ip=119.126.10.15&ak=123456&sn=654321
无论如何SN必须在最终请求地址的最后!
比如以上情况下:https://api.map.baidu.com/location/ip?ip=119.126.10.15&coor=gcj02&sn=654321&ak=123456就是一个错误的地址
二、官方MD5加密是错的!

这一个真是把我害惨了,折腾了半天终于发现正确代码(我也是copy别人的,但不管怎么说,官方的MD5加密代码确实是错的)
正确的加密过程如下
  1. public static string MD52(string password)
  2.         {
  3.             try
  4.             {
  5.                 System.Security.Cryptography.HashAlgorithm hash = System.Security.Cryptography.MD5.Create();
  6.                 byte[] hash_out = hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
  7.                 var md5_str = BitConverter.ToString(hash_out).Replace("-", "");
  8.                 return md5_str.ToLower();
  9.             }
  10.             catch
  11.             {
  12.                 throw;
  13.             }
  14.         }
复制代码
  完整类如下:
  1. using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace SATPlatform{     public class AKSNCaculater    {        public static string MD52(string password)
  2.         {
  3.             try
  4.             {
  5.                 System.Security.Cryptography.HashAlgorithm hash = System.Security.Cryptography.MD5.Create();
  6.                 byte[] hash_out = hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
  7.                 var md5_str = BitConverter.ToString(hash_out).Replace("-", "");
  8.                 return md5_str.ToLower();
  9.             }
  10.             catch
  11.             {
  12.                 throw;
  13.             }
  14.         }         public static string MD5(string password)        {            byte[] textBytes = System.Text.Encoding.UTF8.GetBytes(password);            try            {                System.Security.Cryptography.MD5CryptoServiceProvider cryptHandler;                cryptHandler = new System.Security.Cryptography.MD5CryptoServiceProvider();                byte[] hash = cryptHandler.ComputeHash(textBytes);                string ret = "";                foreach (byte a in hash)                {                    ret += a.ToString("x");                }                return ret;            }            catch            {                throw;            }        }         public static string UrlEncode(string str)        {            str = System.Web.HttpUtility.UrlEncode(str);            byte[] buf = Encoding.ASCII.GetBytes(str);//等同于Encoding.ASCII.GetBytes(str)            for (int i = 0; i < buf.Length; i++)                if (buf[i] == '%')                {                    if (buf[i + 1] >= 'a') buf[i + 1] -= 32;                    if (buf[i + 2] >= 'a') buf[i + 2] -= 32;                    i += 2;                }            return Encoding.ASCII.GetString(buf);//同上,等同于Encoding.ASCII.GetString(buf)        }         public static string HttpBuildQuery(IDictionary querystring_arrays)        {             StringBuilder sb = new StringBuilder();            foreach (var item in querystring_arrays)            {                sb.Append(UrlEncode(item.Key));                sb.Append("=");                sb.Append(UrlEncode(item.Value));                sb.Append("&");            }            sb.Remove(sb.Length - 1, 1);            return sb.ToString();        }         public static string CaculateAKSN(string ak, string sk, string url, IDictionary querystring_arrays)        {            var queryString = HttpBuildQuery(querystring_arrays);             var str = UrlEncode(url + "?" + queryString + sk);             return MD52(str);        }    }}
复制代码
  
以上就是我被坑的经历,希望对其他人有用~~~
最后再附带上我的请求代码
  1.         /// <summary>
  2.         /// 返回指定IP的位置对应的百度城市代码(利用百度地图API
  3.         /// </summary>
  4.         /// <param name="IP">需要查询的IP地址</param>
  5.         /// <returns></returns>
  6.         public string GetPlace(string IP)
  7.         {
  8.             DataTable BasicIn = Reader("SELECT Th_MapAK , Th_MapSK FROM S_Inf");
  9.             Dictionary<string, string> P = new Dictionary<string, string>()
  10.             {
  11.                 {"ip",IP },
  12.                 {"coor","gcj02" },
  13.                 {"ak",BasicIn.Rows[0]["Th_MapAK"].ToString() }
  14.                 //{"address","百度大厦" },
  15.                 //{"output","json" },
  16.                 //{"ak","yourak" }
  17.             };
  18.             string GetSN = AKSNCaculater.CaculateAKSN(BasicIn.Rows[0]["Th_MapAK"].ToString(), BasicIn.Rows[0]["Th_MapSK"].ToString(), "/location/ip", P);
  19.             //string GetSN = AKSNCaculater.CaculateAKSN("yourak", "yoursk", "/geocoder/v2/", P);
  20.             HttpWebRequest NewRequest = (HttpWebRequest)WebRequest.Create("https://api.map.baidu.com/location/ip?" + AKSNCaculater.HttpBuildQuery(P) + "&sn=" + GetSN);
  21.             NewRequest.Headers.Add("charset", "utf-8");
  22.             NewRequest.Method = "GET";
  23.             NewRequest.ContentType = "application/json";
  24.             NewRequest.UserAgent = "Windows KeHuDuan";
  25.             NewRequest.Timeout = 5000;//设置超时时间
  26.             HttpWebResponse Response = (HttpWebResponse)NewRequest.GetResponse();
  27.             Stream ResponseStream = Response.GetResponseStream();
  28.             StreamReader ResponseStreamReader = new StreamReader(ResponseStream);
  29.             string Res = ResponseStreamReader.ReadToEnd();
  30.             ResponseStreamReader.Close();
  31.             ResponseStream.Close();
  32.             JObject ResJ = new JObject();
  33.             try
  34.             { ResJ = JObject.Parse(Res); }
  35.             catch (Exception)
  36.             { GiveErr(ErrCode.ThirdPartyError); }
  37.             if (ResJ["status"].ToString() != "0")
  38.                 GiveErr(ErrCode.ThirdPartyError);
  39.             return ResJ["content"]["address_detail"]["city_code"].ToString();
  40.         }
复制代码
  

来源:https://www.cnblogs.com/nahida/archive/2023/07/04/17526893.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具