CustomMessageHandler_Events.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. /*----------------------------------------------------------------
  2. Copyright (C) 2015 Senparc
  3. 文件名:CustomMessageHandler_Events.cs
  4. 文件功能描述:自定义MessageHandler
  5. 创建标识:Senparc - 20150312
  6. ----------------------------------------------------------------*/
  7. using System;
  8. using System.Diagnostics;
  9. using System.Linq;
  10. using System.Web;
  11. using Senparc.Weixin.MP.Agent;
  12. using Senparc.Weixin.Context;
  13. using Senparc.Weixin.MP.Entities;
  14. using Senparc.Weixin.MP.Helpers;
  15. using Senparc.Weixin.MP.MessageHandlers;
  16. using Senparc.Weixin.MP.Sample.CommonService.Utilities;
  17. namespace Senparc.Weixin.MP.Sample.CommonService.CustomMessageHandler
  18. {
  19. /// <summary>
  20. /// 自定义MessageHandler
  21. /// </summary>
  22. public partial class CustomMessageHandler
  23. {
  24. private string GetWelcomeInfo()
  25. {
  26. //获取Senparc.Weixin.MP.dll版本信息
  27. var fileVersionInfo = FileVersionInfo.GetVersionInfo(HttpContext.Current.Server.MapPath("~/bin/Senparc.Weixin.MP.dll"));
  28. var version = string.Format("{0}.{1}", fileVersionInfo.FileMajorPart, fileVersionInfo.FileMinorPart);
  29. return string.Format(
  30. @"欢迎关注【Senparc.Weixin.MP 微信公众平台SDK】,当前运行版本:v{0}。
  31. 您可以发送【文字】【位置】【图片】【语音】等不同类型的信息,查看不同格式的回复。
  32. 您也可以直接点击菜单查看各种类型的回复。
  33. 还可以点击菜单体验微信支付。
  34. SDK官方地址:http://weixin.senparc.com
  35. 源代码及Demo下载地址:https://github.com/JeffreySu/WeiXinMPSDK
  36. Nuget地址:https://www.nuget.org/packages/Senparc.Weixin.MP
  37. ===============
  38. 更多有关第三方开放平台(Senparc.Weixin.Open)的内容,请回复文字:open
  39. ",
  40. version);
  41. }
  42. public override IResponseMessageBase OnTextOrEventRequest(RequestMessageText requestMessage)
  43. {
  44. // 预处理文字或事件类型请求。
  45. // 这个请求是一个比较特殊的请求,通常用于统一处理来自文字或菜单按钮的同一个执行逻辑,
  46. // 会在执行OnTextRequest或OnEventRequest之前触发,具有以下一些特征:
  47. // 1、如果返回null,则继续执行OnTextRequest或OnEventRequest
  48. // 2、如果返回不为null,则终止执行OnTextRequest或OnEventRequest,返回最终ResponseMessage
  49. // 3、如果是事件,则会将RequestMessageEvent自动转为RequestMessageText类型,其中RequestMessageText.Content就是RequestMessageEvent.EventKey
  50. if (requestMessage.Content == "OneClick")
  51. {
  52. var strongResponseMessage = CreateResponseMessage<ResponseMessageText>();
  53. strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行";
  54. return strongResponseMessage;
  55. }
  56. return null;//返回null,则继续执行OnTextRequest或OnEventRequest
  57. }
  58. public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
  59. {
  60. IResponseMessageBase reponseMessage = null;
  61. //菜单点击,需要跟创建菜单时的Key匹配
  62. switch (requestMessage.EventKey)
  63. {
  64. case "OneClick":
  65. {
  66. //这个过程实际已经在OnTextOrEventRequest中完成,这里不会执行到。
  67. var strongResponseMessage = CreateResponseMessage<ResponseMessageText>();
  68. reponseMessage = strongResponseMessage;
  69. strongResponseMessage.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行";
  70. }
  71. break;
  72. case "SubClickRoot_Text":
  73. {
  74. var strongResponseMessage = CreateResponseMessage<ResponseMessageText>();
  75. reponseMessage = strongResponseMessage;
  76. strongResponseMessage.Content = "您点击了子菜单按钮。";
  77. }
  78. break;
  79. case "SubClickRoot_News":
  80. {
  81. var strongResponseMessage = CreateResponseMessage<ResponseMessageNews>();
  82. reponseMessage = strongResponseMessage;
  83. strongResponseMessage.Articles.Add(new Article()
  84. {
  85. Title = "您点击了子菜单图文按钮",
  86. Description = "您点击了子菜单图文按钮,这是一条图文信息。",
  87. PicUrl = "http://weixin.senparc.com/Images/qrcode.jpg",
  88. Url = "http://weixin.senparc.com"
  89. });
  90. }
  91. break;
  92. case "SubClickRoot_Music":
  93. {
  94. //上传缩略图
  95. var accessToken = CommonAPIs.AccessTokenContainer.TryGetAccessToken(appId, appSecret);
  96. var uploadResult = AdvancedAPIs.MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.thumb,
  97. Server.GetMapPath("~/Images/Logo.jpg"));
  98. //设置音乐信息
  99. var strongResponseMessage = CreateResponseMessage<ResponseMessageMusic>();
  100. reponseMessage = strongResponseMessage;
  101. strongResponseMessage.Music.Title = "天籁之音";
  102. strongResponseMessage.Music.Description = "真的是天籁之音";
  103. strongResponseMessage.Music.MusicUrl = "http://weixin.senparc.com/Content/music1.mp3";
  104. strongResponseMessage.Music.HQMusicUrl = "http://weixin.senparc.com/Content/music1.mp3";
  105. strongResponseMessage.Music.ThumbMediaId = uploadResult.thumb_media_id;
  106. }
  107. break;
  108. case "SubClickRoot_Image":
  109. {
  110. //上传图片
  111. var accessToken = CommonAPIs.AccessTokenContainer.TryGetAccessToken(appId, appSecret);
  112. var uploadResult = AdvancedAPIs.MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image,
  113. Server.GetMapPath("~/Images/Logo.jpg"));
  114. //设置图片信息
  115. var strongResponseMessage = CreateResponseMessage<ResponseMessageImage>();
  116. reponseMessage = strongResponseMessage;
  117. strongResponseMessage.Image.MediaId = uploadResult.media_id;
  118. }
  119. break;
  120. case "SubClickRoot_Agent"://代理消息
  121. {
  122. //获取返回的XML
  123. DateTime dt1 = DateTime.Now;
  124. reponseMessage = MessageAgent.RequestResponseMessage(this, agentUrl, agentToken, RequestDocument.ToString());
  125. //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString());
  126. DateTime dt2 = DateTime.Now;
  127. if (reponseMessage is ResponseMessageNews)
  128. {
  129. (reponseMessage as ResponseMessageNews)
  130. .Articles[0]
  131. .Description += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds);
  132. }
  133. }
  134. break;
  135. case "Member"://托管代理会员信息
  136. {
  137. //原始方法为:MessageAgent.RequestXml(this,agentUrl, agentToken, RequestDocument.ToString());//获取返回的XML
  138. reponseMessage = this.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString());
  139. }
  140. break;
  141. case "OAuth"://OAuth授权测试
  142. {
  143. var strongResponseMessage = CreateResponseMessage<ResponseMessageNews>();
  144. strongResponseMessage.Articles.Add(new Article()
  145. {
  146. Title = "OAuth2.0测试",
  147. Description = "点击【查看全文】进入授权页面。\r\n注意:此页面仅供测试(是专门的一个临时测试账号的授权,并非Senparc.Weixin.MP SDK官方账号,所以如果授权后出现错误页面数正常情况),测试号随时可能过期。请将此DEMO部署到您自己的服务器上,并使用自己的appid和secret。",
  148. Url = "http://weixin.senparc.com/oauth2",
  149. PicUrl = "http://weixin.senparc.com/Images/qrcode.jpg"
  150. });
  151. reponseMessage = strongResponseMessage;
  152. }
  153. break;
  154. case "Description":
  155. {
  156. var strongResponseMessage = CreateResponseMessage<ResponseMessageText>();
  157. strongResponseMessage.Content = GetWelcomeInfo();
  158. reponseMessage = strongResponseMessage;
  159. }
  160. break;
  161. case "SubClickRoot_PicPhotoOrAlbum":
  162. {
  163. var strongResponseMessage = CreateResponseMessage<ResponseMessageText>();
  164. reponseMessage = strongResponseMessage;
  165. strongResponseMessage.Content = "您点击了【微信拍照】按钮。系统将会弹出拍照或者相册发图。";
  166. }
  167. break;
  168. case "SubClickRoot_ScancodePush":
  169. {
  170. var strongResponseMessage = CreateResponseMessage<ResponseMessageText>();
  171. reponseMessage = strongResponseMessage;
  172. strongResponseMessage.Content = "您点击了【微信扫码】按钮。";
  173. }
  174. break;
  175. default:
  176. {
  177. var strongResponseMessage = CreateResponseMessage<ResponseMessageText>();
  178. strongResponseMessage.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey;
  179. reponseMessage = strongResponseMessage;
  180. }
  181. break;
  182. }
  183. return reponseMessage;
  184. }
  185. public override IResponseMessageBase OnEvent_EnterRequest(RequestMessageEvent_Enter requestMessage)
  186. {
  187. var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
  188. responseMessage.Content = "您刚才发送了ENTER事件请求。";
  189. return responseMessage;
  190. }
  191. public override IResponseMessageBase OnEvent_LocationRequest(RequestMessageEvent_Location requestMessage)
  192. {
  193. //这里是微信客户端(通过微信服务器)自动发送过来的位置信息
  194. var responseMessage = CreateResponseMessage<ResponseMessageText>();
  195. responseMessage.Content = "这里写什么都无所谓,比如:上帝爱你!";
  196. return responseMessage;//这里也可以返回null(需要注意写日志时候null的问题)
  197. }
  198. public override IResponseMessageBase OnEvent_ScanRequest(RequestMessageEvent_Scan requestMessage)
  199. {
  200. //通过扫描关注
  201. var responseMessage = CreateResponseMessage<ResponseMessageText>();
  202. responseMessage.Content = "通过扫描关注。";
  203. return responseMessage;
  204. }
  205. public override IResponseMessageBase OnEvent_ViewRequest(RequestMessageEvent_View requestMessage)
  206. {
  207. //说明:这条消息只作为接收,下面的responseMessage到达不了客户端,类似OnEvent_UnsubscribeRequest
  208. var responseMessage = CreateResponseMessage<ResponseMessageText>();
  209. responseMessage.Content = "您点击了view按钮,将打开网页:" + requestMessage.EventKey;
  210. return responseMessage;
  211. }
  212. public override IResponseMessageBase OnEvent_MassSendJobFinishRequest(RequestMessageEvent_MassSendJobFinish requestMessage)
  213. {
  214. var responseMessage = CreateResponseMessage<ResponseMessageText>();
  215. responseMessage.Content = "接收到了群发完成的信息。";
  216. return responseMessage;
  217. }
  218. /// <summary>
  219. /// 订阅(关注)事件
  220. /// </summary>
  221. /// <returns></returns>
  222. public override IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage)
  223. {
  224. var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
  225. responseMessage.Content = GetWelcomeInfo();
  226. if (!string.IsNullOrEmpty(requestMessage.EventKey))
  227. {
  228. responseMessage.Content += "\r\n============\r\n场景值:"+ requestMessage.EventKey;
  229. }
  230. return responseMessage;
  231. }
  232. /// <summary>
  233. /// 退订
  234. /// 实际上用户无法收到非订阅账号的消息,所以这里可以随便写。
  235. /// unsubscribe事件的意义在于及时删除网站应用中已经记录的OpenID绑定,消除冗余数据。并且关注用户流失的情况。
  236. /// </summary>
  237. /// <returns></returns>
  238. public override IResponseMessageBase OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage)
  239. {
  240. var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
  241. responseMessage.Content = "有空再来";
  242. return responseMessage;
  243. }
  244. /// <summary>
  245. /// 事件之扫码推事件(scancode_push)
  246. /// </summary>
  247. /// <param name="requestMessage"></param>
  248. /// <returns></returns>
  249. public override IResponseMessageBase OnEvent_ScancodePushRequest(RequestMessageEvent_Scancode_Push requestMessage)
  250. {
  251. var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
  252. responseMessage.Content = "事件之扫码推事件";
  253. return responseMessage;
  254. }
  255. /// <summary>
  256. /// 事件之扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg)
  257. /// </summary>
  258. /// <param name="requestMessage"></param>
  259. /// <returns></returns>
  260. public override IResponseMessageBase OnEvent_ScancodeWaitmsgRequest(RequestMessageEvent_Scancode_Waitmsg requestMessage)
  261. {
  262. var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
  263. responseMessage.Content = "事件之扫码推事件且弹出“消息接收中”提示框";
  264. return responseMessage;
  265. }
  266. /// <summary>
  267. /// 事件之弹出拍照或者相册发图(pic_photo_or_album)
  268. /// </summary>
  269. /// <param name="requestMessage"></param>
  270. /// <returns></returns>
  271. public override IResponseMessageBase OnEvent_PicPhotoOrAlbumRequest(RequestMessageEvent_Pic_Photo_Or_Album requestMessage)
  272. {
  273. var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
  274. responseMessage.Content = "事件之弹出拍照或者相册发图";
  275. return responseMessage;
  276. }
  277. /// <summary>
  278. /// 事件之弹出系统拍照发图(pic_sysphoto)
  279. /// 实际测试时发现微信并没有推送RequestMessageEvent_Pic_Sysphoto消息,只能接收到用户在微信中发送的图片消息。
  280. /// </summary>
  281. /// <param name="requestMessage"></param>
  282. /// <returns></returns>
  283. public override IResponseMessageBase OnEvent_PicSysphotoRequest(RequestMessageEvent_Pic_Sysphoto requestMessage)
  284. {
  285. var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
  286. responseMessage.Content = "事件之弹出系统拍照发图";
  287. return responseMessage;
  288. }
  289. /// <summary>
  290. /// 事件之弹出微信相册发图器(pic_weixin)
  291. /// </summary>
  292. /// <param name="requestMessage"></param>
  293. /// <returns></returns>
  294. public override IResponseMessageBase OnEvent_PicWeixinRequest(RequestMessageEvent_Pic_Weixin requestMessage)
  295. {
  296. var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
  297. responseMessage.Content = "事件之弹出微信相册发图器";
  298. return responseMessage;
  299. }
  300. /// <summary>
  301. /// 事件之弹出地理位置选择器(location_select)
  302. /// </summary>
  303. /// <param name="requestMessage"></param>
  304. /// <returns></returns>
  305. public override IResponseMessageBase OnEvent_LocationSelectRequest(RequestMessageEvent_Location_Select requestMessage)
  306. {
  307. var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
  308. responseMessage.Content = "事件之弹出地理位置选择器";
  309. return responseMessage;
  310. }
  311. }
  312. }