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下intval()和(int)转换使用与区别
Jul 18 PHP
PHP 数组排序方法总结 推荐收藏
Jun 30 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
Mar 07 PHP
PHP在不同页面间传递Json数据示例代码
Jun 08 PHP
php+mysqli实现批量替换数据库表前缀的方法
Dec 29 PHP
php生成年月日下载列表的方法
Apr 24 PHP
详解PHP对数组的定义以及数组的创建方法
Nov 27 PHP
php中实现字符串翻转的方法
Feb 22 PHP
thinkphp关于简单的权限判定方法
Apr 03 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
PHP使用Redis实现Session共享的实现示例
May 12 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 escape URL编码
2008/12/10 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
PHP目录操作实例总结
2016/09/27 PHP
eval与window.eval的差别分析
2011/03/17 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
Angular 如何使用第三方库的方法
2018/04/18 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
python re正则表达式模块(Regular Expression)
2014/07/16 Python
python通过线程实现定时器timer的方法
2015/03/16 Python
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
Python测试人员需要掌握的知识
2018/02/08 Python
python如何实现内容写在图片上
2018/03/23 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
Django之form组件自动校验数据实现
2020/01/14 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
Python序列化pickle模块使用详解
2020/03/05 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
Java基础类库面试题
2013/09/04 面试题
人事主管岗位职责
2015/02/04 职场文书
茶花女读书笔记
2015/06/29 职场文书
安全知识竞赛主持词
2015/06/30 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
Java 多线程并发FutureTask
2022/06/28 Java/Android