04.接收用户消息

2024-09-01 05:48
文章标签 用户 消息 04 接收

本文主要是介绍04.接收用户消息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

04.–>接收用户消息
首先根据消息类型构建实体类:
根据微信接口地址
将相同的字段建在一个公共类里面。
在根据不同的消息添加实体类和字段。如下图:
所有实体
MSGContent:

枚举类:
消息类型

///
/// 消息类型
///
public enum MsgType
{
///
///文本类型
///
TEXT,
///
/// 图片类型
///
IMAGE,
///
/// 语音类型
///
VOICE,
///
/// 视频类型
///
VIDEO,
///
/// 小视频类型
///
SHORTVIDEO,
///
/// 地理位置类型
///
LOCATION,
///
/// 链接类型
///
LINK,
///
/// 事件类型
///
EVENT
}

///
/// 事件
///
public enum EvenType
{
///
/// 关注事件
///
SUBSCRIBE,
///
/// 取消关注事件
///
UNSUBSCRIBE,
}

public class MSGContent{/// <summary>/// 开发者微信号/// </summary>public string ToUserName { get; set; }/// <summary>/// 发送方帐号(一个OpenID)/// </summary>public string FromUserName { get; set; }/// <summary>/// 消息创建时间 (整型)/// </summary>public int CreateTime { get; set; }/// <summary>/// 消息id,64位整型/// </summary>public long MsgId { get; set; }/// <summary>/// 类型/// </summary>public MsgType MsgType { get; set; }/// <summary>/// 事件/// </summary>public EvenType Event { get; set; }}

实体类搭建好之后进行下一步操作:
根据上一讲验证微信开发者身份的基础上编写:

public ActionResult GetSignature(){string value = "";//HttpContext context = new HttpContext("");//身份验证请求方式:GETif (HttpContext.Request.HttpMethod == "GET"){WeChatHelp.GetSigntrue(Token);}else{//获取接收到的消息//var data = WeChatHelp.GetRequestData();//var xml = XElement.Parse(data);//var type = xml.Element("MsgType").Value;//if (type == "text")//{//    TextModel model = new TextModel();//    model.Content = xml.Element("Content").Value;//    model.ToUserName = xml.Element("ToUserName").Value;//    model.FromUserName = xml.Element("FromUserName").Value;//    model.CreateTime = Convert.ToInt32(xml.Element("CreateTime").Value);//    model.MsgId = Convert.ToInt64(xml.Element("MsgId").Value);//    model.MsgType = MsgType.TEXT.ToString();//}//考虑到消息的类型有很多种,进行封装var msg = MSGFactory.LoadMsg();}return Json(value);}
/// <summary>/// 获取普通消息/// </summary>/// <returns></returns>public static string GetRequestData(){string result = "";var reader = new StreamReader(HttpContext.Current.Request.InputStream);result = reader.ReadToEnd();return result;}

新建基类:MSGFactory

public class MSGFactory{public static MSGContent LoadMsg(){var data = WeChatHelp.GetRequestData();//获取接收的消息var xml = XElement.Parse(data);//进行XML序列化var MSGType = (MsgType)Enum.Parse(typeof(MsgType), xml.Element("MsgType").Value.ToUpper());//获取消息类型switch (MSGType){case MsgType.TEXT://文本return WeChatHelp.ConvertObject<TextModel>(data);//根据类型返回实体数据所封装的方法case MsgType.IMAGE://图片return WeChatHelp.ConvertObject<ImageModel>(data);case MsgType.VOICE://语音return WeChatHelp.ConvertObject<VoiceModel>(data);case MsgType.VIDEO://视频return WeChatHelp.ConvertObject<VideoModel>(data);case MsgType.LOCATION://地理位置return WeChatHelp.ConvertObject<LocationModel>(data);case MsgType.LINK://链接return WeChatHelp.ConvertObject<LinkModel>(data);case MsgType.SHORTVIDEO://小饰品return WeChatHelp.ConvertObject<VideoModel>(data);case MsgType.EVENT://事件{var Event = (EvenType)Enum.Parse(typeof(EvenType), xml.Element("Event").Value.ToUpper());switch (Event){case EvenType.SUBSCRIBE:return WeChatHelp.ConvertObject<EventModel>(data);case EvenType.UNSUBSCRIBE:return WeChatHelp.ConvertObject<EventModel>(data);default:break;}};return null;default:return WeChatHelp.ConvertObject<MSGContent>(data);}}}
        /// <summary>/// 公用获取发送普通消息/// </summary>/// <typeparam name="T">对象</typeparam>/// <param name="xmldata">XML数据</param>/// <returns></returns>public static T ConvertObject<T>(string xmldata){try{var xml = XElement.Parse(xmldata);var type = typeof(T);var t = Activator.CreateInstance<T>();var tousername = type.GetProperty("ToUserName");tousername.SetValue(t, Convert.ChangeType(xml.Element("ToUserName").Value, tousername.PropertyType), null);xml.Element("ToUserName").Remove();var FromUserName = type.GetProperty("FromUserName");FromUserName.SetValue(t, Convert.ChangeType(xml.Element("FromUserName").Value, FromUserName.PropertyType), null);xml.Element("FromUserName").Remove();var CreateTime = type.GetProperty("CreateTime");CreateTime.SetValue(t, Convert.ChangeType(xml.Element("CreateTime").Value, CreateTime.PropertyType), null);xml.Element("CreateTime").Remove();var MsgId = type.GetProperty("MsgId");MsgId.SetValue(t, Convert.ChangeType(xml.Element("MsgId").Value, MsgId.PropertyType), null);xml.Element("MsgId").Remove();var Msg = type.GetProperty("MsgType");var msg = xml.Element("MsgType").Value.ToUpper();Msg.SetValue(t, (MsgType)Enum.Parse(typeof(MsgType), msg), null);xml.Element("MsgType").Remove();//判断是否为事件类型if (msg == "EVENT"){var Event = type.GetProperty("Event");var even = xml.Element("Event").Value.ToUpper();Msg.SetValue(t, (EvenType)Enum.Parse(typeof(EvenType), even), null);xml.Element("Event").Remove();}foreach (var item in xml.Elements()){var content = type.GetProperty(item.Name.ToString());content.SetValue(t, Convert.ChangeType(item.Value, content.PropertyType), null);}return t;}catch (Exception ex){throw;}return default(T);}

这篇关于04.接收用户消息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126112

相关文章

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容