分类:
.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}®ion={name}&city_limit=false&output=json&ak={_apiKey}&sn={sn}";
//注意,键值对顺序需要和url参数顺序一致 顺序不对等也会造成sn校验失败,其次 sn在url里面固定放在最后
//! 文章结束,后续有问题的可以留言 交流群号:709342059评价
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256
50010702506256
欢迎加群交流技术