分类:
微信公众号
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文件夹,查看日志。我自己关注,发了一些文字,图片,语音。参考内容如下图。

在服务器的日志文档里都清楚的记录了每一个手机端的操作。现在是不是感觉挺好玩的,加油
50010702506256