.NET开发微信公众号之公众号消息怎么处理
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要介绍.NET开发微信公众号之公众号消息怎么处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一.前言微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文
千家信息网最后更新 2025年01月31日.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安全错误
数据库的锁怎样保障安全
妈咪日记软件开发
服务器与手机客户端
数据库安全管理常用方法
梦幻西游无双服务器
绿幕抠图软件开发
搭建别人系统用自己的服务器
青海互联网网络技术服务热线
同为服务器查不到录像
山东项目软件开发收费报价表
360服务器防护在哪里
广东华为服务器虚拟化多少钱
盐城系统软件开发项目
橙社网络技术有限公司
服务器控制管理器
管理服务器系统软件
网络安全电信诈骗主题班会教案
服务器返回浏览器状态代码
数据库创建登录名和密码代码
nginxnjs数据库认证
网络安全中的逆向工程是什么
网络安全法与经济法的关系
南阳智捷网络技术服务有限公司
中国移动网络服务器密码
计算机网络安全的目标是哪些
音频云服务器
ui设计需要会软件开发吗
网络安全案件许
东莞市鹏远网络技术服务
服务器安全防护的常见手段
网络安全信息化版面