微信公众号开发-输入城市查询天气

注册百度天气api

首先需要到百度地图API上申请一个专用key,申请链接为http://lbsyun.baidu.com/apiconsole/key
这里写图片描述

php程序

ask-weather.php,注意程序中需换上你自己的token和key

<?php
/**
  * 查询天气 输入城市名称比如:北京,即可返回天气信息
  */

//define your token
define("TOKEN", "******");//换上你自己的token
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
    $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}
class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    public function responseMsg()
    {
        //get post data, May be due to the different environments
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        //extract post data
            if (!empty($postStr)){
                //解析数据
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                //发送消息方ID
                $fromUsername = $postObj->FromUserName;
                //接收消息方ID
                $toUsername = $postObj->ToUserName;
                //消息类型
                $form_MsgType = $postObj->MsgType;
                $keyword = trim($postObj->Content);
                $time = time();
                $textTpl = "<xml>
                                                    <ToUserName><![CDATA[%s]]></ToUserName>
                                                    <FromUserName><![CDATA[%s]]></FromUserName>
                                                    <CreateTime>%s</CreateTime>
                                                    <MsgType><![CDATA[%s]]></MsgType>
                                                    <Content><![CDATA[%s]]></Content>
                                                    <FuncFlag>0</FuncFlag>
                                                    </xml>";    
                $tqTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <ArticleCount>5</ArticleCount>
                            <Articles>
                            <item>
                            <Title><![CDATA[%s]]></Title>
                            <Description><![CDATA[%s]]></Description>
                            <PicUrl><![CDATA[%s]]></PicUrl>
                            <Url><![CDATA[%s]]></Url>
                            </item>
                            <item>
                            <Title><![CDATA[%s]]></Title>
                            <Description><![CDATA[%s]]></Description>
                            <PicUrl><![CDATA[%s]]></PicUrl>
                            <Url><![CDATA[%s]]></Url>
                            </item>
                            <item>
                            <Title><![CDATA[%s]]></Title>
                            <Description><![CDATA[%s]]></Description>
                            <PicUrl><![CDATA[%s]]></PicUrl>
                            <Url><![CDATA[%s]]></Url>
                            </item>
                            <item>
                            <Title><![CDATA[%s]]></Title>
                            <Description><![CDATA[%s]]></Description>
                            <PicUrl><![CDATA[%s]]></PicUrl>
                            <Url><![CDATA[%s]]></Url>
                            </item>
                            <item>
                            <Title><![CDATA[%s]]></Title>
                            <Description><![CDATA[%s]]></Description>
                            <PicUrl><![CDATA[%s]]></PicUrl>
                            <Url><![CDATA[%s]]></Url>
                            </item>
                            </Articles>
                            </xml> ";

                //事件消息
                if ($form_MsgType == "text") {
                    //获取用户发送的文字内容
                    $city = trim($postObj->Content);
                                        if (!empty($city)){
                           $mykey = "**************************";//换上你自己的key
                           $url = "http://api.map.baidu.com/telematics/v3/weather?location=".$city."&output=json&ak=".$mykey;
                           $output = file_get_contents($url);
                           $contentStr = json_decode($output, true);

                           if($contentStr['status']=='success')
                           {

                                $T[0]['Title']=$contentStr['date']." ".$contentStr['results'][0]['currentCity']."天气";
                            //$T[0]['PicUrl']="http://zhengwairen-try2.stor.sinaapp.com/xytq.jpg";
                            //$T[0]['Url']="http://zhengwairen-try2.stor.sinaapp.com/xytq.jpg";
                                //上面两行可以设成你想要的顶部图片
                                if(is_array($contentStr['results'][0]['index']))
                                {
                                    $T[2]['Title']="【pm2.5】".$contentStr['results'][0]['pm25']."\n"."【".$contentStr['results'][0]['index'][0]['title']."】"."(".$contentStr['results'][0]['index'][0]['zs'].") ".$contentStr['results'][0]['index'][0]['des'];
                                    //下一行是洗车指数,感觉不对主题还是不要的好。。
                                    //$T[2]['Title']=$T[2]['Title']."\n"."【".$contentStr['results'][0]['index'][1]['title']."】(".$contentStr['results'][0]['index'][1]['zs'].") ".$contentStr['results'][0]['index'][1]['des'];
                                    //下一行是感冒指数
                                    $T[2]['Title']=$T[2]['Title']."\n"."【".$contentStr['results'][0]['index'][2]['title']."】(".$contentStr['results'][0]['index'][2]['zs'].") ".$contentStr['results'][0]['index'][2]['des'];
                                    //下一行是运动指数
                                    $T[2]['Title']=$T[2]['Title']."\n"."【".$contentStr['results'][0]['index'][3]['title']."】(".$contentStr['results'][0]['index'][3]['zs'].") ".$contentStr['results'][0]['index'][3]['des'];
                                    //下一行是紫外线指数
                                    $T[2]['Title']=$T[2]['Title']."\n"."【".$contentStr['results'][0]['index'][4]['title']."】(".$contentStr['results'][0]['index'][4]['zs'].") ".$contentStr['results'][0]['index'][4]['des'];
                                }
                                else
                                $guowai=1;
                                for($i=1,$aaa=0;$i<=5;$i++)
                                {
                                    if($i==2 && $guowai!=1)
                                     continue;
                                    if($guowai==1 && $i==5)
                                     continue;
                                    $T[$i]['Title']=$contentStr['results'][0]['weather_data'][$aaa]['date']." ".$contentStr['results'][0]['weather_data'][$aaa]['temperature']." ".$contentStr['results'][0]['weather_data'][$aaa]['weather']." ".$contentStr['results'][0]['weather_data'][$aaa]['wind'];
                                    $T[$i]['PicUrl']=$contentStr['results'][0]['weather_data'][$aaa]['dayPictureUrl'];
                                    $T[$i]['Url']=$contentStr['results'][0]['weather_data'][$aaa]['dayPictureUrl'];
                                    $aaa++;
                                }

                                $resultStr = sprintf($tqTpl,$fromUsername,$toUsername,time(),"news",$T[0]['Title'],$T[0]['Description'],$T[0]['PicUrl'],$T[0]['Url'], $T[1]['Title'],$T[1]['Description'],$T[1]['PicUrl'],$T[1]['Url'], $T[2]['Title'],$T[2]['Description'],$T[2]['PicUrl'],$T[2]['Url'], $T[3]['Title'],$T[3]['Description'],$T[3]['PicUrl'],$T[3]['Url'], $T[4]['Title'],$T[4]['Description'],$T[4]['PicUrl'],$T[4]['Url'],$T[5]['Title'],$T[5]['Description'],$T[5]['PicUrl'],$T[5]['Url']);
                                //echo $resultStr;
                           }
                    }

                        echo $resultStr;
                        exit;


                    //事件消息
                }elseif($form_MsgType=="event")
                  {
                    //获取事件类型
                    $form_Event = $postObj->Event;
                    //订阅事件
                    if($form_Event=="subscribe")
                    {
                      //回复欢迎文字消息
                      $msgType = "text";
                      $contentStr = "感谢您关注Super King的天气查询公众号[玫瑰]。请输入要查询的城市名称,比如:北京";
                      $resultStr = sprintf($textTpl, $fromUsername, $toUsername, time(), $msgType, $contentStr);
                      echo $resultStr;
                      exit;
                    }    
                  }

      }else {
            echo "";
            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;
        }
    }
}

?>

测试效果

这里写图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值