tnblog
首页
视频
资源
登录

关于百度地图WebApi调用返回APP SN校验失败的解决

42人阅读 2024/12/16 11:07 总访问:47001 评论:0 收藏:0 手机
分类: .NET
//官网上面有sn校验的demo 其中包括Java,PHP,C#,Python 这里主要说C#的 详情参照附录 'https://lbsyun.baidu.com/faq/api?title=webapi/appendix'
//当我们按照官网给的代码运行起来时,返回一个APP SN 校验失败,因为官网的代码没有问题,但是有些细节并没有标注出来
//1.MD5加密方法, System.Security.Cryptography.MD5CryptoServiceProvider 该方法,目前测试情况,在.Net4.0以上(6.0/8.0)是被弃用的(但是弃用不代表不能用,不建议使用,高版本有替换的)
//2.URL,参数键值对没有说明,一个错误就会导致sn码生成错误
//---解决
//1. MD5升级代码
 private static string _MD5(string password)
 {
     try
     {
         byte[] inputBytes = Encoding.UTF8.GetBytes(password);
         MD5 md5Hash = MD5.Create();
         byte[] hashBytes = md5Hash.ComputeHash(inputBytes);

         string ret = "";
         for (int i = 0; i < hashBytes.Length; i++)
         {
             ret += hashBytes[i].ToString("X2");
         }
         return ret.ToString();       
     }
     catch
     {
         throw;
     }
 }
 //2. 参数说明: 
   /// <summary>
   ///     
   /// </summary>
   /// <param name="ak">AK(此方法未使用)</param>
   /// <param name="sk">AK对应SN校验方式SK(个人主页控制台获取)</param>
   /// <param name="url">请求接口路径 此路径不包括IP 如 行政区域检索接口 ' 只需要传递 /place/v2/suggestion</param>
   /// <param name="querystring_arrays">请求接口参数键值对 包括ak不包括sn</param>
   /// <returns></returns>
   public static string CaculateAKSN(string ak, string sk, string url, IDictionary<string, string> querystring_arrays)
   {
       var queryString = HttpBuildQuery(querystring_arrays);

       var str = UrlEncode(url + "?" + queryString + sk);

       return _MD5(str).ToLower();//返回的sn码需要小写的
   }
   
   private 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)
   }
  
   private static string HttpBuildQuery(IDictionary<string, string> 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();
   }
   //其余方法参照附录获取'https://lbsyun.baidu.com/faq/api?title=webapi/appendix'
   //代码调用
    string BaseUrl = "https://api.map.baidu.com/place/v2/suggestion";
    var keyValuePairs = new Dictionary<string, string>
    {
        {"query",name },
        {"region",name },
        {"city_limit","false" },
        {"output","json" },
        {"ak",_apiKey },
    };
    string sn = CaculateAKSN(_apiKey, _apiSK, "/place/v2/suggestion", keyValuePairs);
    var url = $"{BaseUrl}?query={name}&region={name}&city_limit=false&output=json&ak={_apiKey}&sn={sn}";
    //注意,键值对顺序需要和url参数顺序一致 顺序不对等也会造成sn校验失败,其次 sn在url里面固定放在最后
    //! 文章结束,后续有问题的可以留言 交流群号:709342059


评价
与其用时间去get一个未知的以后,不如做好现在,set自己一个好的以后
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术