.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> ";
}
}
마지막 으로 우리 의 효 과 는 다음 과 같다.이상 에서 말 한 것 이 본문의 전부 이 니,여러분 이 좋아 하 시 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2017에서 SQLite를 사용한 Windows Forms 앱 개발Visual Studio 2017에서 SQLite를 사용하여 Windows Forms 앱을 개발해 보았습니다. 아직 서버 탐색기나 TableAdaptor를 사용한 GUI에서의 개발에는 대응하지 않는 것 같습니다. 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.