php微信开发之百度天气预报

时间:2022-09-06 12:31:16

本文实例为大家分享了php微信百度天气预报的开发代码,供大家参考,具体内容如下

1.登录百度ak申请:http://lbsyun.baidu.com/apiconsole/key

php微信开发之百度天气预报

2.实现天气信息功能

baiduWeather.php 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?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]["data"]."\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.实现天气消息事件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<?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'])){ //SAE
   sae_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);
  }
 }
 
}
?>

php微信开发之百度天气预报

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。