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

相关文章

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结