作为一个新手,开发微信公众号各种不知道、各种无从下手。很希望能找到一个连引用命名空间都有的完整代码的demo拿来就用。经过两天辛苦的查阅,总结如下代码,直接可用,没有什么自定义基类,也没有需要隐藏的部分。代码中有注释,请童鞋边看边操作。
新建一个一般处理程序,粘到里面就好。只有简单的类型判断自动回复。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using System.Web.Security;
using System.IO;
using System.Text;
namespace BigDataMedia.Web.WeiXin
{
///
/// WeixinApi 测试所用,简单判断类型自动回复。
///
//post请求
public class WeixinApi : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
weixin wx = new weixin();
String postStr = String.Empty;
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
{
Stream s = HttpContext.Current.Request.InputStream;
Byte[] b = new Byte[s.Length];
s.Read(b, 0, (Int32)s.Length);
postStr = Encoding.UTF8.GetString(b);
if (!String.IsNullOrEmpty(postStr))
{
wx.Handle(postStr);
}
}
else
{
wx.Auth();
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
//验证token
public class weixin
{
private String Token = "你的token";
public void Auth()
{
String echoStr = HttpContext.Current.Request.QueryString["echoStr"];
if (CheckSignature())
{
if (!String.IsNullOrEmpty(echoStr))
{
HttpContext.Current.Response.Write(echoStr);
HttpContext.Current.Response.End();
}
}
}
//验证微信签名
private bool CheckSignature()
{
String signature = HttpContext.Current.Request.QueryString["signature"];
String timestamp = HttpContext.Current.Request.QueryString["timestamp"];
String nonce = HttpContext.Current.Request.QueryString["nonce"];
String[] ArrTmp = { Token, timestamp, nonce };
Array.Sort(ArrTmp);
String tmpStr = String.Join("", ArrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
tmpStr = tmpStr.ToLower();
if (tmpStr == signature)
{
return true;
}
else
{
return false;
}
}
//判断回复类型
public void Handle(String postStr)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(postStr);
XmlElement rootElement = doc.DocumentElement;
XmlNode MsgType = rootElement.SelectSingleNode("MsgType");
RequestXML requestXML = new RequestXML();
requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
requestXML.MsgType = MsgType.InnerText;
if (requestXML.MsgType == "text")
{
requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
}
else if (requestXML.MsgType == "location")
{
requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
requestXML.MapInfo = rootElement.SelectSingleNode("Label").InnerText;
}
else if (requestXML.MsgType == "image")
{
requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
}
ResponseMsg(requestXML);
}
///
/// 回复消息
///
///
private void ResponseMsg(RequestXML requestXML)
{
String responseContent = String.Empty;
if (requestXML.MsgType == "text")
{
responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "已收到消息!");
}
else if (requestXML.MsgType == "location")
{
responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "已知道您的位置!");
}
else if (requestXML.MsgType == "image")
{
responseContent = FormatTextXML(requestXML.FromUserName,requestXML.ToUserName,"图片已接收!");
}
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
}
//返回格式化文本XML内容
private String FormatTextXML(String fromUserName, String toUserName, String content)
{
return " + fromUserName + "]]> + toUserName + "]]> " + ConvertDateTimeInt(DateTime.Now) + " + content + "]]> 1 ";
}
private int ConvertDateTimeInt(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
return (int)(time - startTime).TotalSeconds;
}
}
//微信请求类
public class RequestXML
{
private String toUserName = String.Empty;
///
/// 公众号
///
public String ToUserName
{
set;get;
}
private String fromUserName = "";
///
/// 发送方微信号
///
public String FromUserName
{
set;get;
}
private String createTime = String.Empty;
///
/// 创建时间
///
public String CreateTime
{
set;get;
}
private String msgType = String.Empty;
///
/// 信息类型 地理位置:location,文本消息:text,消息类型:image
///
public String MsgType
{
set;get;
}
private String content = String.Empty;
///
/// 信息内容
///
public String Content
{
set;get;
}
private String location_X = String.Empty;
///
/// 地理位置纬度
///
public String Location_X
{
set;get;
}
private String location_Y = String.Empty;
///
/// 地理位置经度
///
public String Location_Y
{
set;get;
}
private String scale = String.Empty;
///
/// 地图缩放大小
///
public String Scale
{
set;get;
}
private String mapInfo = String.Empty;
///
/// 地理位置信息
///
public String MapInfo
{
set;get;
}
private String picUrl = String.Empty;
///
/// 图片链接
///
public String PicUrl
{
set;get;
}
}
}
由于本人也是一个新手,不喜勿喷。欢迎一些有经验的前辈来指教。