微信公众系列之百度天气预报开发
1.登录百度ak申请:
http://lbsyun.baidu.com/apiconsole/key
2.实现天气信息功能
baiduWeather.php
<?php
/*** 使用百度天气预报接口获取城市天气信息案例实现*///获取城市天气信息function getWeatherInfo($cityName){if($cityName == "" || (strstr($cityName,"+"))){return "发送城市加天气,例如北京天气";}//获取到的ak$ak = your ak;//获取到的sk$sk = your sk;//调用接口$url = 'http://api.map.baidu.com/telematics/v3/weather?ak=%s&location=%s&output=%s&sk=%s';$uri = '/telematics/v3/weather';$location = $cityName;$output = 'json';$querystring_arrays = array('ak' => $ak,'location' => $location,'output' => $output);$querystring = http_build_query($querystring_arrays);//生成sn$sn = md5(urlencode($uri.'?'.$querystring.$sk));$targetUrl = sprintf($url,$ak,urlencode($location),$output,$sn);$ch = curl_init();curl_setopt($ch,CURLOPT_URL,$targetUrl);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);$result = curl_exec($ch);curl_close($ch);$result = json_decode($result,true);if($result["error"]!=0){return $result["status"];}$curHour = (int)date('H',time());$weather = $result["results"][0];$weatherArray[]=array("Title"=>$weather['currentCity']."天气预报","Description"=>"","PicUrl"=>"","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;}
3.实现天气消息事件
<?php
/*CopyRight 2016 All Rights Reserved
*/define("TOKEN", "weixin");
/*** 百度天气预报案例实现* 实现思路:* 1.申请百度ak、sk* 2.使用百度天气预报接口* 3.实现天气信息功能* 4.实现事件响应功能*/
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {$wechatObj->responseMsg();
}else{$wechatObj->valid();
}class wechatCallbackapiTest
{//验证签名public function valid(){$echoStr = $_GET["echostr"];if($this->checkSignature()){header('content-type:text');echo $echoStr;exit;}}public function checkSignature(){$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) {return true;}else{return false;}}//响应消息public function responseMsg(){$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];if (!empty($postStr)){$this->logger("R ".$postStr);$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$RX_TYPE = trim($postObj->MsgType);//消息类型分离switch ($RX_TYPE){case "event":$result = $this->receiveEvent($postObj);break;case "text":$result = $this->receiveText($postObj);break;default:$result = "unknown msg type: ".$RX_TYPE;break;}echo $result;}else {echo "";exit;}}//接收事件消息public function receiveEvent($object){$content = "";switch ($object->Event){case "subscribe":$content = "欢迎关注Nicky的公众号 ";$content .= (!empty($object->EventKey))?("\n来自二维码场景 ".str_replace("qrscene_","",$object->EventKey)):"";break;case "unsubscribe":$content = "取消关注";break;}$result = $this->transmitText($object, $content);return $result;}//接收文本消息public function receiveText($object){$keyword = trim($object->Content);//自动回复模式if (strstr($keyword, "天气")){$city = str_replace('天气','',$keyword);include("baiduweather.php");$content = getWeatherInfo($city);}$result = $this->transmitNews($object, $content);return $result;}//回复图文消息public 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']);}$xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));return $result;}//日志记录public function logger($log_content){if(isset($_SERVER['HTTP_APPNAME'])){ //SAEsae_set_display_errors(false);sae_debug($log_content);sae_set_display_errors(true);}else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL$max_size = 10000;$log_filename = "log.xml";if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);}}}
?>
微信公众系列之百度天气预报开发相关推荐
- 微信公众号网页在本地开发模式下如何使用正式环境的域名来调试
微信公众号网页在本地开发模式下如何使用正式环境的域名来调试? 鄙人之前也不知道,网上搜了一下,看到的几篇文章都是要使用代理,有用Nginx的,还有自己写代理的.主要是按照步骤做了并不行.于是自己折腾了 ...
- 公众号分享页面php,微信公众号网页分享功能开发的示例代码
现在每天都可以看到很多微信分享的链接上面有网站或者商家的自定义的分享标题,和分享链接的描述及分享出去的图像,例如下面的分享出去的链接: 上面这个是微信的js-SDK页面分享给微信好友在聊天列表中显示的 ...
- 《微信公众平台与小程序开发——从零搭建整套系统》——第1章,第1.2节微信公众平台...
本节书摘来自异步社区<微信公众平台与小程序开发--从零搭建整套系统>一书中的第1章,第1.2节微信公众平台,作者 张剑明,更多章节内容可以访问云栖社区"异步社区"公众号 ...
- 微信公众号的二次开发(二 自定义菜单的创建)
在上篇<微信公众号的二次开发(一)>我们介绍了微信订阅号的一些坑, 以及微信公众平台开发的一些基本配置.下面我们继续介绍如何通过用户关注等行为.获取用户的openid. 自定义微信公众号菜 ...
- 如何判断微信公众号是否二次开发(一)
微信公众号是否二次开发,即微信公众号是否使用了公众平台开发接口(其中主要如:自定义菜单接口.配置第三方开发服务器接口.调用外部链接等). 接下来介绍如何用手机直观的去判断微信公众号是否二次开发,主要从 ...
- 微信公众号的二次开发(三、接收事件推送获取用户信息)
在上篇<微信公众号的二次开发(二 自定义菜单的创建)>中我们介绍了自定义菜单的创建.本篇文章将介绍如何通过接收事件推送来获取用户信息.首先我们阅读官方文档: 根据官方文档的介绍 微信公众号 ...
- 微信公众平台基础和java开发
微信公众平台基础和java开发 1.微信公众号是和微信号的区别: 社交圈:大多数都是认识的人,可以进行一对一, 多对多的交流 社交圈:公众号包括个人在内的更大的社交圈, 关注用户大多都不认识 手机号码 ...
- 微信公众号消息推送开发(模板消息):点击推送消息跳转到网页或者小程序(三)
需求场景: 点击推送的消息后跳转到小程序中的某个页面,或者跳转到某一个网页上,例如有这样一个需求,在商城平台购买产品后,需要通过公众号给用户推送订单详细并且点击消息可以看到对应的订单详情.以下我将在微 ...
- 微信公众号的二次开发(一 订阅号没有获取网页授权的解决方法)
前言 应公司开发需求,最近需要进行公众号的二次开发.经过系列讨论,最后确定为使用订阅号来开发. 因为公众号开发要获取微信用户的基本信息,需要通过用户授权获取code,然后去换取openid,最后在获取 ...
最新文章
- 要在 create-react-app 脚手架里使用 less 的方法
- Glide和Govendor安装和使用
- 《LeetCode力扣练习》第6题 C语言版 (做出来就行,别问我效率。。。。)
- soapui 证书_SoapUI入门之附件上传和配置Https请求
- gin context和官方context_Go Web 小技巧(一)简化Gin接口代码
- JS与APP原生控件交互
- SpringBoot测试失败并报错: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration
- edge打开pdf不显示印章_SumatraPDF - 免费轻量的 PDF 阅读器
- java static关键字_Java基础:static关键字作用总结
- 时间序列分析和预测(含实例及代码)
- Eclipse最新SVN(4.2.x )插件subclipse安装方法
- 获得bat的运行目录
- srb话题x-s x-b3-traceid
- 超融合架构真的完美吗?
- 利用AJAX做天气预报
- 华为p4支持鸿蒙功能吗_只要华为鸿蒙系统能支持三个APP,我就愿意支持!
- SpringBoot打开resources目录下的文件操作
- vscode@局部替换文本/正则匹配分组替换(复杂删除修改替换)/目录检索_模糊匹配工作空间的目录
- 普华i-VirtualApp应用交付系统介绍
- SAP 各大常用模块汇总介绍(一)
热门文章
- 迁移学习基础知识(一)——分类及应用
- 全国高中数学联赛介绍
- 老师教我们用计算机画画就是彩虹,一年级上课文
- PT100高精度测温电路 AD623+REF3030(转)
- 计算机应用技术python_大学计算机应用技术02PythonB2020学习通app网课答案
- 随机创建圆形、三角形或者矩形类的对象, 存放在数组中,并计算出每个形状的面积和周长
- Javaweb_文件上传
- 编辑精选 | 每周为你推荐Github热门项目、学习资源等优质内容!
- Linux 4.x MTD源码分析-cfi-flash设备probe过程分析
- python 读取传入参数