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


Posted in PHP onAugust 31, 2015

最近有项目需求给微信公众号上增加了天气预报功能,使用百度提供的车联网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 相关文章推荐
纯真IP数据库的应用 IP地址转化成十进制
Jun 14 PHP
php.ini中date.timezone设置分析
Jul 29 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
php自定义类fsocket模拟post或get请求的方法
Jul 31 PHP
php实现简单爬虫的开发
Mar 28 PHP
PHP微信开发之查询城市天气
Jun 23 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 PHP
yii插入数据库防并发的简单代码
May 27 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
yii2 在控制器中验证请求参数的使用方法
Jun 19 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 PHP
如何在Mac上通过docker配置PHP开发环境
May 29 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
Aug 28 #PHP
PHP7.0安装笔记整理
Aug 28 #PHP
php中二维数组排序问题方法详解
Aug 28 #PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 #PHP
PHP生成随机密码方法汇总
Aug 27 #PHP
windows下apache搭建php开发环境
Aug 27 #PHP
php给图片添加文字水印方法汇总
Aug 27 #PHP
You might like
xml+php动态载入与分页
2006/10/09 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
mac环境中使用brew安装php5.5.15
2014/08/18 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
JavaScript实现区块链
2018/03/14 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
python 实现两个线程交替执行
2020/05/02 Python
python如何编写win程序
2020/06/08 Python
结束运行python的方法
2020/06/16 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
在什么时候需要使用"常引用"
2015/12/31 面试题
艺术应用与设计个人的自我评价
2013/11/23 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
英语教师个人总结
2015/02/09 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers