浅谈PHP实现微信获取周边信息功能

最近,在做微信公众平台PHP开发时,实现了根据用户发送的自身定位消息来获取周边信息的功能,为防止时间久后会忘记,特此总结,与大家分享,希望可以共同进步!!!


首先,我们自身的服务器应该与微信服务器对接成功,关于怎么去对接,笔者这里不再赘余,大家可以参考微信提供的开发者文档来实现对接功能。


当我们对接成功后,就可以根据用户发送的定位消息来实现了,这里我们使用的是百度开放平台提供的地图API(http://developer.baidu.com/map/webservice.htm)和静态图API(http://developer.baidu.com/map/static-1.htm),前提是我们需要注册百度帐号,毕竟免费用人家的东西嘛…



下面进行详细讲解:

1、一个API的事例,设置城市为北京,检索关键字是“银行”

http://api.map.baidu.com/place/v2/search?&query=银行&location=39.915,116.404&radius=2000&output=xml&ak=E4805d16520de693a3fe707cdc962045

2、接口参数




返回的结果为:

  1. This XML file does not appear to have any style information associated with it. The document tree is shown below.  
  2. <PlaceSearchResponse>  
  3. <status>0</status>  
  4. <message>ok</message>  
  5. <results>  
  6. <result>  
  7. <name>中国银行(前门支行)</name>  
  8. <location>  
  9. <lat>39.908395</lat>  
  10. <lng>116.401507</lng>  
  11. </location>  
  12. <address>东城区西交民巷17号</address>  
  13. <uid>9077bab3ea018f6a7dc876e1</uid>  
  14. </result>  
  15. <result>  
  16. <name>中国工商银行(自动柜员机店)</name>  
  17. <location>  
  18. <lat>39.92203</lat>  
  19. <lng>116.40349</lng>  
  20. </location>  
  21. <address>西城区景山前街4号故宫景运门</address>  
  22. <uid>8ae8bed1a027af62705e8077</uid>  
  23. </result>  
  24. <result>  
  25. <name>中国工商银行(华龙街分理处)</name>  
  26. <location>  
  27. <lat>39.915002</lat>  
  28. <lng>116.413638</lng>  
  29. </location>  
  30. <address>东城区南河沿华龙街北京天安大厦贵宾楼饭店</address>  
  31. <uid>8d0f865a1c57ef4e76e5b6ff</uid>  
  32. </result>  
  33. <result>  
  34. <name>中国工商银行(长安和平门内支行)</name>  
  35. <location>  
  36. <lat>39.90742</lat>  
  37. <lng>116.390732</lng>  
  38. </location>  
  39. <address>北京市西城区北新华街东松树胡同甲31号</address>  
  40. <telephone>(010)66055708,(010)66057768</telephone>  
  41. <uid>a74481d691a0bf46f503b838</uid>  
  42. </result>  
  43. <result>  
  44. <name>中国农业银行长安支行</name>  
  45. <location>  
  46. <lat>39.910138</lat>  
  47. <lng>116.41365</lng>  
  48. </location>  
  49. <address>北京市东城区正义路3号卫戍区正义路物业楼</address>  
  50. <telephone>(010)65250432</telephone>  
  51. <uid>37d60a4657d8ce601e1d11c9</uid>  
  52. </result>  
  53. <result>  
  54. <name>中国工商银行(北池子储蓄所)</name>  
  55. <location>  
  56. <lat>39.921698</lat>  
  57. <lng>116.409168</lng>  
  58. </location>  
  59. <address>东城区东华门大街87号</address>  
  60. <uid>9577afcbeb7f4c1ae812e46c</uid>  
  61. </result>  
  62. <result>  
  63. <name>中国工商银行北京东交民巷分理处</name>  
  64. <location>  
  65. <lat>39.908091</lat>  
  66. <lng>116.413558</lng>  
  67. </location>  
  68. <address>北京市东城区正义路东交民巷30-6号</address>  
  69. <telephone>010-65266185</telephone>  
  70. <uid>5e53af1accd7a25c4151c026</uid>  
  71. </result>  
  72. <result>  
  73. <name>中国工商银行东长安街支行</name>  
  74. <location>  
  75. <lat>39.91588</lat>  
  76. <lng>116.418675</lng>  
  77. </location>  
  78. <address>北京市东城区东长安街1号东方广场W3座</address>  
  79. <telephone>(010)85181650</telephone>  
  80. <uid>24d05508ea8ccbd2128824de</uid>  
  81. </result>  
  82. <result>  
  83. <name>中国工商银行新东安支行</name>  
  84. <location>  
  85. <lat>39.919304</lat>  
  86. <lng>116.417906</lng>  
  87. </location>  
  88. <address>北京市东城区王府井大街138号一层</address>  
  89. <telephone>010-65256818</telephone>  
  90. <uid>8e96d243973dc4bfc51b75e5</uid>  
  91. </result>  
  92. <result>  
  93. <name>中国工商银行北京王府井金街支行</name>  
  94. <location>  
  95. <lat>39.921006</lat>  
  96. <lng>116.417403</lng>  
  97. </location>  
  98. <address>北京市市辖区东城区北京市东城区王府井大街237号</address>  
  99. <telephone>(010)65246520</telephone>  
  100. <uid>7d5f3a0afc6a944b2cb908c9</uid>  
  101. </result>  
  102. </results>  
  103. </PlaceSearchResponse>  
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<PlaceSearchResponse>
<status>0</status>
<message>ok</message>
<results>
<result>
<name>中国银行(前门支行)</name>
<location>
<lat>39.908395</lat>
<lng>116.401507</lng>
</location>
<address>东城区西交民巷17号</address>
<uid>9077bab3ea018f6a7dc876e1</uid>
</result>
<result>
<name>中国工商银行(自动柜员机店)</name>
<location>
<lat>39.92203</lat>
<lng>116.40349</lng>
</location>
<address>西城区景山前街4号故宫景运门</address>
<uid>8ae8bed1a027af62705e8077</uid>
</result>
<result>
<name>中国工商银行(华龙街分理处)</name>
<location>
<lat>39.915002</lat>
<lng>116.413638</lng>
</location>
<address>东城区南河沿华龙街北京天安大厦贵宾楼饭店</address>
<uid>8d0f865a1c57ef4e76e5b6ff</uid>
</result>
<result>
<name>中国工商银行(长安和平门内支行)</name>
<location>
<lat>39.90742</lat>
<lng>116.390732</lng>
</location>
<address>北京市西城区北新华街东松树胡同甲31号</address>
<telephone>(010)66055708,(010)66057768</telephone>
<uid>a74481d691a0bf46f503b838</uid>
</result>
<result>
<name>中国农业银行长安支行</name>
<location>
<lat>39.910138</lat>
<lng>116.41365</lng>
</location>
<address>北京市东城区正义路3号卫戍区正义路物业楼</address>
<telephone>(010)65250432</telephone>
<uid>37d60a4657d8ce601e1d11c9</uid>
</result>
<result>
<name>中国工商银行(北池子储蓄所)</name>
<location>
<lat>39.921698</lat>
<lng>116.409168</lng>
</location>
<address>东城区东华门大街87号</address>
<uid>9577afcbeb7f4c1ae812e46c</uid>
</result>
<result>
<name>中国工商银行北京东交民巷分理处</name>
<location>
<lat>39.908091</lat>
<lng>116.413558</lng>
</location>
<address>北京市东城区正义路东交民巷30-6号</address>
<telephone>010-65266185</telephone>
<uid>5e53af1accd7a25c4151c026</uid>
</result>
<result>
<name>中国工商银行东长安街支行</name>
<location>
<lat>39.91588</lat>
<lng>116.418675</lng>
</location>
<address>北京市东城区东长安街1号东方广场W3座</address>
<telephone>(010)85181650</telephone>
<uid>24d05508ea8ccbd2128824de</uid>
</result>
<result>
<name>中国工商银行新东安支行</name>
<location>
<lat>39.919304</lat>
<lng>116.417906</lng>
</location>
<address>北京市东城区王府井大街138号一层</address>
<telephone>010-65256818</telephone>
<uid>8e96d243973dc4bfc51b75e5</uid>
</result>
<result>
<name>中国工商银行北京王府井金街支行</name>
<location>
<lat>39.921006</lat>
<lng>116.417403</lng>
</location>
<address>北京市市辖区东城区北京市东城区王府井大街237号</address>
<telephone>(010)65246520</telephone>
<uid>7d5f3a0afc6a944b2cb908c9</uid>
</result>
</results>
</PlaceSearchResponse>


3、下面我们介绍下百度地图API-静态地图生成

http://api.map.baidu.com/lbsapi/staticmap/staticmap-helper.html


4、下面是demo:获取用户定位信息

  1. //地理位置纬度  
  2.    location_X</span><span>&nbsp;=&nbsp;</span><span class="vars">xmlArr[‘Location_X’];  
  3.      
  4.    //地理位置经度  
  5.    location_Y</span><span>&nbsp;=&nbsp;</span><span class="vars">xmlArr[‘Location_Y’];  
 //地理位置纬度
    $location_X = $xmlArr['Location_X'];

    //地理位置经度
    $location_Y = $xmlArr['Location_Y'];

5、调用百度接口,并设置接收数据为json格式,进行json字符串编码

  1. //百度圆形区域地图调用接口  
  2.    strUrl</span><span>&nbsp;=&nbsp;</span><span class="string">"http://api.map.baidu.com/place/v2/search?&amp;query="</span><span>.</span><span class="vars">forName.“&location=”. locationX</span><span>.</span><spanclass="string">","</span><span>.</span><spanclass="vars"> location_Y.“&radius=1500&output=json&ak=ekpxLUyfp8Lv7W1gdj57Oji6”;  
  3.   
  4.    //接受json数据  
  5.    jsonStr</span><span>&nbsp;=&nbsp;</span><span class="func">file_get_contents</span><span>(</span><span class="vars">strUrl);  
  6.   
  7.    //进行json字符串编码  
  8.    jsonArr</span><span>&nbsp;=&nbsp;json_decode(</span><span class="vars">jsonStr,TRUE);  
 //百度圆形区域地图调用接口
    $strUrl = "http://api.map.baidu.com/place/v2/search?&amp;query=".$forName."&location=".$location_X.",".$location_Y."&radius=1500&output=json&ak=ekpxLUyfp8Lv7W1gdj57Oji6";

    //接受json数据
    $jsonStr = file_get_contents($strUrl);

    //进行json字符串编码
    $jsonArr = json_decode($jsonStr,TRUE);

6、生成静态地图图片,获取该图片的二进制编码,将图片保存在服务器

  1. //获取百度地图生成图片  
  2.    pic_640</span><span>&nbsp;=&nbsp;</span><span class="string">"http://api.map.baidu.com/staticimage?width=640&amp;height=320¢er="</span><span>.</span><span class="vars">location_Y.“,”.location_X</span><span>.</span><span class="string">"&amp;zoom=13&amp;markers="</span><span>.</span><span class="vars">location_Y.“,”.location_X</span><span>.</span><span class="string">"&amp;markerStyles=l,"</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;<span class="vars">pic_80 = “http://api.map.baidu.com/staticimage?width=80&height=80¢er=”. locationY</span><span>.</span><spanclass="string">","</span><span>.</span><spanclass="vars"> location_X.“&zoom=13&markers=”. locationY</span><span>.</span><spanclass="string">","</span><span>.</span><spanclass="vars"> location_X.“&markerStyles=l,”;  
  3.   
  4.   
  5.    //获取图片的二进制编码  
  6.    p_640</span><span>&nbsp;=&nbsp;</span><span class="func">file_get_contents</span><span>(</span><span class="vars">pic_640);  
  7.    file_put_contents(“./images/640_”. xmlArr</span><span>[</span><spanclass="string">FromUserName</span><span>].</span><spanclass="string">".png"</span><span>,</span><spanclass="vars"> p_640);  
  8.   
  9.   
  10.    p_80</span><span>&nbsp;=&nbsp;</span><span class="func">file_get_contents</span><span>(</span><span class="vars">pic_80);  
  11.    file_put_contents(“./images/80_”. xmlArr</span><span>[</span><spanclass="string">FromUserName</span><span>].</span><spanclass="string">".png"</span><span>,</span><spanclass="vars"> p_80);  
 //获取百度地图生成图片
    $pic_640 = "http://api.map.baidu.com/staticimage?width=640&amp;height=320¢er=".$location_Y.",".$location_X."&amp;zoom=13&amp;markers=".$location_Y.",".$location_X."&markerStyles=l,";

    $pic_80 = "http://api.map.baidu.com/staticimage?width=80&amp;height=80¢er=".$location_Y.",".$location_X."&amp;zoom=13&amp;markers=".$location_Y.",".$location_X."&markerStyles=l,";


    //获取图片的二进制编码
    $p_640 = file_get_contents($pic_640);
    file_put_contents("./images/640_".$xmlArr['FromUserName'].".png",$p_640);


    $p_80 = file_get_contents($pic_80);
    file_put_contents("./images/80_".$xmlArr['FromUserName'].".png",$p_80);


7、组装成xml字符串,返回给用户

  1. xmlPic</span><span>&nbsp;=&nbsp;"&lt;xml&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ToUserName&gt;&lt;![CDATA[<span class="string">".xmlArr[‘FromUserName’].”]]></ToUserName>  
  2.                    <FromUserName><![CDATA[”.xmlArr['ToUserName']."</span><span>]]&gt;&lt;/FromUserName&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;CreateTime&gt;<span class="string">".time()."</span><span>&lt;/CreateTime&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;MsgType&gt;&lt;![CDATA[news]]&gt;&lt;/MsgType&gt;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ArticleCount&gt;<span class="string">".count(arr).”</ArticleCount>  
  3.                    <Articles>”;  
  4.   
  5.        //遍历地理位置信息  
  6.        foreach(arr</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">key => val</span><span>)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$key</span><span>&nbsp;==&nbsp;0)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$picUrl</span><span>&nbsp;=&nbsp;</span><span class="string">"http://weixin.duapp.com/images/640_"</span><span>.</span><span class="vars">$xmlArr</span><span>[</span><span class="string">'FromUserName'</span><span>].</span><span class="string">".png"</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$picUrl</span><span>&nbsp;=&nbsp;</span><span class="string">"http://weixin.duapp.com/images/80_"</span><span>.</span><span class="vars">$xmlArr</span><span>[</span><span class="string">'FromUserName'</span><span>].</span><span class="string">".png"</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$xmlPic</span><span>&nbsp;.="&lt;item&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Title&gt;&lt;![CDATA[<span class="string">".$val['name']."</span><span>&nbsp;地址:</span><span class="string">".$val['address']."</span><span>&nbsp;电话:</span><span class="string">".$val['telephone']."</span><span>]]&gt;&lt;/Title&gt;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Description&gt;&lt;![CDATA[<span class="string">".$val['name']."</span><span>&nbsp;地址:</span><span class="string">".$val['address']."</span><span>&nbsp;电话:</span><span class="string">".$val['telephone']."</span><span>]]&gt;&lt;/Description&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;PicUrl&gt;&lt;![CDATA[<span class="string">".$picUrl."</span><span>]]&gt;&lt;/PicUrl&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Url&gt;&lt;![CDATA[http:<span class="comment">//api.map.baidu.com/place/detail?uid=".$val['uid']."&amp;output=html&amp;src=".$val['name']."&amp;output=html]]&gt;&lt;/Url&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;";&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">xmlPic .= “ </Articles></xml>”;  
  7.   
  8.        echo xmlPic</span><span>;&nbsp;&nbsp;</span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="250709" snippet_file_name="blog_20140322_5_833268" name="code" class="php" style="display: none;">xmlPic = “<xml> <ToUserName><![CDATA[“. xmlArr[FromUserName].]]></ToUserName><FromUserName><![CDATA[. xmlArr[‘ToUserName’].”]]></FromUserName> <CreateTime>”.time().”</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>”.count( arr).</ArticleCount><Articles>;//foreach( arr as key=> val) { if( key==0)$picUrl="http://weixin.duapp.com/images/640′′.$xmlArr[FromUserName]..png;else$picUrl="http://weixin.duapp.com/images/80′′.$xmlArr[FromUserName]..png; xmlPic .=”<item> <Title><![CDATA[“. val[name]."". val[‘address’].” 电话:”. val[telephone].]]></Title><Description><![CDATA[. val['name']." 地址:". val[address].. val[‘telephone’].”]]></Description> <PicUrl><![CDATA[“. picUrl.]]></PicUrl><Url><![CDATA[http://api.map.baidu.com/place/detail?uid=. val['uid']."&amp;output=html&amp;src=".val[‘name’].”&output=html]]></Url>
                        </item>”;
            }
    xmlPic .= ” </Articles></xml>”; echo $xmlPic;


    8、事例样式图片:




    特此分享,如有错误,欢迎大家指出,嘿嘿~~~

    (完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值