为什么还要写微信消息接收的文章
最近项目由.net framework框架升级到了Core
客户有新的需求,需要统计公众号取消关注人数以及新增粉丝数,需要用到事件消息接收
上一篇文章写的不够详细,依然有很多人问我,应该怎么处理微信授权消息
复习要点
为什么我们需要处理微信推送的消息
我们如何处理微信推送消息
开发资料填写
授权事件接收URL
首先这个地址所属域名必须与授权发起页域名保持一致,如:授权发起页域名为:www.xxxx.com。那我们的授权事件接收Url 则为https://www.xxxx.com/Receive/SysMessage
在这个Url中,我们将会接受两种类型的消息。授权通知消息跟ticket消息。
消息接收
我们先通过日志,分析一下微信是怎么请求我们这个接口的,通过日志我们发现;微信实际请求的地址为:
http://www.xxxx.com/Receive/SysMessage?signature=692ded0848127c81dc46da67bb7cb14925we51ee×tamp=1568969944&nonce=1382428071&encrypt_type=aes&msg_signature=f6ee103a5c0189444778bfe9c19e13ewe44790ed
同时,还推送给我们一段文件流信息,信息内容如下:
为避免第一次接触Core2.0的同学踩到跟我一样的坑,我分享一下怎么接收流文件以及参数。
参数部分,我们正常接收即可,流文件,用 Request.GetRequestMemoryStream()正常接收即可。关于参与部分,我们可以 封装成一个实体对象接收,也可以单个参数接受。
接收流文件一定要注意,在Core中,流文件仅允许读取一次,故,我第一次接收到流文件之后,读取并打印出来之后,导致 后边的程序一直无法读取流文件,程序一直报错,后来才了解到这个机制。我们想要重复接收流文件怎么办?
HttpContext.Request.EnableRewind();
HttpContext.Request.Body.Position = 0;
HttpContext.Request.Body.Seek(0, 0);
消息处理
我们需要对接收到的消息,进行解密处理,并获取到ticket,这个才是我们的最终目的。
我们在解密之前,有两件事情需要处理
我们通过分析微信提供给我们的SDK,得知,解密XML文件我们需要初始化对象WXBizMsgCrypt。该类包含一个三个参数的构 造函数,参数分别为:Token,EncodingAESKey,AppId。这三个参数微信在推送消息时,均提供给了我们。直接拿来使用即可。
同时,在WXBizMsgCrypt对象中,提供了DecryptMsg方法,用于校验消息的合法性并返回解密结果。该方法包含5个参数,分别为sMsgSignature,sTimeStamp,sNonce,sPostData,返回sMsg。
参数名称 | 参数描述 | 来源 |
---|---|---|
Msg_Signature | 签名 | 推送消息接收的参数 |
Timestamp | 时间戳 | 推送消息接收的参数 |
Nonce | 随机数 | 推送消息接收的参数 |
postDataStr | 流文件Xml | XML文件直接ToString()即可 |
直接调用,返回的sMsg即为我们最终想要的结果:
四种授权通知消息,解密后的结果不同,我就不一一列举了。这个节点还算清晰。
1569168398
我们主要通过InfoType来区分,消息类型。这里我着重说明一下component_verify_ticket消息。
我的处理方式是,当接受到component_verify_ticket消息之后,我会将ticket消息写入文本文件。并根据推送消息不停覆盖该文本。因为ticket可是我们管理公众号的重要凭据。
如果有公众号开发经验的话,我们都知道,获取有关公众号的所有信息,我们都需要用到acctoke这个票据。而ticket是我们使用开放平台换取acctoken的重要凭据。那我们应该怎么通过ticke换取Token留在开放平台管理公众号文章中再详细说明,本文仅介绍如何处理微信推送的授权消息。
至此,我们的授权事件接收就算处理完了。
消息与事件接收URL
同样,这个地址所属域名必须与授权发起页域名保持一致,如:授权发起页域名为:www.xxxx.com。那我们的消息与事件接收Url 则为https://www.xxxx.com/Receive/EventMessage
在这个Url中,同样,我们也会接受两种类型的消息。
消息接收
同样,我们先分析日志,分析一下微信是怎么请求我们这个接口的,通过日志我们发现;微信实际请求的地址为:
http://www.xxxx.com/Receive/EventMessage/wxf50cbe181c823526?signature=afab092b6ed320aaadb5e84025e868bbbf86b78b×tamp=1569109822&nonce=1958085416&openid=oAvaB1N8afpZuAh5D7IgTGn9Zdlc&encrypt_type=aes&msg_signature=836e160d6921243851e5c121d7bc83aa3fde67ea
同授权消息不同的是,微信直接请求的地址后,带了公众号的AppId,故,请一定要配置好我们的路由规则。
同时,还推送给我们一段文件流信息,信息内容如下:
通过分析,我们得到如下结论:
同样我们需要解密该Xml文件,解密方式同授权通知推送消息解密。