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

前端技术 2023/09/07 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;
 }
 }
 ?>

本文地址:https://www.stayed.cn/item/19640

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。