微信公众平台开发-02-接收信息及回复信息
趁着前两天写博客的激情,趁着小周末有空,周末都是倒头大睡的日子,不知道大家的周末有啥丰富的节目不啊,作为屌丝的程序员,我想大多都是下班就是换个地方上网罢了,周末就是在家办公而已。
上一篇,我们已经成功验证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>
我们服务器接收到的就是这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); }
上面的代码中,我们只获取了XML文档中的toUserName和fromUserName,这里我们只要关心这两个就可以了,暂且先不管用户发过来的是什么类型的内容和具体什么内容,反正客户有发信息过来我们就回复给他。这里的toUserName就是只我们自己的微信,而fromUserName是用户的微信,反正我们不管他是什么,谁发来的我们就回复信息给谁距对了。回复消息方法里需要注意的是,toUserName填的就是我们上面获取到的fromUserName,最后,我们利用System.Web.HttpContext.Current.Response.Write(resxml);输出,Handle(postStr);我们在上面page_load的if (!string.IsNullOrEmpty(postStr))里面调用Handel这个方法就好了。OK,这样子下来就可以实现我们的简单自动回复功能了。
附上我的微信公众号,希望大家关注一下,大家可以给我留言哦!