Maison  >  Article  >  développement back-end  >  PHP implémente la requête météo en temps réel WeChat

PHP implémente la requête météo en temps réel WeChat

韦小宝
韦小宝original
2018-03-14 09:08:071743parcourir

Lorsque nous développons des applications WeChat telles que les comptes officiels WeChat, nous espérons tous que plus il y a de fonctions, mieux c'est, nous allons donc parler aujourd'hui de la façon d'implémenter la requête météo WeChat en PHP. Ce n'est pas trop compliqué. Baidu. L’interface météo suffit. Sans plus tarder, jetons un coup d’œil !

L'effet que nous souhaitons obtenir est celui indiqué dans l'image ci-dessous. Lorsque vous entrez la météo d'un certain endroit tel que « Météo de Shenzhen » dans WeChat, la page suivante apparaîtra :

PHP implémente la requête météo en temps réel WeChat
ps :Je voudrais préciser ici que le serveur backend que j'utilise est le serveur Sina sae. Je ne présenterai pas grand-chose ici

Le code de la première page

Cette page de code est principalement utilisée pour la vérification des jetons et la réponse aux demandes des utilisateurs WeChat via le serveur backend. Le code sur cette page est relativement simple et ne sera pas présenté.

<?php
header("content-Type:text;charset=utf8;")
define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET[&#39;echostr&#39;])) {
    $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);

        if($tmpStr == $signature){
            return true;
        }else{
            return false;
        }
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $this->logger("R ".$postStr);
            $postObj = simplexml_load_string($postStr, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

            switch ($RX_TYPE)
            {
                case "event":
                    $result = $this->receiveEvent($postObj);
                    break;
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
            }
            $this->logger("T ".$result);
            echo $result;
        }else {
            echo "";
            exit;
        }
    }

    private function receiveEvent($object)
    {
        $content = "";
        switch ($object->Event)
        {
            case "subscribe":
                $content = "欢迎关注,查询天气,发送天气加城市名,如“深圳天气”";
                break;
            case "unsubscribe":
                $content = "取消关注";
                break;
        }
        $result = $this->transmitText($object, $content);
        return $result;
    }
  //str_replace(str1,str2,str3)用str3包含str1,用str2取代str1.
    private function receiveText($object)
    {
        $keyword = trim($object->Content);
        if (strstr($keyword, "天气")){
            $city = str_replace(&#39;天气&#39;, &#39;&#39;, $keyword);//这里用空格取代$keyword中的天气二字。
            include("weather2.php");
            $content = getWeatherInfo($city);
        //判断笑话
        }
        $result = $this->transmitNews($object, $content);
        return $result;
    }


    private function transmitText($object, $content)
    {
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }

    private function transmitNews($object, $arr_item)
    {
        if(!is_array($arr_item))
            return;

        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($arr_item as $item)
            $item_str .= sprintf($itemTpl, $item[&#39;Title&#39;], $item[&#39;Description&#39;], $item[&#39;PicUrl&#39;], $item[&#39;Url&#39;]);

        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";

        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item));
        return $result;
    }

    private function transmitMusic($object, $musicArray)
    {
        $itemTpl = "<Music>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <MusicUrl><![CDATA[%s]]></MusicUrl>
    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";

        $item_str = sprintf($itemTpl, $musicArray[&#39;Title&#39;], $musicArray[&#39;Description&#39;], $musicArray[&#39;MusicUrl&#39;], $musicArray[&#39;HQMusicUrl&#39;]);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }
    //这里主要用于在服务器端生成日志
    private function logger($log_content)
    {
        if(isset($_SERVER[&#39;HTTP_BAE_ENV_APPID&#39;])){   //BAE
            require_once "BaeLog.class.php";
            $logger = BaeLog::getInstance();
            $logger ->logDebug($log_content);
        }else if(isset($_SERVER[&#39;HTTP_APPNAME&#39;])){   //SAE
            sae_set_display_errors(false);
            sae_debug($log_content);
            sae_set_display_errors(true);
        }else if($_SERVER[&#39;REMOTE_ADDR&#39;] != "127.0.0.1"){ //LOCAL
            $max_size = 10000;
            $log_filename = "log.xml";
            if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
            file_put_contents($log_filename, date(&#39;H:i:s&#39;)." ".$log_content."\r\n", FILE_APPEND);
        }
    }
}


?>
Deuxième page de code

Cette page de code concerne principalement le processus d'appel de l'interface météo Baidu et leur méthode de transmission de données.

1. Si nous voulons appeler l'interface météo de Baidu, nous devons nous inscrire sur la plateforme ouverte Baidu Map, puis créer une application pour obtenir les ak et sk de l'application.

PHP implémente la requête météo en temps réel WeChatAprès avoir obtenu ak (c'est-à-dire la clé d'accès), cliquez sur Paramètres, la page est la suivante :

PHP implémente la requête météo en temps réel WeChatSélectionnez la méthode de vérification sn dans la méthode de vérification de la demande, et il apparaîtra automatiquement. Le code sk (c'est-à-dire la clé de sécurité) ci-dessous apparaîtra.

Pour le rôle spécifique de sk et de l'algorithme de calcul sn, veuillez vous référer à l'article suivant

http://lbsyun.baidu.com/index.php?title=lbscloud/api/ annexe

<?php

// var_dump(getWeatherInfo("桃江"));
getWeatherInfo("深圳");
function getWeatherInfo($cityName)
{
    if ($cityName == "" || (strstr($cityName, "+"))){
        return "发送天气加城市,例如&#39;天气深圳&#39;";
    }

    $ak = &#39;Plev804CmHUMwPXVcehCcB14Ths0zuat&#39;;//从百度地图开发平台获取的ak
    $sk = &#39;Iv3vSPCd2jnIlMlCrCgywGSkP9PaXiDC&#39;;//从百度地图开发平台获取的sk

//向百度地图开发平台请其数据的url如http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak**&sn=7de5a22212ffaa9e326444c75a58f9a0。包含4个参数,address(查询地址),output(请求数据的恢复格式)、ak(验证密钥)、sn是经过加密后的数据。

    $url = &#39;http://api.map.baidu.com/telematics/v3/weather?ak=%s&location=%s&output=%s&sn=%s&#39;;
    $uri = &#39;/telematics/v3/weather&#39;;
    $location = $cityName;
    $output = &#39;json&#39;;
    $querystring_arrays = array(
        &#39;ak&#39; => $ak,
        &#39;location&#39; => $location,
        &#39;output&#39; => $output
    );
    $querystring = http_build_query($querystring_arrays);//使用关联数组生成一个urlencode请求字符串。格式如下:ak=Plev804CmHUMwPXVcehCcB14Ths0zuat&location=深圳&output=json;
   // var_dump($querystring);
//urlencode()   url中的一些特殊字符和中文字符可能不被服务器所识别,需要经过urlencode()编码才能被识别。
    $sn = md5(urlencode($uri.&#39;?&#39;.$querystring.$sk));//md5()对url中的数据进行加密。
    $targetUrl = sprintf($url, $ak, urlencode($location), $output, $sn);
    // var_dump($targetUrl);

//curl用于与接口服务器建立会话获取 接口传递过来的数据。
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $targetUrl);//与接口简历会话
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//获取的数据存储在一个变量上,而不是直接输出。如果为o或false则直接输出。
    $result = curl_exec($ch);//执行会话,获取数据。
    echo $result;//字符串格式加数个json格式的数据类型
    curl_close($ch);
    $result = json_decode($result, true);//参数带true返回一个数组
    echo "</br>";
     echo "</br>";
      echo "</br>";
       echo "</br>";

        echo "</br>";
         echo "</br>";
          echo "</br>";
           echo "</br>";
    var_dump($result);
    if ($result["error"] != 0){
        return $result["status"];
    }
    $curHour = (int)date(&#39;H&#39;,time());
     echo "</br>";
         echo "</br>";
          echo "</br>";
           echo "</br>";
    echo $curHour;
    $weather = $result["results"][0];
    $weatherArray[] = array("Title" =>$weather[&#39;currentCity&#39;]."天气预报", "Description" =>"", "PicUrl" =>"", "Url" =>"");
    for ($i = 0; $i < count($weather["weather_data"]); $i++) {
        $weatherArray[] = array("Title"=>
            $weather["weather_data"][$i]["date"]."\n".
            $weather["weather_data"][$i]["weather"]." ".
            $weather["weather_data"][$i]["wind"]." ".
            $weather["weather_data"][$i]["temperature"],
        "Description"=>"", 
        "PicUrl"=>(($curHour >= 6) && ($curHour < 18))?$weather["weather_data"][$i]["dayPictureUrl"]:$weather["weather_data"][$i]["nightPictureUrl"], "Url"=>"");
    }
    return $weatherArray;
}


?>
Ce qui précède est tout le contenu de cet article. Veuillez le lire attentivement. Cet article peut être un peu difficile pour les étudiants qui viennent de commencer à contacter le développement de WeChat !


Recommandations associées :

Obtenir la météo de la ville à l'aide du développement PHP WeChat

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn