微信快速开发框架(二) -- 快速开发微信公众平台框架---简介

年底了,比较忙,大家都在展望未来,对于30+的我来说,发展和稳定是个难以取舍的问题。最近发了些求职信,鸟无音讯,没事做,做点帮助大家的东西吧。

之前做了个微信公众平台的查询系统,在开发中,发觉了一些微信公众平台的接口问题《对微信公众平台开发的消息处理》,开发起来比较痛苦,对于微信过来的消息,需要解析后一个一个来返回,编写之痛苦,相信有人明白。在开发中,一直考虑着如何来简化开发,暂时想不到好的模式来开发,就自己胡乱写了一个,希望对大家有帮助。

代码已发布到github:https://github.com/JamesYing/JCWX

第一步:创建Model类库,我把微信发送来的消息,事件、返回回去的消息,都写成了Demo

RequestMessage:微信发送过来的消息、事件。此类是个虚类,继承自WXMessage。

ResponseMessage:返回给微信服务器端的消息,同样也是虚类,继承自WXMessage。

在《对微信公众平台开发的消息处理》中,已经知道,微信服务器端通过Post方式,发来一段xml,通过Request.InputStream获取,是个Stream类型,之前一直考虑着,用XmlSerializer.Deserialize(stream)来解析成对象,但在实践当中,发觉无法判断MsgType,我必须先判断再解析,从性能上来说不太合适,所以我又重写了RequestMessage的构造函数,RequestMessage(XElement),把Stream –> XElement,就可以构造RequestMessage(要使用.net framework 3.5以上版本,您也可以自己修改成适合3.5以下版本)。不过我还是保留了原先的Deserialize方式,使用方法:RequestMessage.Deserializ<RequestMessage>(stream),具体可以参考我的源代码

我们知道返回给用户的也是一个Xml信息,您可以直接使用ResponseMessage.Serializable()返回给用户xml文档。ResponseMessage的构造函数中,有一个ResponseMessage(RequestMessage message),这是为了把FromUserName, ToUserName转换一下,后续文章会继续讲解。

第二步:创建了Business类库,提供一些公开接口,方便大家来进行开发。

IMessageRole:信息处理规则,规则的具体实现,请继承此接口

IMessageHandler:信息处理,根据信息,反馈给用户。

NotHandlerMessage:继承自IMessageHandler,这是一个在无法处理情况下,返回一个null的实现,您也可以自己来写。

IMessageRole接口中,只有一个IMessageHandler MessageRole(XElement xml);方法,为了提高性能,我把过来的Stream转换成了XElement,通过xml.Element(“MsgType”)进行类型判断,返回一个IMessageHandler。

IMEssageHandler:ResponseMessage HandlerRequestMessage(XElement xml);根据不同的Request返回给用户不同的ResponseMessage。

这个快速框架就这些,很简单,实践的话,需要自己编写:

1、信息处理规则,继承IMessageRole,在处理中,您可以根据MsgType进行分析,也可以根据不同Text内容进行分析,返回不同IMessageHanlder就可以了。

2、信息处理,继承IMessageHandler,这个可能要写很多个,看你的项目要求了。

微信公众平台提供了测试接口,但暂时我还没有用,就简单自己模拟了下。

创建一个RequestTextMessage(文本信息):

var request = new RequestTextMessage
            {
                ToUserName = "sh_bus",
                FromUserName = "jamesying1",
                MsgId = 123123123L,
                CreateTime = 1231231322L,
                Content = "my request message"
            };

模拟成Stream:

StringWriter sw = new StringWriter();
            var xmlSerializer = new XmlSerializer(typeof(RequestTextMessage));
            var ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            xmlSerializer.Serialize(sw, request, ns);
            Console.WriteLine(sw.ToString());
            Stream stream = new MemoryStream(sw.Encoding.GetBytes(sw.ToString()));

好了,有了模拟环境,我们,我们写一个自己的规则:

public class MyMessageRole : IMessageRole
    {
        public IMessageHandler MessageRole(XElement xml)
        {
            try
            {
                MsgType msgType = (MsgType)Enum.Parse(typeof(MsgType), xml.Element("MsgType").Value, true);
                return MessageHandlerByMsgType(msgType);
            }
            catch
            {
                return new NotHandlerMessage();
            }
        }

        private IMessageHandler MessageHandlerByMsgType(MsgType msgType)
        {
            IMessageHandler messageHandler = null;

            switch (msgType)
            {
                case MsgType.Text:
                    messageHandler = new TextMessageHander();
                    break;
                case MsgType.Event:
                    messageHandler = new EventMessageHandler();
                    break;
                default:
                    messageHandler = new NotHandlerMessage();
                    break;
            }

            return messageHandler;
        }
    }

 

再编写2个消息处理类:

public class TextMessageHandler : IMessageHandler
    {
        public ResponseMessage HandlerRequestMessage(XElement xml)
        {
            var request = new RequestTextMessage(xml);
            if (request.Content.IndexOf("info") > -1)
            {
                return new ResponseTextMessage(request)
                {
                    Content = "this message has keyword:info"
                };
            }
            else
            {
                return new ResponseTextMessage(request)
                {
                    Content = "this message has not keyword"
                };
            }
        }
    }

TextMessageHandler中,处理的类型为文本信息,判断内容中含有info,返回一个ResponseTextMessage。下面我们实践下:

var reader = XmlReader.Create(stream);
            var doc = XDocument.Load(reader);
            var xml = doc.Element("xml");
            IMessageRole role = new MyMessageRole();
            IMessageHandler handler = role.MessageRole(xml);
            ResponseMessage response = handler.HandlerRequestMessage(xml);
            if (response != null)
            {
                Console.WriteLine(response.Serializable());
            }
            else
            {
                Console.WriteLine("not handler");
            }

请加入response的判断,检查是否为空,因为我们不是每条消息都必须处理的。

看下运行结果:

ok,运行成功,目前还未进行测试,后续会加入测试代码,相信有了这个快速开发框架,会给大家开发微信公众平台有更好的帮助。好了,下班了,明天继续说明一些Model。

代码已发布到github:https://github.com/JamesYing/JCWX

时间: 2024-07-30 11:25:16

微信快速开发框架(二) -- 快速开发微信公众平台框架---简介的相关文章

微信快速开发框架(五)-- 利用快速开发框架,快速搭建微信浏览博客园首页文章

这几天接连发布了<快速开发微信公众平台框架---简介>和<体验微信公众平台快速开发框架>几篇关于微信平台的文章,不过反响一般,可能需求不是很多吧.闲来无事,还是继续改造一下这个框架. 今天更新了框架代码,听取了 @RMay 的建议,加入了一个信息中间件,用来处理xelement,避免了重复解析,所以所有接口都更改了下.此次更新如下: 1.增加信息中间件MiddleMessage 2.更改了接口参数类型,把原来的XElement都改成了MiddleMessage 3.删除了Demo项

微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github

4月28日,已增加多媒体上传及下载API,对应MediaUploadRequest和MediaGetRequest ---------------------------------------------------------------------------- 4月24日,感谢@八二制造的提醒,修复了自定义菜单查询返回的错误,现已修正. ----------------------------------------------------------------------------

java二次开发 struts1 hibernae spring框架

问题描述 java二次开发 struts1 hibernae spring框架 struts1没学过,hibernate spring 不是很熟,该如何开始二次开发 解决方案 原框架是Struts1,和hibernate,spring?还是让你用这三个来进行二次开发? 解决方案二: 原框架是Struts1,和hibernate,spring?还是让你用这三个来进行二次开发? 解决方案三: Struts1是瞒简单的,hibernate要复杂点,spring说简单也简单,说难也有难的,就看你之前的那

快速开发微信公众平台框架:简介

年底了,比较忙,大家都在展望未来,对于30+的我来说,发展和稳定是个难以取舍的问题.最近发了些求职信,鸟无音讯,没事做,做点帮助大家的东西吧. 之前做了个微信公众平台的查询系统,在开发中,发觉了一些微信公众平台的接口问题<对微信公众平台开发的消息处理>,开发起来比较痛苦,对于微信过来的消息,需要解析后一个一个来返回,编写之痛苦,相信有人明白.在开发中,一直考虑着如何来简化开发,暂时想不到好的模式来开发,就自己胡乱写了一个,希望对大家有帮助. 代码已发布到github:https://githu

微信小店二次开发功能套餐列表

本商品包括微信小店二次功能开发套餐.   [商品介绍]以下费用均为一次性费用.永久使用.   套餐一: 800元 订单查询:用户查询自己最近30天之内的订单记录.实时通知:用户付款成功后,实时通知用户订单详情.快递查询:已发货的订单,可以查询快递进度. 套餐二: 1200元 订单查询:用户查询自己最近30天之内的订单记录.实时通知:用户付款成功后,实时通知用户订单详情.快递查询:已发货的订单,可以查询快递进度.工作人员提醒:指定工作人员可以收到最新的订单通知. 套餐一和套餐二区别在于管理员微信提

微信、微博、阿里旺信的公众平台大战开闸

谁都知道,微信不管是腾讯的半张船票还是一张船票,光近四亿的微信用户,日活跃人数50%以上,已经扰得江湖上那些互联网大佬们垂涎三尺.寝食难安,再加上那个简单到被张小龙称为仅仅是个IO功能的公众平台,更是意图明显打算直接颠覆掉一半以上的APP应用.如何对抗微信其实已经不只是那些运营商们的事了. 今天王健林,冯仑,郭广昌,李东生,曹国伟,李彦宏,马化腾,江南春,古永锵等重要级别的商界大佬聚集到阿里巴巴与马云会面,业界很震动,有猜测是不是阿里要上市请各位大佬不要捣乱,或者是和小马哥商讨移动互联网船票分配

平台化三部曲之二模块化开发 - Google Guice 平台模块化开发的果汁

该文章来自阿里巴巴技术协会(ATA)精选集 在前文<从Eclipse平台看交易平台化>中,主要探讨平台的扩展机制. 本文将继续探讨平台化开发中另一个重要方面: 模块机制.在阿里系统开发中,大家都有自己的模块化开发方式.比如目前交易中的TMF框架(Trade Module Framwork)也是从模块化开发解决业务隔离扩展. Detail 2.0平台化项目中定义了一套自己的模块化方式.本文想通过介绍Guice Module的模块机制,介绍一种简单强大的模块开发解决方案,Guice在java开源软

微信快速开发框架(七)--发送客服信息,版本更新至V2.2 代码已更新至github

在V2版本发布的博文中,已经介绍了大多数Api的用法,同时也收到了很多意见,其中发布了几个修正版本,修改了几个bug,在此感谢大家的使用,有了大家的支持,相信快速开发框架会越来越好,也会越来越完善的. 如果您是第一次看到此框架,可以先从以下链接了解下: 一.对微信公众平台开发的消息处理    二.快速开发微信公众平台框架---简介    三.建立微信公众平台测试账号    四.体验微信公众平台快速开发框架    五.利用快速开发框架,快速搭建微信浏览博客园首页文章    六.微信快速开发框架(W

微信公众平台快速开发框架体验

今天上午想着用那个框架来快速建立一个测试,用着用着,发觉了些bug,赶紧修复了下,目前已经更新到github上. 接下来,我们的快速开发,首先您要建立一个公众账号的测试账号,建立方法参见<建立微信公众平台测试账号>,我在项目中,加入了WebDemo项目,您可以参考以下. 在上一篇介绍中,我说过先建立规则,但细想以下,貌似先要建立消息处理类,然后才能在规则中使用. 实践一下,这里我用了2个消息处理,一个是DefaultMessageHandler和CnBlogsMessageHandler,一个