欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

微信開發(fā)之如何實(shí)現(xiàn)接收文本消息

這篇文章將為大家詳細(xì)講解有關(guān)微信開發(fā)之如何實(shí)現(xiàn)接收文本消息,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為萬全企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、做網(wǎng)站,萬全網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

微信中的消息類型有:文本,圖片,語音,視頻,地理位置,鏈接和事件消息。除了事件消息外,其他的統(tǒng)稱為普通消息。微信中消息的推送與響應(yīng)都是以xml數(shù)據(jù)包傳輸?shù)?。在用戶發(fā)送消息給公眾號時(shí),微信服務(wù)器在五秒內(nèi)收不到響應(yīng)會斷掉連接,并且重新發(fā)起請求,總共重試三次。普通消息可以使用msgid排重,以避免重復(fù)的消息對業(yè)務(wù)邏輯的影響。

假如服務(wù)器無法保證在五秒內(nèi)處理并回復(fù),可以直接回復(fù)空串,微信服務(wù)器不會對此座任何處理,并且不會發(fā)起重試。需要注意的是:這里說的回復(fù)空串并不是回復(fù)空的文本消息,而是直接Response.Write(“”)即可。

下面簡要對各普通消息說明一下。

文本消息:
<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>
圖片消息:
<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>
語音消息:
<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>
視頻消息:
<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>
地理位置消息:
<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>
鏈接消息:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[link]]></MsgType><Title><![CDATA[公眾平臺官網(wǎng)鏈接]]></Title><Description><![CDATA[公眾平臺官網(wǎng)鏈接]]></Description><Url><![CDATA[url]]></Url><MsgId>1234567890123456</MsgId></xml>

細(xì)心的程序猿應(yīng)該發(fā)現(xiàn)了,所有的消息中(包括事件消息),都包含下面幾個(gè)字段

參數(shù)描述
ToUserName接收方微信號
FromUserName發(fā)送方微信號,若為普通用戶,則是一個(gè)OpenID
CreateTime消息創(chuàng)建時(shí)間
MsgType消息類型

而消息的類型在文章開頭已經(jīng)講了,分別是:文本(text),圖片(image),語音(voice),視頻(video),地理位置(location),鏈接(link),事件(event)

為了方便管理和代碼編寫,我們可以把這些消息類型寫一個(gè)枚舉。如下:

/// <summary>
    /// 消息類型枚舉    /// </summary>
    public enum MsgType
    {        /// <summary>
        ///文本類型        /// </summary>        TEXT,        /// <summary>
        /// 圖片類型        /// </summary>        IMAGE,        /// <summary>
        /// 語音類型        /// </summary>        VOICE,        /// <summary>
        /// 視頻類型        /// </summary>        VIDEO,        /// <summary>
        /// 地理位置類型        /// </summary>        LOCATION,        /// <summary>
        /// 鏈接類型        /// </summary>        LINK,        /// <summary>
        /// 事件類型        /// </summary>        EVENT
    }

這里說明下,C#中event是關(guān)鍵字,所以event在枚舉中就不能使用了,所以為了統(tǒng)一,我這里的枚舉全部使用大寫的。

既然所有的消息體都有上面的幾個(gè)字段,那就可以寫一個(gè)基類,然后不同的消息實(shí)體繼承這個(gè)基類。(一直在糾結(jié)一個(gè)問題,以前我都是將所有的消息體中的字段寫在一個(gè)類中,調(diào)用起來也很方便,只是類中的字段越來越多,看著都不爽。再加上本人才疏學(xué)淺,面向?qū)ο笠彩褂玫牟皇炀?,所以一直都是在一個(gè)類中羅列所有的字段

調(diào)用的時(shí)候直接   var ss = WeiXinRequest.RequestHelper(token, EncodingAESKey, appid);

返回一個(gè)WeiXinRequest,然后再對消息類型和事件類型判斷,做出響應(yīng)。

今天重新做了下調(diào)整,也就是分了子類基類,代碼可讀性提高了,調(diào)用起來卻沒有之前方便了,各位朋友給點(diǎn)建議唄。

下面是各消息實(shí)體

基類:

public abstract class BaseMessage
    {        /// <summary>
        /// 開發(fā)者微信號        /// </summary>
        public string ToUserName { get; set; }       /// <summary>
        /// 發(fā)送方帳號(一個(gè)OpenID)       /// </summary>
        public string FromUserName { get; set; }        /// <summary>
        /// 消息創(chuàng)建時(shí)間 (整型)        /// </summary>
        public string CreateTime { get; set; }        /// <summary>
        /// 消息類型        /// </summary>
        public MsgType MsgType { get; set; }        public virtual void ResponseNull()
        {
            Utils.ResponseWrite("");
        }        public virtual void ResText(EnterParam param, string content)
        {            
        }        /// <summary>
        /// 回復(fù)消息(音樂)        /// </summary>
        public  void ResMusic(EnterParam param, Music mu)
        {
        }        public  void ResVideo(EnterParam param, Video v)
        {        }        /// <summary>
        /// 回復(fù)消息(圖片)        /// </summary>
        public  void ResPicture(EnterParam param, Picture pic, string domain)
        {
}        /// <summary>
        /// 回復(fù)消息(圖文列表)        /// </summary>
        /// <param name="param"></param>
        /// <param name="art"></param>
        public  void ResArticles(EnterParam param, List<Articles> art)
        {        }        /// <summary>
        /// 多客服轉(zhuǎn)發(fā)        /// </summary>
        /// <param name="param"></param>
        public  void ResDKF(EnterParam param)
        {
}        /// <summary>
        /// 多客服轉(zhuǎn)發(fā)如果指定的客服沒有接入能力(不在線、沒有開啟自動接入或者自動接入已滿),該用戶會一直等待指定客服有接入能力后才會被接入,而不會被其他客服接待。建議在指定客服時(shí),先查詢客服的接入能力指定到有能力接入的客服,保證客戶能夠及時(shí)得到服務(wù)。        /// </summary>
        /// <param name="param">用戶發(fā)送的消息體</param>
        /// <param name="KfAccount">多客服賬號</param>
        public  void ResDKF(EnterParam param, string KfAccount)
        {        }        private  void Response(EnterParam param, string data)
        {            
        }
    }

基類中定義了消息體的公共字段,以及用于響應(yīng)用戶請求的虛方法(響應(yīng)消息不是本文重點(diǎn),所以方法體就沒有貼出來,請關(guān)注后續(xù)文章)。

基類中方法的參數(shù)有個(gè)是EnterParam類型的,這個(gè)類是用戶接入時(shí)和驗(yàn)證消息真實(shí)性需要使用的參數(shù),包括token,加密密鑰,appid等。定義如下:

/// <summary>
    /// 微信接入?yún)?shù)    /// </summary>
    public class EnterParam
    {        /// <summary>
        /// 是否加密        /// </summary>
        public bool IsAes { get; set; }        /// <summary>
        /// 接入token        /// </summary>
        public string token { get; set; }        /// <summary>
        ///微信appid        /// </summary>
        public string appid { get; set; }        /// <summary>
        /// 加密密鑰        /// </summary>
        public string EncodingAESKey { get; set; }
    }

文本實(shí)體:

public class TextMessage:BaseMessage
    {       /// <summary>
       /// 消息內(nèi)容       /// </summary>
        public string Content { get; set; }       /// <summary>
        /// 消息id,64位整型       /// </summary>
        public string MsgId { get; set; }

    
    }

圖片實(shí)體:

public class ImgMessage : BaseMessage
    {       /// <summary>
       /// 圖片路徑       /// </summary>
        public string PicUrl { get; set; }       /// <summary>
        /// 消息id,64位整型       /// </summary>
        public string MsgId { get; set; }        /// <summary>
        /// 媒體ID        /// </summary>
        public string MediaId { get; set; }

     
    }

語音實(shí)體:

public class VoiceMessage : BaseMessage
    {       /// <summary>
       /// 縮略圖ID       /// </summary>
        public string MsgId { get; set; }       /// <summary>
        /// 格式       /// </summary>
        public string Format { get; set; }        /// <summary>
        /// 媒體ID        /// </summary>
        public string MediaId { get; set; }        /// <summary>
        /// 語音識別結(jié)果        /// </summary>
        public string Recognition { get; set; }

    
    }

視頻實(shí)體:

public class VideoMessage : BaseMessage
    {       /// <summary>
       /// 縮略圖ID       /// </summary>
        public string ThumbMediaId { get; set; }       /// <summary>
        /// 消息id,64位整型       /// </summary>
        public string MsgId { get; set; }        /// <summary>
        /// 媒體ID        /// </summary>
        public string MediaId { get; set; }

    
    }

鏈接實(shí)體:

public class LinkMessage : BaseMessage
    {       /// <summary>
       /// 縮略圖ID       /// </summary>
        public string MsgId { get; set; }       /// <summary>
        /// 標(biāo)題       /// </summary>
        public string Title { get; set; }        /// <summary>
        /// 描述        /// </summary>
        public string Description { get; set; }        /// <summary>
        /// 鏈接地址        /// </summary>
        public string Url { get; set; }

     
    }

消息實(shí)體定義好了,下一步就是根據(jù)微信服務(wù)器推送的消息體解析成對應(yīng)的實(shí)體。本打算用C#自帶的xml序列化發(fā)序列化的組件,結(jié)果試了下總是報(bào)什么xmls的錯(cuò),索性用反射寫了個(gè)處理方法:

public static T ConvertObj<T>(string xmlstr)
        {
            XElement xdoc = XElement.Parse(xmlstr);            var type = typeof(T);            var t = Activator.CreateInstance<T>();            foreach (XElement element in xdoc.Elements())
            {                var pr = type.GetProperty(element.Name.ToString());                if (element.HasElements)
                {//這里主要是兼容微信新添加的菜單類型。nnd,竟然有子屬性,所以這里就做了個(gè)子屬性的處理                    foreach (var ele in element.Elements())
                    {
                        pr = type.GetProperty(ele.Name.ToString());
                        pr.SetValue(t, Convert.ChangeType(ele.Value, pr.PropertyType), null);
                    }                    continue;
                }                if (pr.PropertyType.Name == "MsgType")//獲取消息模型
                {
                    pr.SetValue(t, (MsgType)Enum.Parse(typeof(MsgType), element.Value.ToUpper()), null);                    continue;
                }                if (pr.PropertyType.Name == "Event")//獲取事件類型。
                {
                    pr.SetValue(t, (Event)Enum.Parse(typeof(Event), element.Value.ToUpper()), null);                    continue;
                }
                pr.SetValue(t, Convert.ChangeType(element.Value, pr.PropertyType), null);
            }            return t;
        }

處理xml的方法定義好后,下面就是講根據(jù)不同的消息類型來解析對應(yīng)的實(shí)體了:

public class MessageFactory
    {        public static BaseMessage CreateMessage(string xml)
        {
            XElement xdoc = XElement.Parse(xml);            var msgtype = xdoc.Element("MsgType").Value.ToUpper();
            MsgType type = (MsgType)Enum.Parse(typeof(MsgType), msgtype);            switch (type)
            {                case MsgType.TEXT: return Utils.ConvertObj<TextMessage>(xml);                case MsgType.IMAGE: return Utils.ConvertObj<ImgMessage>(xml);                case MsgType.VIDEO: return Utils.ConvertObj<VideoMessage>(xml);                case MsgType.VOICE: return Utils.ConvertObj<VoiceMessage>(xml);                case MsgType.LINK:                    return Utils.ConvertObj<LinkMessage>(xml);                case MsgType.LOCATION:                    return Utils.ConvertObj<LocationMessage>(xml);                case MsgType.EVENT://事件類型                {
                    
                } break;                default:                    return Utils.ConvertObj<BaseMessage>(xml);
            }
        }
    }

CreateMessage方法傳入數(shù)據(jù)包(如加密,需解密后傳入),以基類的形式返回對應(yīng)的實(shí)體。

講到這里普通消息的接收就差不多講完了,結(jié)合上一篇博文,現(xiàn)在把修改后的接入代碼貼出來如下:

public class WxRequest
    {       public static BaseMessage Load(EnterParam param, bool bug = true)
       {           string postStr = "";
           Stream s = VqiRequest.GetInputStream();//此方法是對System.Web.HttpContext.Current.Request.InputStream的封裝,可直接代碼
           byte[] b = new byte[s.Length];
           s.Read(b, 0, (int)s.Length);
           postStr = Encoding.UTF8.GetString(b);//獲取微信服務(wù)器推送過來的字符串
           var timestamp = VqiRequest.GetQueryString("timestamp");           var nonce = VqiRequest.GetQueryString("nonce");           var msg_signature = VqiRequest.GetQueryString("msg_signature");           var encrypt_type = VqiRequest.GetQueryString("encrypt_type");           string data = "";           if (encrypt_type=="aes")//加密模式處理           {
               param.IsAes = true;               var ret = new MsgCrypt(param.token, param.EncodingAESKey, param.appid);               int r = ret.DecryptMsg(msg_signature, timestamp, nonce, postStr, ref data);               if (r != 0)
               {
                   WxApi.Base.WriteBug("消息解密失敗");                   return null;

               }
           }           else
           {
               param.IsAes = false;
               data = postStr;
           }           if (bug)
           {
               Utils.WriteTxt(data);
           }           return MessageFactory.CreateMessage(data);
       }
    }

關(guān)于“微信開發(fā)之如何實(shí)現(xiàn)接收文本消息”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。

文章名稱:微信開發(fā)之如何實(shí)現(xiàn)接收文本消息
瀏覽路徑:http://aaarwkj.com/article26/jeihjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航網(wǎng)站建設(shè)、云服務(wù)器微信小程序、網(wǎng)站改版ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
91在线播放欧美国产视频| 中文日本强暴人妻另类视频| 久久96国产精品久久秘臀| 综合久久精品亚洲天堂| 亚洲一区二区三区熟妇| 久久香蕉精品国产亚洲av| 亚洲小视频免费在线观看| 一本之道高清久久久首页| 久久中文字幕人妻熟av| 久久精品资源综合网| 亚洲中文字幕女同系列av专区| 在线国产丝袜自拍观看| 欧美人与性一区二区三区| 麻豆视频传媒入口在线播放| 欧美一区二区三区十区| 日韩精品有码在线视频免费观看| 日本伦理三级在线观看| 欧美日韩三级国产在线| 熟女一区二区中文字幕| 在线播放精品免费不卡| 日本免费高清一区二区| 国产精品久久99粉嫩| 日韩亚洲毛片全在线播放| 国产福利在线观看网站| 日本国产精品久久一线| 森泽佳奈在线视频观看| 国产精品免费观看在线国产| 三级精品一区二区三区| 亚洲日本在线观看一区| 欧美成人精品三级一二| 国产午夜视频成人无遮挡| 日本不卡在线观看欧美精品| 黄片欧美精品在线观看| 国产综合一区二区三区视频| 手机免费在线观看国产精品| 国产蜜臀视频在线播放| 黑人巨大欧美一区二区| 涩涩涩丁香色婷五月网| 尤物视频精品在线观看| 国产丝袜肉丝在线播放| 粗暴蹂躏中文一区二区三区|