C#微信公眾號開發(fā)之消息處理_第1頁
C#微信公眾號開發(fā)之消息處理_第2頁
C#微信公眾號開發(fā)之消息處理_第3頁
C#微信公眾號開發(fā)之消息處理_第4頁
C#微信公眾號開發(fā)之消息處理_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第C#微信公眾號開發(fā)之消息處理回顧上一節(jié)服務(wù)器配置的內(nèi)容,我們已經(jīng)可以自己完成公眾號服務(wù)器的配置。配置完成之后,我們就可以通過調(diào)用的方式,完成對消息管理的處理。當(dāng)用戶關(guān)注公眾號或者發(fā)送消息的時候,我們應(yīng)該啟用默認(rèn)回復(fù),要不然用戶得不到回應(yīng),

從而導(dǎo)致丟失體驗。所以這一章節(jié),我們將通過消息管理的方式,對用戶的信息進(jìn)行處理,完成公眾號消息回復(fù)功能,實現(xiàn)公眾號與用戶之間的完整對話。

微信公眾平臺對信息做了比較清晰的分類,最基本的包括請求(Request)和響應(yīng)(Response)兩大類信息,這兩類信息有分為文字、語音、圖片等格式。Senparc.Weixin.MP提供了MessageHandler消息處理類,這些類型在以枚舉的方式區(qū)分,

同時根據(jù)嚴(yán)格命名規(guī)則命名了所有類型的RequestMessage和ResponseMessage。在Senparc里也詳細(xì)說明了如何這個類的

新建一個UserMessageHandler.cs,需要繼承Senparc.Weixin.MP.MessageHandlersTC這個抽象類,并重寫所有方法:

publicclassUserMessageHandler:MessageHandlerUserMessageContext

///summary

///構(gòu)造函數(shù)

////summary

///paramname="inputStream"構(gòu)造函數(shù)的inputStream用于接收來自微信服務(wù)器的請求流(如果需要在外部處理,這里也可以傳入XDocument)/param

///paramname="postModel"微信公眾服務(wù)器Post過來的加密參數(shù)集合(不包括PostData)/param

publicUserMessageHandler(StreaminputStream,PostModelpostModel)

:base(inputStream,postModel)

publicoverrideIResponseMessageBaseDefaultResponseMessage(IRequestMessageBaserequestMessage)

/*所有沒有被處理的消息會默認(rèn)返回這里的結(jié)果

varresponseMessage=this.CreateResponseMessageResponseMessageText//ResponseMessageText也可以是News等其他類型

responseMessage.Content="這條消息來自DefaultResponseMessage。";

returnresponseMessage;

}

usingSenparc.Weixin.Context;

usingSenparc.Weixin.MP.Entities;

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Web;

namespaceWeiXinHandler

publicclassUserMessageContext:MessageContextIRequestMessageBase,IResponseMessageBase

publicUserMessageContext()

*注意:即使使用其他類實現(xiàn)IMessageContext,

*也務(wù)必在這里進(jìn)行下面的初始化,尤其是設(shè)置當(dāng)前時間,

*這個時間關(guān)系到及時從緩存中移除過期的消息,節(jié)約內(nèi)存使用

base.MessageContextRemoved+=UserMessageContext_MessageContextRemoved;

///summary

///當(dāng)上下文過期,被移除時觸發(fā)的時間

////summary

///paramname="sender"/param

///paramname="e"/param

voidUserMessageContext_MessageContextRemoved(objectsender,Senparc.Weixin.Context.WeixinContextRemovedEventArgsIRequestMessageBase,IResponseMessageBasee)

/*注意,這個事件不是實時觸發(fā)的(當(dāng)然你也可以專門寫一個線程監(jiān)控)

*為了提高效率,根據(jù)WeixinContext中的算法,這里的過期消息會在過期后下一條請求執(zhí)行之前被清除

varmessageContext=e.MessageContextasCustomMessageContext;

if(messageContext==null)

return;//如果是正常的調(diào)用,messageContext不會為null

//TODO:這里根據(jù)需要執(zhí)行消息過期時候的邏輯,下面的代碼僅供參考

//Log.InfoFormat("{0}的消息上下文已過期",e.OpenId);

//api.SendMessage(e.OpenId,"由于長時間未搭理客服,您的客服狀態(tài)已退出!");

}

重寫的方法對應(yīng)了接收不同的Request類型,構(gòu)造函數(shù)的inputStream用于接收來自微信服務(wù)器的請求流

基本用戶不同類型的請求,比如用戶向我們發(fā)送一條信息,那么會最終會調(diào)用OnTextRequest這個方法,所以在不同的重寫方法內(nèi),實現(xiàn)自己的方法。

比如:我們對于文字(Text)信息進(jìn)行這樣的處理,在UserMessageHandler中我們可以重寫方法OnTextRequest:

publicoverrideIResponseMessageBaseOnTextRequest(RequestMessageTextrequestMessage)

varresponseMessage=base.CreateResponseMessageResponseMessageText

responseMessage.Content="您剛剛發(fā)送了文字信息:"+requestMessage.Content;//requestMessage.Content即用戶發(fā)過來的文字內(nèi)容

returnresponseMessage;

}

對于圖片信息進(jìn)行這樣的處理,在UserMessageHandler中我們可以重寫方法OnImageRequest

///summary

///處理圖片請求

////summary

///paramname="requestMessage"/param

///returns/returns

publicoverrideIResponseMessageBaseOnImageRequest(RequestMessageImagerequestMessage)

varresponseMessage=CreateResponseMessageResponseMessageNews

responseMessage.Articles.Add(newArticle()

Title="您剛才發(fā)送了圖片信息",

Description="您發(fā)送的圖片將會顯示在邊上",

PicUrl=requestMessage.PicUrl,

Url="/i3yuan/"

returnresponseMessage;

}

對于語音信息進(jìn)行這樣的處理,在UserMessageHandler中我們可以重寫方法OnVoiceRequest

///summary

///處理語音請求

////summary

///paramname="requestMessage"/param

///returns/returns

publicoverrideIResponseMessageBaseOnVoiceRequest(RequestMessageVoicerequestMessage)

//獲取公眾號

AccessTokenResultaccount=Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(AppId,AppSecret);

varresponseMessage=CreateResponseMessageResponseMessageMusic

//上傳縮略圖

varuploadResult=Senparc.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryMedia(account.access_token,UploadMediaFileType.image,

Server.GetMapPath("~/Images/Logo.jpg"));

//設(shè)置音樂信息

responseMessage.Music.Title="天籟之音";

responseMessage.Music.Description="播放您上傳的語音";

responseMessage.Music.MusicUrl="/Media/GetVoicemediaId="+requestMessage.MediaId;

responseMessage.Music.HQMusicUrl="/Media/GetVoicemediaId="+requestMessage.MediaId;

responseMessage.Music.ThumbMediaId=uploadResult.media_id;

returnresponseMessage;

}

對于視頻信息進(jìn)行這樣的處理,在UserMessageHandler中我們可以重寫方法OnVideoRequest

///summary

///處理視頻請求

////summary

///paramname="requestMessage"/param

///returns/returns

publicoverrideIResponseMessageBaseOnVideoRequest(RequestMessageVideorequestMessage)

varresponseMessage=CreateResponseMessageResponseMessageText

responseMessage.Content="您發(fā)送了一條視頻信息,ID:"+requestMessage.MediaId;

returnresponseMessage;

}

對于地理信息進(jìn)行這樣的處理,在UserMessageHandler中我們可以重寫方法OnLocationRequest

///summary

///處理位置請求

////summary

///paramname="requestMessage"/param

///returns/returns

publicoverrideIResponseMessageBaseOnLocationRequest(RequestMessageLocationrequestMessage)

varlocationService=newLocationService();

varresponseMessage=locationService.GetResponseMessage(requestMessageasRequestMessageLocation);

returnresponseMessage;

}

對于鏈接信息進(jìn)行這樣的處理,在UserMessageHandler中我們可以重寫方法OnLinkRequest

///summary

///處理鏈接消息請求

////summary

///paramname="requestMessage"/param

///returns/returns

publicoverrideIResponseMessageBaseOnLinkRequest(RequestMessageLinkrequestMessage)

varresponseMessage=ResponseMessageBase.CreateFromRequestMessageResponseMessageText(requestMessage);

responseMessage.Content=string.Format(@"您發(fā)送了一條連接信息:

Title:{0}

Description:{1}

Url:{2}",requestMessage.Title,requestMessage.Description,requestMessage.Url);

returnresponseMessage;

}

在Action中使用MessageHandler,返回對用戶的處理,在上一節(jié)中我們已經(jīng)新建了WXController.cs,在其中通過Post的方式處理用戶的請求

[HttpPost]

[ActionName("Index")]

publicTaskActionResultPost(PostModelpostModel)

returnTask.Factory.StartNewActionResult(()=

if(!CheckSignature.Check(postModel.Signature,postModel.Timestamp,postModel.Nonce,Token))

returnnewWeixinResult("參數(shù)錯誤!");

varmessageHandler=newUserMessageHandler(Request.InputStream);

messageHandler.Execute();//執(zhí)行微信處理過程

returnnewFixWeixinBugWeixinResult(messageHandler);

}).ContinueWithActionResult(task=task.Result);

}

m

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論