A5下载文章资讯

分类分类

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

2015-08-31 15:37作者:yezheng

 最近有项目需求给微信公众号上增加了天气预报功能,使用百度提供的车联网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;

}

}

?>

展开全部

相关

说两句网友评论
    我要跟贴
    取消