微信公众平台开发之天气预报功能

5年以前  |  阅读数:950 次  |  编程语言:PHP 

最近有项目需求给微信公众号上增加了天气预报功能,使用百度提供的车联网API V3.0中的天气查询功能实现.先上一张最终效果图:

项目需求:有连接好的微信平台,有百度注册帐号,需要在百度LBS开放云平台,添加应用,获取AK代码,PHP代码编辑器,如EditPlus等

下面详细介绍下开发步骤:

第一步:准备工作

  登录微信公众平台,检查服务器配置是否已启用,URL(服务器地址) 是否已配置Token(令牌),与自己写的微信入口文件中的Token(令牌一致),如下图:然后点击提交,只至网页上提示绿色背景的提交成功信息,则完成本步骤的操作

第二步:微信天气预报数据源准备

  用已注册好的百度帐号,登录百度LBS云平台,添加一个应用,获取访问应用AK,及了解车联API V3.0,天气查询功能相应的接口说明文件,以按需调用需要的天气信息.

第三步:微信公众平台,接口文件编写 jiekou.php


    <?php
    /*
     无忧电脑技巧网 微信公众号功能源码
     CopyRight 2015 All Rights Reserved
    */
    define("TOKEN", "weixin2015");
    $wechatObj = new wechatCallbackapiTest();
    if (!isset($_GET['echostr'])) {
     $wechatObj->responseMsg();
    }else{
     $wechatObj->valid();
    }
    class wechatCallbackapiTest
    {
     //验证签名
     public function valid()
     {
     $echoStr = $_GET["echostr"];
     $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){
      echo $echoStr;
      exit;
     }
     }
     public function responseMsg()
     {
     // $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
     $postStr = file_get_contents("php://input");
     if (!empty($postStr)){
      $this->logger("R ".$postStr);
      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
      $RX_TYPE = trim($postObj->MsgType);
     $result = "";
      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)
     {
     switch ($object->Event)
     {
      case "subscribe":
      $content = "欢迎关注无忧电脑技巧网 ";
      break;
     }
     $result = $this->transmitText($object, $content);
     return $result;
     }
     private function receiveText($object)
     {
     $keyword = trim($object->Content); //获得用户输入的信息
     //判断天气
     if(!empty( $keyword )){ //!empty 函数,判断 $keyword获得的值是否为空
     $city = mb_substr($keyword, 0, 2, 'utf-8'); //取用户输入内容前两个字符,如"黄冈天气" 最终取值"黄冈"
     include("weather.php"); //调用天气接口文件
     $content = getWeatherInfo($city); //执行天气接口文件中的 getWeatherInfo方法.查询 黄冈天气.
     } else{
     $content = date("Y-m-d H:i:s",time())."\n技术支持 无忧电脑技巧网\nwww.51pcjq.com"; //发送其它内容默认回复的内容.
     }
     if(is_array($content)){
     if (isset($content[0]['PicUrl'])){
      $result = $this->transmitNews($object, $content);
     }else if (isset($content['MusicUrl'])){
      $result = $this->transmitMusic($object, $content);
     }
     }else{
     $result = $this->transmitText($object, $content);
     }
     return $result;
     }
     private function transmitText($object, $content)
     {
     if (!isset($content) || empty($content)){
     return "";
     }
     $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, $newsArray)
     {
     if(!is_array($newsArray)){
      return "";
     }
     $itemTpl = " <item>
     <Title><![CDATA[%s]]></Title>
     <Description><![CDATA[%s]]></Description>
     <PicUrl><![CDATA[%s]]></PicUrl>
     <Url><![CDATA[%s]]></Url>
     </item>
    ";
     $item_str = "";
     foreach ($newsArray as $item){
      $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
     }
     $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($newsArray));
     return $result;
     }
     private function logger($log_content)
     {
     }
    }

第四步:使用百度车联API V3.0接口,及访问应用AK码,编号微信天气接口源码:

weatger.php


    <?php
    function getWeatherInfo($cityName){ 
    if ($cityName == "" || (strstr($cityName, "+"))){ 
    return "发送天气+城市,例如'天气深圳'"; }//用户查询天气,回复关键词 规则 
    $url = "http://api.map.baidu.com/telematics/v3/weather?location=".urlencode($cityName)."&output;=json&ak;=自已申请的百度车联API AK代码";//构建通过百度车联API V3.0查询天气url链接 
    $ch = curl_init();//初始化会话 curl_setopt($ch, CURLOPT_URL, $url);//设置会话参数 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置会话参数 $output = curl_exec($ch);//执行curl会话 
    curl_close($ch);//关闭curl会话 
    $result = json_decode($output, true);//函数json_decode() 的功能时将json数据格式转换为数组。
     if ($result["error"] != 0){ 
     return $result["status"]; } 
     $curHour = (int)date('H',time()); 
     $weather = $result["results"][0];//按照微信公众号开发文档,组建设多图文回复信息 
     $weatherArray[] = array("Title" => $weather['currentCity']."当前天气:"."温度:".$weather['weather_data'][0]['temperature'].",".$weather['weather_data'][0]['weather'].","."风力:".$weather['weather_data'][0]['wind'].".", "Description" =>"", "PicUrl" =>"http://weixin.51pcjq.com/img/weather_bg.jpg", "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;}?>

注意事项

微信公众平台 TOKEN 与自己编写的微信接口文件中的 TOKEN 的值必须保持一致

编写php代码,需使用专业的php编辑工具,如EditPlus,Dreamweaver等

上述天气接口文件中,百度车联api AK代码已换成 "自已申请的百度车联API AK代码:请申请好后,自行填入

如要不明白的地方,可以关注我的百度空间.留言和我联系!

微信天气预报开发最新代码:


     <meta http-equiv="Content-Type" content="text/html; charset=utf" />
     <?php
     header("Content-Type:text/html;charset=UTF-");
     date_default_timezone_set("PRC");
     /**
     * 最开始用的是微信提供的demo老是不成功,用了这个网上下载的才成功
     */

     //define your token
     define("TOKEN", "djjc");
     $wechatObj = new wechatCallbackapiTest();
     //微信接入操作,成功接入了直接注释了就行了
     $wechatObj->responseMsg();
     //$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);
     $RX_TYPE = trim($postObj->MsgType);

     switch($RX_TYPE)
     {
     case "text":
     $resultStr = $this->handleText($postObj);
     break;
     case "event":
     $resultStr = $this->handleEvent($postObj);
     break;
     default:
     $resultStr = "Unknow msg type: ".$RX_TYPE;
     break;
     }
     echo $resultStr;
     }else {
     echo "";
     exit;
     }
     }
     //测试文字回复
     public function handleText($postObj)
     {
     $fromUsername = $postObj->FromUserName;
     $toUsername = $postObj->ToUserName;
     $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></FuncFlag>
     </xml>"; 
     if(!empty( $keyword ))
     {
     $msgType = "text";
     switch($keyword){
     case "你好":
     $contentStr = "你好!";
     break;
     case "你叫什么名字":
     $contentStr = "我是顶尖机器人";
     break;
    //判断是否为天气
     case $keywords+"天气";
     $str = mb_substr($keyword,-,,"UTF-");
     $str_key = mb_substr($keyword,,-,"UTF-");
     if($str=="天气"){
     $data = $this->weather($str_key)->showapi_res_body;
     $data='[今天白天]'.$data->f->day_weather."\n";
     $data='[今天夜间]'.$data->f->night_weather."\n";
     $data='[明天白天]'.$data->f->day_weather."\n";
     $data='[明天夜间]'.$data->f->night_weather."\n";
     $contentStr = $data.$data.$data.$data;
     }
     break;
     default:
     $contentStr = "听不懂您在讲什么";
     break; 
     }
     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
     echo $resultStr;
     }else{
     echo "Input something...";
     }
     }

     public function handleEvent($object)
     {
     $contentStr = "";
     switch ($object->Event)
     {
     case "subscribe":
     $contentStr = "感谢您关注顶尖教程网,在这里您将得到海量免费学习资源!";
     break;
     default :
     $contentStr = "Unknow Event: ".$object->Event;
     break;
     }
     $resultStr = $this->responseText($object, $contentStr);
     return $resultStr;
     }

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

     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 = sha( $tmpStr );

     if( $tmpStr == $signature ){
     return true;
     }else{
     return false;
     }
     }
     //天气预报 此处汉字需要处理,想了很多办法才没乱码
     private function weather($k){
     $n=urlencode($k);
     $showapi_appid = ''; //去相关网站申请就行
     $showapi_sign = 'deafcacefdea';
     $showapi_timestamp = date('YmdHis');
     $areaid='';
     $paramArr = '';
     $needHourData='';
     $url = iconv('gbk','utf-','http://route.showapi.com/-?'.'area='.$n.'&areaid;=&needHourData;=&needIndex;=&needMoreDay;=&showapi;_appid='.$showapi_appid.'&showapi;_timestamp='.$showapi_timestamp.'&showapi;_sign='.$showapi_sign); 
     $result = file_get_contents($url);
     $result = json_decode($result);
     return $result;
     }
     }
     ?>
 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例