对于一个仅仅临时过一遍PHP基础,临时看了thinkphp的框架原理,直接学习微信开发的小白来说,在学完了PHP微信开发的提升课程之后,对微信开发总算是能够自己开始摸索了,今天是在学会了使用第三方api在微信中进行天气查询的编码后自主的一些小扩展,想想还是写出来,增加点印象与理解。
渔夫老师给我们讲了个大概,怎么使用第三方api,是直接回复城市名称,然后进行查询,我在想,实际开发中,肯定不能是这样的,用户不可能直接回复一个城市的名称,然后我们就知道他要查询的是天气,肯定需要特定的格式,比如【城市+天气】这样。
嗯~对于一个小白来说,既然老师没告诉我该怎么办,那我就自己想想吧~
首先,假设我们已经告知用户,查询天气需要输入这样-》[城市+天气]的格式,然后我们根据他输入的格式将城市名称提取出来,然后再进行查询和回复。
我想,这里大概需要一个if判断,首先判断用户输入的是否包含‘天气’字符串,我其实并不知道php的这样的函数是什么,于是我百度了一下【php 判断是否包含字符串】,然后果然得到了答案,我决定使用strpos()函数,因为它返回的是一个boolean值,我需要的就是这个。
而其他的如strstr(),则是搜索字符串在另一字符串中的第一次出现,并返回字符串的剩余部分;
stristr(),与strstr()一样,区别是stristr()不区分大小写,而strstr()是分大小写的。
if判断为true后,我想,我需要从用户输入的Content中提取出城市的名称,该怎样实现呢,我觉得应该也是有这样的函数的,于是我又百度了一下【php 截取字符串的函数】,于是,我找到了substr(),他可以帮助我们截取字符串中制定位置的字符串,然而当我这样[substr($content,0,2)]进行城市名称截取的时候,我发现并没有什么卵用,然后我又学到了一个我觉得比较重要的小知识点:汉字在不同的编码环境中占不同的字节空间!
即:utf-8下一个汉字占用3个字节。linux系统默认情况下采用的该种编码方式。
gb2312下一个汉字占用2个字节。windows中文版采用的该种编码方式。
然后我试着这样-->【substr($content,0,6)】,于是实验成功,顺利跑通,见下图↓↓↓
代码如下:
if (strtolower($msgType) == 'text') {
$cityNamePos = '天气';
if(strpos($content,$cityNamePos)){
$ch = curl_init();
$city = substr($content,0,6);
$url = 'http://apis.baidu.com/apistore/weatherservice/cityname?cityname='.urlencode($city);
$header = array(
'apikey: b57a13a33f5b10af4954e8d09e416489',
);
// 添加apikey到header
curl_setopt($ch, CURLOPT_HTTPHEADER , $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 执行HTTP请求
curl_setopt($ch , CURLOPT_URL , $url);
$res = curl_exec($ch);
var_dump(json_decode($res));
$arr = json_decode($res , true);
$content = '查询城市:'.$arr['retData']['city']."\n".
'查询日期:20'.$arr['retData']['date']."\n".
'当前天气:'.$arr['retData']['weather']."\n".
'当前气温:'.$arr['retData']['temp'].'℃';
$result = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$textInfo = sprintf($result,$fromUser , $toUser , $time , $msgType , $content);
echo $textInfo;
}else{
$content = '查询天气请以[城市+天气]的格式输入,如[北京天气]';
$result = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$textInfo = sprintf($result,$fromUser , $toUser , $time , $msgType , $content);
echo $textInfo;
}
}
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章