粉丝除了会给你发送文字,语音,图片,链接这些,还能发送地理位置。面对粉丝发送过来的地理位置,你会怎么做呢。
这个时候,我会想粉丝可能候比较忙,想在附近找ATM取款机或找娱乐场所,比如KTV,电影院。又或者粉丝是一个吃货,想在附近找美食。
这些,百度地图Place API 可以帮助到你。它能告诉你的粉丝附近会有什么。这个就是POI,就是Point of Interest。信息点哈。你可以将附近的粉丝需要的信息点以图文的形式发送给粉丝的。
由于,粉丝发送消息给你(订阅号)每次都是新鲜的。为什么呢。微信公众平台与你个人的服务器之间的接口是唯一一个固定的。
粉丝发送了一条消息,再发一条消息时看,上一条消息(数据)就已经丢失了。这个场景下,腾讯就开始唱了:我给你每一次都是新鲜,你对我的依恋更加明显。所以,想要酒是陈的香的话。那就积累吧,积累吧。这个时候,用数据库可以将上次的信息存储起来。比如粉丝的坐标。
这里,我不想那么麻烦。想简简单单的,还想粉丝是一个吃货。那么好吧。开始百度地图周边搜索就只搜索美食。
(1).用户发来地理位置,你会解析出用户所在地的经度,纬度。这些都是POI的必要参数。
定义百度API接口的URL以及你个人的K值(注册百度账号,可以领取),以及导入匹配图文消息的工具类。
include 'MatchUtils.php'; define(AK, "3c6a1c10cc47ed9ebf87e2c78eb88882"); define(SEARCH_URL,"http://api.map.baidu.com/place/v2/eventsearch"); //v2 团购信息检索服务
下边开始搜索周边了,我这里把粉丝当成一个吃货,并且把地点设置成上海。对于region这个参数很郁闷,竟然是城市代号或城市名字。真不知道百度怎么想的,既然知道经度纬度既然能搜到周围,还不知道是哪个城市么。假如将这个城市设置成上海,其他城市的人发送地理位置,会有什么反应呢。返回0掉数据还是?不知道。如果有兴趣的,可以加我微信订阅号vini1024体验下。其他的参数设置,百度Place API文档中写得很明白,这里就不一一解释了。下边贴出PHP搜索的code。
public function Search($array) { $xpos = $array['Location_X']; $ypos = $array['Location_Y']; $scale = $array['Scale']; $lab = $array['Label']; $query = "美食"; $region = "上海"; $this ->url = SEARCH_URL."?query=".urlencode($query)."&event=groupon®ion=".urlencode($region)."&location={$xpos},{$ypos}&output=json&page_size=10&ak=".AK; $r = file_get_contents($this ->url); $r = json_decode($r , TRUE); foreach ($r["results"] as $key => $item) { $newItem = array(); $newItem['title'] = $item['name']." ".$item['events'][0]['groupon_title']." ".$item['distance']."米"." ".$item['events'][0]['regular_price']."元"; $newItem['description'] = $item['events'][0]['groupon_title']." ".$item['distance']."米"." ".$item['events'][0]['regular_price']."元"; $newItem['picUrl'] = $item['events'][0]['groupon_image']; $newItem['url'] = $item['events'][0]['groupon_webapp_url']; $array['items'][] = $newItem; } $machUtils = new MatchUtils(); $reply = $machUtils->MatchNews($array); $machUtils->Reply($reply); }
这里,不仅获取到了数据,还将数据按照微信公众平台图文的消息进行处理整理了。
(1)一条图文消息,最多可以允许10个图文信息。所以,这里我将page_size设置成10。
(2) 而每搜索到的一个店铺,至少有一个美食在等待预定中。所以这里我取events的第一个。
上边,获取了数据,并将数据进行了处理。那么,将处理的信息与微信公众平台微信图文消息的格式进行匹配解析,然后返回给粉丝。
/** * 回复图文消息 * @param array $newsData * @return string */ public function MatchNews($newsData=array()) { $createtime = time(); $funcflag = $this->setFlag ? 1 : 0; $newTplHeader = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>{%s}</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <ArticleCount>%s</ArticleCount><Articles>"; $newTplItem = "<item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item>"; $newTplFoot = "</Articles> <FuncFlag>%s</FuncFlag> </xml>"; $content = ''; $itemsCount = count($newsData['items']); $itemsCount = $itemsCount < 10 ? $itemsCount : 10;//微信公众平台图文回复的消息一次最多10条 if ($itemsCount) { foreach ($newsData['items'] as $key => $item) { $content .= sprintf($newTplItem,$item['title'],$item['description'],$item['picUrl'],$item['url'])."\r\n";//微信的信息数据 } } $header = sprintf($newTplHeader,$newsData['FromUserName'], $newsData['ToUserName'],$createtime,"news",$itemsCount); $footer = sprintf($newTplFoot,$funcflag); return $header . $content . $footer; }
最后,将消息返回给粉丝。
public function Reply($mes) { if($this -> debug) { $this ->writeStr($mes."\n"); } echo($mes); }
这个时候,用户收到的就是图文消息了。
由于,对php语法不熟悉,出了些很多头疼问题。比如转义字符 ®是®。打印输出的到浏览器时候就是®。而为了避免这个,我用了&处理了&符号。这个时候,在浏览器上输出时正确的。当以post或get方式提交给百度的时候,这个却多此一举。不仅没有帮倒忙,还使得百度返回一个错误2,请求参数非法给你。
先这样吧。