粉丝除了会给你发送文字,语音,图片,链接这些,还能发送地理位置。面对粉丝发送过来的地理位置,你会怎么做呢。

这个时候,我会想粉丝可能候比较忙,想在附近找ATM取款机或找娱乐场所,比如KTV,电影院。又或者粉丝是一个吃货,想在附近找美食。

这些,百度地图Place API 可以帮助到你。它能告诉你的粉丝附近会有什么。这个就是POI,就是Point of Interest。信息点哈。你可以将附近的粉丝需要的信息点以图文的形式发送给粉丝的。

由于,粉丝发送消息给你(订阅号)每次都是新鲜的。为什么呢。微信公众平台与你个人的服务器之间的接口是唯一一个固定的。

粉丝发送了一条消息,再发一条消息时看,上一条消息(数据)就已经丢失了。这个场景下,腾讯就开始唱了:我给你每一次都是新鲜,你对我的依恋更加明显。所以,想要酒是陈的香的话。那就积累吧,积累吧。这个时候,用数据库可以将上次的信息存储起来。比如粉丝的坐标。

这里,我不想那么麻烦。想简简单单的,还想粉丝是一个吃货。那么好吧。开始百度地图周边搜索就只搜索美食。

点击查看百度Place搜索API文档

(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&region=".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语法不熟悉,出了些很多头疼问题。比如转义字符 &reg是®。打印输出的到浏览器时候就是®。而为了避免这个,我用了&amp处理了&符号。这个时候,在浏览器上输出时正确的。当以post或get方式提交给百度的时候,这个却多此一举。不仅没有帮倒忙,还使得百度返回一个错误2,请求参数非法给你。

先这样吧。