項目中調用天氣預報接口


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

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM