最近有项目需求给微信公众号上增加了天气预报功能,使用百度提供的车联网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; } } ?>
本文地址:https://www.stayed.cn/item/19640
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我