排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256
50010702506256
欢迎加群交流技术
分类:
移动开发
微信只会向我们一个地方推送消息,如果全部逻辑都写到一起,代码会非常多。
所以我们可以考虑通过消息类型,来实现不同的消息类型调用不同的处理方法,分散处理,降低代码的耦合性。
先定义一个用于处理请求的基类
public class BaseProcess
{
protected string ToUserName = "";
protected string FromUserName = "";
protected string MsgType = "";
/// <summary>
/// 解析公共参数的方法
/// </summary>
/// <param name="root"></param>
public void DealCommonParameter(XElement root)
{
ToUserName = root.Element("ToUserName").Value;
FromUserName = root.Element("FromUserName").Value;
MsgType = root.Element("MsgType").Value;
}
/// <summary>
/// 处理微信消息的虚函数
/// </summary>
/// <param name="root"></param>
/// <param name="Response"></param>
public virtual void Process(XElement root, HttpResponseBase Response)
{
}
}然后不同的处理方法都去实现这个基类
例如:处理事件请求的处理方法 (消息类型为event)
public class EventProcess : BaseProcess
{
public override void Process(XElement root, HttpResponseBase Response)
{
string Event = root.Element("Event").Value;
if (Event == "CLICK")
{
string EventKey = root.Element("EventKey").Value;
if (EventKey == "wx_menu_net")
{
Response.Write(WXTools.SendNewsMsg(ToUserName, FromUserName));
Response.End();
}
else if (EventKey == "wx_menu_python")
{
Response.Write(WXTools.SendTextMsg(ToUserName, FromUserName, "你点击了python"));
Response.End();
}
else
{
Response.Write(WXTools.SendTextMsg(ToUserName, FromUserName, "你点击了事件"));
Response.End();
}
}
}
}又如:处理用户发送的文本消息方法(消息类型为text) :
/// <summary>
/// 处理文本消息
/// </summary>
public class TextProcess : BaseProcess
{
public override void Process(XElement root, HttpResponseBase Response)
{
string content = root.Element("Content").Value;
//关键字回复
if (content.Contains("姐姐"))
{
Response.Write(WXTools.SendImgMsg(ToUserName, FromUserName, "q6yc_ZO"));
Response.End();
}
if (content.Contains("视频") || content.Contains("教程") || content.Contains("微信"))
{
Response.Write(WXTools.SendVedioMsg(ToUserName, FromUserName, "q6yc_ZOszJbRSKad74", "视频教程", "这是一个微信开发视频教程"));
Response.End();
}
if (content.Contains("图文"))
{
Response.Write(WXTools.SendNewsMsg(ToUserName, FromUserName));
Response.End();
}
else
{
//记录一下日志
LogTools.WriteLog(content, "接收到文本消息");
Response.Write(WXTools.SendTextMsg(ToUserName, FromUserName, content));
Response.End();
}
}
}在如处理图片消息的类:
public class ImageProcess : BaseProcess
{
public override void Process(XElement root, HttpResponseBase Response)
{
string MediaId = root.Element("MediaId").Value;
//记录一下日志
//LogTools.WriteLog(PicUrl, "接收到图片消息");
Response.Write(WXTools.SendImgMsg(ToUserName, FromUserName, MediaId));
Response.End();
}
}结构如图:
然后在入口点用反射处理下就行了 :
/// <summary>
/// 微信推送统一入口
/// </summary>
public void Index()
{
//获取微信推送的内容
StreamReader reader = new StreamReader(Request.InputStream);
string xml = reader.ReadToEnd();
if (string.IsNullOrEmpty(xml))
{
return;
}
//解析xml,获取xml里边的具体值
XElement root = XElement.Parse(xml);
//首字母转大写
string MsgType = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(root.Element("MsgType").Value);
//根据不同的消息类型,通过反射去找到不同类的处理方法
//反射创建对象
object obj = Activator.CreateInstance(Type.GetType("MvcApplication2.Process." + MsgType + "Process"));
//父类提供公共参数
obj.GetType().GetMethod("DealCommonParamter").Invoke(obj, new object[] { root });
//调用具体的处理方法
obj.GetType().GetMethod("Process").Invoke(obj, new object[] { root, Response });
}当然公共参数的处理也可以直接封装到一个对象,然后反射调用方法的时候多传一个即可。
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
评价