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 相关文章推荐
php抓取https的内容的代码
Apr 06 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
Jun 28 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
destoon安装出现Internal Server Error的解决方法
Jun 21 PHP
PHP解析RSS的方法
Mar 05 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 PHP
PHP实现可自定义样式的分页类
Mar 29 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
Nov 07 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 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 socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
Python简易版停车管理系统
2019/08/12 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
Python如何生成xml文件
2020/06/04 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
元旦寄语大全
2014/04/10 职场文书
爱心捐款倡议书
2014/04/14 职场文书
献爱心活动总结
2014/05/07 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
论群众路线学习笔记
2014/11/06 职场文书
2015年大学生工作总结
2015/04/21 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript