• 项目中调用天气预报接口


    项目中使用的是心知天气的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;

        

  • 相关阅读:
    JDK5的新特性
    反射(一)类加载器、反射、动态代理
    泛型(五)
    spring自定义注解实现登陆拦截器
    java国际化
    Codeforces 231A
    Codeforces 231A
    CCF CSP 201909-2 小明种苹果(续)
    CCF CSP 201909-2 小明种苹果(续)
    CCF CSP 201909-1 小明种苹果
  • 原文地址:https://www.cnblogs.com/lty-fly/p/8683496.html
Copyright © 2020-2023  润新知