PHP 微信公众号开发:实现基于地理位置的周边酒店查询

一颗松果
一颗松果
发布时间:2026-10-14 | 4人浏览过
原创

本文介绍如何利用 PHP 开发微信公众号,当用户发送地理位置时自动回复周边酒店列表。通过解析 XML 消息获取经纬度,调用百度地图 API(Place V2)搜索酒店,并拼接图文消息进行反馈,为公众号增加实用的 LBS 互动功能。

实现结果与目标

当用户在关注微信公众号后,点击“发送位置”功能并选择一个地点,服务器将接收该位置的经纬度坐标,随后查询附近的酒店,并以包含首张大图及后续小图的新闻列表形式返回给用户。

准备条件

  1. 开发者账号:需要在微信公众平台注册并拥有一个已认证的服务器地址配置权限。
  2. 百度地图 App AK:前往 百度地图开放平台 申请应用密钥(AK),用于访问 Place API。
  3. 运行环境:支持 PHP 环境的 Web 服务器,且需开启 simplexml_load_string、file_get_contents 等函数。

真实操作顺序

第1步:接入微信公众平台校验(Echostr验证)

首先,服务器需要处理微信服务器的 GET 请求,验证签名的合法性,以确保接入有效。此步骤是配置服务器 URL 时的必经之路。

<?php
$signature = $_GET['signature'];
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$echostr = $_GET['echostr'];
$token = "jb51.net"; // 此处填写你在微信后台设置的 Token

$arr = array($token,$timestamp,$nonce);
sort($arr);
$result = sha1(join($arr));

if($result==$signature){
    echo $echostr;
}
?>

第2步:接收并解析地理位置消息(XML 结构)

接入成功后,处理用户的 POST 请求。当用户发送地理位置时,$MsgType 为 location。我们需要从中提取出关键的经纬度数据。

<?php
$poststr = $GLOBALS["HTTP_RAW_POST_DATA"];
$xmlObj = simplexml_load_string($poststr,'SimpleXMLElement',LIBXML_NOCDATA);

// 提取基础字段
$ToUserName = $xmlObj->ToUserName;
$FromUserName = $xmlObj->FromUserName;
$MsgType = $xmlObj->MsgType;

if($MsgType=='location') {
    // 地理位置参数:纬度(Lat)、经度(Lng)、Scale(缩放级别)
    $Location_X = $xmlObj->Location_X;
    $Location_Y = $xmlObj->Location_Y;
}
?>

第3步:调用百度地图 API 获取周边酒店列表

利用上一步获取的经纬度,构造 API 请求 URL。这里使用百度地图的 Place V2 Search API,设置搜索关键词为“酒店”,半径设为 5000 米。

<?php
$urlstr = "http://api.map.baidu.com/place/v2/search&query=酒店&location=".$Location_X.",".$Location_Y."&radius=5000&output=json&ak=DESY8unmZnUlLB0mlowjuiRr";
$jsonstr = file_get_contents($urlstr);
$json = json_decode($jsonstr,true);
?>

注意:实际使用时,请将代码中的 ak 替换为你自己申请的百度地图 Key。

第4步:生成并保存定位缩略图素材

为了丰富回复内容的视觉效果,利用百度地图静态图 API,根据用户的位置生成不同大小的地图截图,并保存到本地服务器,供后续调用展示。

<?php
$pic_640 = "http://api.map.baidu.com/staticimage?width=640&height=320&center=".$Location_Y.",".$Location_X."&zoom=15&markers=".$Location_Y.",".$Location_X.",l,&markerStyles=l,";
$pic_80 = "http://api.map.baidu.com/staticimage?width=80&height=80&center=".$Location_Y.",".$Location_X."&zoom=15&markers=".$Location_Y.",".$Location_X.",l,&markerStyles=l,";

// 保存大图用于第一条资讯
$p_640 = file_get_contents($pic_640);
file_put_contents('./images/640_'.$FromUserName.'.png',$p_640);

// 保存小图用于后续资讯
$p_80 = file_get_contents($pic_80);
file_put_contents('./images/80_'.$FromUserName.'.png',$p_80);
?>

第5步:构建并发送图文消息(News Message)

最后,将搜索结果数组转换为微信公众号支持的 XML 格式。每条资讯包含标题(名称+地址+电话)、描述、图片和跳转链接。第一条资讯通常配图较大,其余配图较小,形成视觉差异。

<?php
function pic_send($arr){
    global $ToUserName,$FromUserName;
    
    $str = "<xml> 
<ToUserName><![CDATA[".$FromUserName."]]></ToUserName> 
<FromUserName><![CDATA[".$ToUserName."]]></FromUserName> 
<CreateTime>".time()."</CreateTime> 
<MsgType><![CDATA[news]]></MsgType> 
<ArticleCount>".count($arr)."</ArticleCount> 
<Articles>";
    
    foreach($arr as $k=>$v){ 
        if($k==0){ 
            $picurl = "http://jb51.net/weixin/images/640_".$FromUserName.".png"; 
        }else{ 
            $picurl = "http://jb51.net.net/weixin/images/80_".$FromUserName.".png"; 
        }
        $str .=" 
<item> 
<Title><![CDATA[".$v['name']." 地址:".$v['address']." 电话:".$v['telephone']."]]></Title> 
<Description><![CDATA[".$v['name']." 地址:".$v['address']." 电话:".$v['telephone']."]]></Description> 
<PicUrl><![CDATA[".$picurl."]]></PicUrl> 
<Url><![CDATA[http://api.map.baidu.com/place/detail?uid=".$v['uid'] ."&output=html&src=".$v['name']."&output=html]]></Url> 
</item>";
    }
    $str .= "</Articles></xml>";
    return $str;
}

echo pic_send($json['results']);
?>

完成判断

部署上述代码后,在微信客户端打开公众号,点击输入框下方的“+”号选择“位置”,选定一个具体地点并发送。若收到包含多家周边酒店信息的图文列表,则说明 PHP 后端成功接收了地理位置并完成了第三方 API 的数据对接。

简要总结

以上就是基于地理位置和 PHP 接口开发的获取周边酒店信息的详细内容,更多关于微信公众平台开发实战的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表