zoukankan      html  css  js  c++  java
  • asp.net微信开发第二篇----消息应答

    当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

    请注意:

    1、关于重试的消息排重,推荐使用msgid排重。
    2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
    3、为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“消息加解密说明”。
    

    各消息类型的推送XML数据包结构如下:

     

    文本消息

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName> 
     <CreateTime>1348831860</CreateTime>
     <MsgType><![CDATA[text]]></MsgType>
     <Content><![CDATA[this is a test]]></Content>
     <MsgId>1234567890123456</MsgId>
     </xml>
    
    参数描述
    ToUserName 开发者微信号
    FromUserName 发送方帐号(一个OpenID)
    CreateTime 消息创建时间 (整型)
    MsgType text
    Content 文本消息内容
    MsgId 消息id,64位整型

    图片消息

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName>
     <CreateTime>1348831860</CreateTime>
     <MsgType><![CDATA[image]]></MsgType>
     <PicUrl><![CDATA[this is a url]]></PicUrl>
     <MediaId><![CDATA[media_id]]></MediaId>
     <MsgId>1234567890123456</MsgId>
     </xml>
    
    参数描述
    ToUserName 开发者微信号
    FromUserName 发送方帐号(一个OpenID)
    CreateTime 消息创建时间 (整型)
    MsgType image
    PicUrl 图片链接
    MediaId 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
    MsgId 消息id,64位整型

    语音消息

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <MediaId><![CDATA[media_id]]></MediaId>
    <Format><![CDATA[Format]]></Format>
    <MsgId>1234567890123456</MsgId>
    </xml>
    
    参数描述
    ToUserName 开发者微信号
    FromUserName 发送方帐号(一个OpenID)
    CreateTime 消息创建时间 (整型)
    MsgType 语音为voice
    MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
    Format 语音格式,如amr,speex等
    MsgID 消息id,64位整型

    请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段 (注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启 语音识别后的语音XML数据包如下:

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <MediaId><![CDATA[media_id]]></MediaId>
    <Format><![CDATA[Format]]></Format>
    <Recognition><![CDATA[腾讯微信团队]]></Recognition>
    <MsgId>1234567890123456</MsgId>
    </xml>
    

    多出的字段中,Format为语音格式,一般为amr,Recognition为语音识别结果,使用UTF8编码。

    视频消息

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType><![CDATA[video]]></MsgType>
    <MediaId><![CDATA[media_id]]></MediaId>
    <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
    <MsgId>1234567890123456</MsgId>
    </xml>
    
    参数描述
    ToUserName 开发者微信号
    FromUserName 发送方帐号(一个OpenID)
    CreateTime 消息创建时间 (整型)
    MsgType 视频为video
    MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
    ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
    MsgId 消息id,64位整型

    小视频消息

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType><![CDATA[shortvideo]]></MsgType>
    <MediaId><![CDATA[media_id]]></MediaId>
    <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
    <MsgId>1234567890123456</MsgId>
    </xml>
    
    参数描述
    ToUserName 开发者微信号
    FromUserName 发送方帐号(一个OpenID)
    CreateTime 消息创建时间 (整型)
    MsgType 小视频为shortvideo
    MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
    ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
    MsgId 消息id,64位整型

    地理位置消息

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1351776360</CreateTime>
    <MsgType><![CDATA[location]]></MsgType>
    <Location_X>23.134521</Location_X>
    <Location_Y>113.358803</Location_Y>
    <Scale>20</Scale>
    <Label><![CDATA[位置信息]]></Label>
    <MsgId>1234567890123456</MsgId>
    </xml> 
    
    参数描述
    ToUserName 开发者微信号
    FromUserName 发送方帐号(一个OpenID)
    CreateTime 消息创建时间 (整型)
    MsgType location
    Location_X 地理位置维度
    Location_Y 地理位置经度
    Scale 地图缩放大小
    Label 地理位置信息
    MsgId 消息id,64位整型

    链接消息

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1351776360</CreateTime>
    <MsgType><![CDATA[link]]></MsgType>
    <Title><![CDATA[公众平台官网链接]]></Title>
    <Description><![CDATA[公众平台官网链接]]></Description>
    <Url><![CDATA[url]]></Url>
    <MsgId>1234567890123456</MsgId>
    </xml> 
    
    参数描述
    ToUserName 接收方微信号
    FromUserName 发送方微信号,若为普通用户,则是一个OpenID
    CreateTime 消息创建时间
    MsgType 消息类型,link
    Title 消息标题
    Description 消息描述
    Url 消息链接
    MsgId

    消息id,64位整型

    接上篇,看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;

                }

          if (requestXML.MsgType.Trim().ToLower() == "voice")
                {
                    ///赋值语音识别结果,赋值之前一定要记得在开发者模式下,把语音识别功能开启,否则获取不到
                    requestXML.Recognition = rootElement.SelectSingleNode("Recognition").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; }

        /// <summary>
            /// 语音消息特有字段
            /// </summary>
            public String Recognition { 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 "voice":
                            SendVoiceMsg(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>";
                }
            }

       /// <summary>
            /// 发送响应语音识别结果
            /// </summary>
            /// <param name="requestXML"></param>
            private void SendVoiceMsg(RequestXML requestXML)
            {
                string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "您刚才说的语音消息识别结果为:" + requestXML.Recognition.ToString());
                HttpContext.Current.Response.ContentType = "text/xml";
                HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                HttpContext.Current.Response.Write(responseContent);
                HttpContext.Current.Response.End();
            }

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

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

  • 相关阅读:
    hiho_1081_最短路径1
    hiho_1079_离散化
    hiho_1078_线段树区间修改
    hiho_1069_最近公共祖先3
    【.netcore学习】.netcore添加到 supervisor 守护进程自启动报错
    【.NetCore学习】ubuntu16.04 搭建.net core mvc api 运行环境
    【.NetCore学习】ASP.NET Core EF Core2.0 DB First现有数据库自动生成实体Context
    【vue基础学习】vue.js开发环境搭建
    【vue学习】vue中怎么引用laydate.js日期插件
    【年终总结】个人的2017年年终总结
  • 原文地址:https://www.cnblogs.com/shaojiang/p/4901527.html
Copyright © 2011-2022 走看看