亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁(yè) 微信小程式 微信開(kāi)發(fā) 詳解.NET開(kāi)發(fā)微信公眾號(hào)之公眾號(hào)訊息處理方法

詳解.NET開(kāi)發(fā)微信公眾號(hào)之公眾號(hào)訊息處理方法

Mar 14, 2017 pm 02:09 PM

本文告訴大家的是在.net微信公眾號(hào)開(kāi)發(fā)中的公眾號(hào)的消息處理的相關(guān)內(nèi)容,非常詳細(xì),有需要的小伙伴可以參考下。

一.前言

? 微信公眾平臺(tái)的訊息處理還是比較完善的,有最基本的文字訊息,到圖文訊息,到圖片訊息,語(yǔ)音訊息,影片訊息,音樂(lè)訊息其基本原理都是一樣的,只不過(guò)所post的xml資料有所差別,在處理訊息之前,我們要認(rèn)真閱讀,官方給我們的文件:http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html。首先我們從最基本的文字訊息處理開(kāi)始。


<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

? 我們可以看到這是訊息處理的一個(gè)最基本的模式,有發(fā)送者,接受者,創(chuàng)建時(shí)間,類型,內(nèi)容等等。

首先我們來(lái)創(chuàng)建一個(gè)訊息處理的類,這個(gè)類用來(lái)捕獲,所有的訊息請(qǐng)求,根據(jù)不同的訊息請(qǐng)求類型來(lái)處理不同的訊息回覆。


public class WeiXinService
  {
    /// <summary>
    /// TOKEN
    /// </summary>
    private const string TOKEN = "finder";
    /// <summary>
    /// 簽名
    /// </summary>
    private const string SIGNATURE = "signature";
    /// <summary>
    /// 時(shí)間戳
    /// </summary>
    private const string TIMESTAMP = "timestamp";
    /// <summary>
    /// 隨機(jī)數(shù)
    /// </summary>
    private const string NONCE = "nonce";
    /// <summary>
    /// 隨機(jī)字符串
    /// </summary>
    private const string ECHOSTR = "echostr";
    /// <summary>
    /// 
    /// </summary>
    private HttpRequest Request { get; set; }
    /// <summary>
    /// 構(gòu)造函數(shù)
    /// </summary>
    /// <param name="request"></param>
    public WeiXinService(HttpRequest request)
    {
      this.Request = request;
    }
    /// <summary>
    /// 處理請(qǐng)求,產(chǎn)生響應(yīng)
    /// </summary>
    /// <returns></returns>
    public string Response()
    {
      string method = Request.HttpMethod.ToUpper();
      //驗(yàn)證簽名
      if (method == "GET")
      {
        if (CheckSignature())
        {
          return Request.QueryString[ECHOSTR];
        }
        else
        {
          return "error";
        }
      }

      //處理消息
      if (method == "POST")
      {
        return ResponseMsg();
      }
      else
      {
        return "無(wú)法處理";
      }
    }

    /// <summary>
    /// 處理請(qǐng)求
    /// </summary>
    /// <returns></returns>
    private string ResponseMsg()
    {
      string requestXml = CommonWeiXin.ReadRequest(this.Request);
      IHandler handler = HandlerFactory.CreateHandler(requestXml);
   
      if (handler != null)
      {
        return handler.HandleRequest();
      }

      return string.Empty;
    }
    /// <summary>
    /// 檢查簽名
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    private bool CheckSignature()
    {
      string signature = Request.QueryString[SIGNATURE];
      string timestamp = Request.QueryString[TIMESTAMP];
      string nonce = Request.QueryString[NONCE];

      List<string> list = new List<string>();
      list.Add(TOKEN);
      list.Add(timestamp);
      list.Add(nonce);
      //排序
      list.Sort();
      //拼串
      string input = string.Empty;
      foreach (var item in list)
      {
        input += item;
      }
      //加密
      string new_signature = SecurityUtility.SHA1Encrypt(input);
      //驗(yàn)證
      if (new_signature == signature)
      {
        return true;
      }
      else
      {
        return false;
      }
    }
  }

在來(lái)看看我們的首先是如何捕獲訊息的。首頁(yè)Default.ashx的程式碼如下


    public void ProcessRequest(HttpContext context)
    {
      context.Response.ContentType = "text/html";
      

      string postString = string.Empty;
      if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
      {
        //由微信服務(wù)接收請(qǐng)求,具體處理請(qǐng)求
        WeiXinService wxService = new WeiXinService(context.Request);
        string responseMsg = wxService.Response();
        context.Response.Clear();
        context.Response.Charset = "UTF-8";
        context.Response.Write(responseMsg);
        context.Response.End();
      }
      else
      {
        string token = "wei2414201";
        if (string.IsNullOrEmpty(token))
        {
          return;
        }

        string echoString = HttpContext.Current.Request.QueryString["echoStr"];
        string signature = HttpContext.Current.Request.QueryString["signature"];
        string timestamp = HttpContext.Current.Request.QueryString["timestamp"];
        string nonce = HttpContext.Current.Request.QueryString["nonce"];

        if (!string.IsNullOrEmpty(echoString))
        {
          HttpContext.Current.Response.Write(echoString);
          HttpContext.Current.Response.End();
        }
      }


    }

從上面的程式碼我們可以看到WeiXinService.cs類別中的訊息對(duì)應(yīng)至關(guān)重要。


    /// <summary>
    /// 處理請(qǐng)求
    /// </summary>
    /// <returns></returns>
    private string ResponseMsg()
    {
      string requestXml = CommonWeiXin.ReadRequest(this.Request);
      IHandler handler = HandlerFactory.CreateHandler(requestXml);
   
      if (handler != null)
      {
        return handler.HandleRequest();
      }

      return string.Empty;
    }

IHandler是一個(gè)訊息處理介面#,其下面有EventHandler,TextHandler處理類別實(shí)作這個(gè)介面。程式碼如下


  /// <summary>
  /// 處理接口
  /// </summary>
  public interface IHandler
  {
    /// <summary>
    /// 處理請(qǐng)求
    /// </summary>
    /// <returns></returns>
    string HandleRequest();
  }

EventHandler


#
class EventHandler : IHandler
  {
    /// <summary>
    /// 請(qǐng)求的xml
    /// </summary>
    private string RequestXml { get; set; }
    /// <summary>
    /// 構(gòu)造函數(shù)
    /// </summary>
    /// <param name="requestXml"></param>
    public EventHandler(string requestXml)
    {
      this.RequestXml = requestXml;
    }
    /// <summary>
    /// 處理請(qǐng)求
    /// </summary>
    /// <returns></returns>
    public string HandleRequest()
    {
      string response = string.Empty;
      EventMessage em = EventMessage.LoadFromXml(RequestXml);
      if (em.Event.Equals("subscribe", StringComparison.OrdinalIgnoreCase))//用來(lái)判斷是不是首次關(guān)注
      {


        PicTextMessage tm = new PicTextMessage();//我自己創(chuàng)建的一個(gè)圖文消息處理類
        tm.ToUserName = em.FromUserName;
        tm.FromUserName = em.ToUserName;
        tm.CreateTime = CommonWeiXin.GetNowTime();
        response = tm.GenerateContent();

      }

      return response;
    }
  }

TextHandler


  /// <summary>
  /// 文本信息處理類
  /// </summary>
  public class TextHandler : IHandler
  {
    string openid { get; set; }
    string access_token { get; set; }

    /// <summary>
    /// 請(qǐng)求的XML
    /// </summary>
    private string RequestXml { get; set; }
    /// <summary>
    /// 構(gòu)造函數(shù)
    /// </summary>
    /// <param name="requestXml">請(qǐng)求的xml</param>
    public TextHandler(string requestXml)
    {
      this.RequestXml = requestXml;
    }
    /// <summary>
    /// 處理請(qǐng)求
    /// </summary>
    /// <returns></returns>
    public string HandleRequest()
    {
      string response = string.Empty;
      TextMessage tm = TextMessage.LoadFromXml(RequestXml);
      string content = tm.Content.Trim();
      if (string.IsNullOrEmpty(content))
      {
        response = "您什么都沒(méi)輸入,沒(méi)法幫您啊。";
      }
      else
      {
          string username = System.Configuration.ConfigurationManager.AppSettings["weixinid"].ToString();
          AccessToken token = AccessToken.Get(username);
          access_token = token.access_token;
          openid = tm.FromUserName;
          response = HandleOther(content);
        
      }
      tm.Content = response;
      //進(jìn)行發(fā)送者、接收者轉(zhuǎn)換
      string temp = tm.ToUserName;
      tm.ToUserName = tm.FromUserName;
      tm.FromUserName = temp;
      response = tm.GenerateContent();
      return response;
    }
    /// <summary>
    /// 處理其他消息
    /// </summary>
    /// <param name="tm"></param>
    /// <returns></returns>
    private string HandleOther(string requestContent)
    {
      string response = string.Empty;
      if (requestContent.Contains("你好") || requestContent.Contains("您好"))
      {
        response = "您也好~";
      }else if (requestContent.Contains("openid") || requestContent.Contains("id") || requestContent.Contains("ID"))//用來(lái)匹配用戶輸入的關(guān)鍵字
      {
        response = "你的Openid: "+openid;
      }
      else if (requestContent.Contains("token") || requestContent.Contains("access_token"))
      {
        response = "你的access_token: " + access_token;
      }else 
      {
        response = "試試其他關(guān)鍵字吧。";
      }
      return response;
    }
  }

HandlerFactory


  /// <summary>
  /// 處理器工廠類
  /// </summary>
  public class HandlerFactory
  {
    /// <summary>
    /// 創(chuàng)建處理器
    /// </summary>
    /// <param name="requestXml">請(qǐng)求的xml</param>
    /// <returns>IHandler對(duì)象</returns>
    public static IHandler CreateHandler(string requestXml)
    {
      IHandler handler = null;
      if (!string.IsNullOrEmpty(requestXml))
      {
        //解析數(shù)據(jù)
        XmlDocument doc = new System.Xml.XmlDocument();
        doc.LoadXml(requestXml);
        XmlNode node = doc.SelectSingleNode("/xml/MsgType");
        if (node != null)
        {
          XmlCDataSection section = node.FirstChild as XmlCDataSection;
          if (section != null)
          {
            string msgType = section.Value;

            switch (msgType)
            {
              case "text":
                handler = new TextHandler(requestXml);
                break;
              case "event":
                handler = new EventHandler(requestXml);
                break;
            }
          }
        }
      }

      return handler;
    }
  }

?在這裡基本的一些類別已經(jīng)完成了,現(xiàn)在我們來(lái)完成,關(guān)注我們的微信公眾號(hào),我們就發(fā)送一條圖文訊息,同時(shí)輸入我們的一些關(guān)鍵字,回傳一些訊息,例如輸入id回傳用戶的openid等等。

二.PicTextMessage


public class PicTextMessage : Message
  {
    /// <summary>
    /// 模板靜態(tài)字段
    /// </summary>
    private static string m_Template;

    /// <summary>
    /// 默認(rèn)構(gòu)造函數(shù)
    /// </summary>
    public PicTextMessage()
    {
      this.MsgType = "news";
    }
    /// <summary>
    /// 從xml數(shù)據(jù)加載文本消息
    /// </summary>
    /// <param name="xml"></param>
    public static PicTextMessage LoadFromXml(string xml)
    {
      PicTextMessage tm = null;
      if (!string.IsNullOrEmpty(xml))
      {
        XElement element = XElement.Parse(xml);
        if (element != null)
        {
          tm = new PicTextMessage();
          tm.FromUserName = element.Element(CommonWeiXin.FROM_USERNAME).Value;
          tm.ToUserName = element.Element(CommonWeiXin.TO_USERNAME).Value;
          tm.CreateTime = element.Element(CommonWeiXin.CREATE_TIME).Value;
        }
      }

      return tm;
    }
    /// <summary>
    /// 模板
    /// </summary>
    public override string Template
    {
      get
      {
        if (string.IsNullOrEmpty(m_Template))
        {
          LoadTemplate();
        }

        return m_Template;
      }
    }
    /// <summary>
    /// 生成內(nèi)容
    /// </summary>
    /// <returns></returns>
    public override string GenerateContent()
    {
      this.CreateTime = CommonWeiXin.GetNowTime();
      string str= string.Format(this.Template, this.ToUserName, this.FromUserName, this.CreateTime);
      return str;
    }


    /// <summary>
    /// 加載模板
    /// </summary>
    private static void LoadTemplate()
    {
      m_Template= @"<xml>
              <ToUserName><![CDATA[{0}]]></ToUserName>
              <FromUserName><![CDATA[{1}]]></FromUserName>
              <CreateTime>{2}</CreateTime>
              <MsgType><![CDATA[news]]></MsgType>
              <ArticleCount>1</ArticleCount>
              <Articles>
                <item>
                <Title><![CDATA[有位停車歡迎你!]]></Title> 
                <Description><![CDATA[如有問(wèn)題請(qǐng)致電400-6238-136或直接在微信留言,我們將第一時(shí)間為您服務(wù)!]]></Description>
                <PicUrl><![CDATA[http://ipnx.cn/]]></PicUrl>
                <Url><![CDATA[http://ipnx.cn/]]></Url>
                </item>
              </Articles>
            </xml> ";
    }
  }

最後我們的效果如下所示;

詳解.NET開(kāi)發(fā)微信公眾號(hào)之公眾號(hào)訊息處理方法詳解.NET開(kāi)發(fā)微信公眾號(hào)之公眾號(hào)訊息處理方法

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡

以上是詳解.NET開(kāi)發(fā)微信公眾號(hào)之公眾號(hào)訊息處理方法的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72