C#開發微信門戶及應用(13)-使用地理位置擴展相關應用

本文繼續上一篇《C#開發微信門戶及應用(12)-使用語音處理》,繼續介紹微信的相關應用。咱們知道,地理位置信息能夠用來作不少相關的應用,除了咱們能夠知道用戶所在的位置,還能夠關聯出一些地理位置的應用,如天氣,熱映影片,附近景點,附近影院,交通事件等等,反正全部和地理位置相關的信息,咱們均可以根據須要作一些擴展應用。本文主要介紹利用地理位置信息,如何構建使用這些應用的操做。html

一、微信的地理位置信息

在使用前,咱們先來看看微信的接口,爲咱們定義了那些關於與地理位置的信息。其實地理位置的信息,微信分爲了兩個方面,一個是接收用戶的地理位置請求,一個是用戶容許上報地理位置操做,定時發送的地理位置信息。數據庫

本文主要介紹基於第一種,用戶上報地理位置後,如何處理的相關應用。json

地理位置的上報操做,就是在輸入的地方,選擇+號進行添加地理位置,而後選擇當前或者指定的地理位置地圖,具體操做以下所示。api

                

地理位置消息服務器

<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> 
參數 描述
ToUserName 開發者微信號
FromUserName 發送方賬號(一個OpenID)
CreateTime 消息建立時間 (整型)
MsgType location
Location_X 地理位置維度
Location_Y 地理位置經度
Scale 地圖縮放大小
Label 地理位置信息
MsgId 消息id,64位整型

有了上面的地理位置信息,咱們在程序裏面,須要在消息傳遞過來的時候,定義一個實體類信息,承載相關的地理位置信息,方便咱們進一步的處理操做。微信

    /// <summary>
    /// 接收的地理位置消息
    /// </summary>
    [System.Xml.Serialization.XmlRoot(ElementName = "xml")]
    public class RequestLocation : BaseMessage
    {    
        public RequestLocation()
        {
            this.MsgType = RequestMsgType.Location.ToString().ToLower();
        }
  
        /// <summary>
        /// 消息ID
        /// </summary>
        public Int64 MsgId { get; set; }

        /// <summary>
        /// 地理位置維度
        /// </summary>
        public decimal Location_X { get; set; }

        /// <summary>
        /// 地理位置經度
        /// </summary>
        public decimal Location_Y { get; set; }

        /// <summary>
        /// 地圖縮放大小
        /// </summary>
        public int Scale { get; set; }

        /// <summary>
        /// 地理位置信息
        /// </summary>
        public string Label { get; set; }

    }

有了這些信息,咱們在信息傳遞的時候,就能很好獲得用戶的相關數據了。post

若是僅僅爲了返回給用戶,告訴用戶目前的地理位置信息,能夠用下面的操做就能夠了。測試

        /// <summary>
        /// 對地理位置請求信息進行處理
        /// </summary>
        /// <param name="info">地理位置請求信息實體</param>
        /// <returns></returns>
        public string HandleLocation(Entity.RequestLocation info)
        {
            string xml = "";

            ResponseText txtinfo = new ResponseText(info);
            txtinfo.Content = string.Format("您發送的地理位置是:{0}", info.Label);
            xml = txtinfo.ToXml();

            return xml;
        } 

二、地址位置的應用處理

不過上面的信息,顯然不符合咱們擴展應用的要求,所以咱們進一步進行完善裏面對地理位置信息處理的操做。咱們進一步把關於地理位置的操做,放到事件處理模塊裏面進行處理,處理代碼以下所示。this

        /// <summary>
        /// 對地理位置請求信息進行處理
        /// </summary>
        /// <param name="info">地理位置請求信息實體</param>
        /// <returns></returns>
        public string HandleLocation(Entity.RequestLocation info)
        {
            string xml = "";
            EventDispatch dispatch = new EventDispatch();
            xml = dispatch.DealLocation(info, info.Label, info.Location_Y, info.Location_X);

            return xml;
        } 

在處理的時候,咱們須要先保存用戶的地理位置信息,把它存儲到用戶的上下文記錄裏面。這樣咱們在處理指令的時候,把它獲取到,而後傳遞給相關的方法就能夠實現地理位置的擴展應用了。url

            //保存經緯度
            string location = string.Format("{0},{1}", lat, lon);
            bool result = BLLFactory<UserSet>.Instance.UpdateUserInput(info.FromUserName, location);

首先對用戶地理位置的請求,我根據數據庫配置給出了一個用戶選擇的指令提示,以下所示。

爲了對地理位置請求的處理,我定義了一個用於處理這個操做的指令操做

這樣整個地理位置的指令操做,就在應答鏈裏面進行很好的跳轉管理了。那麼爲了實現天氣、放映影片、附近影院、旅遊線路、交通事件等方面的擴展應用,咱們應該如何操做呢?

三、地址位置應用擴展

咱們知道,百度或者騰訊都提供了一些開放平臺,給咱們進行各類方式的使用。那麼咱們這裏以使用百度LBS平臺應用來構建一些模塊。

 

 

這上面都有不少相關的接口供使用,咱們能夠根據其提供的數據格式進行封裝,而後進行調用處理就能夠了。

剛纔說了,我配置了一些指令,用來構建相關的應用,指令的最後是一些事件代碼的定義,咱們對這些末端的事件代碼進行處理,就能夠給用戶返回相關的信息了,整體的操做代碼以下所示。

        /// <summary>
        /// 其餘插件操做,如天氣,景點、電影影訊、交通等
        /// </summary>
        /// <param name="info">基礎消息</param>
        /// <param name="eventKey">事件標識</param>
        /// <returns></returns>
        public string DealPlugin(BaseMessage info, string eventKey)
        {
            //LogTextHelper.Info(eventKey);
            string userInput = BLLFactory<UserSet>.Instance.GetUserInput(info.FromUserName);

            string xml = "";
            switch (eventKey)
            {
                case "event-void-wether":
                    xml = new WeatherPlugin().Response(info, userInput);
                    break;
                case "event-void-movie":
                    xml = new MoviePlugin().Response(info, userInput);
                    break;
                case "event-void-cinema":
                    xml = new CinemaPlugin().Response(info, userInput);
                    break;
                case "event-void-travel":
                    xml = new TravelPlugin().Response(info, userInput);
                    break;
                case "event-void-traffic":
                    xml = new TrafficEventPlugin().Response(info, userInput);
                    break;
                default:
                    break;
            }

            return xml;
        }

這裏以天氣爲例,說明該如何調用百度的接口的,首先咱們封裝一下相關的接口調用。

        /// <summary>
        /// 根據參數調用百度接口,獲取相關的結果數據
        /// </summary>
        /// <param name="location">地理位置</param>
        /// <param name="ak">API調用鍵</param>
        /// <returns></returns>
        public BaiduWeatherResult Execute(string location, string ak)
        {
            location = HttpUtility.UrlEncode(location);
            var url = string.Format("http://api.map.baidu.com/telematics/v3/weather?location={0}&output=json&ak={1}", location, ak);

            BaiduWeatherResult result = BaiduJsonHelper<BaiduWeatherResult>.ConvertJson(url);
            return result;
        }

其中的BaiduWeatherResult 是我根據調用返回的Json結果,構建的一個實體類,用來存儲返回的內容。具體代碼以下所示。

    /// <summary>
    /// 天氣請求結果Json對象
    /// </summary>
    public class BaiduWeatherResult : BaiduResult
    {
        /// <summary>
        /// 天氣預報信息
        /// </summary>
        public List<BaiduWeatherData> results = new List<BaiduWeatherData>();
    }

    /// <summary>
    /// 城市的天氣信息
    /// </summary>
    public class BaiduWeatherData
    {
        /// <summary>
        /// 當前城市
        /// </summary>
        public string currentCity { get; set; }

        /// <summary>
        /// 天氣預報信息
        /// </summary>
        public List<BaiduWeatherJson> weather_data = new List<BaiduWeatherJson>();
    }

    /// <summary>
    /// 天氣預報的單條記錄Json信息
    /// </summary>
    public class BaiduWeatherJson
    {
        /// <summary>
        /// 天氣預報時間
        /// </summary>
        public string date { get; set; }

        /// <summary>
        /// 白天的天氣預報圖片url
        /// </summary>
        public string dayPictureUrl { get; set; }

        /// <summary>
        /// 晚上的天氣預報圖片url
        /// </summary>
        public string nightPictureUrl { get; set; }

        /// <summary>
        /// 天氣情況
        /// </summary>
        public string weather { get; set; }

        /// <summary>
        /// 風力
        /// </summary>
        public string wind { get; set; }

        /// <summary>
        /// 溫度
        /// </summary>
        public string temperature { get; set; }
    }

爲了構建返回給客戶的圖文數據,咱們須要構建一個News對象,而後生成XML數據返回給服務器進行處理便可。

        /// <summary>
        /// 響應用戶請求,並返回相應的XML數據
        /// </summary>
        /// <param name="info">微信基礎信息</param>
        /// <param name="location">地理位置:經緯度座標或者地名</param>
        /// <returns></returns>
        public string Response(BaseMessage info, string location)
        {
            string xml = "";

            //"廣州" 或者 "116.305145,39.982368"    
            if (!string.IsNullOrEmpty(location))
            {
                BaiduWeatherResult result = Execute(location, baiduAK);
                if (result != null && result.results.Count > 0)
                {
                    BaiduWeatherData data = result.results[0];
                    if (data != null)
                    {
                        ArticleEntity first = new ArticleEntity();
                        first.Title = string.Format("{0} 天氣預報", data.currentCity);

                        ResponseNews news = new ResponseNews(info);
                        news.Articles.Add(first);

                        int i = 0;
                        foreach (BaiduWeatherJson json in data.weather_data)
                        {
                            ArticleEntity article = new ArticleEntity();
                            article.Title = string.Format("{0}\n{1} {2} {3}", json.date, json.weather, json.wind, json.temperature);
                            if (i++ == 0)
                            {
                                article.PicUrl = IsDayTime() ? json.dayPictureUrl : json.nightPictureUrl;
                            }
                            else
                            {
                                article.PicUrl = json.dayPictureUrl;
                            }
                            news.Articles.Add(article);
                        }

                        xml = news.ToXml();
                    }
                }
            }

            return xml;
        }

這樣就很好實現了總體的功能了,具體界面功能能夠訪問個人微信(廣州愛奇迪)進行了解,下面是功能截圖供參考。

   

 

 

若是對這個《C#開發微信門戶及應用》系列感興趣,能夠關注個人其餘文章,系列隨筆以下所示:

C#開發微信門戶及應用(25)-微信企業號的客戶端管理功能

C#開發微信門戶及應用(24)-微信小店貨架信息管理

C#開發微信門戶及應用(23)-微信小店商品管理接口的封裝和測試

C#開發微信門戶及應用(22)-微信小店的開發和使用

C#開發微信門戶及應用(21)-微信企業號的消息和事件的接收處理及解密 

C#開發微信門戶及應用(20)-微信企業號的菜單管理

C#開發微信門戶及應用(19)-微信企業號的消息發送(文本、圖片、文件、語音、視頻、圖文消息等)

C#開發微信門戶及應用(18)-微信企業號的通信錄管理開發之成員管理

C#開發微信門戶及應用(17)-微信企業號的通信錄管理開發之部門管理

C#開發微信門戶及應用(16)-微信企業號的配置和使用

C#開發微信門戶及應用(15)-微信菜單增長掃一掃、發圖片、發地理位置功能

 C#開發微信門戶及應用(14)-在微信菜單中採用重定向獲取用戶數據

C#開發微信門戶及應用(13)-使用地理位置擴展相關應用

C#開發微信門戶及應用(12)-使用語音處理

C#開發微信門戶及應用(11)--微信菜單的多種表現方式介紹

C#開發微信門戶及應用(10)--在管理系統中同步微信用戶分組信息

C#開發微信門戶及應用(9)-微信門戶菜單管理及提交到微信服務器

C#開發微信門戶及應用(8)-微信門戶應用管理系統功能介紹

C#開發微信門戶及應用(7)-微信多客服功能及開發集成

C#開發微信門戶及應用(6)--微信門戶菜單的管理操做

C#開發微信門戶及應用(5)--用戶分組信息管理

C#開發微信門戶及應用(4)--關注用戶列表及詳細信息管理

C#開發微信門戶及應用(3)--文本消息和圖文消息的應答

C#開發微信門戶及應用(2)--微信消息的處理和應答

C#開發微信門戶及應用(1)--開始使用微信接口

相關文章
相關標籤/搜索