微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字、图片、语音的全方位沟通、互动。
首先注册一个微信公众平台账户,注册地址:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=wxm2-realname-reg&lang=zh_CN
注册后登记了个人信息审核后就可以使用平台了,登陆后进入高级功能开启开发模式:如图
首次进入开发模式需要配置“接口配置信息”
需要Token验证;
先去看看这个验证的帮助指南,http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97
我们定义一个MessageReceiveHandler.ashx一般处理程序来处理这个功能,
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Tencent.WeiXin; namespace Test { /// <summary> /// MessageReceiveHandler 的摘要说明 /// </summary> public class MessageReceiveHandler : IHttpHandler { private static readonly string Token = "中国.NET协会"; public void ProcessRequest(HttpContext context) { if (context.Request.RequestType == "GET")//第一次Token验证 { if (CheckSignature(context)) { context.Response.Write(context.Request.QueryString["echostr"]); } return; } context.Response.Flush(); } /// <summary> /// 加密/校验流程: ///1. 将token、timestamp、nonce三个参数进行字典序排序 ///2. 将三个参数字符串拼接成一个字符串进行sha1加密 ///3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 /// </summary> /// <param name="context"></param> /// <returns></returns> protected virtual bool CheckSignature(HttpContext context) { List<string> list = new List<string>(); list.Add(context.Request.QueryString["timestamp"]); list.Add(context.Request.QueryString["nonce"]); list.Add(Token); list = list.OrderBy(t => t).ToList(); var sha1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(list[0] + list[1] + list[2], "SHA1"); var signature = context.Request.QueryString["signature"]; return signature.Equals(sha1, StringComparison.OrdinalIgnoreCase); } public bool IsReusable { get { return false; } } } }
在来实现解析消息主题
/// <summary> /// 获取一个<see cref="System.Xml.XmlDocument"/>对象,该对象表示消息的主体。 /// </summary> public System.Xml.XmlDocument MessageXml { get { return myMessageXml; } } /// <summary> /// 根据指定的key获取主体中的文本值。 /// </summary> /// <param name="key">要在主体中的获取文本值的key。</param> /// <returns></returns> protected virtual string ReadValue(string key) { return MessageXml.SelectSingleNode(string.Format("/xml/{0}", key)).InnerText; } /// <summary> /// 初始化信息。 /// </summary> protected virtual void Init() { ToUserName=ReadValue("ToUserName"); FromUserName = ReadValue("FromUserName"); CreateTime =Convert.ToInt32(ReadValue("CreateTime")); Id = Convert.ToInt64(ReadValue("MsgId")); } /// <summary> /// 把接收到的信息转换成消息类。 /// </summary> /// <param name="inputStream">收到的流。</param> /// <param name="encoding">流编码。</param> /// <returns>根据xml类型创建的<see cref="MessageBase"/>对象。</returns> public static MessageBase Parse(Stream inputStream, System.Text.Encoding encoding) { MessageBase message = null; var length = inputStream.Length; var bytes = new byte[length]; inputStream.Read(bytes, 0, bytes.Length); var text = encoding.GetString(bytes); System.Xml.XmlDocument xmlMessage = new System.Xml.XmlDocument(); xmlMessage.LoadXml(text); var msgTypeNode = xmlMessage.SelectSingleNode("/xml/MsgType"); switch (msgTypeNode.InnerText) { case "text": message = new TextMessage(xmlMessage); break; case "image": message = new ImageMessage(xmlMessage); break; case "location": message = new LocationMessage(xmlMessage); break; case "link": message = new LinkMessage(xmlMessage); break; case "event": message = new EventMessage(xmlMessage); break; } return message; }
其实看完腾迅提供的说明文档后就觉得这个东西比较简单了,我这里不一一介绍了,我把源码和示例上传了,
http://files.cnblogs.com/dotnet-org-cn/%E5%BE%AE%E4%BF%A1%E6%8E%A5%E5%8F%A3.rar
测试微信公众平台账户