前面几篇文章对微信公众平台的开通及简单使用做了简单的介绍,但都没有涉及到实际使用中的问题,例如天气查询,公交查询,快递查询等。接下来的几篇文章将对实际生活中会经常使用到的一些功能进行开发讲解,以供读者参考。
这一篇文章将对大家每天都会关心的天气查询进行开发,例如,用户发送消息 “苏州天气”,则会返回苏州实时天气状况,以及未来两天甚至未来五天的天气状况。
首先要对用户发送过来的消息进行判断,判断消息里是否含有“天气”关键字,如果含有,则需要继续提取地区信息,然后再通过中国天气网(http://www.weather.com.cn)提供的开放API进行相关地区天气查询。
用户发送过来查询天气的消息的格式是固定好的,即 “地区+天气”,所以首先截取后两个字,判断是否为 “天气” 关键字。
使用php函数 mb_substr() 截取,关于该函数的用法:
<span mb_substr — 获取字符串的部分 </span><span string</span> mb_substr ( <span string</span> <span $str</span> , int <span $start</span> [, int <span $length</span> [, <span string</span> <span $encoding</span><span ]] ) <strong>说明:</strong>根据字符数执行一个多字节安全的 </span><span substr</span>() 操作。 位置是从 str 的开始位置进行计数。 第一个字符的位置是 0。第二个字符的位置是 1<span ,以此类推。 <strong>参数:</strong> str 从该 </span><span string</span><span 中提取子字符串。 start str 中要使用的第一个字符的位置。<br />正数 -> 从字符串开头指定位置开始;<br />负数 -> 从字符串结尾指定位置开始;<br /> length str 中要使用的最大字符数。<br />正数 -> <span>从 start </span></span><span <span>处开始最多包括 length </span><span>个字符;<br />负数 -> string <code class="parameter"></code><span>末尾处的 length 个字符将会被漏掉(若 start </span><span>是负数则从字符串开头算起)。</span><br /></span> encoding encoding 参数为字符编码。如果省略,则使用内部字符编码。 <strong>返回值:</strong> mb_substr() 函数根据 start 和 length 参数返回 str 中指定的部分。</span>
$str = mb_substr($keyword,-2,2,"UTF-8");
从消息的结尾数第二个字符开始截取,截取两个字符,然后加以判断是否为 “天气” 关键字。
下面进行地区提取,还是使用 mb_substr() 函数。
$str_key = mb_substr($keyword,0,-2,"UTF-8");
从消息的开头开始,截掉末尾的两个字符(天气),既得地区关键字。
然后进行判断,继而调用函数查询天气数据。
<span if</span>(<span $str</span> == '天气' && !empty($str_key)<span ) { </span><span //调用函数查询天气数据</span> }
我们这里调用的是中国国家气象局提供的天气预报API接口,接口地址:http://m.weather.com.cn/data/101190401.html
URL中的数字指代城市的编号101190401(苏州),其他城市对应关系将在下面提供。
该接口返回信息比较全面,也是以json格式提供,格式如下:
<span {"weatherinfo":{<br /><span>//基本信息;</span> "city":"苏州","city_en":"suzhou", "date_y":"2013年7月9日","date":"","week":"星期二","fchh":"18","cityid":"101190401",<br /><span>//摄氏温度</span> "temp1":"30℃~37℃", "temp2":"30℃~37℃", "temp3":"29℃~35℃", "temp4":"27℃~33℃", "temp5":"27℃~31℃", "temp6":"27℃~35℃",<br /><span>//华氏温度;</span> "tempF1":"86℉~98.6℉", "tempF2":"86℉~98.6℉", "tempF3":"84.2℉~95℉", "tempF4":"80.6℉~91.4℉", "tempF5":"80.6℉~87.8℉", "tempF6":"80.6℉~95℉",<br /><span>//天气描述;</span> "weather1":"晴转多云", "weather2":"晴转多云", "weather3":"晴转多云", "weather4":"多云", "weather5":"雷阵雨转中雨", "weather6":"雷阵雨转多云",<br /><span>//天气描述图片序号</span> "img1":"0", "img2":"1", "img3":"0", "img4":"1", "img5":"0", "img6":"1", "img7":"1", "img8":"99", "img9":"4", "img10":"8", "img11":"4", "img12":"1",<br /><span>//图片名称;</span> "img_single":"1", "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":"多云",<br /><span>//风速描述</span> "wind1":"西南风3-4级", "wind2":"西南风3-4级", "wind3":"东南风3-4级", "wind4":"东南风3-4级转4-5级", "wind5":"东南风4-5级转西南风3-4级", "wind6":"西南风3-4级转4-5级",<br /><span>//风速级别描述</span> "fx1":"西南风", "fx2":"西南风", "fl1":"3-4级", "fl2":"3-4级", "fl3":"3-4级", "fl4":"3-4级转4-5级", "fl5":"4-5级转3-4级", "fl6":"3-4级转4-5级",<br /><span>//今日穿衣指数;</span> "index":"炎热", "index_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。",<br /><span>//48小时穿衣指数</span> "index48":"炎热", "index48_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。",<br /><span>//紫外线及48小时紫外线</span> "index_uv":"中等", "index48_uv":"中等",<br /><span>//洗车指数</span> "index_xc":"适宜",<br /><span>//旅游指数</span> "index_tr":"较不宜",<br /><span>//舒适指数</span> "index_co":"很不舒适", "st1":"36", "st2":"28", "st3":"36", "st4":"28", "st5":"34", "st6":"27",<br /><span>//晨练指数</span> "index_cl":"较适宜",<br /><span>//晾晒指数</span> "index_ls":"适宜",<br /><span>//过敏指数</span> "index_ag":"不易发"}}</span>
weather() 函数如下:
<span private</span> <span function</span> weather(<span $n</span><span ){ </span><span include</span>("weather_cityId.php"<span ); </span><span $c_name</span>=<span $weather_cityId</span>[<span $n</span><span ]; </span><span if</span>(!<span empty</span>(<span $c_name</span><span )){ </span><span $json</span>=<span file_get_contents</span>("http://m.weather.com.cn/data/".<span $c_name</span>.".html"<span ); </span><span return</span> json_decode(<span $json</span><span ); } </span><span else</span><span { </span><span return</span> <span null</span><span ; } }</span>
这里include 了一个城市对应关系文件 weather_cityId.php,格式如下:
<?<span php </span><span $weather_cityId</span> = <span array</span>("北京"=>"101010100","上海"=>"101020100","苏州"=>"101190401"<span ); </span>?>
根据传入的城市名,得到城市代码,如果不为空,则调用中国天气网的API进行查询,返回json格式的数据,然后进行解析并返回数据,如果为空,则返回null值。
判断返回数据是否为空,若为空,则 $contentStr = "抱歉,没有查到\"".$str_key."\"的天气信息!";
若返回数据不为空,则:
$contentStr = "【".$data->weatherinfo->city."天气预报】\n".$data->weatherinfo->date_y." ".$data->weatherinfo->fchh."时发布"."\n\n实时天气\n".$data->weatherinfo->weather1." ".$data->weatherinfo->temp1." ".$data->weatherinfo->wind1."\n\n温馨提示:".$data->weatherinfo->index_d."\n\n明天\n".$data->weatherinfo->weather2." ".$data->weatherinfo->temp2." ".$data->weatherinfo->wind2."\n\n后天\n".$data->weatherinfo->weather3." ".$data->weatherinfo->temp3." ".$data->weatherinfo->wind3;
说明:
weatherinfo->city //获取城市名,这里为苏州
weatherinfo->date_y //获取日期,这里为2013年7月9日
weatherinfo->fchh //数据发布时间
weatherinfo->weather1 //实时天气
weatherinfo->temp1 //实时温度
weatherinfo->wind1 //实时风向和风速
weatherinfo->index_d //穿衣指数
<?<span php </span><span /*</span><span * * wechat php test </span><span */</span> <span //</span><span define your token</span> <span define</span>("TOKEN", "zhuojin"<span ); </span><span $wechatObj</span> = <span new</span><span wechatCallbackapiTest(); </span><span $wechatObj</span>-><span responseMsg(); </span><span //</span><span $wechatObj->valid();</span> <span class</span><span wechatCallbackapiTest { </span><span /*</span><span public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } }</span><span */</span> <span public</span> <span function</span><span responseMsg() { </span><span //</span><span get post data, May be due to the different environments</span> <span $postStr</span> = <span $GLOBALS</span>["HTTP_RAW_POST_DATA"<span ]; </span><span //</span><span extract post data</span> <span if</span> (!<span empty</span>(<span $postStr</span><span )){ </span><span $postObj</span> = <span simplexml_load_string</span>(<span $postStr</span>, 'SimpleXMLElement',<span LIBXML_NOCDATA); </span><span $RX_TYPE</span> = <span trim</span>(<span $postObj</span>-><span MsgType); </span><span switch</span>(<span $RX_TYPE</span><span ) { </span><span case</span> "text": <span $resultStr</span> = <span $this</span>->handleText(<span $postObj</span><span ); </span><span break</span><span ; </span><span case</span> "event": <span $resultStr</span> = <span $this</span>->handleEvent(<span $postObj</span><span ); </span><span break</span><span ; </span><span default</span>: <span $resultStr</span> = "Unknow msg type: ".<span $RX_TYPE</span><span ; </span><span break</span><span ; } </span><span echo</span> <span $resultStr</span><span ; }</span><span else</span><span { </span><span echo</span> ""<span ; </span><span exit</span><span ; } } </span><span public</span> <span function</span> handleText(<span $postObj</span><span ) { </span><span $fromUsername</span> = <span $postObj</span>-><span FromUserName; </span><span $toUsername</span> = <span $postObj</span>-><span ToUserName; </span><span $keyword</span> = <span trim</span>(<span $postObj</span>-><span Content); </span><span $time</span> = <span time</span><span (); </span><span $textTpl</span> = "<span <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml></span>"<span ; </span><span if</span>(!<span empty</span>( <span $keyword</span><span )) { </span><span $msgType</span> = "text"<span ; </span><span //</span><span 天气</span> <span $str</span> = mb_substr(<span $keyword</span>,-2,2,"UTF-8"<span ); </span><span $str_key</span> = mb_substr(<span $keyword</span>,0,-2,"UTF-8"<span ); </span><span if</span>(<span $str</span> == '天气' && !<span empty</span>(<span $str_key</span><span )){ </span><span $data</span> = <span $this</span>->weather(<span $str_key</span><span ); </span><span if</span>(<span empty</span>(<span $data</span>-><span weatherinfo)){ </span><span $contentStr</span> = "抱歉,没有查到\"".<span $str_key</span>."\"的天气信息!"<span ; } </span><span else</span><span { </span><span $contentStr</span> = "【".<span $data</span>->weatherinfo->city."天气预报】\n".<span $data</span>->weatherinfo->date_y." ".<span $data</span>->weatherinfo->fchh."时发布"."\n\n实时天气\n".<span $data</span>->weatherinfo->weather1." ".<span $data</span>->weatherinfo->temp1." ".<span $data</span>->weatherinfo->wind1."\n\n温馨提示:".<span $data</span>->weatherinfo->index_d."\n\n明天\n".<span $data</span>->weatherinfo->weather2." ".<span $data</span>->weatherinfo->temp2." ".<span $data</span>->weatherinfo->wind2."\n\n后天\n".<span $data</span>->weatherinfo->weather3." ".<span $data</span>->weatherinfo->temp3." ".<span $data</span>->weatherinfo-><span wind3; } } </span><span else</span><span { </span><span $contentStr</span> = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待..."<span ; } </span><span $resultStr</span> = <span sprintf</span>(<span $textTpl</span>, <span $fromUsername</span>, <span $toUsername</span>, <span $time</span>, <span $msgType</span>, <span $contentStr</span><span ); </span><span echo</span> <span $resultStr</span><span ; }</span><span else</span><span { </span><span echo</span> "Input something..."<span ; } } </span><span public</span> <span function</span> handleEvent(<span $object</span><span ) { </span><span $contentStr</span> = ""<span ; </span><span switch</span> (<span $object</span>-><span Event) { </span><span case</span> "subscribe": <span $contentStr</span> = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待..."<span ; </span><span break</span><span ; </span><span default</span> : <span $contentStr</span> = "Unknow Event: ".<span $object</span>-><span Event; </span><span break</span><span ; } </span><span $resultStr</span> = <span $this</span>->responseText(<span $object</span>, <span $contentStr</span><span ); </span><span return</span> <span $resultStr</span><span ; } </span><span public</span> <span function</span> responseText(<span $object</span>, <span $content</span>, <span $flag</span>=0<span ) { </span><span $textTpl</span> = "<span <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>%d</FuncFlag> </xml></span>"<span ; </span><span $resultStr</span> = <span sprintf</span>(<span $textTpl</span>, <span $object</span>->FromUserName, <span $object</span>->ToUserName, <span time</span>(), <span $content</span>, <span $flag</span><span ); </span><span return</span> <span $resultStr</span><span ; } </span><span private</span> <span function</span> weather(<span $n</span><span ){ </span><span include</span>("weather_cityId.php"<span ); </span><span $c_name</span>=<span $weather_cityId</span>[<span $n</span><span ]; </span><span if</span>(!<span empty</span>(<span $c_name</span><span )){ </span><span $json</span>=<span file_get_contents</span>("http://m.weather.com.cn/data/".<span $c_name</span>.".html"<span ); </span><span return</span> json_decode(<span $json</span><span ); } </span><span else</span><span { </span><span return</span> <span null</span><span ; } } </span><span private</span> <span function</span><span checkSignature() { </span><span $signature</span> = <span $_GET</span>["signature"<span ]; </span><span $timestamp</span> = <span $_GET</span>["timestamp"<span ]; </span><span $nonce</span> = <span $_GET</span>["nonce"<span ]; </span><span $token</span> =<span TOKEN; </span><span $tmpArr</span> = <span array</span>(<span $token</span>, <span $timestamp</span>, <span $nonce</span><span ); </span><span sort</span>(<span $tmpArr</span><span ); </span><span $tmpStr</span> = <span implode</span>( <span $tmpArr</span><span ); </span><span $tmpStr</span> = <span sha1</span>( <span $tmpStr</span><span ); </span><span if</span>( <span $tmpStr</span> == <span $signature</span><span ){ </span><span return</span> <span true</span><span ; }</span><span else</span><span { </span><span return</span> <span false</span><span ; } } } </span>?>
关于城市对应关系文件 weather_cityId.php,目前更新到了400多个城市,以后还会继续增加,请到QQ群213260412下载吧。
请关注卓锦苏州 微信公众帐号,卓锦苏州 基于SAE 平台开发,针对于主流的微信功能进行开发测试。
您可以关注 卓锦苏州 公众帐号进行功能测试,以及获取新的应用开发。
1. 登录微信客户端,朋友们 -> 添加朋友 -> 搜号码 -> zhuojinsz,查找并关注。
2. 扫描二维码:
卓锦苏州 功能列表。
We Believe, Great People Share Knowledge...