本篇文章给大家介绍在使用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# 调用api SN校验 签名
  • 程序员必备接口测试调试工具:点击使用

    Apipost = Postman + Swagger + Mock + Jmeter

    Api设计、调试、文档、自动化测试工具

    网页生成APP,用做网站的技术去做APP:立即创建

    手机网站开发APP、自助封装APP、200+原生模块、2000+映射JS接口按需打包

    • 上一篇:C#如何使用Reflect获取dll文件中的类型并调用?
    • 下一篇:C#如何绘制PDF嵌套表格?绘制PDF嵌套表格的步骤

    相关文章

    相关视频


    • 浅析Node.js 中 Stream API 的使...
    • 百度地图api如何使用_javascript技巧
    • PHP下SSL加密解密、验证、签名方法(很简单)_...
    • php接口数据加密、解密、验证签名_PHP
    • PHP、Java、C#实现URI参数签名算法,确保...
    • c#之解决百度地图api APP SN校验失败问题...
    • 微信小程序API 用户数据的签名验证和加解密
    • 电子凭证签名加密和解密
    • 授权签名与SDK

    视频教程分类

    • php视频教程
    • html视频教程
    • css视频教程
    • JS视频教程
    • jQuery视频教程
    • mysql视频教程
    • Linux视频教程
    • Python视频教程
    • Laravel视频教程
    • Vue视频教程

    专题

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