微信公众平台开发(三)--位置信息的识别

标签: 微信 公众 平台 | 发表时间:2013-03-25 21:37 | 作者:qiyadeng
出处:http://www.blogjava.net/

位置识别这是实际应用经常应用的消息,特别是很多商家,通过了解用户位置,给用户提供特别的产品或是商场的推荐。其中用户可能发送两种类型的消息:

1.微信地理位置信息

2.路名、标志性建筑或是商场名称

1.微信地理位置消息

认识一下,微信地理位置消息,包含一些什么信息


<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>23.134521</Location_X>
<Location_Y>113.358803</Location_Y>
<Scale>20</Scale>
<Label><![CDATA[位置信息]]></Label>
<MsgId>1234567890123456</MsgId>
</xml>

包含的主要信息有经度纬度和Label的位置。可以根据label中描述的位置信息,提供给用户对应的服务。也可根据用户的经度纬度信息,提供你最近的产品或是有地域性的产品。

首先根据微信的地理位置信息,定义WeChatLocationMessage类,并能把Xml转换为WeChatLocationMessage对象

public class WeChatLocationMessage {
    private String toUserName;
    private String fromUserName;
    private String createTime;
    private String msgType;
    private String locationx;
    private String localtiony;
    private String scale;
    private String label;
    private String msgId;
    
    public static WeChatLocationMessage getWeChatLocationMessage(String xml){
        XStream xstream = new XStream(new DomDriver());
        WeChatLocationMessage  message = null;
        xstream.alias("xml", WeChatLocationMessage.class);
        xstream.aliasField("ToUserName", WeChatLocationMessage.class, "toUserName");
        xstream.aliasField("FromUserName", WeChatLocationMessage.class, "fromUserName");
        xstream.aliasField("CreateTime", WeChatLocationMessage.class, "createTime");
        xstream.aliasField("MsgType", WeChatLocationMessage.class, "msgType");
        xstream.aliasField("Location_X", WeChatLocationMessage.class, "locationx");
        xstream.aliasField("Location_Y", WeChatLocationMessage.class, "localtiony");
        xstream.aliasField("Scale", WeChatLocationMessage.class, "scale");
        xstream.aliasField("Label", WeChatLocationMessage.class, "label");
        xstream.aliasField("MsgId", WeChatLocationMessage.class, "msgId");
        message = (WeChatLocationMessage)xstream.fromXML(xml);
        return message;
    }
//getter and setter
}
本文利用百度的地图API,查找最近的银行做为示例。

    public String getPalace(String query,String lat,String lng) throws ClientProtocolException, IOException{
        HttpClient httpClient = new DefaultHttpClient();
        String url = palceRequestUrl(query,lat,lng);
        logger.log(Level.INFO, url);
        HttpGet httpget = new HttpGet(url);
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        String responseBody = httpClient.execute(httpget, responseHandler);
        logger.log(Level.INFO,"baidu response:"+responseBody);
        return responseBody;
    }
    
    public String palceRequestUrl(String query,String lat,String lng) throws UnsupportedEncodingException {
        String url = WeChatConstant.BASEURL + "place/search?query=" + URLEncoder.encode(query,"UTF-8") + "&key="
                + WeChatConstant.MAPKEY +"&location="+lat+","+lng +"&radius=2000"+"&output=" + WeChatConstant.OUTPUTFORMAT;
        return url;
    }
输出的结果
<PlaceSearchResponse>
    <status>OK</status>
    <results>
        <result>
            <name>中国工商银行东长安街支行</name>
            <location>
                <lat>39.915891</lat>
                <lng>116.41867</lng>
            </location>
            <address>东城区东长安街1号东方广场西三办公楼1楼</address>
            <uid>a025683c73033c35a21de987</uid>
            <detail_url>http://api.map.baidu.com/place/detail?uid=a025683c73033c35a21de987&amp;amp;output=html&amp;amp;source=placeapi
            </detail_url>
            <tag>银行,王府井/东单</tag>

        </result>
      </results>
</PlaceSearchResponse>

接下来,把百度地图反映出来的最近位置信息,以图文消息的格式展示给微信用户

    public static String getWeChatReplyNewsMessageByBaiduPlace(List<BaiduPlaceResponse> placeList, double lat, double lng,String userName, int size){
        WeChatReplyNewsMessage newsMessage = new WeChatReplyNewsMessage();
        List<Item> items = new ArrayList<Item>();
        StringBuffer strBuf = new StringBuffer();
        logger.log(Level.INFO,"placeList count="+placeList.size());
        newsMessage.setItems(items);
        if(placeList.size()>size){
            newsMessage.setArticleCount(size);
        }
        else{
            newsMessage.setArticleCount(placeList.size());
        }
        logger.log(Level.INFO,"article count="+newsMessage.getArticleCount());
        newsMessage.setCreateTime(new Date().getTime()+"");
        newsMessage.setMsgType("news");
        newsMessage.setFuncFlag("0");
        newsMessage.setToUserName(userName);
        newsMessage.setFromUserName(WeChatConstant.FROMUSERNAME);
        for(int i = 0;i <newsMessage.getArticleCount();i++){
            BaiduPlaceResponse place = placeList.get(i);
            Double distance = GeoUtil.DistanceOfTwoPoints(Double.valueOf(place.getLng()), Double.valueOf(place.getLat()), lng, lat, GaussSphere.Beijing54);
            Item item = new Item();
            item.setTitle(place.getName()+"["+distance+"米]"+"\n"+place.getAddress()+"\n"+place.getTelephone());
            item.setPicUrl("");
            item.setUrl(place.getDetailUrl());
            item.setDescription("");
            items.add(item);
        }
        logger.log(Level.INFO,"newMessage="+newsMessage.toString());
        strBuf = strBuf.append(getWeChatNewsMessage(newsMessage));
        
        return strBuf.toString();
    }
    
    public static String getWeChatNewsMessage(WeChatReplyNewsMessage newsMessage){
        XStream xstream = new XStream(new DomDriver());
        xstream.alias("xml", WeChatReplyNewsMessage.class);
        xstream.aliasField("ToUserName", WeChatReplyNewsMessage.class, "toUserName");
        xstream.aliasField("FromUserName", WeChatReplyNewsMessage.class, "fromUserName");
        xstream.aliasField("CreateTime", WeChatReplyNewsMessage.class, "createTime");
        xstream.aliasField("MsgType", WeChatReplyNewsMessage.class, "msgType");
        xstream.aliasField("ArticleCount", WeChatReplyNewsMessage.class, "articleCount");
        xstream.aliasField("Content", WeChatReplyNewsMessage.class, "content");
        xstream.aliasField("FuncFlag", WeChatReplyNewsMessage.class, "funcFlag");
        xstream.aliasField("Articles", WeChatReplyNewsMessage.class, "items");
        
        xstream.alias("item", Item.class);
        xstream.aliasField("Title", Item.class, "title");
        xstream.aliasField("Description", Item.class, "description");
        xstream.aliasField("PicUrl", Item.class, "picUrl");
        xstream.aliasField("Url", Item.class, "url");
        
        return xstream.toXML(newsMessage);
    }

2.路名、标志性建筑或是商场名称

对路名、标志性建筑等信息,方法还是通过第三方地图信息,确定输入的位置信息的经度纬度。

本文使用百度地图API,确定所查找的位置的经度和纬度。


    public String getGeoCode(String query) throws ClientProtocolException, IOException{
        HttpClient httpClient = new DefaultHttpClient();
        String url = geoCodeRequestUrl(query);
        logger.log(Level.INFO, url);
        HttpGet httpget = new HttpGet(url);
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        String responseBody = httpClient.execute(httpget, responseHandler);
        logger.log(Level.INFO,"baidu response:"+responseBody);
        return responseBody;
    }
    
    public String geoCodeRequestUrl(String query) throws UnsupportedEncodingException{
        String url = WeChatConstant.BASEURL + "geocoder?address=" + URLEncoder.encode(query,"UTF-8") + "&key="
                + WeChatConstant.MAPKEY + "&output=" + WeChatConstant.OUTPUTFORMAT;
        return url;
    }

确定了经度和纬度,问题就变成和第1种消息类型一致了,根据经度纬度去做相应处理。

3.源代码

本文的代码较长,提供源代码下载。

WeChatDemo下载

原创文章,转载请注明: 转载自 http://www.qiyadeng.com/

本文链接地址: 微信公众平台开发(三)–位置信息的识别












qiyadeng 2013-03-25 21:37 发表评论

相关 [微信 公众 平台] 推荐:

浅谈微信公众平台

- - 微博之博
过去的这个周末,应该大部分人都在家里调戏 微信公共 平台. 有人幸灾乐祸,有人稍作恐慌:芸芸众生相. 注册尝试了一个微信 公众平台,总结一句话:龙生龙,凤生凤. 以前曾经有人说中国的互联网,要么生要么死要么被腾讯. 企鹅家族优良的传统,势必不会放过 微博帝国的3亿用户群的潜在商业价值,所以这次爱起哄的企鹅家族,又一次决定露出起哄天性,悄悄的推出了微信公众平台.

微信公众平台开发(一)

- - BlogJava-首页技术区
  开始微信公众平台的开发,我们首先要了解微信平台可以帮助我们做哪些事情. 使用您的公众账号登陆http://mp.weixin.qq.com/,选择菜单--高级功能-开发模式--查看文档,即能看到微信公众平台目前所能开发的功能. 接受用户发送给您公众账号的消息. 需要特别说明的是,发送消息和回复消失是一个连贯的过程,只能在一个对话中完成.

微信公众平台接口开发

- - CSDN博客互联网推荐文章
随着微信公众平台的开放,微信营销推广也越发受到重视. 现在企业越来越注重求职者是否拥有“微信公众平台接口开发”的经验. 现在参考资料介绍下微信公众平台接口开发模式:. 首先你得有个微信公众平台账号,注册地址:http://mp.weixin.qq.com/. 开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数:.

微信公众平台开发入门

- - Web前端 - ITeye博客
在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序、MySQL数据库、计算机网络通讯、及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务:. 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+MySQL数据库作为程序运行环境.

微信公众平台:移动推送(Push)平台

- - 天涯海阁|Web2.0Share
之前曾经写过一个文章《 移动互联网的未来:基于情境/兴趣的推送》,至今我也觉得这个在未来会是有着巨大想想空间的移动生活方式. 之前其实也有不少初创企业在Push这个领域努力,不过效果却都不好,所以其实本质而言,要构建Push这样的平台,需要吸引大量的内容、媒体、品牌来提供Push内容,而对于内容、媒体、品牌而言,最在意的是这个平台有没有用户,而微信可能已经到了可以去构建这样一个信息推送平台的阶段.

微信公众平台为什么会火

- - 月光博客
  在某IT评论网站看到一篇号称是微信公共平台干货分享的文章,立马点进去查看,结果却大失所望. 仅仅是微信公共平台如何开通的介绍. 文章名字可以适当夸大,但必须真有内容,否则你就是在浪费别人的时间. 今天讨论为什么 微信公共平台能火. 微信从一诞生就拥有真实的基因,一开始就严格限定与手机号绑定. 微信可以说是中国最严谨的实名认证社交平台.

微信公众平台开发(三)--位置信息的识别

- - BlogJava-首页技术区
位置识别这是实际应用经常应用的消息,特别是很多商家,通过了解用户位置,给用户提供特别的产品或是商场的推荐. 其中用户可能发送两种类型的消息:. 2.路名、标志性建筑或是商场名称. 认识一下,微信地理位置消息,包含一些什么信息. . 包含的主要信息有经度纬度和Label的位置.

JavaWeb发送信息到微信公众平台的企业号

- - 行业应用 - ITeye博客
首先到微信公众平台申请微信企业号: https://qy.weixin.qq.com. 申请后需要在管理平台做如下几个步骤:. 1、在通讯录里添加一个成员并使这个成员关注这个微信企业号;. 2、在应用中心里新建一个应用并记录appid;. 3、在设置里的权限管理中新建管理组;. 新建一个JavaWeb工程并导入如下几个jar文件:.

微信公众平台增加微信小店功能 可快速开店

- - TechWeb 今日焦点 RSS阅读
微信公众平台增加微信小店功能 可快速开店(TechWeb配图). 【TechWeb报道】5月29日消息,腾讯今日发布消息称,微信公众平台更新增加了微信小店功能,微信小店基于微信支付,包括添加商品、商品管理、订单管理、货架管理、维权等功能,开发者可使用接口批量添加商品,快速开店. 已接入微信支付的公众号,可在服务中心中申请开通微信小店功能.

微信公众平台开发(二)--简单的聊天机器人

- - BlogJava-首页技术区
1.设置成为开发者模式 登录微信工作平台,选择高级功能-进入开发模式,成为开发者. URL配置的信息是指,微信的后台服务器把您的用户消息发送到该URL处理. Token是你和微信之间的一个密码,用来验证消息是否是从微信的服务发送而来,而不是其他来攻击你的系统. 现在你还不能设置,在设置时微信会GET请求你设置的URL,已检测接口是否可以使用.