繼續之前我們沒有完成的部分,現在可以實現簡單的文本交互,這篇將實現各種消息,事件的響應。
項目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
一:實現各類消息的簡單回復
基於現在的底層框架,我們不難看出其余的響應機制不是很難,只是我們不是很熟悉這個SDK而已;現在已經實現了文本回復,我們在重寫OnTextRequest方法的時候發現有很多的重新方法,如下。
這個就是我們需要實現各種消息機制和事件機制的方法。可以通過實現對應的方法來響應微信服務器發送過來的各種POST請求,如果網站有很多的需求,那么處理的業務邏輯就是在這些方法中進行。
- 1.1:處理語音請求;
public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage) { var responseVoice = base.CreateResponseMessage<ResponseMessageVoice>(); responseVoice.Voice=new Voice() { MediaId = requestMessage.MediaId }; return responseVoice; }
我們客戶端發送的語音請求先到OnVoiceRequest方法中,要是沒有任何的回復就到默認回復方法中回復用戶消息。在上面方法測試中我們創建了語音的回復,默認回復它自己的語音,MediaId是通過素材管理接口上傳的多媒體文件得到的ID,其實就是微信服務器保存用戶發送語音的ID;
- 1.2:處理圖片請求;
public override IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage) { var responseImage = base.CreateResponseMessage<ResponseMessageText>(); responseImage.Content = "來自圖片,ahui"; return responseImage; }
用戶發送的圖片請求,之后我們回復文本。要是需要復雜的邏輯我們可以自己在這里添加。其中的base.CreateResponseMessage<ResponseMessageText>()就是創建了一個回復的文本類型;
- 1.3:處理地理位置請求;
public override IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage) { //返回的是圖文消息,是關於地址的圖文消息。 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("您剛才發送了地理位置信息。Location_X:{0},Location_Y:{1},Scale:{2},標簽:{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; }
處理地理位置請求,用戶發送自己的地理位置,我們可以給用戶發送任何我們想發送的信息,上面是調用百度地圖的接口,將它自己的信息又重新的發送。
- 1.4:處理鏈接請求;
public override IResponseMessageBase OnLinkRequest(RequestMessageLink requestMessage) { var responseLink = base.CreateResponseMessage<ResponseMessageNews>(); responseLink.Articles.Add(new Article() { Title="處理鏈接來的請求。", Description =requestMessage.Description, PicUrl = "http://pic.cnblogs.com/avatar/679140/20141128195544.png", Url=requestMessage.Url }); return responseLink; }
關於鏈接也是回復圖文消息,之前的很多都是回復圖文消息,但是我們需要注意里面的參數,這樣才可以符合微信的回復內容。
二:POST事件的回復
微信用戶和公眾號的交互過程中,用戶的一些操作會使微信服務器以事件的形式發送請求到開發者設置的網站服務器上,某些事件可以讓我們回復用戶信息;下面就是來處理這些的。
微信開發者文檔的事件推送:
http://mp.weixin.qq.com/wiki/7/9f89d962eba4c5924ed95b513ba69d9b.html
帶有Event_標識的代表就是事件的方法,我們需要重寫這些方法來實現我們的回復。這里面有很多可以看官網的介紹。
- 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; }
回復的是文本內容,這有利於測試,我們可以添加任何的邏輯,也可以回復任何的圖文,語音,文本等類型。這就要看項目的需求了。
- 2.2:點擊菜單拉取消息時的事件推送
/// <summary> /// 點擊事件 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { var respondeEvert = base.CreateResponseMessage<ResponseMessageText>(); respondeEvert.Content = "點擊事件,"; return respondeEvert; }
這里你可能不知道這個點擊事件是什么,這個是在菜單欄那邊設置的,我們之后就會實現菜單欄的功能。
- 2.3:點擊菜單跳轉鏈接時的事件推送
public override IResponseMessageBase OnEvent_ViewRequest(RequestMessageEvent_View requestMessage) { var responseView = base.CreateResponseMessage<ResponseMessageText>(); responseView.Content = "點擊帶有view的菜單欄"; return responseView; }
三:實現微信公眾號自定義菜單
每一個微信的頁面下基本上都有菜單欄,人家的那個是通過常規的設置可以實現的,現在我們的只是測試號,在測試號頁面找了好久都沒有發現,最后經過查詢在開發者調試中可以設置。還有一種是利用SDK提供的頁面來實現。
- 3.1:利用開發者調試工具實現自定義菜單
我們發現這個還需要access_token來請求,但是我們從之前的開發中都沒有發現有這個,那么這個是什么呢,仔細的看官方的介紹吧;
獲取access_token,我們可以通過開發者調試工具,利用AppId和secret來獲取;
在第一幅圖中我們還需要body,調用接口的json數據包;可以參考微信開發文檔里面的進行設置。注意里面就會看到click和view這兩個事件類型。
{ "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": "關於開發者", "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": "關注我們", "key": "V1001_GOOD", "sub_button": [ ] } ] }, { "name": "學生", "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": "關注我們", "key": "V1001_GOOD", "sub_button": [ ] } ] } ] }
關於里面的事件類型,我們可以自己隨意的設置,都會響應我們前面設置的菜單事件,我們可以進行一系列的邏輯代碼的處理。
3.2:SDK的自定義菜單
通過下面的網址可以 進行設置,里面還是需要前面的兩個參數AppId和secret或者Token來設置微信的自定義菜單。
設置自定義菜單網址:http://sdk.weixin.senparc.com/Menu
四:最終的結果展示
實現上面的代碼就可以實現相應的功能。這個SDK簡單的使用我們現在已經大體的會了,在之后的博文中會慢慢的解析這個SDK里面的一些東西,會從Request,Response等基礎開始。
----------------------------------請繼續關注!-------------------------------------