微信生态中关注、点击等各种微信消息处理的后端服务实现WxMpMessageRouter
微信生态中关于消息处理的后端服务实现
业务场景
- 在微信公众号中,用户点击菜单、给公众号发消息、关注公众号等事件,微信都会将消息通过接口传给后台服务器,后台服务经过处理返回给微信,微信对应展示。
- 用户关注微信公众号,公众号自动回复用户“欢迎关注”此类的话术。还有用户对话框中输入消息,公众号自动回复对应话术这种场景
技术实现
使用binarywang的微信SDK,开源SDK,公司连不上GitHub,放个gitee的地址吧 https://gitee.com/binary
定义一个管理类,实现ApplicationRunner,项目启动后执行run方法,将微信的相关配置进行初始化。这时候会将微信消息处理的handler初始化到消息处理路由中。SDK中关于微信消息路由器的描述如下:
微信消息路由器,通过代码化的配置,把来自微信的消息交给handler处理
说明:
1. 配置路由规则时要按照从细到粗的原则,否则消息可能会被提前处理2. 默认情况下消息只会被处理一次,除非使用 WxMpMessageRouterRule.next()3. 规则的结束必须用WxMpMessageRouterRule.end()或者WxMpMessageRouterRule.next(),否则不会生效
路由器中可以放置对应的handler和拦截器进行消息的处理,拦截器在项目中没有实际应用,这里不再赘述。
微信消息拦截器,可以用来做验证
public interface WxMpMessageInterceptor {/*** 拦截微信消息** @param wxMessage* @param context 上下文,如果handler或interceptor之间有信息要传递,可以用这个* @param wxMpService* @param sessionManager* @return true代表OK,false代表不OK*/boolean intercept(WxMpXmlMessage wxMessage,Map<String, Object> context,WxMpService wxMpService,WxSessionManager sessionManager) throws WxErrorException;}
WxMpMessageHandler,SDK中定义的处理微信推送消息的处理器接口。项目中定义一个抽象类,实现WxMpMessageHandler接口,在实现handle的方法逻辑中再定义一个抽象方法。再分别定义各个实际处理的handler继承这个抽象类,重写抽象类中定义的抽象方法,这个抽象方法,是实际业务逻辑中处理消息的方法。
public interface WxMpMessageHandler {/*** 处理微信推送消息.** @param wxMessage 微信推送消息* @param context 上下文,如果handler或interceptor之间有信息要传递,可以用这个* @param wxMpService 服务类* @param sessionManager session管理器* @return xml格式的消息,如果在异步规则里处理的话,可以返回null* @throws WxErrorException 异常*/WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,Map<String, Object> context,WxMpService wxMpService,WxSessionManager sessionManager) throws WxErrorException;}
在微信管理类执行run方法时,定义一个微信消息路由器WxMpMessageRouter,将自定义的handler和拦截器放进路由器中进行初始化。类似如下写法:
final WxMpMessageRouter wxMpMessageRouter = new WxMpMessageRouter(wxMpService); wxMpMessageRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.SUBSCRIBE).handler(wxmpSubscribeHandler).interceptor(wxmpMessageInterceptorImpl).end();
实际执行逻辑
微信调用服务器接口
类似的请求报文体如下,还有签名、nonce、时间戳等参数
<xml>
<ToUserName><![CDATA[gh_28ba13224381]]></ToUserName
<FromUserName><![CDATA[微信公众号的openid]]></FromUserName> <CreateTime>1657779555</CreateTime>
<MsgType><![CDATA[text]]></MsgTyp
<Content><![CDATA[你好]]></Content
<MsgId>23733694539373153</MsgId</xml>
验签并初始化消息
使用开源SDK中的方法,WxMpService.checkSignature()进行验签。
接着用WxMpXmlMessage 将xml报文转换成消息实体进行处理
WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);
消息处理
- 初始化的微信消息,放进微信消息路由器中进行处理。WxmpManager.getWxmpMessageRouter(appId).route(wxMessage);
- 遍历获取到的router,与传进去的微信消息实体进行匹配,比如msgtype、event等,详见WxMpMessageRouterRule中的test方法。
- 匹配到WxMpMessageRouterRule之后,执行rule.service方法并返回,这里也可以设置成异步的处理,异步处理只是开启一个新线程,new runnable,里面执行rule.service,外面executorService.submit,同时一个list接收返回。
- 在service方法中,先执行拦截器的逻辑,而后交给handler处理,返回执行结果。对应的每个handler在初始化路由器的时候已经放进去了,所以可以找到对应具体的handler执行逻辑。具体handler类似WxmpMenuHandler(微信公众号菜单事件handler)中只重写了具体的逻辑,所以handler中的hand方法还是要在父类WxmpAbstractMessageHandler中执行。
- 这里应该是用到了策略模式吧,大体是每个类型的消息通过条件匹配出来一个对应的执行路由,执行路由再通过初始化时的intercepter和handler,进行实际的逻辑处理,表现在controller中只需要将消息传给微信消息路由器并接收返回值即可。用着确实很方便,且如果需要新增事件类型处理的handler时,只需要写一个对应的handler并且微信消息路由器初始化时放进去即可。
项目中用到的消息路由
- 客服会话
- 自定义菜单
- 点击菜单连接
- 关注事件
- 取关事件
- 上报地理位置事件
- 接收地理位置事件
- 扫码事件
- 默认
微信生态中关注、点击等各种微信消息处理的后端服务实现WxMpMessageRouter相关推荐
- 微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?
据 2020 腾讯财报数据显示,微信月活用户已超 12 亿,相比我国网络购物用户规模的 7.5 亿(截至 2020 年 6 月),其中仍存在超 4.5 亿人的空集,这巨大的红利让众多行业蠢蠢欲动. 其 ...
- 神策营销云:微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?...
据 2020 腾讯财报数据显示,微信月活用户已超 12 亿,相比我国网络购物用户规模的 7.5 亿(截至 2020 年 6 月),其中仍存在超 4.5 亿人的空集,这巨大的红利让众多行业蠢蠢欲动. 其 ...
- 微信openid 服务器备案,微信生态中的 openId、unionID和业务系统中的ID
在进行微信生态相关的开发的时候,经常会遇到一个术语:openID.openID 在微信生态下几乎无处不在:你想要识别用户身份?需要 openID 你需要给用户推送消息?需要 openID 除了 ope ...
- 如何巧用微信生态搭建和运营私域流量
什么是私域流量? 2020年,说到私域流量,可谓是热度颇高,但目前对私域流量的解读,尚不能统一.当下多数人的理解是,私域流量即微信群+公众号,但其实并不全面. 广义上说,私域流量是相对于公域流量来说的 ...
- 神策数据王乾:微信生态与小程序发展趋势洞察
▼▼▼ 导读 在 2020 年的微信公开课上,微信官方宣布,小程序的重点目标是助力商家打造自己的商业闭环.而随着近期小程序热度的持续攀升,品牌零售商也纷纷强化了对这一重要自建渠道的重视. 为此,神策数 ...
- “网红”白鸦创立6年的有赞,为何不敌同样诞生于微信生态3年的拼多多?
导读 同样脱胎于微信生态的有赞与拼多多,规模之差难道仅仅是To B与To C的区别吗?已借壳上市的有赞,目前积累超过300万注册商家,活跃付费商家超10万,预计今年将实现盈利. 来源:爱分析丨撰写:黄 ...
- 微信小程序开发09 开放数据:微信生态帮助业务快速落地
你好,我是俊鹏,从今天开始,我会用四讲的时间,从"效率.留存.体验和更新"四个角度出发,带你学习目前在微信小程序开发领域中的一些前沿技术和实践经验. 这四个角度是团队在日常工作中最 ...
- 深度洞见|品牌如何布局微信生态,玩转私域运营?
这是神策研究院深度洞见系列文章的第三期,重点介绍微信生态的基础能力.微信作为私域运营主战场的优势及主要趋势.本文共计 3340 字,阅读时间约 10 分钟. 近两年消费市场的低迷.疫情的反复让零售难上 ...
- 企业微信生态下的会员管理系统
当今社会,数字化已经不算什么新兴词汇,随着讨论度的持续升温,越来越多的企业开始对数字化有了新的认知.数字化不仅仅是将线下的销售搬到线上,也不仅仅是线上线下渠道相结合.数字化发展至今,也已经不再是这样肤 ...
最新文章
- Go 学习笔记(64)— Go error.New 创建接口错误对象、fmt.Errorf 创建接口错误对象、errors.Is 和 errors.As
- 9、MySQL定义条件和处理程序
- 《草原安魂曲》《自由意志》及其他我喜欢的电影海报
- 来自后端的突袭? --开包即食的教程带你浅尝最新开源的C# Web引擎 Blazor
- ActiveMQ学习总结(8)——消息队列设计精要
- 动态规划 —— 线性 DP
- [linux]CentOS安装pre-built Nginx
- PBR理论基础3.1:基于图像的光照(下)
- 剑指Offer 64 求1+2+...+n
- 浅论照明节能的系统设计
- Logitech Control Center 3.9.8 特别版 Mac 罗技USB键盘和鼠标管理软件
- Python温度转换程序
- 记用Fiddler抓包爬取pc端微信公众号文章
- 【学习笔记】密码学入门(2) 单向散列函数,消息认证码,数字签名,证书
- ACM中的整数K拆分 (有条件限制 无条件限制 插板法 URAL-1036 HDU-6397)
- Linux下用火焰图进行性能分析
- java jfreechart 折线图_JFreeChart在制作折线图
- 单片机采集电压信号(AD转换器的应用实例)上
- gcc/g++ 命令的常用选项
- 爆肝1个多月,严选10大热门静态博客框架,官方文档、教学视频、经典案例、热门插件一应俱全,强烈建议收藏