1. 서문
WeChat 공개 플랫폼의 메시지 처리는 가장 기본적인 문자 메시지, 그래픽 메시지, 사진 메시지, 음성 메시지, 비디오 메시지 및 음악 메시지를 포함하여 비교적 완벽합니다. 기본 원칙은 동일하지만 게시된 XML 데이터는 다릅니다. 메시지를 처리하기 전에 우리에게 제공된 공식 문서(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>
이것이 보내는 사람, 받는 사람, 생성 시간, 유형, 내용 등을 포함하는 메시지 처리의 가장 기본적인 패턴임을 알 수 있습니다.
먼저 메시지 처리 클래스를 만듭니다. 이 클래스는 모든 메시지 요청을 캡처하고 다양한 메시지 요청 유형에 따라 다양한 메시지 응답을 처리하는 데 사용됩니다.
먼저 메시지를 캡처하는 방법을 살펴보겠습니다. 홈페이지의 Default.ashx 코드는 다음과 같습니다.
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; } } }
위 코드를 보면 WeiXinService.cs 클래스의 메시지가 매우 중요하다는 것을 알 수 있습니다.
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(); } } }
IHandler는 메시지 처리 인터페이스이며 그 아래에 EventHandler가 있으며 TextHandler 처리 클래스가 이 인터페이스를 구현합니다. 코드는 다음과 같습니다
/// <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; }
EventHandler
/// <summary> /// 处理接口 /// </summary> public interface IHandler { /// <summary> /// 处理请求 /// </summary> /// <returns></returns> string HandleRequest(); }
TextHandler
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; } }
HandlerFactory
/// <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; } }
여기까지 기본 클래스가 몇 개 완성되었으니 이제 완성해 보도록 하겠습니다. 우리 WeChat 공식 계정에서는 그래픽 메시지를 보내고, 일부 키워드를 입력하고, 사용자의 openid를 반환하기 위해 ID를 입력하는 등 일부 메시지를 반환합니다.
2.PicTextMessage
/// <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; } }
최종 효과는 다음과 같습니다.
위 내용은 .NET WeChat 개발 공개 계정 메시지 처리 코드 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!