微信开发第二篇----消息应答

接上篇,看ResponseXML(postString);方法如下

/// <summary>
        /// 获取用户发送的消息
        /// </summary>
        /// <param name="postString"></param>
        private void ResponseXML(string postString)
        {
            //使用XMLDocument加载信息结构                     
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(postString);

XmlElement rootElement = xmlDoc.DocumentElement;//获取文档的根

XmlNode MsgType = rootElement.SelectSingleNode("MsgType"); //获取消息的文本类型

RequestXML requestXML = new RequestXML();//声明实例,获取各个属性并赋值
            requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;//公众号
            requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;//用户
            requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;//创建时间
            requestXML.MsgType = MsgType.InnerText;//消息类型

   
            ///对消息的不同类型进行赋值
            if (requestXML.MsgType == "text")
            {
                //赋值文本信息内容
                requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;

}
            if (requestXML.MsgType.Trim() == "location")
            {
                ///赋值地理位置纬度,经度,地图缩放比例,地理位置说明
                requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
                requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
                requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
                requestXML.Label = rootElement.SelectSingleNode("Label").InnerText;
            }
            if (requestXML.MsgType.Trim().ToLower() == "event")
            {
                ///赋值事件名称和事件key值
                requestXML.EventName = rootElement.SelectSingleNode("Event").InnerText;
                requestXML.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;

}
            ResponseMsg(requestXML);

}

requestXML是我单独创建的一个类,该类声明了消息中常用的属性字段,如下:

/// <summary>
    /// 接收消息的实体类
    /// </summary>
    public class RequestXML
    {
        private String toUserName = String.Empty;

/// <summary>
        /// 本公众号
        /// </summary>
        public String ToUserName{get;set;}

/// <summary>
        /// 用户微信号
        /// </summary>
        public String FromUserName{get;set;}

/// <summary>
        /// 创建时间
        /// </summary>
        public String CreateTime{get;set;}

/// <summary>
        /// 信息类型
        /// </summary>
        public String MsgType{get;set;}

/// <summary>
        /// 信息内容
        /// </summary>
        public String Content{get;set;}

/*以下为事件类型的消息特有的属性*/
        /// <summary>
        /// 事件名称
        /// </summary>
        public String EventName{get;set;}
        /// <summary>
        /// 事件值
        /// </summary>
        public string EventKey { get; set; }

/*以下为图文类型的消息特有的属性*/
        /// <summary>
        /// 图文消息的个数
        /// </summary>
        public int ArticleCount { get; set; }
        /// <summary>
        /// 图文消息的标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 图文消息的简介
        /// </summary>
        public string Description { get; set; }
        /// <summary>
        /// 图文消息图片的链接地址
        /// </summary>
        public string PicUrl { get; set; }
        /// <summary>
        /// 图文消息详情链接地址
        /// </summary>
        public string Url { get; set; }
        /// <summary>
        /// 图文消息集合
        /// </summary>
        public List<RequestXML> Articles { get; set;}

/*以下为地理位置类型的消息特有的属性*/
        /// <summary>
        /// 地理位置纬度
        /// </summary>
        public String Location_X { get; set; }

/// <summary>
        /// 地理位置经度
        /// </summary>
        public String Location_Y { get; set; }

/// <summary>
        /// 地图缩放比例
        /// </summary>
        public String Scale { get; set; }

/// <summary>
        /// 地图位置说明
        /// </summary>
        public String Label { get; set; }
     
    }

继续关注  ResponseMsg(requestXML);方法如下,

private void ResponseMsg(RequestXML requestXML)
        {
            string MsgType = requestXML.MsgType;

try
            {
                //根据消息类型判断发送何种类型消息
                switch (MsgType)
                {
                    case "text":
                        SendTextCase(requestXML);//发送文本消息
                        break;
                    case "event"://发送事件消息
                        if (!string.IsNullOrWhiteSpace(requestXML.EventName) && requestXML.EventName.ToString().Trim().Equals("subscribe"))
                        {
                            SendWelComeMsg(requestXML);//关注时返回的图文消息
                        }
                        else if (!string.IsNullOrWhiteSpace(requestXML.EventName) && requestXML.EventName.ToString().Trim().Equals("CLICK"))
                        {
                            SendEventMsg(requestXML);//发送事件消息
                        }
                        break;
                    case "location"://发送位置消息
                        SendMapMsg(requestXML);
                        break;
                    default:
                        break;

}
            }
            catch (Exception ex)
            {
                HttpContext.Current.Response.Write(ex.ToString());
            }
        }

先来关注发送文本消息,SendTextCase(requestXML);//发送文本消息

/// <summary>
        /// 发送文本
        /// </summary>
        /// <param name="requestXML"></param>
        private void SendTextCase(RequestXML requestXML)
        {
                    string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, requestXML.Content);

HttpContext.Current.Response.ContentType = "text/xml";
                    HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                    HttpContext.Current.Response.Write(responseContent);
                    HttpContext.Current.Response.End();
        }

FormatTextXML方法制定格式

/// <summary>
        /// 返回格式化的Xml格式内容
        /// </summary>
        /// <param name="p1">公众号</param>
        /// <param name="p2">用户号</param>
        /// <param name="p3">回复内容</param>
        /// <returns></returns>
        private string FormatTextXML(string p1, string p2, string p3)
        {
            return "<xml><ToUserName><![CDATA[" + p1 + "]]></ToUserName><FromUserName><![CDATA[" + p2 + "]]></FromUserName><CreateTime>" + DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString() + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + p3 + "]]></Content><FuncFlag>1</FuncFlag></xml>";
        }

这样就能实现消息的应答,如果用户点击的按钮,如下代码:

case "event"://发送事件消息
                        if
(!string.IsNullOrWhiteSpace(requestXML.EventName) &&
requestXML.EventName.ToString().Trim().Equals("subscribe"))
                        {
                            SendWelComeMsg(requestXML);//关注时返回的图文消息
                        }
                       
else if (!string.IsNullOrWhiteSpace(requestXML.EventName) &&
requestXML.EventName.ToString().Trim().Equals("CLICK"))
                        {
                            SendEventMsg(requestXML);//发送事件消息
                        }
                        break;

/// <summary>
        /// 发送响应事件消息
        /// </summary>
        /// <param name="requestXML"></param>
        private void SendEventMsg(RequestXML requestXML)
        {
            string keyStr = requestXML.EventKey.ToString();

switch (keyStr)
            {
                case "mypay":
                    SendPayDetails(requestXML);//发送薪资账单
                    break;
                case "tianqiyubao":
                    SendWeaterMessage(requestXML);//发送天气预报
                    break;
                case "kaixinyixiao":
                    SendKaiXinMessage(requestXML);//发送开心一笑结果集
                    break;
                case  "updateMessage":
                    SendUpdateMessage(requestXML);//发送修改信息链接
                    break;
                case "yuangonghuodong":
                    SendYuanGongHuoDong(requestXML);//发送学生活动
                    break;
                case "yuangongtongzhi":
                    SendYuanGongTongZhi(requestXML);//发送员工通知
                    break;
                case "youwenbida":
                    SendWenti(requestXML);//发送员工提交问题链接
                    break;
               case "mywen":
                    SendWentiList(requestXML);//发送问题列表链接
                    break;
               case "PhoneSerices":
                    SendKeFuMessage(requestXML);//接入客服
                    break;
                default:
                    String responseContent = String.Empty;
                    responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName,"此功能暂未开放!敬请期待!");
                    HttpContext.Current.Response.ContentType = "text/xml";
                    HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                    HttpContext.Current.Response.Write(responseContent);
                    HttpContext.Current.Response.End();
                    break;
            }
        }

SendWelComeMsg(requestXML);//关注时返回的图文消息

/// <summary>
        /// 发送关注时的图文消息
        /// </summary>
        /// <param name="requestXML"></param>
        private void SendWelComeMsg(RequestXML requestXML)
        {
            String responseContent = String.Empty;

string newdate = DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString();

string PUrlfileName = "http://www.deqiaohr.com.cn/weixin/welcome.jpg";

responseContent = string.Format(Message_News_Main, requestXML.FromUserName, requestXML.ToUserName, newdate, "1",
                string.Format(Message_News_Item, "欢迎关注德桥员工服务中心", "苏州德桥人力资源创立于2002年...", PUrlfileName, "http://www.deqiaohr.com.cn/weixin/WxGsjianjie.aspx"));

HttpContext.Current.Response.ContentType = "text/xml";
            HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
            HttpContext.Current.Response.Write(responseContent);
            HttpContext.Current.Response.End();
        }

Message_News_Main 和Message_News_Item是图文消息格式化

/// <summary>
        /// 返回图文消息主体
        /// </summary>
        public static string Message_News_Main
        {
            get
            {
                return @"<xml>
                            <ToUserName><![CDATA[{0}]]></ToUserName>
                            <FromUserName><![CDATA[{1}]]></FromUserName>
                            <CreateTime>{2}</CreateTime>
                             <MsgType><![CDATA[news]]></MsgType>
                             <ArticleCount>{3}</ArticleCount>
                             <Articles>
                             {4}
                           </Articles>
                           </xml> ";
            }
        }
        /// <summary>
        /// 返回图文消息项
        /// </summary>
        public static string Message_News_Item
        {
            get
            {
                return @"<item>
                            <Title><![CDATA[{0}]]></Title>
                            <Description><![CDATA[{1}]]></Description>
                            <PicUrl><![CDATA[{2}]]></PicUrl>
                            <Url><![CDATA[{3}]]></Url>
                            </item>";
            }
        }

点击查看全文,直接跳转至自己写的网页,关于网页图片自适应的问题,把图片的宽度设置为100%,即可,如果让网页在屏幕中自适应,记得在网页中一定要添加

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;"/>

时间: 2024-10-13 11:57:35

微信开发第二篇----消息应答的相关文章

微信开发第二篇:工具篇

自从写了第一篇后,最近一直在整理另一个项目的需求,没有继续研究下去,今天晚上终于开始了我的第二篇. 本次微信的项目是想基于H5做的,所以现在的想法还是先从前端入手. 要做一个移动端H5的网站有很多种方式: 1.使用Html5.css3.js自己从头开始做. 但如果这样,对于目前主要从事项目管理及后端开发工作的我,无疑是困难重重:另外自己也已经对前端的东西很久没碰过了.如果选择这种方式,肯定会本末倒置.最后说不定整个项目都没得戏(虽说这个项目完全是自己的个人爱好!!) 2.使用现在已有的移动端H5

记微信开发(接口篇)

记微信开发(接口篇) 刚从哥们儿那弄到了个带认证的微信号,恰巧能部署到我的ECS上,来玩玩微信开发(php编程-.) ECS环境:centos7+XAMPP+drupal(已部署了一个drupal网站) 1. wx_sample.php文件 就在微信公众号开发者文档处,接入指南里面有PHP示例下载 下载完成后,看见 把第7行的weixin改成任意你喜欢的字符,记下来(譬如我这里改成jiekou,这就是你接下来要在服务器配置里面填的Token(令牌)项,这个暂且不提) 2. 上传到php服务器 这

C#开发微信.NET平台MVC微信开发 发送普通消息Demo以及收不到消息的问题

不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼.于是今天兴致来潮,想做一个试试. 首先找到了开发者文档,看了看,蛮简单的.(公众号早已申请,有兴趣可以关注看看:zyjsoft) 第一步(提供接口,供微信调用,由于是HTTP请求,于是我用MVC模式做了一个简单的接口): //认证接口 public ActionResult WeiXin(string signature, string timestamp, string nonce, st

夺命雷公狗---微信开发23----客服消息接口基础和推送文本

我们这边课程里面一共用到了三个文件,分别是WeChat.class.php和common.php以及index.php 我们在写这个功能之前也要学会查手册,手册我们可以在微信开发这里找到,如下所示: 点击进去后我们将会看到客服接口,我们可以点击下进去看看里面有什么动动 这里有一个发送文本消息的,我们点击进去看下 这里很明显就看到文本消息是通过一个json数据来进行实现的,废话不多说,开工 这里我们先来写一个WeChat.php的文件,这里作用主要适用于封装一个CURL上传类的,代码如下所示: <

第 6 章 微信开发之各种消息的接收与响应

一.在哪里接收这些消息 从微信公众平台接口消息指南中可以了解到,当用户向公众帐号发消息时,微信服务器会将消息通过POST方式提交给我们在接口配置信息中填写的URL,而我们就需要在URL所指向的请求处理类CoreServlet的doPost方法中接收消息.处理消息和响应消息. /** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws Servle

夺命雷公狗---微信开发27----客服消息接口基础和推送图文消息

按照25课的套路在改下index.php即可实现,代码如下所示: <?php /** * wechat php test */ //define your token require_once "common.php"; //这里是引入curl发送函数的类 require_once 'WeChat.class.php'; define("TOKEN", "twgdh"); //这里让这个类继承了curl发送参数的类 class wechat

微信开发第一篇:问题篇

最近几天一直在研究微信相关的开发.虽然没有进入正式Demo的阶段,但经过最近几天不断努力,总算有几点收获,记录下来,以此开始.本篇都以Q&A的方式记录 1.第1阶段,如何将内网的端口进行映射? 花生壳是个不错的选择,但比较麻烦的是,目前没有已经不提供免费的映射了.需要免费的只能每天上午10左右抢. 今天晚上偶然发现,官方有1元活动. 直接付钱,免费的映射终于可以用了,关键可以使用1个80端口的二级域名.地址去百度搜吧.官方就能看到,不然要有做广告的嫌疑了. 按照微信开发者的要求,“必须以http

微信开发第二讲 开发与微信交互的servlet

?? 在上一节中我们学习了如何在微信服务号中配置URL和token,现在介绍一下如何开发与微信交互的Servlet. package com.demo.weixin.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.htt

微信开发第一篇:问题篇(转)

最近几天一直在研究微信相关的开发.虽然没有进入正式Demo的阶段,但经过最近几天不断努力,总算有几点收获,记录下来,以此开始.本篇都以Q&A的方式记录 1.第1阶段,如何将内网的端口进行映射? 花生壳是个不错的选择,但比较麻烦的是,目前没有已经不提供免费的映射了.需要免费的只能每天上午10左右抢. 今天晚上偶然发现,官方有1元活动. 直接付钱,免费的映射终于可以用了,关键可以使用1个80端口的二级域名.地址去百度搜吧.官方就能看到,不然要有做广告的嫌疑了. 按照微信开发者的要求,“必须以http