微信生态中关于消息处理的后端服务实现

业务场景

  • 在微信公众号中,用户点击菜单、给公众号发消息、关注公众号等事件,微信都会将消息通过接口传给后台服务器,后台服务经过处理返回给微信,微信对应展示。
  • 用户关注微信公众号,公众号自动回复用户“欢迎关注”此类的话术。还有用户对话框中输入消息,公众号自动回复对应话术这种场景

技术实现

  • 使用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相关推荐

  1. 微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?

    据 2020 腾讯财报数据显示,微信月活用户已超 12 亿,相比我国网络购物用户规模的 7.5 亿(截至 2020 年 6 月),其中仍存在超 4.5 亿人的空集,这巨大的红利让众多行业蠢蠢欲动. 其 ...

  2. 神策营销云:微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?...

    据 2020 腾讯财报数据显示,微信月活用户已超 12 亿,相比我国网络购物用户规模的 7.5 亿(截至 2020 年 6 月),其中仍存在超 4.5 亿人的空集,这巨大的红利让众多行业蠢蠢欲动. 其 ...

  3. 微信openid 服务器备案,微信生态中的 openId、unionID和业务系统中的ID

    在进行微信生态相关的开发的时候,经常会遇到一个术语:openID.openID 在微信生态下几乎无处不在:你想要识别用户身份?需要 openID 你需要给用户推送消息?需要 openID 除了 ope ...

  4. 如何巧用微信生态搭建和运营私域流量

    什么是私域流量? 2020年,说到私域流量,可谓是热度颇高,但目前对私域流量的解读,尚不能统一.当下多数人的理解是,私域流量即微信群+公众号,但其实并不全面. 广义上说,私域流量是相对于公域流量来说的 ...

  5. 神策数据王乾:微信生态与小程序发展趋势洞察

    ▼▼▼ 导读 在 2020 年的微信公开课上,微信官方宣布,小程序的重点目标是助力商家打造自己的商业闭环.而随着近期小程序热度的持续攀升,品牌零售商也纷纷强化了对这一重要自建渠道的重视. 为此,神策数 ...

  6. “网红”白鸦创立6年的有赞,为何不敌同样诞生于微信生态3年的拼多多?

    导读 同样脱胎于微信生态的有赞与拼多多,规模之差难道仅仅是To B与To C的区别吗?已借壳上市的有赞,目前积累超过300万注册商家,活跃付费商家超10万,预计今年将实现盈利. 来源:爱分析丨撰写:黄 ...

  7. 微信小程序开发09 开放数据:微信生态帮助业务快速落地

    你好,我是俊鹏,从今天开始,我会用四讲的时间,从"效率.留存.体验和更新"四个角度出发,带你学习目前在微信小程序开发领域中的一些前沿技术和实践经验. 这四个角度是团队在日常工作中最 ...

  8. 深度洞见|品牌如何布局微信生态,玩转私域运营?

    这是神策研究院深度洞见系列文章的第三期,重点介绍微信生态的基础能力.微信作为私域运营主战场的优势及主要趋势.本文共计 3340 字,阅读时间约 10 分钟. 近两年消费市场的低迷.疫情的反复让零售难上 ...

  9. 企业微信生态下的会员管理系统

    当今社会,数字化已经不算什么新兴词汇,随着讨论度的持续升温,越来越多的企业开始对数字化有了新的认知.数字化不仅仅是将线下的销售搬到线上,也不仅仅是线上线下渠道相结合.数字化发展至今,也已经不再是这样肤 ...

最新文章

  1. Go 学习笔记(64)— Go error.New 创建接口错误对象、fmt.Errorf 创建接口错误对象、errors.Is 和 errors.As
  2. 9、MySQL定义条件和处理程序
  3. 《草原安魂曲》《自由意志》及其他我喜欢的电影海报
  4. 来自后端的突袭? --开包即食的教程带你浅尝最新开源的C# Web引擎 Blazor
  5. ActiveMQ学习总结(8)——消息队列设计精要
  6. 动态规划 —— 线性 DP
  7. [linux]CentOS安装pre-built Nginx
  8. PBR理论基础3.1:基于图像的光照(下)
  9. 剑指Offer 64 求1+2+...+n
  10. 浅论照明节能的系统设计
  11. Logitech Control Center 3.9.8 特别版 Mac 罗技USB键盘和鼠标管理软件
  12. Python温度转换程序
  13. 记用Fiddler抓包爬取pc端微信公众号文章
  14. 【学习笔记】密码学入门(2) 单向散列函数,消息认证码,数字签名,证书
  15. ACM中的整数K拆分 (有条件限制 无条件限制 插板法 URAL-1036 HDU-6397)
  16. Linux下用火焰图进行性能分析
  17. java jfreechart 折线图_JFreeChart在制作折线图
  18. 单片机采集电压信号(AD转换器的应用实例)上
  19. gcc/g++ 命令的常用选项
  20. 爆肝1个多月,严选10大热门静态博客框架,官方文档、教学视频、经典案例、热门插件一应俱全,强烈建议收藏

热门文章

  1. 软件测试真的很重要!——软件测试的作用
  2. 林业数字孪生打造实时树木“管家”
  3. DIY 空气质量检测器
  4. Notepad2 可以替换xp记事本Notepad
  5. c语言fopen函数的作用是,c语言fopen函数的用法
  6. 注意!这些设备禁止使用!物联卡网速慢、没信号的朋友请自行排查!
  7. 模仿360安全卫士项目笔记4
  8. 高数部分常用公式整理(扫描版——个人整理)
  9. js-运动总结(常见运动效果)
  10. 科技自主研发的FCRM-壹脉销客智能名片系统