C# 微信公众平台开发(3)-- 接受/发送消息
1.接收事件
关注/取消关注事件;
用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。
通过微信返回的XML,我们通过代码 就可以作相应的处理;
先获取返回的信息:
- if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
- {
- using (Stream stream = HttpContext.Current.Request.InputStream)
- {
- Byte[] postBytes = new Byte[stream.Length];
- stream.Read(postBytes, , (Int32)stream.Length);
- postString = Encoding.UTF8.GetString(postBytes);
- EventHandle(postString);
- }
- if (!string.IsNullOrEmpty(postString))
- {
- responseMsg(postString, context);//关注微信,返回消息
- }
- }
- postString 里面 就是XML;我们只需要对 XML作相应的处理就好
- System.Xml.XmlDocument postObj = new System.Xml.XmlDocument();
- postObj.LoadXml(postStr);
- var eventList = postObj.GetElementsByTagName("Event");
- var textpl = "";
- string FromUserName = string.Empty;
- for (int i = ; i < FromUserNameList.Count; i++)
- {
- if (FromUserNameList[i].ChildNodes[].NodeType == System.Xml.XmlNodeType.CDATA)
- {
- FromUserName = FromUserNameList[i].ChildNodes[].Value;
- }
- }
- var toUsernameList = postObj.GetElementsByTagName("ToUserName");
- string ToUserName = string.Empty;
- for (int i = ; i < toUsernameList.Count; i++)
- {
- if (toUsernameList[i].ChildNodes[].NodeType == System.Xml.XmlNodeType.CDATA)
- {
- ToUserName = toUsernameList[i].ChildNodes[].Value;
- }
- }
- if (toEvent == "subscribe")
- {
- string rebakcHtml = @"Hi,欢迎来到我爱足球社区";
//ReceivedText 返回文本消息的格式- textpl = type.ReceivedText(FromUserName, ToUserName, rebakcHtml);
- }
- /// <summary>
- /// 回复文本
- /// </summary>
- /// <param name="FromUserName"></param>
- /// <param name="ToUserName"></param>
- /// <param name="Content"></param>
- /// <returns></returns>
- public string ReceivedText(string FromUserName, string ToUserName, string Content)
- {
- string textpl = string.Empty;
- textpl = "<xml>" +
- "<ToUserName><![CDATA[" + FromUserName + "]]></ToUserName>" +
- "<FromUserName><![CDATA[" + ToUserName + "]]></FromUserName>" +
- "<CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime>" +
- "<MsgType><![CDATA[text]]></MsgType>" +
- "<Content><![CDATA[" + Content + "]]></Content>" +
- "<FuncFlag>0</FuncFlag>" +
- "</xml>";
- return textpl;
- }
文本消息
System.Web.HttpContext.Current.Response.Write(textpl); 我们将文本信息 返回给微信;
2.点击按钮
- #region 微信菜单点击事件
- /// <summary>
- /// 微信菜单点击事件
- /// </summary>
- /// <param name="postStr">接受消息</param>
- /// <returns></returns>
- private void EventHandle(string postStr)
- {
- string responseContent = "";
- try
- {
- System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
- xmldoc.LoadXml(postStr);
- XmlNode Event = xmldoc.SelectSingleNode("/xml/Event");
- XmlNode EventKey = xmldoc.SelectSingleNode("/xml/EventKey");
- XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");
- XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");
- if (Event != null)
- {
- if (EventKey.InnerText.Equals("V1001_ORDER"))//EventKey.InnerText.Equals("V1001_ORDER") 就是创建菜单时,click按钮的唯一Key
- {
- responseContent = string.Format(Message_Text,
- FromUserName.InnerText,
- ToUserName.InnerText,
- DateTime.Now.Ticks,
- "您好,小萌为您服务,请回复十四位订单号,查询订单详情。");//生成文本消息
- }
- responseContent = type.ReceivedText(FromUserName.InnerText, ToUserName.InnerText, rebakcHtml);
- }
- }
- LogTextHelper.WriteLogToFile(responseContent + "------------------" + postStr);
- HttpContext.Current.Response.Write(responseContent);//返回给微信
- }
- catch (Exception ex)
- {
- LogTextHelper.WriteLogToFile("微信菜单点击事件" + "||" + ex.ToString());
- }
- }
- /// <summary>
- /// 普通文本消息
- /// </summary>
- public static string Message_Text
- {
- get
- {
- return @"<xml>
- <ToUserName><![CDATA[{0}]]></ToUserName>
- <FromUserName><![CDATA[{1}]]></FromUserName>
- <CreateTime>{2}</CreateTime>
- <MsgType><![CDATA[text]]></MsgType>
- <Content><![CDATA[{3}]]></Content>
- </xml>";
- }
- }
- #endregion
3.接受消息:
接受消息 跟关注微信号有点类似:
消息内容
var keywordList = postObj.GetElementsByTagName("Content");
string Content = string.Empty;
for (int i = 0; i < keywordList.Count; i++)
{
if (keywordList[i].ChildNodes[0].NodeType == System.Xml.XmlNodeType.CDATA)
{
Content = keywordList[i].ChildNodes[0].Value;
}
}
- if (toMsgType == "text")//接口文本消息 toMsgType是消息类型
- {
//ToDo 根据业务 处理消息内容- }
- else if (toMsgType == "event")//关注
- {
- if (toEvent == "subscribe")
- {
- }
- }
C# 微信公众平台开发(3)-- 接受/发送消息的更多相关文章
- 微信公众平台开发(十) 消息回复总结——用其xml模板
一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个PO ...
- 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理
温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...
- PHP实现微信公众平台开发 全套视频资源下载
好久没有在博客园更新东西了,今天给大家分享一份比较不错的视频学习资源吧. 主要是关于PHP实现微信公众平台开发, 不知道大家对于微信平台的开发有多少了解,那么今天就从基础开始吧,资源目录如下(PS ...
- David Camp 微信公众平台开发官方内容拓展版---PHP版本
微信公众平台开发(一) 配置接口 微信公众平台开发(二) 微信公众平台示例代码分析 微信公众平台开发(三) 订阅事件(subscribe)处理 微信公众平台开发(四) 简单回复功能开发 微信公众平台开 ...
- 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容
第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
- 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单
我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...
- 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token
一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...
- 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装
微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...
随机推荐
- html 基本标签
HTML 基本标签 Web 服务器工作原理 HTML 注释 HTML 基本标签 http://192.168.32.36:8080/scan/demo.html scan 表示你的应用资源目录 HTM ...
- VC中利用多线程技术实现线程之间的通信
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...
- [置顶] Oracle GoldenGate 常见问题:长事务处理
长事务的影响 OGG是基于事务级的实时复制工具,也就是说OGG只复制已提交的事务,在遇到事务的commit或rollback之前,它会将每个事务的操作存储在称为cache的托管虚拟内存池中.内存再大也 ...
- 反恐训练营(LCS)
反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- I Hate It(线段树)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- AS3游戏中可视对象上限及位图相关的内存消耗实测
前些天连续做了一些测试,以加深对AS3的掌握和在项目中对 游戏 性能.效率优化方面的一些处理,有很多测试实际意义不大,都不过是证明一些猜想是正确的,除此没有什么. 但前天进行的一系列测试中,有一些对游 ...
- 达内TTS6.0课件oop_day01
- Linux下安装Oracle的过程和涉及的知识点-系列4
10.使用rpm安装包 假设本地有现成的相关包,能够直接使用rpm安装.rpm rpm包名,但有时会出现它须要其他包的支持,这时若须要忽略此提示.强行安装,运行rpm -i --force --nod ...
- 关于使用由CA机构(EJBCA)颁发的证书实现SLLSocket双向认证服务端报null cert chain的解决方案
在 SSLSocket实现服务端和客户端双向认证的例子 文章中最后提到使用keytool.exe的自签证书实现双向认证可以,但是使用ejbca生成证书实现SLL Socket的双向认证是服务端老是报错 ...
- WndProc Msg 消息列表
WM_NULL = 0x0000; WM_CREATE = 0x0001;应用程序创建一个窗口 WM_DESTROY = 0x0002;一个窗口被销毁 WM_MOVE = 0x0003;移动一个窗口 ...