tnblog
首页
视频
资源
登录

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

4392人阅读 2019/12/13 16:19 总访问:400888 评论:0 收藏:0 手机
分类: 微信公众号

everyday

tnblog

 在路上,我们生命得到了肯定,一路上,我们有失败也有成功,有泪水也有感动,有曲折也有坦途,有机遇也有梦想。一路走来,我们熟悉了陌生的世界,我们熟悉了陌生的面孔,遇人无数,匆匆又匆匆,有些成了我们忘不掉的背影,有些成了我们一生的风景。我笑,便面如春花,定是能感动人的,任他是谁。


  今天我们主要讲解的内容是:微信公众号的接收与回复文本,图片,语音,图文消息内容等等系列操作(实则是对于Xml的写入和读取操作)


   第一步:虽然是一个小小的操作,但是没有它,后面内容都无法完成的。就是在测试号管理处配置测试号的路径和token,如图:

 

 

  如果报错:配置失败,则是我们后台需要重新配置生成token,然后回传服务器,后台代码如下:

  1.  //新的公众号都要先配置token才能使用
  2.         //配置微信公众号的token
  3.         public ActionResult Index(string echostr)
  4.         {
  5.             Response.Write(echostr);
  6.             Response.End();
  7.             return View(echostr);
  8.         }

  注释:url:为自己注册服务器时发的短信里的ip地址,token:可随意设置。提示配置成功即可。

  注意:更改代码后要本地发布项目,然后把最新数据更换到服务器上,手机上才有效果哦。


  下面就是程序的后台代码部分啦。

   第一步:我们可以在类库的工具类封装一个写微信推送消息的日志的方法,来记录开发过程语句。代码如下:

   

  1.  //写微信推送消息的日志
  2.    public class log
  3.     {
  4.         public static void Write(string content, string type, string remark)
  5.         {
  6.             string name = DateTime.Now.ToShortDateString().Replace("/""-") + ".txt";
  7.             //创建文件流写推送消息日志  地址为服务器的C盘的新建文件夹log
  8.             using (FileStream fileStream = new FileStream("c:/log/" + name, FileMode.Append))
  9.             {
  10.                 //写入
  11.                 using (StreamWriter streamWriter = new StreamWriter(fileStream))
  12.                 {
  13.                     streamWriter.WriteLine("消息内容:" + content);
  14.                     streamWriter.WriteLine("消息类型:" + type);
  15.                     streamWriter.WriteLine("消息备注:" + remark);
  16.                     streamWriter.WriteLine("消息时间:" + DateTime.Now);
  17.                     streamWriter.WriteLine("--------------------------------------------------------------");
  18.                 }
  19.             }
  20.         }
  21.     }

第二步:根据微信公众号开发文档,我们需要在项目里新建一个类,封装推送回复消息的多个方法,代码如下。

  1.  public class SendMsgTools
  2.     {
  3.         //计算时间差的方法
  4.         public static long GetWxTime()
  5.         {
  6.             //设置初始时间
  7.             DateTime start = new DateTime(1970, 1, 1);
  8.             //获取当前时间,距开始时间的秒数
  9.             long cur = (long)(DateTime.Now - start).TotalSeconds;
  10.             return cur;
  11.         }
  12.         //回复文本消息
  13.         public static string SendMsg(string toUser, string fromUser, string content)
  14.         {
  15.             string xml = string.Format(@"<xml>
  16.                                     <ToUserName><![CDATA[{0}]]></ToUserName>
  17.                                     <FromUserName><![CDATA[{1}]]></FromUserName>
  18.                                     <CreateTime>{2}</CreateTime>
  19.                                     <MsgType><![CDATA[text]]></MsgType>
  20.                                     <Content><![CDATA[{3}]]></Content>
  21.                                     <MsgId>1234567890123456</MsgId>
  22.                                     </xml>", fromUser, toUser, GetWxTime(), content);
  23.             xml = xml.Trim();
  24.             return xml;
  25.         }
  26.         //回复图片
  27.         public static string SendMsgImg(string toUser, string fromUser, string media_id)
  28.         {
  29.             string xml = string.Format(@"<xml>
  30.                                     <ToUserName><![CDATA[{0}]]></ToUserName>
  31.                                     <FromUserName><![CDATA[{1}]]></FromUserName>
  32.                                     <CreateTime>{2}</CreateTime>
  33.                                     <MsgType><![CDATA[image]]></MsgType>
  34.                                     <Image>
  35.                                     <MediaId><![CDATA[{3}]]></MediaId>
  36.                                    </Image>
  37.                                   
  38.                                     </xml>", fromUser, toUser, GetWxTime(), media_id);
  39.             xml = xml.Trim();
  40.             return xml;
  41.         }
  42.         //回复语音消息
  43.         public static string SendMsgVoice(string toUser, string fromUser, string media_id)
  44.         {
  45.             string xml = string.Format(@"<xml>
  46.                                     <ToUserName><![CDATA[{0}]]></ToUserName>
  47.                                     <FromUserName><![CDATA[{1}]]></FromUserName>
  48.                                     <CreateTime>{2}</CreateTime>
  49.                                     <MsgType><![CDATA[voice]]></MsgType>
  50.                                     <Voice>
  51.                                     <MediaId><![CDATA[{3}]]></MediaId>
  52.                                    </Voice>                      
  53.                                     </xml>", fromUser, toUser, GetWxTime(), media_id);
  54.             xml = xml.Trim();
  55.             return xml;
  56.         }
  57.         //回复图文消息
  58.         public static string SendMsgNews(string toUser, string fromUser)
  59.         {
  60.             string xml = string.Format(@"<xml>
  61.                                     <ToUserName><![CDATA[{0}]]></ToUserName>
  62.                                     <FromUserName><![CDATA[{1}]]></FromUserName>
  63.                                     <CreateTime>{2}</CreateTime>
  64.                                     <MsgType><![CDATA[news]]></MsgType>
  65.                                     <ArticleCount>2</ArticleCount>
  66.                                     <Articles>
  67.                                     <item>
  68.                                         <Title><![CDATA[精品文章解析]]></Title>
  69.                                         <Description><![CDATA[关于在mvc框架里对Excel表的导入,导出操作]]></Description>
  70.                                         <PicUrl><![CDATA[http://image.tnblog.net/banner18.jpg]]></PicUrl>
  71.                                         <Url><![CDATA[http://www.tnblog.net/xj/article/details/2265]]></Url>
  72.                                     </item>
  73.                                     <item>
  74.                                         <Title><![CDATA[NET mvc Excel的导入导出解析]]></Title>
  75.                                         <Description><![CDATA[讲解的内容是关于在mvc框架里对Excel表的导入,导出操作]]></Description>
  76.                                         <PicUrl><![CDATA[http://www.tnblog.net/arcimg/15985459135/1cc73d90588d4cd5860ffa27cd4ba5d5.jpeg]]></PicUrl>
  77.                                         <Url><![CDATA[www.tnblog.net/15985459135/article/details/2938]]></Url>
  78.                                     </item>
  79.                                     </Articles>                  
  80.                                     </xml>", fromUser, toUser, GetWxTime());
  81.             xml = xml.Trim();
  82.             return xml;
  83.         }
  84.     }

   注释:推送回复消息的的模块是参照微信开发文档写入,详情可参照开发文档,方便解读本文章。

   思路:我们每个方法都需要服务器数据-->控制器-->回传数据


   第三步,就是控制器定义参数,做一系列逻辑判断操作,然后回传数据,手机扫码查看效果。

    调用封装的推送消息的方法,在home控制器里进行判断逻辑操作,代码如下:

     

  1.    public ActionResult Index()
  2.         {
  3.             try
  4.             {
  5.                 //接收微信推送的xml
  6.                 StreamReader streamReader = new StreamReader(Request.InputStream);
  7.                 string xml = streamReader.ReadToEnd();
  8.                 log.Write(xml, """记录微信推送服务内容");
  9.                 //xml取值
  10.                 XElement root = XElement.Parse(xml);
  11.                 //取出发送者
  12.                 string FromUserName = root.Element("FromUserName").Value;
  13.                 //取出开发者微信号
  14.                 string ToUserName = root.Element("ToUserName").Value;
  15.                 //取出消息类型
  16.                 string MsgType = root.Element("MsgType").Value;
  17.              
  18.                 string result = "";
  19.                 //判断文本消息
  20.                 if (MsgType.ToLower() == "text")
  21.                 {
  22.                     //取出消息内容
  23.                     string Content = root.Element("Content").Value;
  24.                     if (Content == "yan")  //关键字回复
  25.                     {
  26.                         result = SendMsgTools.SendMsgNews(ToUserName, FromUserName);  //判断图文消息推送
  27.                     }
  28.                     else
  29.                     {
  30.                         result = SendMsgTools.SendMsg(ToUserName, FromUserName, Content);
  31.                     }
  32.                 }
  33.                
  34.                 //判断处理点击菜单拉取消息时的事件推送
  35.                 else if (MsgType.ToLower() == "event")
  36.                 {
  37.                     //取出事件推送消息
  38.                     string Event = root.Element("Event").Value;
  39.                     //处理点击事件
  40.                     if (Event == "CLICK")
  41.                     {
  42.                         string EventKey = root.Element("EventKey").Value;
  43.                         if (EventKey == "wx_menu_mui" || EventKey == "wx_menu_vue")
  44.                         {
  45.                             result = SendMsgTools.SendMsgNews(ToUserName, FromUserName);
  46.                         }
  47.                         else
  48.                         {
  49.                             result = SendMsgTools.SendMsg(ToUserName, FromUserName, "暂时不支持该事件类型");
  50.                         }
  51.                     }
  52.                    
  53.                 }
  54.                 //判断图片消息
  55.                 else if (MsgType.ToLower() == "image")
  56.                 {
  57.                     //取出图片id
  58.                     string MediaId = root.Element("MediaId").Value;
  59.                     result = SendMsgTools.SendMsgImg(ToUserName, FromUserName, MediaId);
  60.                 }
  61.                 //判断语音消息
  62.                 else if (MsgType.ToLower() == "voice")
  63.                 {
  64.                     //取出语音id
  65.                     string MediaId = root.Element("MediaId").Value;
  66.                     result = SendMsgTools.SendMsgVoice(ToUserName, FromUserName, MediaId);
  67.                 }
  68.                 else
  69.                 {
  70.                     result = SendMsgTools.SendMsg(ToUserName, FromUserName, "暂时不支持该消息类型");
  71.                 }
  72.                 log.Write(result, """生成的xml");
  73.                 Response.Write(result);
  74.                 Response.End();
  75.             }
  76.             catch (Exception ex)
  77.             {
  78.                 log.Write(ex.Message, """哎呀报错了");
  79.             }
  80.             return View();
  81.         }

     

  好啦,基本操作就着这些了。最后一步就是发布项目,然后把数据更新到自己服务器上就行了。

  以上操作完成后,我们就可以扫一扫,发点文本内容,图片,语音,点击菜单的net子菜单都会有相关的内容推送回复。


大家可以扫一扫我的微信测试号哦。

  然后在自己服务器的c盘下的log文件夹,查看日志。我自己关注,发了一些文字,图片,语音。参考内容如下图。



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





 

评价

使用 微软自带语音合成类库

//引入语音合成名称空间 usingSystem.Speech.Synthesis; classA { voidtest1() { //实例化并指定字符串播放合成读音 ...

C语音播放的崎岖之路

最近由于工作中需要语音读取消息文本,达到现场通知效果,故而研究了下C#语音播放功能:开始崎岖之路BEGIEN:首先测试,写...

人工智能语音方面的理解

语音识别:让电脑可以把语音转化成文字语义理解:让电脑能够听懂语音语音合成:可以把文字转化成语音,也就是可以让机器说话

c windows sdk科大讯飞语音合成

只是记录一下思路需要把c++的dll转换成c#用的dll可以用这种方式导入,需要把下载的sdk,放到bll

微信公众号语音录入

页面注入如下接口开始录音接口startRecord停止录音接口 stopRecord 监听录音自动停止接口onVoiceRecordEnd播放语音接口play...

vue 播放 .amr 语音文件

安装 npm install benz-amr-recorder引入importBenzAMRRecorderfrom&quot;benz-amr-recorder&quot;;//实例化 varamr=newBen...
你之所以觉得时间一年比一年过得快,是因为时间对你一年比一年重要。
排名
13
文章
64
粉丝
20
评论
30
MUI框架页面间的传值指针
XingDy姐 : 不错哦
MUI框架页面间的传值指针
剑轩 : 接口的真实地址可以用xx/yy什么的代替哦,真实地址还是隐藏一下好
.NET EF 用户按钮权限
YOU : 可以,在写文章的时候,有需要写代码的地方,可以选择编辑器上的代...
.NET EF 用户按钮权限
剑轩 : 哈哈哈哈,你这个追女生的逻辑
EF三种模式解析
剑轩 : 好文采!
重要sql语句和linq,lamdba分组条件查询语句
剑轩 : 开头那句诗句写得很好哇!
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
煩い!煩い!煩い!