微信公众平台消息接口开发(3)

来源:互联网 发布:广东省大数据管理局 编辑:程序博客网 时间:2024/04/26 08:14

原文链接

上面那篇讲了翻译宝宝,调用有道翻译的接口,现在开发天气宝宝,调用的接口是中国气象网的,这个返回给用户的信息是图文信息。

效果如下:

豌豆荚截图20130319003400 微信公众平台消息接口开发(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];
    $url="http://m.weather.com.cn/data/".$code.".html";
    $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 ($arrayas $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

 欢迎关注天气宝宝和翻译宝宝:qrcode for gh 64423d947dbe 430 微信公众平台消息接口开发(3) qrcode for gh 9bf953886ba5 430 微信公众平台消息接口开发(3)