




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 提升教學(xué)質(zhì)量與效率的利器-在線學(xué)習(xí)平臺功能分析
- 提升醫(yī)療服務(wù)質(zhì)量數(shù)字化模型的應(yīng)用與影響
- 基于數(shù)字技術(shù)的語文教學(xué)策略研究
- 2025年度消防安全生產(chǎn)培訓(xùn)計劃
- 2025年我的新年技術(shù)創(chuàng)新計劃
- 2025年小學(xué)課程評價體系改革計劃
- 一年級語文線上評估反饋計劃
- 外研版三年級下冊英語評估計劃
- 八年級道德與法治課外拓展活動計劃
- 小學(xué)心理健康教育年度計劃
- 2018年浙江嘉興舟山中考滿分作文《讓矛盾的心不再矛盾》
- 《高強(qiáng)韌馬氏體不銹鋼組織與性能研究》
- 建筑施工安全設(shè)備檢測實施方案
- 建筑垃圾處置公司激勵與獎勵機(jī)制
- GB/T 32151.25-2024溫室氣體排放核算與報告要求第25部分:食品、煙草及酒、飲料和精制茶企業(yè)
- 佳能-M2-Wifi-相機(jī)說明書
- JJF 1049-2024溫度傳感器動態(tài)響應(yīng)校準(zhǔn)規(guī)范
- 2024年全國物業(yè)客服技能基礎(chǔ)知識考試題庫(附含答案)
- 幼兒園男性教師對幼兒性別意識發(fā)展的影響
- 食品生產(chǎn)加工小作坊生產(chǎn)規(guī)范 第4部分:粉條
- 防火門監(jiān)控系統(tǒng)調(diào)試、檢測、驗收記錄
評論
0/150
提交評論