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


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 相关文章推荐
PHP 程序员也要学会使用“异常”
Jun 16 PHP
php中autoload的用法总结
Nov 08 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
Apr 17 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
Oct 30 PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 PHP
php阳历转农历优化版
Aug 08 PHP
thinkPHP中session()方法用法详解
Dec 08 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
php中关于换行的实例写法
Sep 26 PHP
php实现的数组转xml案例分析
Sep 28 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
使用php显示搜索引擎来的关键词
2014/02/13 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
python中验证码连通域分割的方法详解
2018/06/04 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
电脑教师的教学自我评价
2013/11/26 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
幼儿园课题方案
2014/06/09 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript