微信公众平台设计——消息处理

1.1 接受消息

微信公众平台开发者文档://mp.weixin.qq.com/wiki/index.php?title=接收普通消息,我们使用微信就是要对用户发送的信息进行处理,这边以接受普通消息为例,语音、图片消息等,举一反三可得。

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。文本类型的推送XML数据包结构如下:

< ![CDATA[toUser]] > < / ToUserName >

< ![CDATA[fromUser]] > < / FromUserName >

1348831860 < / CreateTime >

< ![CDATA[text]] > < / MsgType >

< ![CDATA[this is a test]] > < / Content >

1234567890123456 < / MsgId >

< / xml >

我们在ashx添加下面代码:

public void ProcessRequest(HttpContext param_context)

{

string postString = string.Empty;

if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")

{

using (Stream stream = HttpContext.Current.Request.InputStream)

{

Byte[] postBytes = new Byte[stream.Length];

stream.Read(postBytes, 0, (Int32)stream.Length);

postString = Encoding.UTF8.GetString(postBytes);

Handle(postString);

}

}

}

///

/// 处理信息并应答

///

private void Handle(string postStr)

{

messageHelp help = new messageHelp();

string responseContent = help.ReturnMessage(postStr);

HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;

HttpContext.Current.Response.Write(responseContent);

}

messageHelp是消息处理帮助类,获取的postString是xml,格式如上,我们这边只需要转换成XmlDocument进行解析就行了:

//接受文本消息

public string TextHandle(XmlDocument xmldoc)

{

string responseContent = "";

XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");

XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");

XmlNode Content = xmldoc.SelectSingleNode("/xml/Content");

if (Content != null)

{

responseContent = string.Format(ReplyType.Message_Text,

FromUserName.InnerText,

ToUserName.InnerText,

DateTime.Now.Ticks,

"欢迎使用微信公共账号,您输入的内容为:

" + Content.InnerText + "\r\n点击进入");

}

return responseContent;

}

/// <summary>

/// 普通文本消息

/// </summary>

public static string Message_Text

{

get {

return @"<xml>

<ToUserName>

<FromUserName>

<CreateTime>{2}

<MsgType>

<Content></Content>

";

}

}

上面的代码就是接受消息,并做一些处理操作,返回消息。

1.2 发送消息(图文、菜单事件响应)

这边发送消息我分为三种:普通消息、图文消息和菜单事件响应。普通消息其实上面说接受消息的时候讲到了。我们先看下图文消息和菜单事件响应,微信公众平台开发者文档://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html

xml格式为:

< ![CDATA[toUser]] > < / ToUserName >

< ![CDATA[fromUser]] > < / FromUserName >

12345678 < / CreateTime >

< ![CDATA[news]] > < / MsgType >

<ArticleCount>2 < / ArticleCount >

<Articles>

<item>

<Title> < ![CDATA[title1]] > < / Title >

<Description> < ![CDATA[description1]] > < / Description >

<PicUrl> < ![CDATA[picurl]] > < / PicUrl >

<Url> < ![CDATA[url]] >< / Url >

< / item >

<item>

<Title> < ![CDATA[title]] > < / Title >

<Description> < ![CDATA[description]] > < / Description >

<PicUrl> < ![CDATA[picurl]] > < / PicUrl >

<Url> < ![CDATA[url]] > < / Url >

< / item >

< / Articles >

< / xml >

//事件

public string EventHandle(XmlDocument xmldoc)

{

string responseContent = "";

XmlNode Event = xmldoc.SelectSingleNode("/xml/Event");

XmlNode EventKey = xmldoc.SelectSingleNode("/xml/EventKey");

XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");

XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");

if (Event != null)

{

//菜单单击事件

if (Event.InnerText.Equals("CLICK"))

{

if (EventKey.InnerText.Equals("click_one"))//click_one

{

responseContent = string.Format(ReplyType.Message_Text,

FromUserName.InnerText,

ToUserName.InnerText,

DateTime.Now.Ticks,

"你点击的是click_one");

}

else if (EventKey.InnerText.Equals("click_two"))//click_two

{

responseContent = string.Format(ReplyType.Message_News_Main,

FromUserName.InnerText,

ToUserName.InnerText,

DateTime.Now.Ticks,

"1",

string.Format(ReplyType.Message_News_Item, "FarSight Watch开源智能手表", "",

"//image.baidu.com/i?tn=....jpg",

"//dev.hqyj.com/products/case40.htm"));

}

}

}

return responseContent;

}

/// <summary>

/// 图文消息主体

/// </summary>

public static string Message_News_Main

{

get

{

return @"

<ToUserName><![CDATA[{0}]]></ToUserName>

<FromUserName><![CDATA[{1}]]></FromUserName>

<CreateTime>{2}</CreateTime>

<MsgType><![CDATA[news]]></MsgType>

<ArticleCount>{3}</ArticleCount>

<Articles>

{4}

</Articles>

</xml> ";

}

}

需要注意的是:XmlNode Event = xmldoc.SelectSingleNode("/xml/Event")表示获取的是事件类型,XmlNode EventKey = xmldoc.SelectSingleNode("/xml/EventKey")表示事件标示,就是我们创建菜单添加click的key,通过key我们就可以判断出是点的哪个菜单。

还有一点是回复超链接,有时候在服务号会发送一些链接,我们打开直接就会链接到相关网址,只需要在回复内容中添加:<a href="// dev.hqyj.com">点击进入</a>,就可以了。