陪你听风

公众号接收与回复图片,语音,图文消息等操作

电脑版发表于:2019/12/13 16:19

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.nethttp://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文件夹,查看日志。我自己关注,发了一些文字,图片,语音。参考内容如下图。



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





 

关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢