.NET开发微信公众号之公众号消息怎么处理
发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,这篇文章主要介绍.NET开发微信公众号之公众号消息怎么处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一.前言微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文
千家信息网最后更新 2025年11月11日.NET开发微信公众号之公众号消息怎么处理
这篇文章主要介绍.NET开发微信公众号之公众号消息怎么处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
一.前言
微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们要认真阅读,官方给我们的文档:http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html。首先我们从最基本的文本消息处理开始。
12345678
我们可以看到这是消息处理的一个最基本的模式,有发送者,接受者,创建时间,类型,内容等等。
首先我们来创建一个消息处理的类,这个类用来捕获,所有的消息请求,根据不同的消息请求类型来处理不同的消息回复。
public class WeiXinService { /// /// TOKEN /// private const string TOKEN = "finder"; /// /// 签名 /// private const string SIGNATURE = "signature"; /// /// 时间戳 /// private const string TIMESTAMP = "timestamp"; /// /// 随机数 /// private const string NONCE = "nonce"; /// /// 随机字符串 /// private const string ECHOSTR = "echostr"; /// /// /// private HttpRequest Request { get; set; } /// /// 构造函数 /// /// public WeiXinService(HttpRequest request) { this.Request = request; } /// /// 处理请求,产生响应 /// /// public string Response() { string method = Request.HttpMethod.ToUpper(); //验证签名 if (method == "GET") { if (CheckSignature()) { return Request.QueryString[ECHOSTR]; } else { return "error"; } } //处理消息 if (method == "POST") { return ResponseMsg(); } else { return "无法处理"; } } /// /// 处理请求 /// /// private string ResponseMsg() { string requestXml = CommonWeiXin.ReadRequest(this.Request); IHandler handler = HandlerFactory.CreateHandler(requestXml); if (handler != null) { return handler.HandleRequest(); } return string.Empty; } /// /// 检查签名 /// /// /// private bool CheckSignature() { string signature = Request.QueryString[SIGNATURE]; string timestamp = Request.QueryString[TIMESTAMP]; string nonce = Request.QueryString[NONCE]; List list = new List(); list.Add(TOKEN); list.Add(timestamp); list.Add(nonce); //排序 list.Sort(); //拼串 string input = string.Empty; foreach (var item in list) { input += item; } //加密 string new_signature = SecurityUtility.SHA1Encrypt(input); //验证 if (new_signature == signature) { return true; } else { return false; } } } 在来看看我们的首先是如何捕获消息的。首页Default.ashx的代码如下
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; string postString = string.Empty; if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST") { //由微信服务接收请求,具体处理请求 WeiXinService wxService = new WeiXinService(context.Request); string responseMsg = wxService.Response(); context.Response.Clear(); context.Response.Charset = "UTF-8"; context.Response.Write(responseMsg); context.Response.End(); } else { string token = "wei2414201"; if (string.IsNullOrEmpty(token)) { return; } string echoString = HttpContext.Current.Request.QueryString["echoStr"]; string signature = HttpContext.Current.Request.QueryString["signature"]; string timestamp = HttpContext.Current.Request.QueryString["timestamp"]; string nonce = HttpContext.Current.Request.QueryString["nonce"]; if (!string.IsNullOrEmpty(echoString)) { HttpContext.Current.Response.Write(echoString); HttpContext.Current.Response.End(); } } }从上面的代码中我们可以看到WeiXinService.cs类中的消息相应至关重要。
////// 处理请求 /// ///private string ResponseMsg() { string requestXml = CommonWeiXin.ReadRequest(this.Request); IHandler handler = HandlerFactory.CreateHandler(requestXml); if (handler != null) { return handler.HandleRequest(); } return string.Empty; }
IHandler是一个消息处理接口,其下面有EventHandler,TextHandler处理类实现这个接口。代码如下
////// 处理接口 /// public interface IHandler { ////// 处理请求 /// ///string HandleRequest(); }
EventHandler
class EventHandler : IHandler { /// /// 请求的xml /// private string RequestXml { get; set; } /// /// 构造函数 /// /// public EventHandler(string requestXml) { this.RequestXml = requestXml; } /// /// 处理请求 /// /// public string HandleRequest() { string response = string.Empty; EventMessage em = EventMessage.LoadFromXml(RequestXml); if (em.Event.Equals("subscribe", StringComparison.OrdinalIgnoreCase))//用来判断是不是首次关注 { PicTextMessage tm = new PicTextMessage();//我自己创建的一个图文消息处理类 tm.ToUserName = em.FromUserName; tm.FromUserName = em.ToUserName; tm.CreateTime = CommonWeiXin.GetNowTime(); response = tm.GenerateContent(); } return response; } }TextHandler
////// 文本信息处理类 /// public class TextHandler : IHandler { string openid { get; set; } string access_token { get; set; } ////// 请求的XML /// private string RequestXml { get; set; } ////// 构造函数 /// /// 请求的xml public TextHandler(string requestXml) { this.RequestXml = requestXml; } ////// 处理请求 /// ///public string HandleRequest() { string response = string.Empty; TextMessage tm = TextMessage.LoadFromXml(RequestXml); string content = tm.Content.Trim(); if (string.IsNullOrEmpty(content)) { response = "您什么都没输入,没法帮您啊。"; } else { string username = System.Configuration.ConfigurationManager.AppSettings["weixinid"].ToString(); AccessToken token = AccessToken.Get(username); access_token = token.access_token; openid = tm.FromUserName; response = HandleOther(content); } tm.Content = response; //进行发送者、接收者转换 string temp = tm.ToUserName; tm.ToUserName = tm.FromUserName; tm.FromUserName = temp; response = tm.GenerateContent(); return response; } /// /// 处理其他消息 /// /// ///private string HandleOther(string requestContent) { string response = string.Empty; if (requestContent.Contains("你好") || requestContent.Contains("您好")) { response = "您也好~"; }else if (requestContent.Contains("openid") || requestContent.Contains("id") || requestContent.Contains("ID"))//用来匹配用户输入的关键字 { response = "你的Openid: "+openid; } else if (requestContent.Contains("token") || requestContent.Contains("access_token")) { response = "你的access_token: " + access_token; }else { response = "试试其他关键字吧。"; } return response; } }
HandlerFactory
////// 处理器工厂类 /// public class HandlerFactory { ////// 创建处理器 /// /// 请求的xml ///IHandler对象 public static IHandler CreateHandler(string requestXml) { IHandler handler = null; if (!string.IsNullOrEmpty(requestXml)) { //解析数据 XmlDocument doc = new System.Xml.XmlDocument(); doc.LoadXml(requestXml); XmlNode node = doc.SelectSingleNode("/xml/MsgType"); if (node != null) { XmlCDataSection section = node.FirstChild as XmlCDataSection; if (section != null) { string msgType = section.Value; switch (msgType) { case "text": handler = new TextHandler(requestXml); break; case "event": handler = new EventHandler(requestXml); break; } } } } return handler; } }
在这里基本的一些类已经完成了,现在我们来完成,关注我们的微信公众号,我们就发送一条图文消息,同时输入我们的一些关键字,返回一些消息,比如输入id返回用户的openid等等。
二.PicTextMessage
public class PicTextMessage : Message { /// /// 模板静态字段 /// private static string m_Template; /// /// 默认构造函数 /// public PicTextMessage() { this.MsgType = "news"; } /// /// 从xml数据加载文本消息 /// /// public static PicTextMessage LoadFromXml(string xml) { PicTextMessage tm = null; if (!string.IsNullOrEmpty(xml)) { XElement element = XElement.Parse(xml); if (element != null) { tm = new PicTextMessage(); tm.FromUserName = element.Element(CommonWeiXin.FROM_USERNAME).Value; tm.ToUserName = element.Element(CommonWeiXin.TO_USERNAME).Value; tm.CreateTime = element.Element(CommonWeiXin.CREATE_TIME).Value; } } return tm; } /// /// 模板 /// public override string Template { get { if (string.IsNullOrEmpty(m_Template)) { LoadTemplate(); } return m_Template; } } /// /// 生成内容 /// /// public override string GenerateContent() { this.CreateTime = CommonWeiXin.GetNowTime(); string str= string.Format(this.Template, this.ToUserName, this.FromUserName, this.CreateTime); return str; } /// /// 加载模板 /// private static void LoadTemplate() { m_Template= @" {2} 1 -
"; } }最后我们的效果如下所示;
以上是".NET开发微信公众号之公众号消息怎么处理"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
消息
处理
公众
内容
函数
文本
输入
代码
关键
关键字
图文
接口
数据
模板
发微
不同
发送者
处理器
时间
用户
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
全球应用软件开发市场分析
浮生妖绘卷服务器
数据库n读取
黑客帝国软件开发
为什么进入魔兽世界看不到服务器
网络安全保护基本法是
海淀区常规软件开发设计规范
黄岛区建站宝网络技术服务中心
合肥高新区网络安全
移动技术和网络技术
网络安全技术学专业
网络安全周相关要求
openvpn 服务器端
世界网络安全会议
数据库无法启动了但是无法读取
深圳凯翔软件开发公司
计算机信息系统与数据库网课
网络安全检测服务平台
软件开发专业教材
网络技术资源论坛
数据库安全运维措施
数据库产品哪个好
2019网络安全攻防大赛
kv数据库结构
我的世界怎么注册服务器密码
海口直销软件开发
sql数据库中修改字段长度
爱微知著网络技术公司6
呼叫系统管理服务器图片
硬盘数据库连接