C#微信公众号——消息处理
2024-10-19 08:58:04
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL。
一、接收POST请求,处理XML信息
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
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, , (Int32)stream.Length);
postString = Encoding.UTF8.GetString(postBytes);
Handle(postString);
}
}
}
/// <summary>
/// 处理信息并应答
/// </summary>
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);
}
二、处理消息
public class messageHelp
{
public string ReturnMessage(string postStr)
{
string responseContent = "";
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(new System.IO.MemoryStream(System.Text.Encoding.GetEncoding("UTF-8").GetBytes(postStr)));
XmlNode MsgType = xmldoc.SelectSingleNode("/xml/MsgType");
if (MsgType != null)
{
switch (MsgType.InnerText)
{
case "event":
responseContent = EventHandle(xmldoc);//事件处理
break;
case "text":
responseContent = TextHandle(xmldoc);//接受文本消息处理break;
}
}
return responseContent;
}
//事件
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"))
{
Helper.GetUserDetail(Helper.IsExistAccess_Token(), FromUserName.InnerText);//获取用户基本信息
if (EventKey.InnerText.Equals(""))
{
responseContent = string.Format(ReplyType.Message_Text,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
"欢迎查看工作动态");
}
}
else if (Event.InnerText.Equals("subscribe"))//关注公众号时推送消息
{
Helper.GetUserDetail(Helper.IsExistAccess_Token(), FromUserName.InnerText);//获取用户基本信息
responseContent = string.Format(ReplyType.Message_Text,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
"欢迎关注XX公司");
}
}
return responseContent;
}
//接受文本消息
public string TextHandle(XmlDocument xmldoc)
{
string responseContent = "";
XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");//接收方帐号(收到的OpenID)
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,
"欢迎使用微信公众号,如有任何疑问请联系我们客服人员!");
}
return responseContent;
}
//回复类型
public class ReplyType
{
/// <summary>
/// 普通文本消息
/// </summary>
public static string Message_Text
{
get
{
return @"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{3}]]></Content>
</xml>";
}
}
}
最新文章
- WCF学习之旅—第三个示例之五(三十一)
- linux基础1——网络配置入门
- 利用YaHoo YUI实现Javascript CSS 压缩 分类: C# 2014-07-13 19:07 371人阅读 评论(0) 收藏
- Linux各版本的本地root密码破解方法
- url重写后发布出错问题
- Day15 HTML补充、初识JavaScript
- MongoDB 权限管理 用户名和密码的操作
- Chrome 的 100 个小技巧 中文版
- Windows XP SP3中远程桌面实现多用户登陆
- Android打包版本号设置
- Linux指令--telnet
- C语言_指针变量的赋值与运算,很详细
- Java 使用PDFBox提取PDF文件中的图片
- go语言基础之range
- PHP图像处理(GD库)
- nodejs基础快速上手
- C#知识点汇总
- CF1029E
- Oracle数据库联机重定义讲解及错误处理
- Postman入门
热门文章
- 封装Jquery 合并table中任何同列数据
- tcpdump抓包工具的使用
- 01-Python的介绍_Python编程之路
- java基础学习系列二
- poj-1045(数学不好怪我咯)
- Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
- python基础学习笔记二之列表
- ava集合---HashSet的源码分析
- Python中的unittest和logging
- Sublime Text3下使用Python,REPL的安装与快捷键设置方法