范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

。Net6FurionSqlsugarSenparcSdk开发微信公众号九事件推送

  一、说明
  在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。 二、新建partial 类
  partial即为定义部分类的关键字。部分类主要用于当一个类中的内容较多时将相似类中的内容拆分到不同的类中,并且部分类的名称必须相同。
  CustomMessageHandler.cs加关键词 partial
  Handler下新建CustomMessageHandler_Events部分类用来接收事件推送
  修改类名为CustomMessageHandler并添加关键词 partial 使得CustomMessageHandler_Events为CustomMessageHandler的部分类,这样推送事件和普通消息事件就分开了,职责清晰,便于维护。namespace WeiXinApi.Application.Handler {     public partial class CustomMessageHandler     {      } }
  同样的我们新建MessageService_Events部分类
  namespace WeiXinApi.Application.Services {     public partial interface IMessageService     {      } }namespace WeiXinApi.Application.Services {     public partial class MessageService     {      } }
  IMessageService和IMessageService也要加partial 关键字
  三、关注/取消关注事件
  IMessageService_Events定义接口        ///          /// 订阅         ///          ///          ///          Task OnEvent_SubscribeRequestAsync(RequestMessageEvent_Subscribe requestMessage);          ///          /// 取消订阅         ///          ///          ///          Task OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage);
  MessageService_Events实现接口         public async Task OnEvent_SubscribeRequestAsync(RequestMessageEvent_Subscribe requestMessage)         {             var responseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage);              var receives = await DbContext.Db.Queryable().ToListAsync();             //如果关键字搜不到,列出关键字             var result = new StringBuilder();             result.AppendFormat("欢迎订阅,可以试试下面的关键字r r ");             for (int i = 0; i < receives.Count; i++)             {                 result.AppendFormat(#34;{i + 1}:{receives[i].KeyWords}r ");             }             responseMessage.Content = result.ToString();             return responseMessage;         }           ///          ///          ///          ///          public async Task OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage)         {             //实际上用户无法收到非订阅账号的消息,所以这里可以随便写。             var responseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage);             responseMessage.Content = #34;再见!";             Console.WriteLine(#34;{requestMessage.FromUserName}取消了订阅");             return responseMessage;         }
  CustomMessageHandler_Events里重写订阅和取消订阅事件        ///          /// 订阅或关注事件         ///          ///          ///          public override async Task OnEvent_SubscribeRequestAsync(RequestMessageEvent_Subscribe requestMessage)         {             var result = await _messageService.OnEvent_SubscribeRequestAsync(requestMessage);             return result;         }          ///          /// 退订         /// unsubscribe事件的意义在于及时删除网站应用中已经记录的OpenID绑定,消除冗余数据。并且关注用户流失的情况。         ///          ///          public override async Task OnEvent_UnsubscribeRequestAsync(RequestMessageEvent_Unsubscribe requestMessage)         {             var result = await _messageService.OnEvent_UnsubscribeRequest(requestMessage);             return result;         }
  发布到服务器,测试下效果,成功接收到事件
  四、扫描带参数二维码事件
  IMessageService_Events定义接口        ///          /// 扫描带参数二维码事件         ///          ///          ///          Task OnEvent_ScanRequestAsync(RequestMessageEvent_Scan requestMessage);
  MessageService_Events实现接口public async Task OnEvent_ScanRequestAsync(RequestMessageEvent_Scan requestMessage)         {             var responseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage);             var result = "扫描带二维码事件";             var sceneId = requestMessage.EventKey.ObjToInt();             var receive = await DbContext.Db.Queryable().Where(it => it.SceneId == sceneId).FirstAsync();//从数据库拿数据             Console.WriteLine(#34;是否有数据:{receive != null}");             if (receive != null)             {                 switch (receive.ReceiveInfo.ReceiveType)                 {                     case ReceiveType.文字:                         result += #34;{receive.ReceiveInfo.ReceiveString}";                         break;                 }             }             responseMessage.Content = result;             return responseMessage;         }
  CustomMessageHandler_Events重写扫描二维码事件        ///          /// 扫描带参数二维码事件         ///          ///          ///          public override async Task OnEvent_ScanRequestAsync(RequestMessageEvent_Scan requestMessage)         {             var result = await _messageService.OnEvent_ScanRequestAsync(requestMessage);             return result;         }
  先用api接口创建一个二维码,然后发布到服务器,记得sqlite文件为始终复制,可以正常显示
  先取消关注再扫码,发现只回复了"扫描带二维码事件"这几个字,发现原来在没有关注的情况下会将eventkey推送到订阅事件
  因为关注事件和扫码二维码事件都会去数据库查数据,所以将共用的方法提取出来,编写方法GetScanRequest        ///          /// 获取扫描事件结果         ///          ///          ///          private async Task GetScanRequest(string eventKey)         {             Console.WriteLine(#34;eventKey:{eventKey}");             var result = "扫描带二维码事件!";             var sceneId = eventKey.ObjToInt();             var receive = await DbContext.Db.Queryable().Where(it => it.SceneId == sceneId).FirstAsync();//从数据库拿数据             Console.WriteLine(#34;是否有数据:{receive != null}");             if (receive != null)             {                 switch (receive.ReceiveInfo.ReceiveType)                 {                     case ReceiveType.文字:                         result += #34;{receive.ReceiveInfo.ReceiveString}";                         break;                 }             }             return result;          }
  修改OnEvent_SubscribeRequestAsync方法        public async Task OnEvent_SubscribeRequestAsync(RequestMessageEvent_Subscribe requestMessage)         {             var responseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage);             if (!string.IsNullOrWhiteSpace(requestMessage.EventKey) && requestMessage.EventKey.StartsWith("qrscene_"))//扫二维码事件             {                 responseMessage.Content = await GetScanRequest(requestMessage.EventKey.Split("_")[1]);             }             else             {                 var receives = await DbContext.Db.Queryable().ToListAsync();                 //如果关键字搜不到,列出关键字                 var result = new StringBuilder();                 result.AppendFormat("欢迎订阅,可以试试下面的关键字r r ");                 for (int i = 0; i < receives.Count; i++)                 {                     result.AppendFormat(#34;{i + 1}:{receives[i].KeyWords}r ");                 }                 responseMessage.Content = result.ToString();             }             return responseMessage;         }
  OnEvent_ScanRequestAsync也改下     public async Task OnEvent_ScanRequestAsync(RequestMessageEvent_Scan requestMessage)         {             var responseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage);             responseMessage.Content = await GetScanRequest(requestMessage.EventKey);             return responseMessage;         }
  发布到服务器,取消关注再扫描,成功显示数据
  五、上报地理位置事件
  IMessageService_Events定义接口        ///          /// 位置事件         ///          ///          ///          Task OnEvent_LocationRequestAsync(RequestMessageEvent_Location requestMessage);
  MessageService_Events实现接口  public async Task OnEvent_LocationRequestAsync(RequestMessageEvent_Location requestMessage)         {             //这里是微信客户端(通过微信服务器)自动发送过来的位置信息             var responseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage);             var result = #34;Latitude:{requestMessage.Latitude},Longitude:{requestMessage.Longitude}";             Console.WriteLine(result);             responseMessage.Content = result;//这里写什么都无所谓             return responseMessage;         }
  CustomMessageHandler_Events重写位置事件        ///          /// 位置事件         ///          ///          ///          public override async Task OnEvent_LocationRequestAsync(RequestMessageEvent_Location requestMessage)         {             var result = await _messageService.OnEvent_LocationRequestAsync(requestMessage);             return result;         }
  开通位置权限
  测试一下,正常打印日志
  六、自定义菜单事件6.1、创建菜单
  参考自定义菜单章节6.2、点击事件
  IMessageService_Events定义接口        ///          /// 点击事件         ///          ///          ///          Task OnEvent_ClickRequestAsync(RequestMessageEvent_Click requestMessage);
  MessageService_Events实现接口public async Task OnEvent_ClickRequestAsync(RequestMessageEvent_Click requestMessage)         {             Console.WriteLine("进入点击事件");             IResponseMessageBase reponseMessage = null;             switch (requestMessage.EventKey)             {                 case "V1001_TODAY_MUSIC":                     {                         var filePath = "~/wwwroot/Images/music.jpeg";//记得调成始终复制                         var uploadResult = await MediaApi.UploadTemporaryMediaAsync(appId, UploadMediaFileType.thumb,                                                                         ServerUtility.ContentRootMapPath(filePath));                         //PS:缩略图官方没有特别提示文件大小限制,实际测试哪怕114K也会返回文件过大的错误,因此尽量控制在小一点                         //设置音乐信息                         var strongResponseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage);                         reponseMessage = strongResponseMessage;                         strongResponseMessage.Music.Title = "天籁之音";                         strongResponseMessage.Music.Description = "真的是天籁之音";                         strongResponseMessage.Music.MusicUrl = "https://sdk.weixin.senparc.com/Content/music1.mp3";                         strongResponseMessage.Music.HQMusicUrl = "https://sdk.weixin.senparc.com/Content/music1.mp3";                         strongResponseMessage.Music.ThumbMediaId = uploadResult.thumb_media_id;                     }                     break;                 default:                     {                         var strongResponseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage);                         strongResponseMessage.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey;                         reponseMessage = strongResponseMessage;                     }                     break;             }              return reponseMessage;         }
  CustomMessageHandler_Events重写点击事件         ///          /// 点击事件         ///          ///          ///          public override async Task OnEvent_ClickRequestAsync(RequestMessageEvent_Click requestMessage)         {             var result = await _messageService.OnEvent_ClickRequestAsync(requestMessage);             return result;         }
  发布到服务器,测试下,没毛病,这里缩略图不知道为啥没显示,不管了,后面再看看啥问题。
  七、点击菜单跳转链接时的事件推送
  IMessageService_Events定义接口        ///          /// 打开网页事件         ///          ///          ///          Task OnEvent_ViewRequestAsync(RequestMessageEvent_View requestMessage);
  MessageService_Events实现接口        public async Task OnEvent_ViewRequestAsync(RequestMessageEvent_View requestMessage)         {             Console.WriteLine("进入链接跳转事件");             //说明:这条消息只作为接收,下面的responseMessage到达不了客户端,类似OnEvent_UnsubscribeRequest             var responseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage);             responseMessage.Content = "您点击了view按钮,将打开网页:" + requestMessage.EventKey;             return responseMessage;         }
  CustomMessageHandler_Events重写打开网页事件        ///          /// 打开网页事件         ///          ///          ///          public override async Task OnEvent_ViewRequestAsync(RequestMessageEvent_View requestMessage)         {             var result = await _messageService.OnEvent_ViewRequestAsync(requestMessage);             return result;         }
  发布到服务器,测试下,没毛病。
  八、本章Gitee地址链接
  https://gitee.com/huguodong520/weixinapi/tree/%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81/

云南这个地方可赏可食的棠梨花开了春天正是吃花的好时节,立春过后,棠梨花陆续登上人们的餐桌,逐渐出现在大众视野中,与暖春如约而至。棠梨花开了棠梨花开了走进山里,一簇簇白色的棠梨花映入眼帘,引得大家都纷纷前来采摘,棠云南踏青正当时,赏花悦目别错过三月的云南,到处春光灿烂,山花盛开。正是踏青赏花的好时节,各位好朋友们不要错过哟!红河县二级路观景台三月里,在云南,不论你去哪里,都能看到满山遍野的山花。在三月八日这天,我开车带着全球农业文化遗产大观之乌兹别克斯坦农业文化遗产乌兹别克斯坦,是金庸笔下的名城撒马尔罕,是著名的丝绸之路古国,是中亚的灵魂所在,历史上与中国有着悠久的联系。走进乌兹别克斯坦,你会惊叹于宏大瑰丽的伊斯兰建筑,你可以和能歌善舞的乌兹人类是如何出现在地球的?第一个人是男人,还是女人?人是如何出现在地球上的?这个问题困扰了科学家很久,因为所谓的进化论,无法解释先有鸡还是先有蛋的问题,也无法解释人类的先祖如果是猴子,为什么一小部分猴子进化了成人了,但是和人类超过百玉米面馒头这样做才好吃,松软劲道,口感细腻不粗糙,太香了昨天三姨来我们家做客,本来是要做米饭炒菜吃的,后来看到米桶旁边有一袋金黄的玉米面,说啥都不愿吃米饭了,非要我给她用玉米面做点美食吃。按照三姨的年纪,小时候是经过了一段艰苦岁月的,那炒腊肉,不能直接切片炒,想要软嫩不咸不油腻,下锅前2步不能少炒腊肉,不能直接切片炒,想要软嫩不咸不油腻,下锅前2步不能少冬天做的腊肉,都是给过年准备的,对南方人来说,腊肉就等同于年味儿,是年夜饭必不可少的一种美食。腊肉的吃法不多,最常见的就马上迎来春分,老祖宗留下的5种习俗莫忘记,寓意好,身体更健康春分是我们迎来春天的第四个节气,这一天正好白天和黑夜平分,都是12个小时,你也可以说是这一天平分了春季,此后的日子里,阳光明媚,春暖花开,雨水较多,温度宜人。若是按照我们传统习俗来正月十五元宵节,家宴菜单准备好了,12道主打菜,照做省事又省力大家好,欢迎大家来到我的美食自媒体,我是美食领域创作者锦绣V山东专注美食,让生活更有味。今天为大家带来了几道家常美食的做法,这几道美食也是深受大家的喜欢,而且是很常见的几道美食。天特色美食助阵我县二月二民俗文化活动3月4日,在民乐现代丝路田园综合体举办的以百年芳华启新程乡村振兴开新局为主题的二月二民俗文化节,为广大群众献上了一场集旅游文化美食民俗体验于一体的饕餮盛宴。特色美食展销活动一大早便明日惊蛰,记得吃4样做2事,老习俗不能丢,寓意平安顺遂如意明天就是中国传统二十四节气中的惊蛰,它是一年中第三个节气,也是一个重要的节气,惊蛰节气来临,寓意着春天真正的到来。俗话说,春雷惊百虫,是指惊蛰时节,春雷初响,惊醒蛰伏于地下越冬的蛰地球出现九个金乌就是火星水源重现之时地球出现九个金乌就是火星水源重现之时。如果地球上真的有九个太阳出现,九阳烈日高空当照,那时地球上的水几乎都要被晒干了,晒过了足足七日,然后救世主现身,它堪比后裔神勇无比,它用九块施
东北不夜城网红演艺一个人干一群人的事梅河口东北不夜城,是文旅历史上具有划时代意义的项目,据有关权威机构统计显示,梅河口东北不夜城于2021年五一开街,5天时间就接待了超133万游客,如同一声惊雷,将东北的文旅市场唱响夜尿多,起夜频繁,试试这4个食疗方大家有没有这样的一个习惯,晚上睡觉前一定要去趟厕所再睡觉,要不然就没有安全感。晚上不敢喝汤汤水水的东西,害怕起夜。夜尿频繁确实会影响睡眠质量,有些肾病患者深有同感。那除了疾病的原因春天喝好一碗汤,免得医生开药方!详细做法都列好啦春天的天气最是反复无常,加上空气干燥,很多疾病都会在此时发生,居家调理可以对症煲点汤。李蔚海摄1。暖身汤提高身体抗寒力推荐山药汤牛肉汤解放军总医院第八医学中心中医科来要水介绍,初春去虾线不要用手扯了,只用1根吸管,一秒一个,又快又干净,实用每天一道生活小诀窍,健康营养的在身边。虾的味道鲜美,不同品种的虾价格也不同,一般我们经常吃的是小龙虾,油焖大虾等等,出去聚餐或者是在家里聚餐时,我们都会点上一盘虾来吃,如果是自己做甜面酱柱候酱黄豆酱豆瓣酱叉烧酱有啥区别?终于弄明白了甜面酱柱候酱黄豆酱豆瓣酱叉烧酱有啥区别?终于弄明白了酱是炒菜做饭必不可少的一种调料,有上色增味的作用,日常生活中我们会用到很多酱,比如甜面酱黄豆酱豆瓣酱柱候酱等等,能不能混用呢?估忆7080年代童年的那些事,那些纯粹的快乐再也回不来了人总是越长大就越怀念从前,那时候的风很轻柔,那时候的快乐也很纯粹。人过中年,有几分不舍和眷恋人过中年,有几分油腻和执拗人过中年,有几分伤感和无助。人过中年,沉默不语时不经意间会想起而立之年,拥抱未来不管是对是错,你终究来到了这个世界请,善待自己1不满周岁襁褓223岁孩提3女孩7岁髫年4男孩8岁龆年5幼年泛称总角610岁以下黄口,即乃稚气未脱的少儿代称也71315岁舞勺之年81玉如二号新发现,厘米级玻璃珠,月球无人,谁制造了玻璃珠?2月17日消息,中山大学肖智勇博士领衔的研究团队,在ScienceBulletin2022年第4期发表了题为TranslucentglassglobulesontheMoon的Sh直径5。2亿光年,囊括10万星系,恐怖的拉尼亚凯亚超星系团就和人类的单位部门一样,宇宙也是有等级大小的。比如地球就是一颗行星,它属于一个恒星系太阳系。浩瀚的宇宙太阳系对于我们来说非常巨大,因为人类目前都没有飞出去。然而在宇宙中,太阳系只是被冷落的金星,曾经可能也是一颗宜居星球,现在怎么变成这样了?距离地球最近的行星是哪一颗?就是金星,它与地球的最近距离只有约4050万公里。那么,与地球最为相像的行星又是哪一颗?还是金星。金星与地球的相似体现在两个方面,一是相貌,二是行为。在2022年鼠标选购指南,几乎涵盖所有类型鼠标这里是知科技app,如果觉得本文有用,欢迎点赞关注我。往期精彩回顾如何长时间保存重要数据?拒绝U盘,拒绝网盘鼠标的功能虽然很简单,但是性能上有很多参数有线还是无线?DPIIPS是什