搜索
首页后端开发php教程微信公众平台开发之天气预报功能_PHP

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

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

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

第一步:准备工作

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


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

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

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

<&#63;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

<&#63;php
function getWeatherInfo($cityName){ 
if ($cityName == "" || (strstr($cityName, "+"))){ 
return "发送天气+城市,例如'天气深圳'"; }//用户查询天气,回复关键词 规则 
$url = "http://api.map.baidu.com/telematics/v3/weather&#63;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))&#63;$weather["weather_data"][$i]["dayPictureUrl"]:$weather["weather_data"][$i]["nightPictureUrl"], "Url"=>""); 
 }
 return $weatherArray;}&#63;>

注意事项

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

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

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

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

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

 <meta http-equiv="Content-Type" content="text/html; charset=utf" />
 <&#63;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/-&#63;‘.‘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;
 }
 }
 &#63;>

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

PHP记录:PHP日志分析的最佳实践PHP记录:PHP日志分析的最佳实践Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

解释PHP中晚期静态结合的概念。解释PHP中晚期静态结合的概念。Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

自定义/扩展框架:如何添加自定义功能。自定义/扩展框架:如何添加自定义功能。Mar 28, 2025 pm 05:12 PM

本文讨论了将自定义功能添加到框架上,专注于理解体系结构,识别扩展点以及集成和调试的最佳实践。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能