微信開發(fā)系列---03:實(shí)現(xiàn)各類消息響應(yīng)

繼續(xù)之前我們沒有完成的部分,現(xiàn)在可以實(shí)現(xiàn)簡(jiǎn)單的文本交互琼富,這篇將實(shí)現(xiàn)各種消息侠坎,事件的響應(yīng)。
項(xiàng)目GitHub地址: https://github.com/Andyahui/xgyxsh_WeiXin
SDK的GitHub地址:https://github.com/JeffreySu/WeiXinMPSDK/
SDK官方介紹博客:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html

一:實(shí)現(xiàn)各類消息的簡(jiǎn)單回復(fù)

基于現(xiàn)在的底層框架据途,我們不難看出其余的響應(yīng)機(jī)制不是很難,只是我們不是很熟悉這個(gè)SDK而已叙甸;現(xiàn)在已經(jīng)實(shí)現(xiàn)了文本回復(fù)颖医,我們?cè)谥貙慜nTextRequest方法的時(shí)候發(fā)現(xiàn)有很多的重新方法,如下裆蒸。


有夢(mèng)想的人了不起

這個(gè)就是我們需要實(shí)現(xiàn)各種消息機(jī)制和事件機(jī)制的方法熔萧。可以通過(guò)實(shí)現(xiàn)對(duì)應(yīng)的方法來(lái)響應(yīng)微信服務(wù)器發(fā)送過(guò)來(lái)的各種POST請(qǐng)求僚祷,如果網(wǎng)站有很多的需求佛致,那么處理的業(yè)務(wù)邏輯就是在這些方法中進(jìn)行。

  • 1.1:處理語(yǔ)音請(qǐng)求辙谜;
public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
{
    var responseVoice = base.CreateResponseMessage<ResponseMessageVoice>();
    responseVoice.Voice=new Voice()
    {                
        MediaId = requestMessage.MediaId
    };           
    return responseVoice;
}

我們客戶端發(fā)送的語(yǔ)音請(qǐng)求先到OnVoiceRequest方法中俺榆,要是沒有任何的回復(fù)就到默認(rèn)回復(fù)方法中回復(fù)用戶消息。在上面方法測(cè)試中我們創(chuàng)建了語(yǔ)音的回復(fù)装哆,默認(rèn)回復(fù)它自己的語(yǔ)音罐脊,MediaId是通過(guò)素材管理接口上傳的多媒體文件得到的ID,其實(shí)就是微信服務(wù)器保存用戶發(fā)送語(yǔ)音的ID;

  • 1.2:處理圖片請(qǐng)求蜕琴;
public override IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage)
{
    var responseImage = base.CreateResponseMessage<ResponseMessageText>();
    responseImage.Content = "來(lái)自圖片萍桌,ahui";
    return responseImage;
}

用戶發(fā)送的圖片請(qǐng)求,之后我們回復(fù)文本凌简。要是需要復(fù)雜的邏輯我們可以自己在這里添加梗夸。其中的base.CreateResponseMessage<ResponseMessageText>()就是創(chuàng)建了一個(gè)回復(fù)的文本類型;

  • 1.3:處理地理位置請(qǐng)求号醉;
public override IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage)
{
    //返回的是圖文消息,是關(guān)于地址的圖文消息反症。
    var responseLocation = base.CreateResponseMessage<ResponseMessageNews>();
 
    var markersList = new List<BaiduMarkers>();
    markersList.Add(new BaiduMarkers()
    {
        Size=BaiduMarkerSize.m,
        Color ="red",
        Label="A",
        Latitude =requestMessage.Location_X,
        Longitude=requestMessage.Location_Y,
    });
    var mapUrl = BaiduMapHelper.GetBaiduStaticMap(requestMessage.Location_Y,requestMessage.Location_X,1,13,markersList);
    responseLocation.Articles.Add(new Article()
    {
        Description = string.Format("您剛才發(fā)送了地理位置信息。Location_X:{0},Location_Y:{1},Scale:{2},標(biāo)簽:{3}",requestMessage.Location_X,requestMessage.Location_Y,requestMessage.Scale,requestMessage.Label),
        PicUrl = "http://pic.cnblogs.com/avatar/679140/20141128195544.png",
        Title="張輝的地圖",
        Url = mapUrl
    });
    return responseLocation;
}

處理地理位置請(qǐng)求畔派,用戶發(fā)送自己的地理位置铅碍,我們可以給用戶發(fā)送任何我們想發(fā)送的信息,上面是調(diào)用百度地圖的接口线椰,將它自己的信息又重新的發(fā)送胞谈。

  • 1.4:處理鏈接請(qǐng)求;
public override IResponseMessageBase OnLinkRequest(RequestMessageLink requestMessage)
{
    var responseLink = base.CreateResponseMessage<ResponseMessageNews>();
    responseLink.Articles.Add(new Article()
    {
        Title="處理鏈接來(lái)的請(qǐng)求。",
        Description =requestMessage.Description,
        PicUrl = "http://pic.cnblogs.com/avatar/679140/20141128195544.png",
        Url=requestMessage.Url
    });
    return responseLink;
}

關(guān)于鏈接也是回復(fù)圖文消息烦绳,之前的很多都是回復(fù)圖文消息卿捎,但是我們需要注意里面的參數(shù),這樣才可以符合微信的回復(fù)內(nèi)容径密。

二:POST事件的回復(fù)

微信用戶和公眾號(hào)的交互過(guò)程中午阵,用戶的一些操作會(huì)使微信服務(wù)器以事件的形式發(fā)送請(qǐng)求到開發(fā)者設(shè)置的網(wǎng)站服務(wù)器上,某些事件可以讓我們回復(fù)用戶信息享扔;下面就是來(lái)處理這些的底桂。
微信開發(fā)者文檔的事件推送:
http://mp.weixin.qq.com/wiki/7/9f89d962eba4c5924ed95b513ba69d9b.html
帶有Event_標(biāo)識(shí)的代表就是事件的方法,我們需要重寫這些方法來(lái)實(shí)現(xiàn)我們的回復(fù)惧眠。這里面有很多可以看官網(wǎng)的介紹籽懦。

  • 2.1:訂閱事件

      /// <summary>
      /// 訂閱事件
      /// </summary>
      /// <param name="requestMessage"></param>
      /// <returns></returns>
      public override IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage)
      {
          var responseSubscribe = base.CreateResponseMessage<ResponseMessageText>();
          responseSubscribe.Content = "歡迎訂閱,張輝歡迎您氛魁。";
          return responseSubscribe;
      }回復(fù)的是文本內(nèi)容暮顺,這有利于測(cè)試,我們可以添加任何的邏輯秀存,也可以回復(fù)任何的圖文拖云,語(yǔ)音,文本等類型应又。這就要看項(xiàng)目的需求了。
    
  • 2.2:點(diǎn)擊菜單拉取消息時(shí)的事件推送

      /// <summary>
      /// 點(diǎn)擊事件
      /// </summary>
      /// <param name="requestMessage"></param>
      /// <returns></returns>
      public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
      {
          var respondeEvert = base.CreateResponseMessage<ResponseMessageText>();
          respondeEvert.Content = "點(diǎn)擊事件乏苦,";
          return respondeEvert;
      } 
    

這里你可能不知道這個(gè)點(diǎn)擊事件是什么株扛,這個(gè)是在菜單欄那邊設(shè)置的,我們之后就會(huì)實(shí)現(xiàn)菜單欄的功能汇荐。

  • 2.3:點(diǎn)擊菜單跳轉(zhuǎn)鏈接時(shí)的事件推送

      public override IResponseMessageBase OnEvent_ViewRequest(RequestMessageEvent_View requestMessage)
      {
          var responseView = base.CreateResponseMessage<ResponseMessageText>();
          responseView.Content = "點(diǎn)擊帶有view的菜單欄";
          return responseView;
      }
    

三:實(shí)現(xiàn)微信公眾號(hào)自定義菜單

每一個(gè)微信的頁(yè)面下基本上都有菜單欄洞就,人家的那個(gè)是通過(guò)常規(guī)的設(shè)置可以實(shí)現(xiàn)的,現(xiàn)在我們的只是測(cè)試號(hào)掀淘,在測(cè)試號(hào)頁(yè)面找了好久都沒有發(fā)現(xiàn)旬蟋,最后經(jīng)過(guò)查詢?cè)陂_發(fā)者調(diào)試中可以設(shè)置。還有一種是利用SDK提供的頁(yè)面來(lái)實(shí)現(xiàn)革娄。

有夢(mèng)想的人了不起

在第一幅圖中我們還需要body,調(diào)用接口的json數(shù)據(jù)包;可以參考微信開發(fā)文檔里面的進(jìn)行設(shè)置软能。注意里面就會(huì)看到click和view這兩個(gè)事件類型迎捺。

{
        "button": [
            {
                "name": "IT資訊", 
                "sub_button": [
                    {
                        "type": "view", 
                        "name": "博客園", 
                        "url": "http://m.cnblogs.com/", 
                        "sub_button": [ ]
                    }, 
                    {
                        "type": "view", 
                        "name": "IT新聞", 
                        "url": "http://news.cnblogs.com/m", 
                        "sub_button": [ ]
                    }, 
                    {
                        "type": "click", 
                        "name": "關(guān)于開發(fā)者", 
                        "key": "http://m.cnblogs.com/?u=netxiaohui", 
                        "sub_button": [ ]
                    }
                ]
            }, 
            {
                "name": "校園生活", 
                "sub_button": [
                    {
                        "type": "view", 
                        "name": "搜索", 
                        "url": "http://www.baidu.com/", 
                        "sub_button": [ ]
                    }, 
                    {
                        "type": "view", 
                        "name": "視頻", 
                        "url": "http://v.qq.com/", 
                        "sub_button": [ ]
                    }, 
                    {
                        "type": "click", 
                        "name": "關(guān)注我們", 
                        "key": "V1001_GOOD", 
                        "sub_button": [ ]
                    }
                ]
            }, 
            {
                "name": "學(xué)生", 
                "sub_button": [
                    {
                        "type": "view", 
                        "name": "搜索", 
                        "url": "http://www.soso.com/", 
                        "sub_button": [ ]
                    }, 
                    {
                        "type": "view", 
                        "name": "視頻", 
                        "url": "http://v.qq.com/", 
                        "sub_button": [ ]
                    }, 
                    {
                        "type": "click", 
                        "name": "關(guān)注我們", 
                        "key": "V1001_GOOD", 
                        "sub_button": [ ]
                    }
                ]
            }
        ]
    } 

關(guān)于里面的事件類型,我們可以自己隨意的設(shè)置查排,都會(huì)響應(yīng)我們前面設(shè)置的菜單事件凳枝,我們可以進(jìn)行一系列的邏輯代碼的處理。

  • 3.2:SDK的自定義菜單
    通過(guò)下面的網(wǎng)址可以 進(jìn)行設(shè)置雹嗦,里面還是需要前面的兩個(gè)參數(shù)AppId和secret或者Token來(lái)設(shè)置微信的自定義菜單范舀。
    設(shè)置自定義菜單網(wǎng)址:http://sdk.weixin.senparc.com/Menu
    有夢(mèng)想的人了不起

四:最終的結(jié)果展示

實(shí)現(xiàn)上面的代碼就可以實(shí)現(xiàn)相應(yīng)的功能。這個(gè)SDK簡(jiǎn)單的使用我們現(xiàn)在已經(jīng)大體的會(huì)了了罪,在之后的博文中會(huì)慢慢的解析這個(gè)SDK里面的一些東西锭环,會(huì)從Request,Response等基礎(chǔ)開始。

有夢(mèng)想的人了不起

------------------------請(qǐng)繼續(xù)關(guān)注泊藕!-------------------------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辅辩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子娃圆,更是在濱河造成了極大的恐慌玫锋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讼呢,死亡現(xiàn)場(chǎng)離奇詭異撩鹿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)悦屏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門节沦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人础爬,你說(shuō)我怎么就攤上這事甫贯。” “怎么了看蚜?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵叫搁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我供炎,道長(zhǎng)渴逻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任音诫,我火速辦了婚禮裸卫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纽竣。我一直安慰自己墓贿,他們只是感情好茧泪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聋袋,像睡著了一般队伟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幽勒,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天嗜侮,我揣著相機(jī)與錄音,去河邊找鬼啥容。 笑死锈颗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咪惠。 我是一名探鬼主播击吱,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遥昧!你這毒婦竟也來(lái)了覆醇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炭臭,失蹤者是張志新(化名)和其女友劉穎永脓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞋仍,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡常摧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了威创。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片落午。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖那婉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情党瓮,我是刑警寧澤详炬,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站寞奸,受9級(jí)特大地震影響呛谜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枪萄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一隐岛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓷翻,春花似錦聚凹、人聲如沸割坠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)彼哼。三九已至,卻和暖如春湘今,著一層夾襖步出監(jiān)牢的瞬間敢朱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工摩瞎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拴签,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓旗们,卻偏偏與公主長(zhǎng)得像蚓哩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚪拦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容