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

年底了,比较忙,大家都在展望未来,对于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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏何俊林

Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程

不知不觉到第九篇了,感觉还有好多好多没有写,路漫漫其修远兮 ,吾将上下而求索。先说福利吧,此前在关于我, ? 曾说过,不定期搞活动,vip,书啥的,都可以有,...

25660
来自专栏逸鹏说道

.Net中的AOP系列之构建一个汽车租赁应用(下)

相似地,我们也要在Redeem方法中添加,这里不做了,省略。问题越来越明显了,横切关注点基本上占据了这个方法的一半代码。但是我们还没有做完,我们需要讨论一下异常...

36760
来自专栏领域驱动设计DDD实战进阶

DDD实战进阶第一波(四):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架三)

上一篇文章我们讲了经典DDD架构对比传统三层架构的优势,以及经典DDD架构每一层的职责后,本篇文章将介绍基础结构层中支持DDD的轻量级框架的主要代码。 这里需要...

59650
来自专栏数值分析与有限元编程

Python IDLE关联.py文件

为进一步提升Python IDLE可操作性,本文介绍如何在windows操作系统下默认使用python自带的IDLE编辑器关联后缀名为.py的文件。

64910
来自专栏Java架构师学习

分享我在阿里工作十年接触过Java框架设计模式一、前言二、责任链设计模式(Chain of Responsibility Pattern)三、工厂模式(Factory Pattern)四、单例设计模式

一、前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者可以简化代码,或者可...

78380
来自专栏racaljk

《代码整洁之道》摘录总结

1.     以下全部条款源于·<Clean Code Robert.C.Martin>Chapter 17,这里对其进行文字层面的加工,简化,便于以后能短时浏...

10830
来自专栏Spark生态圈

[spark] spark推测式执行

推测任务是指对于一个Stage里面拖后腿的Task,会在其他节点的Executor上再次启动这个task,如果其中一个Task实例运行成功则将这个最先完成的Ta...

25920
来自专栏NetCore

[原创]Fluent NHibernate之旅二--Entity Mapping

接着上一篇,今天我们说说ORM中的Mapping。如果你要体验NHibernate的强大,首先你就要学会配置,包括SessionFactory和Mapping的...

24090
来自专栏JadePeng的技术博客

Flutter与Dart 入门

Flutter是google推出的,一个使用Dart语言开发的跨平台移动UI框架,通过自建绘制引擎,能高性能、高保真地进行Android和IOS开发。

13820
来自专栏Java开发者杂谈

For update带来的思考

​ 之所以想写这个专题,是因为最近在做一个抢占任务的实现。假设数据库很多个任务,在抢占发生之前任务的状态都是FREE。现在假设同时有一堆抢占线程开始工作,抢占线...

13930

扫码关注云+社区

领取腾讯云代金券