上一篇文章我们完成了自己的web服务器与微信公众号服务器的对接,本篇开始处理微信用户和服务器之间的互动交流。一个用户与公众号之间,无外乎用户向公众号发送信息、点击公众号里的菜单和链接,或者公众号向用户推送不同类型的信息。
用户微信客户端与你的服务器之间的信息互动流程参见下图:
首先讲解客户向微信公众号发送文本消息的处理方式。
文本消息常见应用:聊天机器人;知识库;在线翻译;客户需求反馈或投诉等。
用户发送的微信,经微信服务器处理后,形成如下XML格式发到你的服务器:
1348831860 1234567890123456
上面的各个关键字解释如下:
在接收到微信服务器发来的内容之后,首先由指定的接口网页AccessWx.aspx对信息类型进行判别,然后交给指定的消息处理类处理和回应。在上一篇介绍的AccessWx.aspx中完善下面这一段,增加本篇给出的文本消息处理环节。
if(MsgType == "text")
{
//对用户发送的文本消息处理,使用QinMing.Weixin.MessageHandlerText命名空间下的TextMessageDeal类
TextMessageDeal tmd = new TextMessageDeal();
Response.Write(tmd.DealResult(weixinXML));
}
在命名空间QinMing.Weixin.MessageHandlerText下新建一个类TextMessageDeal,用来处理微信服务器发来的文本消息。记得类源码文件要放在App_Code目录下!
QinMingWeixinMessageHandlerText.cs文件内容如下:(为了确保你拷过去的代码立即就能使用,我把尚未讲到的类先注释了,不过你在关注公众号后对它输入相应文字时是能收到对应的回复的,比如对公众号输入“段子”,立刻就能得到惊喜)
using System;
using System.Web;
using System.Xml;
using System.Text;
using QinMing.Config;
using QinMing.Weixin.ReturnContent;
//using QinMing.WeixinSendTemplateMessage;
//using QinMing.Joke;
namespace QinMing.Weixin.MessageHandlerText
{
//文本消息处理
public class TextMessageDeal :System.Web.UI.Page
{
public string DealResult(string weixinXML)
{
string content = DealText(weixinXML);
return content;
}
public string DealText(string weixinXML)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(weixinXML);
XmlNodeList list = doc.GetElementsByTagName("xml");
XmlNode xn = list[0];
string FromUserName = xn.SelectSingleNode("//FromUserName").InnerText; //关注用户的加密后openid
string ToUserName = xn.SelectSingleNode("//ToUserName").InnerText; //公众微信号原始ID
string MsgType = xn.SelectSingleNode("//MsgType").InnerText;
string contentrec = xn.SelectSingleNode("//Content").InnerText.ToString().Trim();
string strresponse = "";
//引用QinMing.Weixin.ReturnContent命名空间下的ReturnMsg类来生成固定格式的回应消息
ReturnMsg rm = new ReturnMsg();
switch (contentrec)
{
case "合伙人":
strresponse = rm.ReturnText(FromUserName, ToUserName, "您好!欢迎加盟降价联盟合伙人!nn点击此处进入推广海报获取页面" );
break;
case "段子":
//GetJoke joke = new GetJoke();
//strresponse = rm.ReturnText(FromUserName, ToUserName, joke.GetOneJokeText() );
break;
case "测试":
strresponse = rm.ReturnText(FromUserName, ToUserName, "您刚发送了测试" );
break;
default:
string content = "";
content = "欢迎光临降价联盟。";
strresponse = rm.ReturnText(FromUserName, ToUserName, content);
break;
}
//告知客服人员有新的留言,或者启动客服消息管理工单流程
//QinMingWeixinSendTemplateMessage SendTempMsg = new QinMingWeixinSendTemplateMessage();
//SendTempMsg.SendTempMsgRemind("客服人员的openid", "客户留言:" + contentrec, "");
return strresponse;
}
}
}
演示结果如下图:
不停的输入段子,就会有很多惊喜,都是精品。
上面的源码中用到了命名空间QinMing.Weixin.ReturnContent中的ReturnMsg类,来向微信用户发送格式化之后的消息,截止目前一共有六种消息,分别是文本、图片、语音、视频、音乐、图文,该类的源码如下:
QinMingWeixinReturnContent.cs
using System;
namespace QinMing.Weixin.ReturnContent
{
public class ReturnMsg :System.Web.UI.Page
{
//向客户返回文本消息
public string ReturnText(string FromUserName,string ToUserName,string content)
{
string strresponse = "";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "" + DateTime.Now.Ticks.ToString() + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
return strresponse;
}
//向客户返回图片消息
public string ReturnImage(string FromUserName,string ToUserName,string ImageId)
{
string strresponse = "";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "" + DateTime.Now.Ticks.ToString() + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
return strresponse;
}
//向客户返回语音消息
public string ReturnVoice(string FromUserName,string ToUserName,string VoiceId)
{
string strresponse = "";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "" + DateTime.Now.Ticks.ToString() + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
return strresponse;
}
//向客户返回视频消息
public string ReturnVideo(string FromUserName, string ToUserName, string VideoId, string Title, string Description)
{
string strresponse = "";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "" + DateTime.Now.Ticks.ToString() + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "";
strresponse = strresponse + " ";
return strresponse;
}
//向客户返回音乐消息
public string ReturnMusic(string FromUserName, string ToUserName, string Title, string Description,string MusicUrl, string HQMusicUrl, string MusicId)
{
string strresponse = "";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "" + DateTime.Now.Ticks.ToString() + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
return strresponse;
}
//向客户返回图文消息,因微信限制,现在只能返回单图文形式
public string ReturnTuWenPre(string FromUserName, string ToUserName, string Title, string Description, string PicUrl, string Url)
{
string strresponse = "";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "" + DateTime.Now.Ticks.ToString() + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "1";
strresponse = strresponse + "";
strresponse = strresponse + "- ";
strresponse = strresponse + "
";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + " ";
strresponse = strresponse + "";
strresponse = strresponse + " ";
return strresponse;
}
}
}
举其中一个例子来解释格式化文本的内涵,如返回图片信息,从自己的服务器向微信服务器发送如下格式的XML串。
12345678
字段解释如下:
更多解释可以参考:回复文本消息 | 微信开放文档 (qq.com)
看到这里,感觉微信公众号开发是不是也就那么回事,没有那么高大上。
上面举的例子是微信用户向公众号发送文本,返回的也是文本的案例,当然你也可以返回6中不同形式的信息。比如用户发送音乐,你就向ta推送一首歌曲;用户发送视频,你就向ta推送一段视频;用户发送想买XX,你就向ta推送一个购物链接。这都可以和自己服务器上的海量数据存储结合起来,在用搜索引擎或人工智能,就是一个很全面的机器人应用啦,是不是很酷?
如果感觉有收获,请来个赞。下篇介绍图片消息处理,敬请关注。



