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 相关文章推荐
Ajax+PHP 边学边练 之二 实例
Nov 24 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
PHP中Date()时间日期函数的使用方法小结
Apr 20 PHP
php eval函数用法 PHP中eval()函数小技巧
Oct 31 PHP
php不用正则验证真假身份证
Nov 06 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
Apr 01 PHP
JavaScript实现滚动栏效果的方法
Apr 27 PHP
php计算税后工资的方法
Jul 28 PHP
php数据序列化测试实例详解
Aug 12 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
PHP生成随机数的方法总结
Mar 01 PHP
php转换上传word文件为PDF的方法【基于COM组件】
Jun 10 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
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
自动更新作用
2006/10/08 Javascript
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
python的绘图工具matplotlib使用实例
2014/07/03 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
python障碍式期权定价公式
2019/07/19 Python
Python流程控制 if else实现解析
2019/09/02 Python
pandas数据处理进阶详解
2019/10/11 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
Ajax请求总共有多少种Callback
2016/07/17 面试题
班主任经验交流会主持词
2014/04/01 职场文书
公司周年庆典标语
2014/10/07 职场文书
商铺门面租房协议书
2014/10/21 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
Python借助with语句实现代码段只执行有限次
2022/03/23 Python
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android