微信公众平台消息接口开发(3)
上面那篇讲了翻译宝宝,调用有道翻译的接口,现在开发天气宝宝,调用的接口是中国气象网的,这个返回给用户的信息是图文信息。
效果如下:
先了解下中国气象网的api,其实只是一条url,即http://m.weather.com.cn/data/城市代码.html,如http://m.weather.com.cn/data/101280101.html,其中的101280101是城市代码,可以在浏览器输入这条url,看看返回什么数据。
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
|
{ "weatherinfo" : { "city" : "广州" , "city_en" : "guangzhou" , "date_y" : "2013年2月27日" , "date" : "" , "week" : "星期三" , "fchh" : "11" , "cityid" : "101280101" , <!-- 从今天开始到第六天的每天的天气情况,这里的温度是摄氏温度 --> "temp1" : "25℃~19℃" , "temp2" : "24℃~19℃" , "temp3" : "25℃~13℃" , "temp4" : "22℃~11℃" , "temp5" : "16℃~9℃" , "temp6" : "20℃~11℃" , <!-- 从今天开始到第六天的每天的天气情况,这里的温度是华氏温度 --> "tempF1" : "77℉~66.2℉" , "tempF2" : "75.2℉~66.2℉" , "tempF3" : "77℉~55.4℉" , "tempF4" : "71.6℉~51.8℉" , "tempF5" : "60.8℉~48.2℉" , "tempF6" : "68℉~51.8℉" , <!-- 天气描述 --> "weather1" : "阴" , "weather2" : "阴" , "weather3" : "阴转小雨" , "weather4" : "小雨" , "weather5" : "阴转晴" , "weather6" : "晴" , <!-- 天气描述图片序号 --> "img1" : "2" , "img2" : "99" , "img3" : "2" , "img4" : "99" , "img5" : "2" , "img6" : "7" , "img7" : "7" , "img8" : "99" , "img9" : "2" , "img10" : "0" , "img11" : "0" , "img12" : "99" , "img_single" : "2" , <!-- 图片名称 --> "img_title1" : "阴" , "img_title2" : "阴" , "img_title3" : "阴" , "img_title4" : "阴" , "img_title5" : "阴" , "img_title6" : "小雨" , "img_title7" : "小雨" , "img_title8" : "小雨" , "img_title9" : "阴" , "img_title10" : "晴" , "img_title11" : "晴" , "img_title12" : "晴" , "img_title_single" : "阴" , <!-- 风速描述 --> "wind1" : "微风" , "wind2" : "微风" , "wind3" : "微风转北风4-5级" , "wind4" : "北风4-5级转3-4级" , "wind5" : "微风" , "wind6" : "微风" , <!-- 风速级别描述 --> "fx1" : "微风" , "fx2" : "微风" , "fl1" : "小于3级" , "fl2" : "小于3级" , "fl3" : "小于3级转4-5级" , "fl4" : "4-5级转3-4级" , "fl5" : "小于3级" , "fl6" : "小于3级" , <!-- 今天穿衣指数 --> "index" : "舒适" , "index_d" : "建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。" , <!-- 48小时穿衣指数 --> "index48" : "舒适" , "index48_d" : "建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。" , <!-- 紫外线及48小时紫外线 --> "index_uv" : "最弱" , "index48_uv" : "最弱" , <!-- 洗车 --> "index_xc" : "较适宜" , <!-- 旅游 --> "index_tr" : "适宜" , <!-- 舒适指数 --> "index_co" : "舒适" , "st1" : "26" , "st2" : "18" , "st3" : "25" , "st4" : "18" , "st5" : "26" , "st6" : "9" , <!-- 晨练 --> "index_cl" : "较适宜" , <!-- 晾晒 --> "index_ls" : "不太适宜" , <!-- 过敏 --> "index_ag" : "极不易发" } } |
返回的是json格式的数据,至少返回的数据是什么意思,我也已注明。
在根目录下建立一个weather_code.php文件,里面主要是存储各城市的城市名和对应的城市代码,是一个数组,下面只显示部分数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<!--?php $weather_code = array ( '北京' =--> 101010100, '重庆' => 101040100, '上海' => 101020100, '天津' => 101030100, '澳门' => 101330101, '香港' => 101320101, '合肥' => 101220101, '蚌埠' => 101220201, '芜湖' => 101220301, '淮南' => 101220401, '马鞍山' => 101220501, '安庆' => 101220601, '宿州' => 101220701 ); |
在index.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
|
/** * getWeather * @param $keyword * @return unknown */ function getWeather( $keyword ) { include 'weather_code.php' ; $code = $weather_code [ $keyword ]; $file = file_get_contents ( $url ); $obj =json_decode( $file ); $weatherinfo = $obj -> weatherinfo; $city = $weatherinfo -> city; $temp1 = $weatherinfo ->temp1; $temp2 = $weatherinfo ->temp2; $temp3 = $weatherinfo ->temp3; $img1 = $weatherinfo ->img1; $img2 = $weatherinfo ->img3; $img3 = $weatherinfo ->img5; $weather1 = $weatherinfo ->weather1; $weather2 = $weatherinfo ->weather2; $weather3 = $weatherinfo ->weather3; $wind1 = $weatherinfo ->wind1; $wind2 = $weatherinfo ->wind2; $wind3 = $weatherinfo ->wind3; $index = $weatherinfo ->index; $index_d = $weatherinfo ->index_d; $date_y = $weatherinfo ->date_y; $week = $weatherinfo ->week; $array = array ( array ( "title" => $city . " " . $week . " " . $temp1 . " " . $weather1 , "des" => "testdes" , "pic" => "http://api.itcreating.com/weather/image.jpg" ), array ( "title" => $index_d , "des" => "testdes" ), array ( "title" => date ( "Y年m月d日" ). " " . $temp1 . " " . $weather1 . " " . $wind1 , "des" => "testdes" , "pic" => "http://api.itcreating.com/weather/images/" . $img1 . ".png" ), array ( "title" => date ( "Y年m月d日" , strtotime ( "+1 day" )). " " . $temp2 . " " . $weather2 . " " . $wind2 , "des" => "testdes" , "pic" => "http://api.itcreating.com/weather/images/" . $img2 . ".png" ), array ( "title" => date ( "Y年m月d日" , strtotime ( "+2 day" )). " " . $temp3 . " " . $weather3 . " " . $wind3 , "des" => "testdes" , "pic" => "http://api.itcreating.com/weather/images/" . $img3 . ".png" ), ); return $array ; } |
这方法很简单,通过传入城市名,然后获取该城市的城市代码,接着通过中国气象网api发送请求,再将中国气象网返回的数据通过PHP的JSON解析函数json_decode将JSON格式的数据解析为PHP的关联数组,最后将我们需要的信息取出来再封装成数组。
注释掉$wechatObj->responseMsg();
在$wechatObj->responseMsg()下面加入$wechatObj->responseImgMsg();并新建一个responseImgMsg方法,如下:
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
|
public function responseImgMsg() { //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); $fromUsername = $postObj ->FromUserName; $toUsername = $postObj ->ToUserName; $keyword = trim( $postObj ->Content); $time = time(); $textHaderTpl = " <![CDATA[%s]]> <![CDATA[%s]]> %s <![CDATA[news]]> %d "; $textContentTpl = " <![CDATA[%s]]> <![CDATA[%s]]> <![CDATA[%s]]> <![CDATA[%s]]> "; $textFooterTpl = " 1 "; if (! empty ( $keyword )) { $msgType = "news" ; // 判断是否首次关注 if ( $keyword == "Hello2BizUser" ) { } else { $array = getWeather( $keyword ); $resultHaderStr = sprintf( $textHaderTpl , $fromUsername , $toUsername , $time , count ( $array )); foreach ( $array as $key => $value ) { $resultContentStr .= sprintf( $textContentTpl , $value [ 'title' ], $value [ 'des' ], $value [ 'pic' ], $value [ 'url' ]); } $resultFooterStr = sprintf( $textFooterTpl ); echo $resultStr = $resultHaderStr , $resultContentStr , $resultFooterStr ; } } else { echo "Input something..." ; } } else { echo "" ; exit ; } } |
要返回图文消息的,就要使用数组这种方式将将消息输出。
源码已在github上托管,可以上去下载,地址:https://github.com/hxxy2003/Weather-weixin
欢迎关注天气宝宝和翻译宝宝: