通过本文主要向大家介绍了.net微信公众号开发,.net 微信公众号,微信公众号发布消息,微信公众号群发消息,微信公众号消息提醒等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
一.前言
微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所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></div>
我们可以看到这是消息处理的一个最基本的模式,有发送者,接受者,创建时间,类型,内容等等。
首先我们来创建一个消息处理的类,这个类用来捕获,所有的消息请求,根据不同的消息请求类型来处理不同的消息回复。
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;
}
}
}
</div>
在来看看我们的首先是如何捕获消息的。首页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();
}
}
}
</div>
从上面的代码中我们可以看到WeiXinService.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;
}
</div>
IHandler是一个消息处理接口,其下面有EventHandler,TextHandler处理类实现这个接口。代码如下
/// <summary>
/// 处理接口
/// </summary>
public interface IHandler
{
/// <summary>
/// 处理请求
/// </summary>
/// <returns></returns>
string HandleRequest();
}
</div>
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;
}
}
</div>
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>

