最近有项目需求给微信公众号上增加了天气预报功能,使用百度提供的车联网API V3.0中的天气查询功能实现.先上一张最终效果图:
项目需求:有连接好的微信平台,有百度注册帐号,需要在百度LBS开放云平台,添加应用,获取AK代码,PHP代码编辑器,如EditPlus等
下面详细介绍下开发步骤:
第一步:准备工作
登录微信公众平台,检查服务器配置是否已启用,URL(服务器地址) 是否已配置Token(令牌),与自己写的微信入口文件中的Token(令牌一致),如下图:然后点击提交,只至网页上提示绿色背景的提交成功信息,则完成本步骤的操作
第二步:微信天气预报数据源准备
用已注册好的百度帐号,登录百度LBS云平台,添加一个应用,获取访问应用AK,及了解车联API V3.0,天气查询功能相应的接口说明文件,以按需调用需要的天气信息.
第三步:微信公众平台,接口文件编写 jiekou.PHP
PHP;">
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,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 = "
%s
";
$result = sprintf($textTpl,$object->FromUserName,$object->ToUserName,time(),$content);
return $result;
}
private function transmitNews($object,$newsArray)
{
if(!is_array($newsArray)){
return "";
}
$itemTpl = "
-
";
$item_str = "";
foreach ($newsArray as $item){
$item_str .= sprintf($itemTpl,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
}
$newsTpl = "
%s
%s
$item_str
";
$result = sprintf($newsTpl,count($newsArray));
return $result;
}
private function logger($log_content)
{
}
}
第四步:使用百度车联API V3.0接口,及访问应用AK码,编号微信天气接口源码:
weatger.PHP
PHP;">
$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代码:请申请好后,自行填入
如要不明白的地方,可以关注我的百度空间.留言和我联系!
微信天气预报开发最新代码:
PHP;">
//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 = "
%s
";
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 = "
%s
";
$resultStr = sprintf($textTpl,$content,$flag);
return $resultStr;
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token,$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;
}
}
?>