zoukankan      html  css  js  c++  java
  • 微信快速开发框架(四)-- 体验微信公众平台快速开发框架

    今天上午想着用那个框架来快速建立一个测试,用着用着,发觉了些bug,赶紧修复了下,目前已经更新到github上。

    接下来,我们的快速开发,首先您要建立一个公众账号的测试账号,建立方法参见《建立微信公众平台测试账号》,我在项目中,加入了WebDemo项目,您可以参考以下。

    上一篇介绍中,我说过先建立规则,但细想以下,貌似先要建立消息处理类,然后才能在规则中使用。

    实践一下,这里我用了2个消息处理,一个是DefaultMessageHandler和CnBlogsMessageHandler,一个是默认的消息,在无法处理时返回,CnblogsMessageHandler是一个文本消息处理,您只要回复“博客园”就能看到相应的反馈消息。

    先建立2个MessageHandler都继承IMessageHandler:

    public class DefaultMessageHandler : IMessageHandler
        {
            private static string s_defaultMsg = "对不起,亲,我还无法了解您的需求,我会不断改进的!";
    
            public ResponseMessage HandlerRequestMessage(XElement xml)
            {
                var fromUserName = xml.Element("ToUserName").Value;
                var toUserName = xml.Element("FromUserName").Value;
                return new ResponseTextMessage
                {
                    FromUserName = fromUserName,
                    ToUserName = toUserName,
                    CreateTime = DateTime.Now.Ticks,
                    Content = s_defaultMsg
                };
            }
        }
    public class CnblogsTextMessageHandler : IMessageHandler
        {
            private static string s_cnblogsMsg = "HI,博客园的园友,欢迎来到JamesYing的微信世界,请关注我,http://inday.cnblogs.com";
            public ResponseMessage HandlerRequestMessage(XElement xml)
            {
                var request = new RequestTextMessage(xml);
                return new ResponseTextMessage(request)
                {
                    CreateTime = DateTime.Now.Ticks,
                    Content = s_cnblogsMsg
                };
            }
        }

    后面建立一些规则:

    这里我建立了几套规则,先建立了主体规则:

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

    MsgTypeMessageRole是一个根据类型处理的规则,与之前Demo不同,我把规则都细分了,这样耦合度减小,可以根据不同需求,在不同规则中修改。

    public class MsgTypeMessageRole : IMessageRole
        {
            private MsgType MsgType { get; set; }
    
            public MsgTypeMessageRole(MsgType msgType)
            {
                this.MsgType = msgType;
            }
    
            public IMessageHandler MessageRole(XElement xml)
            {
                switch (MsgType)
                {
                    case MsgType.Text:
                        return new TextMessageRole().MessageRole(xml);
                    default:
                        return new DefaultMessageHandler();
                }
            }
        }

    这里在判断为Text的时候,返回了另外一个规则,文本消息处理规则TextMessageRole,其余情况下则直接返回一个默认的消息处理DefaultMessageHandler

    public class TextMessageRole : IMessageRole
        {
            public IMessageHandler MessageRole(XElement xml)
            {
                var request = new RequestTextMessage(xml);
                if (request.Content.IndexOf("博客园") > -1)
                {
                    return new CnblogsTextMessageHandler();
                }
    
                return new DefaultMessageHandler();
            }
        }

    TextMessageRole 是个很简单的规则类,我只是判断在文本内容中是否含有“博客园”三个字,有的话,我直接返回CnblogsTextMessageHandler

    基本的处理都好了,接下来是在微信接口中,进行部署,在web项目中wx.aspx为接口地址。

    我的公开测试地址:http://wx.jamesying.com/wx.aspx

    在wx.aspx.cs中,进行一些必要的配置:

    public partial class WX : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                try
                {
                    //微信服务器一直把用户发过来的消息,post过来
                    if (Request.HttpMethod == "POST")
                    {
                        var reader = XmlReader.Create(Request.InputStream);
                        
                        var doc = XDocument.Load(reader);
                        MyLog.Log(doc.ToString());
                        var xml = doc.Element("xml");
                        //把inputstream转换成xelement后,直接交给WebMessageRole来处理吧
                        var responseMessage =  new WebMessageRole()
                            .MessageRole(xml)
                            .HandlerRequestMessage(xml);
    
                        if (responseMessage != null)
                        {
                            Response.Write(responseMessage.Serializable());
    #if DEBUG
                            MyLog.Log(responseMessage.Serializable());
    #endif
                        }
                    }
                    else if (Request.HttpMethod == "GET") //微信服务器在首次验证时,需要进行一些验证,但。。。。
                    {
                        //我仅需返回给他echostr中的值,就为验证成功,可能微信觉得这些安全策略是为了保障我的服务器,要不要随你吧
                        Response.Write(Request["echostr"].ToString());
                    }
                }
                catch (Exception ex)
                {
                    MyLog.Log("error:" + ex.ToString());
                }
            }
        }

    至此,一个简单的微信公众平台接口已经配置完成,只要部署到自己的web服务器即可。在上一篇中,有人提到了之前有过接口+工厂的模式,说实在,真没看过,可能最近比较懒,没一直刷博客园吧。不过看了@戢俊建 的一篇关于微信平台的文章,觉得写得蛮好的,大家也可以看看。

    做这个框架的目的,也是为了方便大家来进行开发,昨天有用户说提供一些模板比较好(其实就是MessageHandler),我觉得这个方案不错,过几天申请个公众账号,写几个常用的处理类,方便大家。当然也可以大家自己写,Email给我也行。

    下面看下效果,您如果也要看效果,请关注我的测试账号(必须用扫一扫功能扫二维码才能添加):QQ截图20131211120953

    我用了web weixin:

    image

    亲,可以关注我的微信:jamesying1

  • 相关阅读:
    xml转义字符在mybatis动态sql中的使用
    jdbc类型与java类型
    aop日志(记录方法调用日志)
    mysql数据库关联查询【lert join】常见使用
    maven项目基本配置
    mapper文件的参数传入与获取
    idea新建项目出现push rejected如何解决
    快速从2个List集合中找出相同/不同元素
    Windows 环境下安装RocketMQ
    RabbitMQ java客户端集成 Spring 开发环境
  • 原文地址:https://www.cnblogs.com/inday/p/wx-publicform-quick-framework-webdemo.html
Copyright © 2011-2022 走看看