.NET 위 챗 공중 번호 개발 의 공중 번호 정보 처리

머리말
  위 챗 공식 플랫폼 의 정보 처 리 는 비교적 완선 하 다.가장 기본 적 인 텍스트 정보,그림 메시지,이미지 메시지,음성 메시지,영상 메시지,음악 메시지 의 기본 원 리 는 모두 같다.다만 post 의 xml 데이터 가 차이 가 있 을 뿐이다.이 자 를 처리 하기 전에 우 리 는 열심히 읽 어야 한다.공식 적 으로 우리 에 게 준 문서:http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html.우선 우 리 는 가장 기본 적 인 텍스트 메시지 처리 부터 시작 합 니 다.

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

  우 리 는 이것 이 메시지 처리 의 가장 기본 적 인 모델 로 발송 자,수용자,생 성 시간,유형,내용 등 이 있다 는 것 을 볼 수 있다.
우선 메시지 처리 클래스 를 만 듭 니 다.이 클래스 는 모든 메시지 요청 을 캡 처 하고 메시지 요청 유형 에 따라 메시지 답장 을 처리 합 니 다.

public class WeiXinService
  {
    /// <summary>
    /// TOKEN
    /// </summary>
    private const string TOKEN = "finder";
    /// <summary>
    ///   
    /// </summary>
    private const string SIGNATURE = "signature";
    /// <summary>
    ///    
    /// </summary>
    private const string TIMESTAMP = "timestamp";
    /// <summary>
    ///    
    /// </summary>
    private const string NONCE = "nonce";
    /// <summary>
    ///      
    /// </summary>
    private const string ECHOSTR = "echostr";
    /// <summary>
    /// 
    /// </summary>
    private HttpRequest Request { get; set; }
    /// <summary>
    ///     
    /// </summary>
    /// <param name="request"></param>
    public WeiXinService(HttpRequest request)
    {
      this.Request = request;
    }
    /// <summary>
    ///     ,    
    /// </summary>
    /// <returns></returns>
    public string Response()
    {
      string method = Request.HttpMethod.ToUpper();
      //    
      if (method == "GET")
      {
        if (CheckSignature())
        {
          return Request.QueryString[ECHOSTR];
        }
        else
        {
          return "error";
        }
      }

      //    
      if (method == "POST")
      {
        return ResponseMsg();
      }
      else
      {
        return "    ";
      }
    }

    /// <summary>
    ///     
    /// </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);
      //  
      if (new_signature == signature)
      {
        return true;
      }
      else
      {
        return false;
      }
    }
  }

우리 가 먼저 어떻게 소식 을 잡 았 는 지 살 펴 보 자.첫 페이지 Default.ashx 의 코드 는 다음 과 같 습 니 다.

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

      string postString = string.Empty;
      if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
      {
        //         ,      
        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();
        }
      }


    }

위의 코드 에서 우 리 는 WeiXin Service.cs 류 의 정 보 를 볼 수 있 는 것 이 매우 중요 하 다.

    /// <summary>
    ///     
    /// </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 는 메시지 처리 인터페이스 로 그 아래 에 EventHandler,TextHandler 처리 클래스 가 이 인 터 페 이 스 를 실현 합 니 다.코드 는 다음 과 같다.

  /// <summary>
  ///     
  /// </summary>
  public interface IHandler
  {
    /// <summary>
    ///     
    /// </summary>
    /// <returns></returns>
    string HandleRequest();
  }

EventHandler

class EventHandler : IHandler
  {
    /// <summary>
    ///    xml
    /// </summary>
    private string RequestXml { get; set; }
    /// <summary>
    ///     
    /// </summary>
    /// <param name="requestXml"></param>
    public EventHandler(string requestXml)
    {
      this.RequestXml = requestXml;
    }
    /// <summary>
    ///     
    /// </summary>
    /// <returns></returns>
    public string HandleRequest()
    {
      string response = string.Empty;
      EventMessage em = EventMessage.LoadFromXml(RequestXml);
      if (em.Event.Equals("subscribe", StringComparison.OrdinalIgnoreCase))//           
      {


        PicTextMessage tm = new PicTextMessage();//               
        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>
    ///    XML
    /// </summary>
    private string RequestXml { get; set; }
    /// <summary>
    ///     
    /// </summary>
    /// <param name="requestXml">   xml</param>
    public TextHandler(string requestXml)
    {
      this.RequestXml = requestXml;
    }
    /// <summary>
    ///     
    /// </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 = "       ,     。";
      }
      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;
      //     、     
      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"))//            
      {
        response = "  Openid: "+openid;
      }
      else if (requestContent.Contains("token") || requestContent.Contains("access_token"))
      {
        response = "  access_token: " + access_token;
      }else 
      {
        response = "        。";
      }
      return response;
    }
  }

HandlerFactory

  /// <summary>
  ///       
  /// </summary>
  public class HandlerFactory
  {
    /// <summary>
    ///      
    /// </summary>
    /// <param name="requestXml">   xml</param>
    /// <returns>IHandler  </returns>
    public static IHandler CreateHandler(string requestXml)
    {
      IHandler handler = null;
      if (!string.IsNullOrEmpty(requestXml))
      {
        //    
        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;
    }
  }

 여기 서 기본 적 인 일부 유형 은 이미 완성 되 었 습 니 다.지금 우 리 는 완성 하고 우리 의 위 챗 공중 번 호 를 주목 합 니 다.우 리 는 그림 과 글 메 시 지 를 보 내 는 동시에 우리 의 키 워드 를 입력 하고 메 시 지 를 되 돌려 줍 니 다.예 를 들 어 id 를 입력 하여 사용자 의 openid 로 돌아 가 는 등 입 니 다.
2.PicTextMessage

public class PicTextMessage : Message
  {
    /// <summary>
    ///       
    /// </summary>
    private static string m_Template;

    /// <summary>
    ///       
    /// </summary>
    public PicTextMessage()
    {
      this.MsgType = "news";
    }
    /// <summary>
    ///  xml        
    /// </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>
    ///     
    /// </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[       400-6238-136        ,           !]]></Description>
                <PicUrl><![CDATA[http://www.baidu.com/youwei.jpg]]></PicUrl>
                <Url><![CDATA[http://www.baidu.com]]></Url>
                </item>
              </Articles>
            </xml> ";
    }
  }

마지막 으로 우리 의 효 과 는 다음 과 같다.

이상 에서 말 한 것 이 본문의 전부 이 니,여러분 이 좋아 하 시 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기