• 技术文章 >后端开发 >C#.Net教程

    c#之解决百度地图api APP SN校验失败问题(代码实例)

    青灯夜游青灯夜游2018-10-18 14:34:52转载2002
    本篇文章给大家介绍在使用c#调用百度地图api时遇到的SN校验失败问题的解决方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。

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

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

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

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

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

    这里是完整的签名代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    
    namespace IpService.Code
    {
        public class BaiduAKSNCaculater
        {
            private static string MD5(string password)
            {
                try
                {
                    System.Security.Cryptography.HashAlgorithm hash = System.Security.Cryptography.MD5.Create();
                    byte[] hash_out = hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
    
                    var md5_str=BitConverter.ToString(hash_out).Replace("-", "");
                    return md5_str.ToLower();
    
                }
                catch
                {
                    
                    throw;
                }
            }
    
            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();
            }
    
            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);
            }
        }
    }

    这里是调用代码

    public static string GetIPAreas()
            {
                var ip = "你要查询的ip地址";
                var ak = "从百度控制台获取到应用AK";
                var sk = "从百度控制台获取到签名SK";
                var uri = "http://api.map.baidu.com";
                var path = "/location/ip";
                var param = new Dictionary<string, string>();
                param.Add("ip", ip);
                param.Add("ak", ak);
    
                //注意:签名的url参数,并非完整地址
                var sn = BaiduAKSNCaculater.CaculateAKSN(ak, sk, path, param);
    
                var url = string.Format("{0}{1}?ip={2}&ak={3}&sn={4}",
                    uri,
                    path,
                    ip,
                    ak,
                    sn);
    
                var str = Code.HttpService.Get(url);
                return str;
            }

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

    总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问C#视频教程

    以上就是c#之解决百度地图api APP SN校验失败问题(代码实例)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    上一篇:C#如何使用Reflect获取dll文件中的类型并调用? 下一篇:C#如何绘制PDF嵌套表格?绘制PDF嵌套表格的步骤

    相关文章推荐

    • 浅析Node.js 中 Stream API 的使用_node.js• 百度地图api如何使用_javascript技巧• PHP下SSL加密解密、验证、签名方法(很简单)_PHP• php接口数据加密、解密、验证签名_PHP• PHP、Java、C#实现URI参数签名算法,确保应用与REST服务器之间的

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网