0

0

PHP实现微信实时天气查询

韦小宝

韦小宝

发布时间:2018-03-14 09:08:07

|

1940人浏览过

|

来源于php中文网

原创

在我们开发微信公众号等微信应用的时候,我们都是希望功能越多越好,那么我们今天就来讲一下,php实现微信天气查询,其实并不是太复杂,只需要调用一下百度天气接口就可以了,废话不多说了,我们一起来看看吧!
 
我们要达到的效果如下图所示,当你在微信中输入某地天气如“深圳天气”字样是会出现以下页面:

微信效果图.jpeg
ps:这里声明一下,我使用的后台服务器是新浪sae服务器,这里不做过多介绍

第一页代码

这一页代码主要是用于token的验证、以及通过后台服务器对微信用户请求发出响应。这一页代码比较简单,不做介绍。

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, 'SimpleXMLElement', 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('天气', '', $keyword);//这里用空格取代$keyword中的天气二字。
            include("weather2.php");
            $content = getWeatherInfo($city);
        //判断笑话
        }
        $result = $this->transmitNews($object, $content);
        return $result;
    }


    private function transmitText($object, $content)
    {
        $textTpl = "


%s


";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }

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

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

        $newsTpl = "


%s


%s

$item_str
";

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

    private function transmitMusic($object, $musicArray)
    {
        $itemTpl = "
    <![CDATA[%s]]>
    
    
    
";

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

        $textTpl = "


%s

$item_str
";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }
    //这里主要用于在服务器端生成日志
    private function logger($log_content)
    {
        if(isset($_SERVER['HTTP_BAE_ENV_APPID'])){   //BAE
            require_once "BaeLog.class.php";
            $logger = BaeLog::getInstance();
            $logger ->logDebug($log_content);
        }else if(isset($_SERVER['HTTP_APPNAME'])){   //SAE
            sae_set_display_errors(false);
            sae_debug($log_content);
            sae_set_display_errors(true);
        }else if($_SERVER['REMOTE_ADDR'] != "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('H:i:s')." ".$log_content."\r\n", FILE_APPEND);
        }
    }
}


?>

第二页代码

这一页代码主要关于调用百度天气接口的过程以及他们的数据传输方式。

1、我们要调用百度的天气接口,需要在百度地图开放平台进行注册,然后创建一个应用获取该应用ak和sk。

立即学习PHP免费学习笔记(深入)”;

华友协同办公自动化OA系统
华友协同办公自动化OA系统

华友协同办公管理系统(华友OA),基于微软最新的.net 2.0平台和SQL Server数据库,集成强大的Ajax技术,采用多层分布式架构,实现统一办公平台,功能强大、价格便宜,是适用于企事业单位的通用型网络协同办公系统。 系统秉承协同办公的思想,集成即时通讯、日记管理、通知管理、邮件管理、新闻、考勤管理、短信管理、个人文件柜、日程安排、工作计划、工作日清、通讯录、公文流转、论坛、在线调查、

下载

获取百度地图开放平台接口图1.jpg
获取ak(即access key)后,点击设置,页面如下:
百度地图开放平台图2.jpg
在请求校验方式哪里选择sn校验方式,会自动出现下方的sk码(即 Security Key)。

sk的具体作用和sn计算算法可参照下面这篇文章http://lbsyun.baidu.com/index.php?title=lbscloud/api/appendix
 $ak,
        'location' => $location,
        'output' => $output
    );
    $querystring = http_build_query($querystring_arrays);//使用关联数组生成一个urlencode请求字符串。格式如下:ak=Plev804CmHUMwPXVcehCcB14Ths0zuat&location=深圳&output=json;
   // var_dump($querystring);
//urlencode()   url中的一些特殊字符和中文字符可能不被服务器所识别,需要经过urlencode()编码才能被识别。
    $sn = md5(urlencode($uri.'?'.$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 "
"; echo "
"; echo "
"; echo "
"; echo "
"; echo "
"; echo "
"; echo "
"; var_dump($result); if ($result["error"] != 0){ return $result["status"]; } $curHour = (int)date('H',time()); echo "
"; echo "
"; echo "
"; echo "
"; echo $curHour; $weather = $result["results"][0]; $weatherArray[] = array("Title" =>$weather['currentCity']."天气预报", "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; } ?>

以上就是本篇文章的所有内容,大家好好看看吧,对于刚开始接触微信开发的同学来讲本篇文章可能有点难度哦!    

相关推荐:

PHP微信开发之获取城市天气

相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

2

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

21

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

6

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

28

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

2

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

8

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

3

2026.01.15

php图片上传教程汇总
php图片上传教程汇总

本专题整合了php图片上传相关教程,阅读专题下面的文章了解更多详细教程。

2

2026.01.15

phpstorm相关教程大全
phpstorm相关教程大全

本专题整合了phpstorm相关教程汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

ECMAScript6 / ES6---十天技能课堂
ECMAScript6 / ES6---十天技能课堂

共25课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号