zoukankan      html  css  js  c++  java
  • (转)微信公众平台开发02-接收信息及回复信息

    原文地址:http://www.cnblogs.com/zknu/p/3402385.html

      趁着前两天写博客的激情,趁着小周末有空,周末都是倒头大睡的日子,不知道大家的周末有啥丰富的节目不啊,作为屌丝的程序员,我想大多都是下班就是换个地方上网罢了,周末就是在家办公而已。

      上一篇,我们已经成功验证URL的有效性,成为了开发者。没有验证成功的小伙伴,可以联系我哦,不一定能帮你验证通过,不过我可以告诉我我具体是怎么弄的一个过程,哈哈,或许能帮到你吧。
      在验证通过之后,我们还需要去选择开发者模式,登录微信公众平台的后台选择高级功能,然后再选择开发者模式,并且开启开发者模式。编辑模式和开发者模式两者之间是互斥的,两者之间只能选择一种,而我们要通过服务器来响应用户的请求就是选择开发者模式。
      首先我们这一篇的目的很明确,接收用户发给我们的信息,然后回复信息给用户,这一节,主要简单地实现分析用户发的是什么类型的信息,然后,简单的回复信息。回复信息的内容暂且就只会重复的回复一句。后面回复的具体内容再慢慢实现,各位小伙伴可以根据自己的业务需求进行分析回复。
      先来看看微信公众平台消息接口,我们先来了解一下微信公众平台API中消息接口的内容,每一个开放平台都肯定少不了API开发文档说明的,小伙伴们要习惯读开发者文档哦。

    如上图,图可能有点小,小伙伴可以通过点击这里 查看详细的开发文档说明,上面消息推送就是指用户发送的信息微信服务器以 文本、图片、地理位置、链接、事件五种格式推送到我们自己的服务器。微信服务器也就是把用户发的信息以相对应类型的XML格式传到我们URL地址,例如文本消息:

    复制代码
    <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName> 
     <CreateTime>1348831860</CreateTime>
     <MsgType><![CDATA[text]]></MsgType>
     <Content><![CDATA[this is a test]]></Content>
     <MsgId>1234567890123456</MsgId>
     </xml>
    复制代码
    View Code

    我们服务器接收到的就是这XML格式的内容了。
      OK,接下来我们看 消息回复 ,从上图可以看到,我们紧支持文本、音乐、图文三种回复,微信服务器在5秒内收不到响应会断掉连接,用户收不到信息可能就是因为你服务器处理信息超过了5秒,所以到后面业务复杂的话,服务器要给力才行啊。
      可能会有些跟我一样的初学者,跟本不知道怎么接收到微信服务器发过来的内容,接收到又怎样处理,或者是无从下手,我也是从这样一步一步过来的,所以我比那些大牛更清楚初学者的痛苦了。上面我写了我的URL是http://cnblogs.com/zknu/weixin.aspx ,这很明显是一个页面地址是吧,微信服务器是怎么把内容传到我的服务器呢,它其实就相当于我们平时的页面提交地址一样,他只要这个地址后面加上内容就好了。所以,我们weixin.aspx页面的page_load是接收微信服务器发送内容的入口,那么在page_load里的方法应该怎么写呢?OK,先把代码贴出来:

    复制代码
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    //WeiXinAPI wx = new WeiXinAPI();
                    string postStr = "";
                    if (Request.HttpMethod.ToLower() == "post")
                    {
                        Stream s = System.Web.HttpContext.Current.Request.InputStream;
                        byte[] b = new byte[s.Length];
                        s.Read(b, 0, (int)s.Length);
                        postStr = Encoding.UTF8.GetString(b);
    
                        if (!string.IsNullOrEmpty(postStr))//请求处理
                        {
                            //wx.Handle(postStr);
                        }
                        else
                        {
                           // wx.Auth();
                        }
                    }
                    else 
                    {
                       // wx.Auth();
                    }
                }
            }
    复制代码

      首先,Request.HttpMethod.ToLower() == "post" 判断提交的模式是不是post,因为当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL上,跟着Stream s = System.Web.HttpContext.Current.Request.InputStream;接收数据流,byte[] b = new byte[s.Length];
     s.Read(b,
    0, (int)s.Length); 定义字节数组并把数据流读到字节数组里去,postStr = Encoding.UTF8.GetString(b);把字节数据转换位string类型,然后我们就把postStr转换为XML,然后就可以读取到每个节点的内容了。接下来就是看怎么转换成XML文件并且读取每个节点的内容了。好,这部分相信把代码贴出来大家都比较容易懂得了。需要说明,这里的代码写法不规范,我们只是为了实现我们这个简单的的回复功能,而且让小伙伴们看到尽可能的代码,后面我们再慢慢把代码分离规范整理吧。

    复制代码
    // 接收处理信息
            public void Handle(string postStr)
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(postStr);
                XmlElement rooElement = doc.DocumentElement;
                string toUserName = rooElement.SelectSingleNode("ToUserName").InnerText;
                string fromUserName = rooElement.SelectSingleNode("FromUserName").InnerText;
                ReponseMsg(toUserName,fromUserName);
            }
            //回复信息
            private void ReponseMsg(string toUserName, string fromUserName)
            {
                string Content = "欢迎您关注都是坤坤!我是坤坤,请问有什么可以帮到您吗?(" + DateTime.Now + ")";
                string resxml = @" <xml>
                                     <ToUserName><![CDATA[" + fromUserName + @"]]></ToUserName>
                                     <FromUserName><![CDATA[" + toUserName + @"]]></FromUserName>
                                     <CreateTime>" + DateTime.Now.ToString("yyyyMMdd") + @"</CreateTime>
                                     <MsgType><![CDATA[text]]></MsgType>
                                     <Content><![CDATA["+Content+@"]]></Content>
                                     </xml>";
                System.Web.HttpContext.Current.Response.Write(resxml);
            }
    复制代码
    View Code

    上面的代码中,我们只获取了XML文档中的toUserName和fromUserName,这里我们只要关心这两个就可以了,暂且先不管用户发过来的是什么类型的内容和具体什么内容,反正客户有发信息过来我们就回复给他。这里的toUserName就是只我们自己的微信,而fromUserName是用户的微信,反正我们不管他是什么,谁发来的我们就回复信息给谁距对了。回复消息方法里需要注意的是,toUserName填的就是我们上面获取到的fromUserName,最后,我们利用System.Web.HttpContext.Current.Response.Write(resxml);输出,Handle(postStr);我们在上面page_load的if (!string.IsNullOrEmpty(postStr))里面调用Handel这个方法就好了。OK,这样子下来就可以实现我们的简单自动回复功能了。
      附上我的微信公众号,希望大家关注一下,大家可以给我留言哦!

  • 相关阅读:
    Assignment 1-3 :Pattern Recognition
    GDB Guide
    Java 进阶
    Lab 4: Cache Geometries
    Buffer Overflows Lab
    二进制炸弹Lab
    Assignment 1-2 :Randomized Queues
    Assignment 1 :Percolation
    CSAPP Chapter 2
    在win7下用U盘安装Ubuntu,实现双系统
  • 原文地址:https://www.cnblogs.com/fcsh820/p/3404437.html
Copyright © 2011-2022 走看看