重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要为大家展示了“如何处理微信公众号开发中的消息与事件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何处理微信公众号开发中的消息与事件”这篇文章吧。
在做网站、成都做网站中从网站色彩、结构布局、栏目设置、关键词群组等细微处着手,突出企业的产品/服务/品牌,帮助企业锁定精准用户,提高在线咨询和转化,使成都网站营销成为有效果、有回报的无锡营销推广。创新互联公司专业成都网站建设10多年了,客户满意度97.8%,欢迎成都创新互联客户联系。
1 消息(事件)概况
当普通微信用户向公众号发消息或者微信服务器向公众号推送事件时,微信服务器将POST消息(事件)的XML数据包到开发者填写的公众号服务器URL上;公众号服务器然后对消息作出响应。
1.1 消息的流转过程
为了便于区分,我们将微信服务器发往公众号服务器的消息称为请求(Request)消息;将公众号服务器发往微信服务器的消息称为响应(Response)消息;将推送事件看成特殊的请求消息。
请求与响应消息的流转过程如下图所示:
1.2 请求消息
请求消息有很多种,我们为其一一建立了对应的类,类层次结构如下图所示:
有些请求消息,我们可以做出响应,有些则不能,详见下表:
消息类型 | 是否事件 | 能够被动回复 | 备注 |
文本 | × | √ | |
图片 | × | √ | |
声音 | × | √ | |
视频 | × | 未知 | 接收不到视频消息,不知道是否能被动回复 |
地理位置 | × | √ | |
链接 | × | √ | |
订阅 | √ | √ | |
取消订阅 | √ | × | |
扫描二维码 | √ | × | |
上报地理位置 | √ | × | |
点击菜单拉取消息 | √ | √ | |
点击菜单跳转链接 | √ | × | |
点击菜单扫码推 | √ | × | |
点击菜单扫码等待回复 | √ | √ | |
点击菜单系统发图 | √ | 未知 | 接收不到系统发图事件;微信服务器会发送图片消息,可回复 |
点击菜单拍照或相册发图 | √ | × | 微信服务器会发送图片消息,可回复 |
点击菜单微信发图 | √ | × | 微信服务器会发送图片消息,可回复 |
点击菜单选择地理位置 | √ | × | 微信服务器会发送地理位置消息,可回复 |
推送群发消息结果 | √ | × | |
推送发送模板消息结果 | √ | × |
1.3 响应消息
响应消息的类层次结构如下图所示:
2 验证消息的真实性
公众号服务器接收到微信服务器的请求之后,第一件事情是验证消息的真实性。
Utility.CheckSignature方法用于验证消息签名是否正确。
示例如下:
////// 验证消息的有效性 /// /// ///如果消息有效,返回true;否则返回false。 private bool Validate(HttpContext context) { string username = RequestEx.TryGetQueryString("username"); //在接口配置的URL中加入了username参数,表示哪个微信公众号 AccountInfo account = AccountInfoCollection.GetAccountInfo(username); if (account == null) return false; string token = account.Token; string signature = RequestEx.TryGetQueryString("signature"); string timestamp = RequestEx.TryGetQueryString("timestamp"); string nonce = RequestEx.TryGetQueryString("nonce"); if (string.IsNullOrWhiteSpace(signature) || string.IsNullOrWhiteSpace(timestamp) || string.IsNullOrWhiteSpace(nonce)) return false; return xrwang.weixin.PublicAccount.Utility.CheckSignature(signature, token, timestamp, nonce); } 验证消息真实性
验证消息真实性
3 解析消息
如果消息签名通过验证,我们需要将XML格式的消息文本解析成请求消息对象,RequestMessageHelper类用于完成这项工作。
RequestMessageHelper helper = new RequestMessageHelper(context.Request); if(helper.Message != null) { //消息解析成功,对它进行处理 }
消息解析成功之后,helper.Message为消息基类RequestBaseMessage,我们可以根据属性MsgType及Event判断到底是哪种消息(事件),并转换成适当的子类型。例如:
RequestBaseMessage bm=helper.Message; switch(bm.MsgType) { case RequestMessageTypeEnum.text: //文本消息 HandleTextMessage((RequestTextMessage)bm); break; case RequestMessageTypeEnum.image: //图片消息 HandleImageMessage((RequestImageMessage)bm); break; //处理其他消息 case RequestMessageTypeEnum.event: //事件 RequestEventMessage ev=(RequestEventMessage)bm; switch(ev.Event) { case RequestEventTypeEnum.subscribe: //订阅 HandleSubscribeMessage((RequestSubscribeMessage)ev); break; case RequestEventTypeEnum.unsubscribe: //取消订阅 HandleUnsubscribeMessage((RequestUnsubscribeMessage)ev); break; //处理其他事件 } break; default: break; }
解析消息的细节请参看源代码:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/PublicAccount/RequestMessage/RequestMessageHelper.cs
4 被动回复消息
从微信服务器接收到消息(事件)之后,我们可以在5秒之内直接(被动)回复消息;也可以先直接回复空字符串,然后再在48小时内回复客服消息。
先初始化ResponseXxxMessage,然后用ToXml方法得到响应消息内容。
被动回复消息的示例如下:
////// 处理微信的POST请求 /// /// ///返回xml响应 private string HandlePost(HttpContext context) { RequestMessageHelper helper = new RequestMessageHelper(context.Request); if (helper.Message != null) { ResponseBaseMessage responseMessage = HandleRequestMessage(helper.Message); return responseMessage.ToXml(helper.EncryptType); } else return string.Empty; } ////// 处理请求消息,返回响应消息 /// ///返回响应消息 private ResponseBaseMessage HandleRequestMessage(RequestBaseMessage requestMessage) { ResponseTextMessage response = new ResponseTextMessage(requestMessage.FromUserName, requestMessage.ToUserName, DateTime.Now, string.Format("自动回复,请求内容如下:\r\n{0}", requestMessage)); return response; }
以上是“如何处理微信公众号开发中的消息与事件”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!