文章导读:
C#微信公众号接口开发之从零开发(一) 接入微信公众平台
微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们的绑定的地址上,通过解析XML数据,获取到微信用户发送的消息,让根据微信消息(文本:关键字,图片,语音等等)回复XML格式的数据给微信服务器,微信服务器再将接收到的消息返回给用户微信。
我们所需要做的:接收消息和返回消息
一、创建实体类
首先看文档http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html
微信发送过来的消息XML格式我们先创建一个实体类来解析XML数据 实体类根据后续开发增加
1 public class WxXmlModel 2 { 3 /// <summary> 4 /// 消息接收方微信号 5 /// </summary> 6 public string ToUserName { get; set; } 7 8 /// <summary> 9 /// 消息发送方微信号 10 /// </summary> 11 public string FromUserName { get; set; } 12 13 /// <summary> 14 /// 创建时间 15 /// </summary> 16 public string CreateTime { get; set; } 17 18 /// <summary> 19 /// 信息类型 地理位置:location,文本消息:text,消息类型:image 20 /// </summary> 21 public string MsgType { get; set; } 22 23 /// <summary> 24 /// 信息内容 25 /// </summary> 26 public string Content { get; set; } 27 28 /// <summary> 29 /// 地理位置纬度 30 /// </summary> 31 public string Location_X { get; set; } 32 33 /// <summary> 34 /// 地理位置经度 35 /// </summary> 36 public string Location_Y { get; set; } 37 /// <summary> 38 /// 地图缩放大小 39 /// </summary> 40 public string Scale { get; set; } 41 /// <summary> 42 /// 地理位置信息 43 /// </summary> 44 public string Label { get; set; } 45 /// <summary> 46 /// 图片链接,开发者可以用HTTP GET获取 47 /// </summary> 48 public string PicUrl { get; set; } 49 50 /// <summary> 51 /// 事件类型,subscribe(订阅/扫描带参数二维码订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件) 、SCAN(已关注的状态下扫描带参数二维码) 52 /// </summary> 53 public string Event { get; set; } 54 55 /// <summary> 56 /// 事件KEY值 57 /// </summary> 58 public string EventKey { get; set; } 59 60 /// <summary> 61 /// 二维码的ticket,可以用来换取二维码 62 /// </summary> 63 public string Ticket { get; set; } 64 }
二、接收消息若成功返回提示消息
1 /// <summary> 2 /// 接收微信发送的XML消息并且解析 3 /// </summary> 4 private void ReceiveXml() 5 { 6 Stream requestStream = System.Web.HttpContext.Current.Request.InputStream; 7 byte[] requestByte = new byte[requestStream.Length]; 8 requestStream.Read(requestByte, 0, (int)requestStream.Length); 9 string requestStr = Encoding.UTF8.GetString(requestByte); 10 11 if (!string.IsNullOrEmpty(requestStr)) 12 { 13 //封装请求类 14 XmlDocument requestDocXml = new XmlDocument(); 15 requestDocXml.LoadXml(requestStr); 16 XmlElement rootElement = requestDocXml.DocumentElement; 17 18 WxXmlModel WxXmlModel = new WxXmlModel(); 19 WxXmlModel.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText; 20 WxXmlModel.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText; 21 WxXmlModel.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText; 22 WxXmlModel.MsgType = rootElement.SelectSingleNode("MsgType").InnerText; 23 24 switch (WxXmlModel.MsgType) 25 { 26 case "text": 27 WxXmlModel.Content = rootElement.SelectSingleNode("Content").InnerText; 28 break; 29 case "image": 30 WxXmlModel.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText; 31 break; 32 case "event": 33 WxXmlModel.Event = rootElement.SelectSingleNode("Event").InnerText; 34 if (WxXmlModel.Event == "subscribe")//关注类型 35 { 36 WxXmlModel.EventKey = rootElement.SelectSingleNode("EventKey").InnerText; 37 } 38 break; 39 default: 40 break; 41 } 42 sohovan.com.common.CommonMethod.WriteTxt(WxXmlModel.Content);//接收的文本消息 43 //回复消息<xml> 44 //<ToUserName><![CDATA[toUser]]></ToUserName> 45 //<FromUserName><![CDATA[fromUser]]></FromUserName> 46 //<CreateTime>12345678</CreateTime> 47 //<MsgType><![CDATA[text]]></MsgType> 48 //<Content><![CDATA[你好]]></Content> 49 //<FuncFlag>0</FuncFlag> 50 //</xml> 51 string XML = "<xml><ToUserName><![CDATA[" + WxXmlModel.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + WxXmlModel.ToUserName + "]]></FromUserName><CreateTime>" + sohovan.com.common.CommonMethod.ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[接收消息成功,消息为" + WxXmlModel.Content + "]]></Content><FuncFlag>0</FuncFlag></xml>"; 52 //ResponseXML(WxXmlModel); 53 sohovan.com.common.CommonMethod.WriteTxt(XML); 54 HttpContext.Current.Response.Write(XML); 55 HttpContext.Current.Response.End(); 56 } 57 }
如图为我测试的情况:
只有微信请求我们的地址,我们返回去的xml消息才可以发送给微信用户,如图中公众账号回复了测试的文本消息,说明微信接收消息成功。