[c#]asp.net开发微信公众平台(3)微信消息封装及反射赋值

时间:2021-08-26 21:54:03

上一篇已经搭建好整体框架,实现了入口的验证,   验证通过后就交给LookMsgType方法处理,LookMsgType方法主要是对微信发来的不同的消息进行分解,不同的类型交给业务逻辑层不同的方法处理,   对不同类型的消息判断,可以用if,也可以用switch   一般来说超过5个的if用switch会更好, 这里贴出LookMsgType方法:

         public void LookMsgType(string msgType)
{ #region 判断消息类型
switch (msgType)
{
case "text":
RText mText = new RText();
mText = ReadXml.GetModel<RText>(mText, xmlModel);
BLLWei.DoText(dbHome, mText);//文本消息
break;
case "image":
RImg mImg = new RImg();
mImg = ReadXml.GetModel<RImg>(mImg, xmlModel);
BLLWei.DoImg(dbHome,mImg);//图片
break;
case "voice": //声音
RVoice mVoice = new RVoice();
mVoice = ReadXml.GetModel<RVoice>(mVoice, xmlModel);
BLLWei.DoVoice(dbHome,mVoice);
break; case "video"://视频
RVideo mVideo = new RVideo();
mVideo = ReadXml.GetModel<RVideo>(mVideo, xmlModel);
BLLWei.DoVideo(dbHome, mVideo);
break; case "location"://地理位置
RLocation mLocation = new RLocation();
mLocation = ReadXml.GetModel<RLocation>(mLocation, xmlModel);
BLLWei.DoLocation(dbHome,mLocation);
break;
case "link"://链接
RLink mLink = new RLink();
mLink = ReadXml.GetModel<RLink>(mLink, xmlModel);
BLLWei.DoLink(dbHome,mLink);
break;
#region 事件
case "event": switch (ReadXml.ReadModel("Event", xmlModel))
{
case "subscribe": if (ReadXml.ReadModel("EventKey", xmlModel).IndexOf("qrscene_") >= )
{
RCodeNotSub mNotSub = new RCodeNotSub();
mNotSub = ReadXml.GetModel<RCodeNotSub>(mNotSub, xmlModel);
BLLWei.DoCodeNotSub(dbHome,mNotSub);//未关注的新用户,扫描带参数的二维码关注
}
else
{
RSub mSub = new RSub();
mSub = ReadXml.GetModel<RSub>(mSub, xmlModel);
BLLWei.DoSub(dbHome,mSub);//普通关注
}
break;
case "unsubscribe":
RUnsub mUnSub = new RUnsub ();
mUnSub = ReadXml.GetModel<RUnsub>(mUnSub, xmlModel);
BLLWei.DoUnSub(dbHome,mUnSub);//取消关注
break; case "SCAN":
RCodeSub mCodeSub = new RCodeSub();
mCodeSub = ReadXml.GetModel<RCodeSub>(mCodeSub, xmlModel);
BLLWei.DoCodeSub(dbHome,mCodeSub);//已经关注的用户扫描带参数的二维码
break;
case "LOCATION"://用户上报地理位置 RSubLocation mSubLoc = new RSubLocation();
mSubLoc = ReadXml.GetModel<RSubLocation>(mSubLoc, xmlModel); BLLWei.DoSubLocation(dbHome, mSubLoc);
break;
case "CLICK"://自定义菜单点击 RMenuClick mMenuClk = new RMenuClick();
mMenuClk = ReadXml.GetModel<RMenuClick>(mMenuClk, xmlModel);
BLLWei.DoMenuClick(dbHome, mMenuClk);
break;
case "VIEW"://自定义菜单跳转事件 RMenuView mMenuVw = new RMenuView();
mMenuVw = ReadXml.GetModel<RMenuView>(mMenuVw, xmlModel);
BLLWei.DoMenuView(dbHome, mMenuVw);
break;
};
break;
#endregion
}
#endregion
}

外层switch判断msgtype,   在event类型时,再次switch判断具体的事件类型(关注、取消关注、自定义菜单事件等),  至此所有的微信发来的消息都有处理了,在上面代码中用到消息模型以及ReadXml.GetModel方法给模型赋值, 赋值之后传递给业务逻辑层对应的方法处理,  下面写出消息封装和给模型赋值的方法。

1、消息封装:

对所有微信发来的消息进行封装, 在datamodel中建一个Receive文件夹和一个send文件夹,在其中分别建立对应消息的类,完成之后,完整的datamodel类库如下图:

[c#]asp.net开发微信公众平台(3)微信消息封装及反射赋值

举例

-----接收消息:

文本消息RText.cs

     public class RText
{
public string ToUserName { get; set; }// 开发者微信号
public string FromUserName { get; set; }// 用户号(OpenID)
public long CreateTime { get; set; }// 创建时间
public string MsgType { get; set; } //消息类型
public string Content { get; set; }//内容
public long MsgId { get; set; }//消息ID }

自定义菜单点击RMenuClick.cs

     public class RMenuClick
{
public string ToUserName { get; set; }// 开发者微信号
public string FromUserName { get; set; }// 用户号(OpenID)
public long CreateTime { get; set; }// 创建时间
public string MsgType { get; set; } //消息类型 public string Event { get; set; }//事件类型
public string EventKey { get; set; }//事件key }

其他也都类似,不一一列举。

-----发送消息

发送文本消息SText.cs

     public class SText
{ public string ToUserName { get; set; }// 用户号(OpenID)
public string FromUserName { get; set; }// 开发者微信号 public long CreateTime { get; set; }// 创建时间 public string MsgType { get { return "text"; } } //消息类型 public string Content { get; set; }//内容 }

SText

发送图文消息SNews.cs

 namespace DataModel.Send
{
public class SNews
{
public string ToUserName { get; set; }// 用户号(OpenID)
public string FromUserName { get; set; }// 开发者微信号 public long CreateTime { get; set; }// 创建时间 public string MsgType { get { return "news"; } } //消息类型 public int ArticleCount { get; set; }//图文个数 public List<ArticlesModel> Articles { get; set; }//图文列表
}
public class ArticlesModel //默认第一条大图显示
{
public string Title { get; set; }//标题
public string Description { get; set; }//描述
public string PicUrl { get; set; }//图片链接
public string Url { get; set; }//点击之后跳转的链接 }
}

发送图文消息

在发送图文消息中,因为回复给微信的图文消息中,具体的图文内容是多条(最多可以10条),所以单独会有ArticlesModel。    后面文章会写出图文消息的发送。

2、通过反射给model赋值

在上篇文章写的入口处,已经有了解析xml的方法,现在封装了消息,通常的做法,是每次用到对应的model就手动写代码赋值,  而我这里LookMsgType方法中所有给消息赋值时全用的ReadXml.GetModel这同一个方法,  这里用的就是反射,方法如下:

         /// <summary>
/// 通过反射给接收消息model赋值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <returns></returns>
public static T GetModel<T>(T model, Dictionary<string, string> xmlModel) where T : class
{
var m = model.GetType();
foreach (PropertyInfo p in m.GetProperties())
{
string name = p.Name;
if (xmlModel.Keys.Contains(name))
{
string value=xmlModel.Where(x => x.Key == name).FirstOrDefault().Value;
p.SetValue(model,
string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, p.PropertyType), null);
}
}
return model;
}

T model 就是要使用的消息类,   xmlmodel是在入口处传递进来的解析的微信发来的xml信息,  这样,就不需要每次手动写代码赋值了。

好了,此篇实现了lookmsgtype方法, 实现了消息封装和反射赋值, 接下去就是到了业务逻辑层中的处理和具体实现了...

[c#]asp.net开发微信公众平台(3)微信消息封装及反射赋值的更多相关文章

  1. 微信公众平台推出&quot&semi;微信保护&quot&semi;提升微信账号安全 附微信保护开启教程

    前两天小美女的微信公众平台要群发消息时提示需要绑定手机才能操作,当时还以为是动态ip的问题,今天微信公众平台安全中心就说升级了,原来那时已经在公测了.微信公众平台推出"微信保护", ...

  2. 微信公众平台—— 获取微信服务器IP地址

    微信公众平台—— 获取微信服务器IP地址 const ServerIpUrl = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?&acces ...

  3. &lbrack;c&num;&rsqb;asp&period;net开发微信公众平台&lpar;8&rpar;微信9大高级接口,自定义菜单

    前7篇把最基础的消息接收和回复全做完了,  也把高级接口的入口和分拆处理写好了空方法,  此篇接着介绍微信的9大高级接口, 并着重讲解其中的自定义菜单. 微信9大接口为: 1.语音识别接口 2.客服接 ...

  4. &lbrack;c&num;&rsqb;asp&period;net开发微信公众平台&lpar;5&rpar;微信图文消息

    上篇已经成功响应了关注事件,也实现了文本消息的发送,这篇开始图文消息处理, 微信中最常用的消息类型就是图文消息了,因为它图文并茂,最能表达信息. 图文消息在微信中的接口定义如下: <xml&gt ...

  5. 使用Java语言开发微信公众平台&lpar;四&rpar;——图文消息的发送与响应

    在上一篇文章中,我们实现了被关注回复与关键词回复功能.在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息.但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起 ...

  6. 使用Java语言开发微信公众平台&lpar;七&rpar;——音乐消息的回复

    在上一节课程中,我们学习了图片消息的回复功能.根据微信公众平台的消息类型显示,微信共支持文本.图片.语音.视频.音乐.图文等6种消息类型的回复: 其中,我们已经实现了文本.图文.图片等消息的回复处理, ...

  7. 利用微信公众平台实现自动回复消息—java版

    最近公司需要拿微信公众平台做个东西,所以就开始了最基本学习,网上很多是php版的,对于我这个只会java,不会php的就只能在网上找点只言片语来一点一点学习了.不费话了直接贴图看效果(很简单的). 不 ...

  8. 微信公众平台:微信JS-SDK Demo

    ylbtech-微信公众平台:微信JS-SDK Demo 1. HTML返回顶部 1.demo.html <!DOCTYPE html> <html> <head> ...

  9. 微信公众平台测试号 &OpenCurlyDoubleQuote;微信登录失败,redirect&lowbar;uri域名与后台配置不一致,错误代码10003”

    设置"网页授权获取用户基本信息" 点击"修改" 弹出"OAuth2.0网页授权",注意域名不加"https://"或&q ...

随机推荐

  1. cef 介绍

    介绍 cef 是一个基于google chromiun的简单的框架. 它主要是作为一个内嵌浏览器嵌入到客户端应用程序中. 可以再 http://cefbuilds.com 下载最新的编译版本. 总体框 ...

  2. NumberPicker设置宽度,设置文字颜色

    修改宽度 wheel = (NumberPicker) findViewById(R.id.info_wheel_province); wheel.setLayoutParams(new Linear ...

  3. spring随手笔记1:constructor-arg

    <bean id="Hello" class="com.ltf.captha.serviceImpl.HelloWorldServiceImpl"> ...

  4. 【Android 复习】:从Activity中返回数据

    在实际的应用中,我们不仅仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递类似,也可以采用上一讲中的四种方式来传递数据,但是一般建议采用Intent对象的方式的来返 ...

  5. BZOJ 1226&colon; &lbrack;SDOI2009&rsqb;学校食堂Dining &lbrack;DP 状压&rsqb;

    题意: $n$个人排队打饭,第$i$个人口味$a_i$,能容忍最多身后第$b_i$个人先打饭. 先后两人$i,j$做饭时间为$a_i & a_j - a_i | a_j$ 求最少时间 一开始想 ...

  6. TypeError&colon; Error &num;1034&colon; 强制转换类型失败&colon;无法将 flash&period;events&colon;&colon;MouseEvent&commat;73b7cc1 转换为 mx&period;events&period;ItemClickEvent。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClick ...

  7. elasticsearch x-pack

    elasticsearch-plugin.bat install x-pack D:\elasticsearch-5.5.3\bin>elasticsearch-plugin.bat insta ...

  8. gulp基本设置

    var gulp = require('gulp'); var clean = require('gulp-clean'); var concat = require('gulp-concat'); ...

  9. tomcat常用的配置

    这里我们使用tomcat版本:apache-tomcat-7.0.77-windows-x64.zip 为例:下载链接地址为:https://archive.apache.org/dist/tomca ...

  10. 复杂链表的复制&lpar;python&rpar;

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...