[c#]asp.net开发微信公众平台(3)微信消息封装及反射赋值
上一篇已经搭建好整体框架,实现了入口的验证, 验证通过后就交给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类库如下图:

举例
-----接收消息:
文本消息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)微信消息封装及反射赋值的更多相关文章
- 微信公众平台推出"微信保护"提升微信账号安全 附微信保护开启教程
前两天小美女的微信公众平台要群发消息时提示需要绑定手机才能操作,当时还以为是动态ip的问题,今天微信公众平台安全中心就说升级了,原来那时已经在公测了.微信公众平台推出"微信保护", ...
- 微信公众平台—— 获取微信服务器IP地址
微信公众平台—— 获取微信服务器IP地址 const ServerIpUrl = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?&acces ...
- [c#]asp.net开发微信公众平台(8)微信9大高级接口,自定义菜单
前7篇把最基础的消息接收和回复全做完了, 也把高级接口的入口和分拆处理写好了空方法, 此篇接着介绍微信的9大高级接口, 并着重讲解其中的自定义菜单. 微信9大接口为: 1.语音识别接口 2.客服接 ...
- [c#]asp.net开发微信公众平台(5)微信图文消息
上篇已经成功响应了关注事件,也实现了文本消息的发送,这篇开始图文消息处理, 微信中最常用的消息类型就是图文消息了,因为它图文并茂,最能表达信息. 图文消息在微信中的接口定义如下: <xml> ...
- 使用Java语言开发微信公众平台(四)——图文消息的发送与响应
在上一篇文章中,我们实现了被关注回复与关键词回复功能.在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息.但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起 ...
- 使用Java语言开发微信公众平台(七)——音乐消息的回复
在上一节课程中,我们学习了图片消息的回复功能.根据微信公众平台的消息类型显示,微信共支持文本.图片.语音.视频.音乐.图文等6种消息类型的回复: 其中,我们已经实现了文本.图文.图片等消息的回复处理, ...
- 利用微信公众平台实现自动回复消息—java版
最近公司需要拿微信公众平台做个东西,所以就开始了最基本学习,网上很多是php版的,对于我这个只会java,不会php的就只能在网上找点只言片语来一点一点学习了.不费话了直接贴图看效果(很简单的). 不 ...
- 微信公众平台:微信JS-SDK Demo
ylbtech-微信公众平台:微信JS-SDK Demo 1. HTML返回顶部 1.demo.html <!DOCTYPE html> <html> <head> ...
- 微信公众平台测试号 “微信登录失败,redirect_uri域名与后台配置不一致,错误代码10003”
设置"网页授权获取用户基本信息" 点击"修改" 弹出"OAuth2.0网页授权",注意域名不加"https://"或&q ...
随机推荐
- CListBox控件基本功能
创建CListBox对象 CListBox m_ListBox;关联控件 ,同时注意行数从 0 开始计算 1.向控件中添加内容 int AddString(LPCTSTR lpszItem ); ...
- 常用CSS代码片断
单行文本截字 .nowrap { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; word-break: normal; ...
- MOOTOOLS简单操作应用知识
在项目中我们经常需要用到全选/反选.等操作按钮. 基于mootools框架与jquery框架不一致.导致缓慢. $('chkall').addEvent('click',function(){ if( ...
- nginx配置使其支持thinkphp的pathinfo模式
#user root;#user nobody;worker_processes 1; #error_log logs/error.log;#error_log logs/error.log noti ...
- php随机抽奖实例分析
<?php header('Content-type:text/html;charset=utf-8'); /** * 抽奖工具 */ class lottery_tool { protecte ...
- Day02
1.os.system()和os.popen() os.popen() 功能强于os.system() , os.popen() 可以返回回显的内容,以文件描述符返回 eg: import os re ...
- 光盘卡在MacBook里退不出来咋办?
如果光盘推不出来了怎么办?很多同学想到的是:上针!不过这招对MacBook Pro毫无用处,因为没有给你插针的地方,没有机械按键,只有键盘右上角一个推出的快捷键,不过在光盘卡在光驱里时,按此健基本无效 ...
- 在Ubuntu14.04下安装运行Unity-tweak-tool报错scheme missing的解决办法
问题: 安装完unity-tweak-tool后,打开运行弹出出错窗口,忘了截图了,提示内容: scheme missing! Error: schema com.canonical.indicato ...
- 转:15 Best Responsive Web Design Testing Tools
Responsive Web Design is regarded as being the approach which suggests that web design and developme ...
- Usage、Usage Minimum和Usage Maximum项目详解
(1)一个产生多个数据域(Report Count>1)的主项目之前有一个以上的[用途]时,每个[用途]与一个数据域依次对应,如果数据域个数(Report Count)超过[用途]的个数,则剩余 ...