(转)微信公众平台开发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,这样子下来就可以实现我们的简单自动回复功能了。
  附上我的微信公众号,希望大家关注一下,大家可以给我留言哦!

posted on 2013-11-02 23:00  黑子范  阅读(287)  评论(0编辑  收藏  举报

导航