微信公衆平臺是騰訊公司在微信的基礎上新增的功能模塊,經過這一平臺,我的和企業均可以打造一個微信的公衆號,並實現和特定羣體的文字、圖片、語音的全方位溝通、互動。
首先註冊一個微信公衆平臺帳戶,註冊地址:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=wxm2-realname-reg&lang=zh_CN
註冊後登記了我的信息審覈後就能夠使用平臺了,登錄後進入高級功能開啓開發模式:如圖php
首次進入開發模式須要配置「接口配置信息」
須要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; } } } }
在來實現解析消息主題ide
/// <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測試
測試微信公衆平臺帳戶編碼