PHP微信开发之根据用户回复关键词\位置返回附近信息


Posted in PHP onJune 24, 2016

用户关注了微信公众号之后,可以回复用户的地理位置(腾讯地图)给公众号,提取位置信息的纬度和经度,转化为百度的纬度和经度。然后根据纬度和经度,调用百度地图的API,返回附近半径2KM以内的“饭店”“旅馆”(可以自定义)等信息。调用百度的API时,需要获取apiKEY,如果没有,请到百度开发者中心去注册和申请。

首先,用一组纬度和经度来测试接口返回的数据:

<?php

/**根据一组经纬度查找附近2公里以内的关键字**/

header('Content-type:text/html;charset=utf-8');

//--------第一步:转换经纬度----
//参考链接:http://developer.baidu.com/map/index.php?title=webapi/guide/changeposition

$Location_X = 23.134521;
$Location_Y = 113.358803;

$url = "http://api.map.baidu.com/geoconv/v1/?coords=$Location_X,$Location_Y&from=3&to=5&ak=这里填写你的apikey";

$res = file_get_contents($url);
$res = json_decode($res, true);

//用户发送腾讯的soso地图位置信息经过转换之后,得到百度地图的经纬度
$x = $res['result'][0]['x'];
$y = $res['result'][0]['y'];

//---------第二步:根据经纬度和关键词获得附近的信息----------
//参考链接:http://developer.baidu.com/map/index.php?title=webapi/guide/webservice-placeapi
$url = "http://api.map.baidu.com/place/v2/search?ak=这里填写你的apikey&output=json&query=" . urlencode("饭店") . "&page_size=10&page_num=0&scope=2&location=$x,$y&radius=2000";
$res = file_get_contents($url);
$res = json_decode($res, true);

// echo "<pre>";
// print_r($res);
// echo "</pre>";

 

//提取所需的信息
foreach($res['results'] as $k=>$v){
 $arr[$k]['name'] = $v['name'];
 $arr[$k]['address'] = $v['address'];
 $arr[$k]['img_url'] = 'http://misakaqnxt-public.stor.sinaapp.com/click.png';
 $arr[$k]['detail_url'] = isset($v['detail_info']['detail_url'])?$v['detail_info']['detail_url']:'';
}

 echo "<pre>";
 print_r($arr);
 echo "</pre>";

返回的数据

PHP微信开发之根据用户回复关键词\位置返回附近信息 

如果你填写了正确的apikey,那么应该返回了上面的数据了。接下来:在微信的接口平台代码(放在你的公网域名空间里的PHP脚本)里,判断消息类型,并获取纬度和经度,调用百度地图API,拼接XML返回即可。由于百度API返回的数据里,没有“饭店”的缩略图,所以我就用了自己网站的一张图。
 为了能够让用户自定义查找周围的“饭店”
 或“旅馆”等信息,可以先让用户回复“寻找XX”,然后提取出XX,放到session里,等用户再回复地理位置时取出session。但我设置了session之后,没能取出session。所以我这里用新浪云的KVDB服务,当然你也可以用memcache或者Redis等缓存方式。 

$which = mb_substr($keyword, 0, 2, 'UTF-8');

elseif($which == "寻找"){

        $find = str_replace($which, "", $keyword);

        //调用新浪云的KVDB服务
        $kv = new SaeKV();
        $kv->init();
        $kv->set('find', $find);

        $contentStr = "选择表情旁边的'+',发送位置,即可查找你要找的地方";
        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
        echo $resultStr;
        exit();

      }
elseif($postObj->MsgType == 'location'){
          /**
           * 如果是收到了地理位置消息,则返回附近的饭店
           */

          //--------第一步:转换经纬度-------
          //参考链接:http://developer.baidu.com/map/index.php?title=webapi/guide/changeposition
          $Location_X = $postObj->Location_X;
          $Location_Y = $postObj->Location_Y;
          
          $url = "http://api.map.baidu.com/geoconv/v1/?coords=$Location_X,$Location_Y&from=3&to=5&ak=这里填写你的apikey";
          
          $res = file_get_contents($url);
          $res = json_decode($res, true);

          //用户发送腾讯的soso地图位置信息经过转换之后,得到百度地图的经纬度
          $x = $res['result'][0]['x'];
          $y = $res['result'][0]['y'];

          //---------第二步:根据经纬度和关键词获得附近的信息----------
          $kv = new SaeKV();
          // 初始化KVClient对象
          $kv->init();
          
          $url = "http://api.map.baidu.com/place/v2/search?ak=这里填写你的apikey&output=json&query=" . urlencode($kv->get('find')) . "&page_size=10&page_num=0&scope=2&location=$x,$y&radius=2000";
          $res = file_get_contents($url);
          $res = json_decode($res, true);
          
          //提取信息
          foreach($res['results'] as $k=>$v){
            $arr[$k]['name'] = $v['name'];
            $arr[$k]['address'] = $v['address'];
            $arr[$k]['img_url'] = 'http://misakaqnxt-public.stor.sinaapp.com/click.png';
            $arr[$k]['detail_url'] = isset($v['detail_info']['detail_url'])?$v['detail_info']['detail_url']:'';
          }

          //--------第三步:拼接XML字符串--------
          $head = "<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[news]]></MsgType>
          <ArticleCount>10</ArticleCount>
          <Articles>";

          $items = "";
          foreach($arr as $v){
            $items .= "<item>
            <Title><![CDATA[" . $v['name'] .":". $v['address'] . "]]></Title>
            <Description><![CDATA[" . $v['address'] . "]]></Description>
            <PicUrl><![CDATA[" . $v['img_url'] . "]]></PicUrl>
            <Url><![CDATA[" . $v['detail_url'] . "]]></Url>
            </item>";
          }

          $foot = "</Articles></xml>";

          $res = $head . $items . $foot;
          
          $resultStr = sprintf($res, $fromUsername, $toUsername, $time);
          echo $resultStr;
          exit();


}

如果你看不懂代码怎么用,可以参考我之前的文章:简单的文本回复    查询微信精选文章 

用户关注了公众号之后,回复寻找饭店,然后回复地理位置之后,就能得附近的饭店信息了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。 

PHP 相关文章推荐
PHP4之真OO
Oct 09 PHP
PHP初学者头疼问题总结
Oct 09 PHP
使用字符串函数输出整数化的PHP版本号
Oct 09 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
Jul 09 PHP
ThinkPHP之用户注册登录留言完整实例
Jul 22 PHP
PHP获取数组最大值下标的方法
May 12 PHP
Zend Framework教程之Resource Autoloading用法实例
Mar 08 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
ThinkPHP 3使用OSS的方法
Jul 19 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
PHP随机数函数rand()与mt_rand()的讲解
Mar 25 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
简单解析PHP程序的运行流程
Jun 23 #PHP
PHP微信开发之查询微信精选文章
Jun 23 #PHP
PHP微信开发之查询城市天气
Jun 23 #PHP
PHP微信开发之有道翻译
Jun 23 #PHP
PHP微信开发之文本自动回复
Jun 23 #PHP
php微信高级接口群发 多客服
Jun 23 #PHP
php英文单词统计器
Jun 23 #PHP
You might like
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
jQuery 工具函数学习资料
2010/04/29 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
了解Javascript的模块化开发
2015/03/02 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
npm qs模块使用详解
2020/02/07 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
python检索特定内容的文本文件实例
2018/06/05 Python
python实现换位加密算法的示例
2018/10/14 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
宝宝周岁宴答谢词
2014/01/26 职场文书
总经理司机职责
2014/02/02 职场文书
职位说明书范文
2014/05/07 职场文书
人事任命书怎么写
2014/06/05 职场文书
汽修专业自荐信
2014/07/07 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
学校财务管理制度
2015/08/04 职场文书
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android
把77A收信机改造成收音机
2022/04/05 无线电