everyday
tnblog
在路上,我们生命得到了肯定,一路上,我们有失败也有成功,有泪水也有感动,有曲折也有坦途,有机遇也有梦想。一路走来,我们熟悉了陌生的世界,我们熟悉了陌生的面孔,遇人无数,匆匆又匆匆,有些成了我们忘不掉的背影,有些成了我们一生的风景。我笑,便面如春花,定是能感动人的,任他是谁。
今天我们主要讲解的内容是:微信公众号的接收与回复文本,图片,语音,图文消息内容等等系列操作(实则是对于Xml的写入和读取操作)
第一步:虽然是一个小小的操作,但是没有它,后面内容都无法完成的。就是在测试号管理处配置测试号的路径和token,如图:
如果报错:配置失败,则是我们后台需要重新配置生成token,然后回传服务器,后台代码如下:
//新的公众号都要先配置token才能使用 //配置微信公众号的token public ActionResult Index(string echostr) { Response.Write(echostr); Response.End(); return View(echostr); }
注释:url:为自己注册服务器时发的短信里的ip地址,token:可随意设置。提示配置成功即可。
注意:更改代码后要本地发布项目,然后把最新数据更换到服务器上,手机上才有效果哦。
下面就是程序的后台代码部分啦。
第一步:我们可以在类库的工具类封装一个写微信推送消息的日志的方法,来记录开发过程语句。代码如下:
//写微信推送消息的日志 public class log { public static void Write(string content, string type, string remark) { string name = DateTime.Now.ToShortDateString().Replace("/", "-") + ".txt"; //创建文件流写推送消息日志 地址为服务器的C盘的新建文件夹log using (FileStream fileStream = new FileStream("c:/log/" + name, FileMode.Append)) { //写入 using (StreamWriter streamWriter = new StreamWriter(fileStream)) { streamWriter.WriteLine("消息内容:" + content); streamWriter.WriteLine("消息类型:" + type); streamWriter.WriteLine("消息备注:" + remark); streamWriter.WriteLine("消息时间:" + DateTime.Now); streamWriter.WriteLine("--------------------------------------------------------------"); } } } }
第二步:根据微信公众号开发文档,我们需要在项目里新建一个类,封装推送回复消息的多个方法,代码如下。
public class SendMsgTools { //计算时间差的方法 public static long GetWxTime() { //设置初始时间 DateTime start = new DateTime(1970, 1, 1); //获取当前时间,距开始时间的秒数 long cur = (long)(DateTime.Now - start).TotalSeconds; return cur; } //回复文本消息 public static string SendMsg(string toUser, string fromUser, string content) { string xml = string.Format(@"<xml> <ToUserName><![CDATA[{0}]]></ToUserName> <FromUserName><![CDATA[{1}]]></FromUserName> <CreateTime>{2}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{3}]]></Content> <MsgId>1234567890123456</MsgId> </xml>", fromUser, toUser, GetWxTime(), content); xml = xml.Trim(); return xml; } //回复图片 public static string SendMsgImg(string toUser, string fromUser, string media_id) { string xml = string.Format(@"<xml> <ToUserName><![CDATA[{0}]]></ToUserName> <FromUserName><![CDATA[{1}]]></FromUserName> <CreateTime>{2}</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[{3}]]></MediaId> </Image> </xml>", fromUser, toUser, GetWxTime(), media_id); xml = xml.Trim(); return xml; } //回复语音消息 public static string SendMsgVoice(string toUser, string fromUser, string media_id) { string xml = string.Format(@"<xml> <ToUserName><![CDATA[{0}]]></ToUserName> <FromUserName><![CDATA[{1}]]></FromUserName> <CreateTime>{2}</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <Voice> <MediaId><![CDATA[{3}]]></MediaId> </Voice> </xml>", fromUser, toUser, GetWxTime(), media_id); xml = xml.Trim(); return xml; } //回复图文消息 public static string SendMsgNews(string toUser, string fromUser) { string xml = string.Format(@"<xml> <ToUserName><![CDATA[{0}]]></ToUserName> <FromUserName><![CDATA[{1}]]></FromUserName> <CreateTime>{2}</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>2</ArticleCount> <Articles> <item> <Title><![CDATA[精品文章解析]]></Title> <Description><![CDATA[关于在mvc框架里对Excel表的导入,导出操作]]></Description> <PicUrl><![CDATA[http://image.tnblog.net/banner18.jpg]]></PicUrl> <Url><![CDATA[http://www.tnblog.net/xj/article/details/2265]]></Url> </item> <item> <Title><![CDATA[NET mvc Excel的导入导出解析]]></Title> <Description><![CDATA[讲解的内容是关于在mvc框架里对Excel表的导入,导出操作]]></Description> <PicUrl><![CDATA[http://www.tnblog.net/arcimg/15985459135/1cc73d90588d4cd5860ffa27cd4ba5d5.jpeg]]></PicUrl> <Url><![CDATA[www.tnblog.net/15985459135/article/details/2938]]></Url> </item> </Articles> </xml>", fromUser, toUser, GetWxTime()); xml = xml.Trim(); return xml; } }
注释:推送回复消息的的模块是参照微信开发文档写入,详情可参照开发文档,方便解读本文章。
思路:我们每个方法都需要服务器数据-->控制器-->回传数据
第三步,就是控制器定义参数,做一系列逻辑判断操作,然后回传数据,手机扫码查看效果。
调用封装的推送消息的方法,在home控制器里进行判断逻辑操作,代码如下:
public ActionResult Index() { try { //接收微信推送的xml StreamReader streamReader = new StreamReader(Request.InputStream); string xml = streamReader.ReadToEnd(); log.Write(xml, "", "记录微信推送服务内容"); //xml取值 XElement root = XElement.Parse(xml); //取出发送者 string FromUserName = root.Element("FromUserName").Value; //取出开发者微信号 string ToUserName = root.Element("ToUserName").Value; //取出消息类型 string MsgType = root.Element("MsgType").Value; string result = ""; //判断文本消息 if (MsgType.ToLower() == "text") { //取出消息内容 string Content = root.Element("Content").Value; if (Content == "yan") //关键字回复 { result = SendMsgTools.SendMsgNews(ToUserName, FromUserName); //判断图文消息推送 } else { result = SendMsgTools.SendMsg(ToUserName, FromUserName, Content); } } //判断处理点击菜单拉取消息时的事件推送 else if (MsgType.ToLower() == "event") { //取出事件推送消息 string Event = root.Element("Event").Value; //处理点击事件 if (Event == "CLICK") { string EventKey = root.Element("EventKey").Value; if (EventKey == "wx_menu_mui" || EventKey == "wx_menu_vue") { result = SendMsgTools.SendMsgNews(ToUserName, FromUserName); } else { result = SendMsgTools.SendMsg(ToUserName, FromUserName, "暂时不支持该事件类型"); } } } //判断图片消息 else if (MsgType.ToLower() == "image") { //取出图片id string MediaId = root.Element("MediaId").Value; result = SendMsgTools.SendMsgImg(ToUserName, FromUserName, MediaId); } //判断语音消息 else if (MsgType.ToLower() == "voice") { //取出语音id string MediaId = root.Element("MediaId").Value; result = SendMsgTools.SendMsgVoice(ToUserName, FromUserName, MediaId); } else { result = SendMsgTools.SendMsg(ToUserName, FromUserName, "暂时不支持该消息类型"); } log.Write(result, "", "生成的xml"); Response.Write(result); Response.End(); } catch (Exception ex) { log.Write(ex.Message, "", "哎呀报错了"); } return View(); }
好啦,基本操作就着这些了。最后一步就是发布项目,然后把数据更新到自己服务器上就行了。
以上操作完成后,我们就可以扫一扫,发点文本内容,图片,语音,点击菜单的net子菜单都会有相关的内容推送回复。
大家可以扫一扫我的微信测试号哦。
然后在自己服务器的c盘下的log文件夹,查看日志。我自己关注,发了一些文字,图片,语音。参考内容如下图。
在服务器的日志文档里都清楚的记录了每一个手机端的操作。现在是不是感觉挺好玩的,加油