1 公司提供接口,微信平台可以通过访问我们的接口,进行数据交互,通过xml。
2 http://mp.weixin.qq.com/ 微信服务号平台,输入用户名密码进入高级功能-开发者模式,
3 申请服务号之后,微信会提供appid和
4 接下里就是完成自己的接口部分的开发,然后接口的服务器配置地址输入微信服务号的服务器配置url,本地的项目地址是不行的,得是能访问的地址
5 接口的开发,接受xml,然后返回xml。
6 页面不需要写什么,但是注意编码,微信的编码是utf-8的,所以一定要注意,gb2312或者默认是无法访问的
<%@ Page Language="C#" ResponseEncoding="utf-8" ContentType="text/xml" AutoEventWireup="true" CodeBehind="weixin.aspx.cs" Inherits="weixin.weixin" %>
7 后台代码:
protected void Page_Load(object sender, EventArgs e) { if (Request.QueryString["city"] != null && Request.QueryString["city"].ToString() != "") { cityname = Request.QueryString["city"].ToString(); } weixinEntity wx = new weixinEntity(); string postStr = ""; if (Request.HttpMethod.ToLower() == "post" ) { Stream s = System.Web.HttpContext.Current.Request.InputStream; byte[] b = new byte[s.Length]; s.Read(b, 0, (int)s.Length); postStr = Encoding.UTF8.GetString(b); if (!string.IsNullOrEmpty(postStr)) //请求处理 { wx.Handle(postStr); } } else { wx.Auth(); } }

#region 微信请求类 RequestXML
/// <summary> /// 微信请求类 /// </summary> public class RequestXML { private string toUserName = ""; /// <summary> /// 消息接收方微信号,一般为公众平台账号微信号 /// </summary> public string ToUserName { get { return toUserName; } set { toUserName = value; } } private string fromUserName = ""; /// <summary> /// 消息发送方微信号 /// </summary> public string FromUserName { get { return fromUserName; } set { fromUserName = value; } } private string createTime = ""; /// <summary> /// 创建时间 /// </summary> public string CreateTime { get { return createTime; } set { createTime = value; } } private string msgType = ""; /// <summary> /// 信息类型 地理位置:location,文本消息:text,消息类型:image /// </summary> public string MsgType { get { return msgType; } set { msgType = value; } } private string content = ""; /// <summary> /// 信息内容 /// </summary> public string Content { get { return content; } set { content = value; } } private string location_X = ""; /// <summary> /// 地理位置纬度 /// </summary> public string Location_X { get { return location_X; } set { location_X = value; } } private string location_Y = ""; /// <summary> /// 地理位置经度 /// </summary> public string Location_Y { get { return location_Y; } set { location_Y = value; } } private string scale = ""; /// <summary> /// 地图缩放大小 /// </summary> public string Scale { get { return scale; } set { scale = value; } } private string label = ""; /// <summary> /// 地理位置信息 /// </summary> public string Label { get { return label; } set { label = value; } } private string picUrl = ""; /// <summary> /// 图片链接,开发者可以用HTTP GET获取 /// </summary> public string PicUrl { get { return picUrl; } set { picUrl = value; } } private string eventtype = ""; /// <summary> /// 事件类型,CLICK/VIEW /// </summary> public string Eventtype { get { return eventtype; } set { eventtype = value; } } private string eventkey = ""; /// <summary> /// 事件KEY值,与自定义菜单接口中KEY值对应,设置的跳转URL /// </summary> public string Eventkey { get { return eventkey; } set { eventkey = value; } } } #endregion
View Code

public class weixinEntity:weixin { private string Token = "mf0605"; //换成自己的token public void Auth() { string echoStr = System.Web.HttpContext.Current.Request.QueryString["echoStr"]; if (CheckSignature()) //校验签名是否正确 { if (!string.IsNullOrEmpty(echoStr)) { System.Web.HttpContext.Current.Response.Write(echoStr); //返回原值表示校验成功 System.Web.HttpContext.Current.Response.End(); } } } private bool CheckSignature() { string signature = System.Web.HttpContext.Current.Request.QueryString["signature"]; string timestamp = System.Web.HttpContext.Current.Request.QueryString["timestamp"]; string nonce = System.Web.HttpContext.Current.Request.QueryString["nonce"]; //加密/校验流程: //1. 将token、timestamp、nonce三个参数进行字典序排序 string[] ArrTmp = { Token, timestamp, nonce }; Array.Sort(ArrTmp);//字典排序 //2.将三个参数字符串拼接成一个字符串进行sha1加密 string tmpStr = string.Join("", ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"); tmpStr = tmpStr.ToLower(); //3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 if (tmpStr == signature) { return true; } else { return false; } } public void Handle(string postStr) { //封装请求类 XmlDocument doc = new XmlDocument(); doc.LoadXml(postStr); XmlElement rootElement = doc.DocumentElement; //MsgType 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; //根据不同的类型进行不同的处理 switch (requestXML.MsgType) { case "text": //文本消息 requestXML.Content = rootElement.SelectSingleNode("Content").InnerText; break; case "image": //图片 requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText; break; case "location": //位置 requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText; requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText; requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText; requestXML.Label = rootElement.SelectSingleNode("Label").InnerText; break; case "link": //链接 break; case "event": //事件推送 requestXML.Eventtype = rootElement.SelectSingleNode("Event").InnerText; requestXML.Eventkey = rootElement.SelectSingleNode("EventKey").InnerText; break; } //消息回复 ResponseMsg(requestXML); } private void ResponseMsg(RequestXML requestXML) { try { string resxml = ""; resxml = GetXMLByEvent(requestXML); System.Web.HttpContext.Current.Response.Write(resxml); //WriteToDB(requestXML, resxml, mi.pid); } catch (Exception e) { string resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType>"; resxml += "<Content><![CDATA["+ e.InnerException + e.Source + e.StackTrace + "]]></Content></xml>"; System.Web.HttpContext.Current.Response.Write(resxml); } } private string GetXMLByEvent(RequestXML requestXML) { string strxml = ""; #region switch (requestXML.MsgType) { case "event": string strkey = requestXML.Eventkey; string strdesc = "", strpage = ""; if (requestXML.Eventtype ==
