天气预报接口:SmartWeather API中key用c#的计算方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了天气预报接口:SmartWeather API中key用c#的计算方法相关的知识,希望对你有一定的参考价值。

天气预报接口:SmartWeather API中key用c#的计算法hash_hmac('sha1',$public_key,$private_key,TRUE)
这个用c#代码怎么写呢?求大神帮忙!!!

参考技术A string GetKey(string appid, string privateKey, string areaId, string date, string type)

//使用SHA1的HMAC

HMAC hmac = HMACSHA1.Create();
var publicKey = "http://webapi.weather.com.cn/data/?areaid=0&type=1&date=2&appid=3";
var data = System.Text.Encoding.UTF8.GetBytes(string.Format(publicKey, areaId, type, date, appid));
//密钥
var key = System.Text.Encoding.UTF8.GetBytes(privateKey);
hmac.Key = key;

//对数据进行签名
var signedData = hmac.ComputeHash(data);
return Convert.ToBase64String(signedData);



参考资料:http://www.cnblogs.com/aptdo2008/p/3566391.html追问

谢谢

本回答被提问者和网友采纳
参考技术B   private_key: 审核通过后,邮件中会提供。private_key仅负责与 public_key 共同合成 key 传参,私钥不可见,客户端与服务端各存储一份;
  public_key: 不包含key在类的完整URL的其他部分(此处appid为完整appid);
  key的算法: 说明书中提供的是php中的算法代码,如下
  <span 1 <span key = <span base64_encode(hash_hmac('sha1', <span $public_key, <span $private_key, <span true));

  key加密后,通过 urlencode 对其编码后传参。

项目中调用天气预报接口

项目中使用的是心知天气的API,下面我就简单总结一下使用的过程:

1. 在心知天气官网注册一个个人账号,这样就会产生一个API秘钥和一个用户ID,用户ID用于签名验证方式。签名指的是通过HMAC-SHA1,对请求参数加密后得到的签名字串进行身份验证,避免了将API密钥明文包含在请求中而造成泄露。

2. 关于签名生成方式如下:

  (1)构造验证参数字符串

    将请求参数按照参数名字典升序排列后,把所有参数param=value用&连接起来,类似URI中Query string的构造方式。目前支持的参数有:UNIX时间戳ts 签名失效时间ttl(单位为秒,缺省为1800,可选)和用户IDuid。例:ts=1443079775&ttl=30&uid=U123456789

  (2)对上面的参数进行url编码,使用http_build_query()

    比如参数为:

       $param = [
        ‘ts‘ => time(),
        ‘ttl‘ => 300,
        ‘uid‘ => $uid,
       ];

    $sig_data = http_build_query($params);

    (3)对上面的字符串进行加密,让后进行base64编码

    加密使用的是hash_hmac()。如下得到签名:$sig = base64_encode(hash_hmac(‘sha1‘, $sig_data, $key, TRUE))。这里的$key就是注册时得到的API秘钥。

  (4)将得到的签名也放入$param数组中 $param[‘sig‘] = $sig, 其他的参数同样如此,然后构造url

    $url = $api. ‘?‘ . http_build_query($param)。 这里的$api是接口地址;比如$api = ‘https://api.seniverse.com/v3/weather/daily.json‘;

  (5)然后使用curl库进行访问$url 得到天气信息。

 

代码如下:

    // 心知天气接口调用凭据
    $key = ‘你的秘钥‘; // 秘钥
    $uid = ‘你的用户ID‘; // 用户 ID
    // 参数
    $api = ‘https://api.seniverse.com/v3/weather/daily.json‘; // 接口地址
    $location = ‘杭州‘; // 城市名称

    $param = [
      ‘ts‘ => time(),
      ‘ttl‘ => 300,
      ‘uid‘ => $uid,
    ];
    $sig_data = http_build_query($param); // http_build_query 会自动进行 url 编码
    // 使用 HMAC-SHA1 方式,以 API 密钥(key)对上一步生成的参数字符串(raw)进行加密,然后 base64 编码
    $sig = base64_encode(hash_hmac(‘sha1‘, $sig_data, $key, TRUE));

    $param[‘sig‘] = $sig; // 签名
    $param[‘location‘] = $location;
    $param[‘start‘] = 0; // 开始日期。0 = 今天天气
    $param[‘days‘] = 1; // 查询天数,1 = 只查一天
    // 构造url
    $url = $api . ‘?‘ . http_build_query($param);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_ENCODING ,‘gzip‘);
    $output = curl_exec($ch);
    curl_getinfo($ch,CURLINFO_HTTP_CODE);
    
    curl_close($ch);

    $result = json_decode($output,TRUE);
    return $result;

 

    

 

以上是关于天气预报接口:SmartWeather API中key用c#的计算方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用百度天气预报API接口

免费天气api_高速稳定的天气数据_高速稳定的天气API接口

PHP调用API接口实现天气查询功能

js获取天气

python 获取天气信息

项目中调用天气预报接口