本篇讲解微信客户端向公众号发送视频和小视频的处理方式。

视频消息常见应用:

在线教学;

基于公众号的定向类型小视频应用,类似于抖音、快手,但不用再安装app;

视频剪辑、特效添加,比如美颜;

其它视频类应用等等。

用户发送的视频和小视频,经微信服务器处理后,形成如下XML格式发到你的服务器:

视频:

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[video]]></MsgType><MediaId><![CDATA[media_id]]></MediaId><ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId><MsgId>1234567890123456</MsgId>
</xml>

小视频:

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[shortvideo]]></MsgType><MediaId><![CDATA[media_id]]></MediaId><ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId><MsgId>1234567890123456</MsgId>
</xml>

从上面两段可以看出,只有MsgType有所不同(video和shortvideo),其它都是一样的,所以本篇文章只给出处理视频消息的源码,处理小视频的完全一样,自行复制一份再做自己的应用开发即可。

在接收到微信服务器发来的内容之后,首先由指定的接口网页AccessWx.aspx对信息类型进行判别,然后交给指定的消息处理类处理和回应。在本系列文章第1篇介绍的AccessWx.aspx.cs中完善下面这一段,增加本篇给出的视频、小视频消息处理环节。

         else if(MsgType == "video"){//对用户发送的视频消息处理,使用QinMing.Weixin.MessageHandlerVideo命名空间下的VideoMessageDeal类VideoMessageDeal vmd = new VideoMessageDeal();Response.Write(vmd.DealResult(weixinXML));}else if(MsgType == "shortvideo"){//对用户发送的小视频消息处理,使用QinMing.Weixin.MessageHandlerShortVideo命名空间下的ShortVideoMessageDeal类ShortVideoMessageDeal svmd = new ShortVideoMessageDeal();Response.Write(svmd.DealResult(weixinXML));}

在命名空间QinMing.Weixin.MessageHandlerVideo下新建一个类VideoMessageDeal,用来处理微信服务器发来的视频消息;在命名空间QinMing.Weixin.MessageHandlerShortVideo下新建一个类ShortVideoMessageDeal,用来处理微信服务器发来的小视频消息。记得类源码文件要放在App_Code目录下!下面是视频消息处理源码:
QinMingWeixinMessageHandlerVideo.cs文件内容如下:

using System;
using System.Web;
using System.Xml;
using System.Text;
using System.IO;
using System.Net;
using QinMing.Config;
using QinMing.Weixin.ReturnContent;
using QinMing.WeixinContainer;
//using QinMing.WeixinSendTemplateMessage;
//using QinMing.Tools;namespace QinMing.Weixin.MessageHandlerVideo
{//视频消息处理public class VideoMessageDeal :System.Web.UI.Page{public string DealResult(string weixinXML){string content = DealVideo(weixinXML);  return content;}public string DealVideo(string weixinXML){XmlDocument doc = new XmlDocument();doc.LoadXml(weixinXML);XmlNodeList list = doc.GetElementsByTagName("xml");XmlNode xn = list[0];string FromUserName = xn.SelectSingleNode("//FromUserName").InnerText;   //关注用户的加密后openidstring ToUserName = xn.SelectSingleNode("//ToUserName").InnerText;       //公众微信号原始IDstring MsgType = xn.SelectSingleNode("//MsgType").InnerText;string MediaId = xn.SelectSingleNode("//MediaId").InnerText.ToString().Trim();string ThumbMediaId = xn.SelectSingleNode("//ThumbMediaId").InnerText.ToString().Trim();string strresponse = "";//保存用户发来的视频文件,并把发送记录写入数据库用于后期分析//保存文件之前最好先给微信服务器一个响应,防止视频文件过大保存时间过长,strresponse回复时微信服务器报错string ResultVideoUrl = DownloadFileByMediaId(FromUserName, MediaId, ThumbMediaId); //引用QinMing.Weixin.ReturnContent命名空间下的ReturnMsg类来生成固定格式的回应消息ReturnMsg rm = new ReturnMsg();strresponse = rm.ReturnText(FromUserName, ToUserName, "<a href='" + ResultVideoUrl + "'>点击这里查看您刚发的视频</a>");//strresponse = rm.ReturnVideo(FromUserName, ToUserName, "V8SCW337lwx0dCkfeacnGVi5Tj4qGyhl2vbv8WpGNEwRgkmpYa1MCyiEEF8MqQTN", "视频标题", "您刚发的视频");   //如果使用ReturnVideo返回,这里的第三个参数mediaid必须是通过接口上传素材生成的,否则会报错//告知客服人员有新的留言,或者启动客服消息管理工单流程//QinMingWeixinSendTemplateMessage SendTempMsg = new QinMingWeixinSendTemplateMessage();//SendTempMsg.SendTempMsgRemind("管理员的openid", "客户发送视频", "");  return strresponse; }//使用MediaId加基础access_token从微信服务器下载视频文件public string DownloadFileByMediaId(string FromUserName, string MediaId, string ThumbMediaId){//获取普通基础access_tokenQinMingWeixinContainer wc = new QinMingWeixinContainer();string access_token = wc.GetAccessToken();string imgurl = "";string TmpDir = "E:\\Web\\Video\\Upload\\";string TmpFileName = FromUserName + DateTime.Now.Ticks.ToString() + ".";string TmpExtName = "";string strUrl = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=" + access_token + "&media_id=" + MediaId; var q = HttpWebRequest.Create(strUrl).GetResponse();var s = q.GetResponseStream();var b = new BinaryReader(s);//QinMingTools.WriteLog("Headers", q.Headers.ToString());   //微信服务器返回的Headers中包含文件名以及后缀名,可以使用正则表达式取后缀名//QinMingTools.WriteLog("Headers里面的内容之一", q.Headers["Content-disposition"]);string tmpext = q.Headers["Content-disposition"];TmpExtName = tmpext.Substring(tmpext.LastIndexOf(".") + 1, (tmpext.Length - tmpext.LastIndexOf(".") - 2));    //这里用取字符串子串方式取出文件后缀名var file = TmpDir + TmpFileName + TmpExtName;FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write);fs.Write(b.ReadBytes((int)q.ContentLength), 0, (int)q.ContentLength);fs.Close();b.Close();s.Close();return "http://www.yourweb.com/Video/Upload/" + TmpFileName + TmpExtName;//此处可以添加用户发视频保存到数据库记录处理,用于对粉丝进行行为分析,以及使用客户发送的视频文件}}
}

头两篇文章在介绍下载语音和图片时,考虑篇幅原因没判断下载文件的后缀名,都是自己指定的格式,但实际使用中可能会碰到用户发送的媒体格式和你指定的不一致的情况。

所以上面代码给出了使用微信服务器响应GET请求后给出的Headers内包含的信息来判断文件类型及后缀名,我们可以看到Headers中包含了Content-disposition字段,有清晰的后缀名。下面通过取日志文件给出一个例子:

2022-04-19 00:29:15.573 Headers : Connection: keep-alive
Content-disposition: attachment; filename="GEI3kHQyI5kAg3cYQkuL1AV2hA_jnTdvTkFI3s_tGtrbuDi9QwYhOtnuENUNzYUk.mp4"
Content-Length: 405874
Cache-Control: no-cache, must-revalidate
Content-Type: video/mpeg4
Date: Mon, 18 Apr 2022 16:29:15 GMT

演示结果如下:

如果想不点击链接而直接查看视频,需要通过素材管理接口生成素材并取得MediaId,然后发送给微信用户即可,这在后续关于素材管理的篇幅中讲解。

实例:用C#.NET手把手教你做微信公众号开发(6)--普通消息处理之视频、小视频相关推荐

  1. 实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式

    在做线上.线下销售时,可以使用微信便捷支付,通过微信公众号收款有很多种收款方式,如下图: 今天我们来讲一下jsapi支付,场景就是在微信内打开某个页面,完成在线支付,同样一个网页,使用微信打开就是js ...

  2. 实例:用C#.NET手把手教你做微信公众号开发(21)--使用微信支付线上收款:H5方式

    在做线上.线下销售时,可以使用微信便捷支付,通过微信公众号收款有很多种收款方式,如下图: 今天我们来讲一下H5场景支付,使用手机浏览器打开就是H5方式,最常见的推广是短信内置链接,这种场景需要调用微信 ...

  3. 实例:用C#.NET手把手教你做微信公众号开发(22)--网页里通过OAuth获取用户openid

    第一篇:理论 如果一个用户并未关注某个公众号,只是在微信内打开了公众号web服务器上的某个网页,要如何获取用户的openid以及用户的微信信息,以便实现业务逻辑呢?本篇讲述网页授权OAuth获取微信用 ...

  4. 实例:用C#.NET手把手教你做微信公众号开发(3)--普通消息处理之图片

    本着简短.便于理解应用的原则,本系列文章每次只讲一个公众号知识点,给出一个应用实例,通过一个知识点帮助你掌握公众号一类应用的开发方法. 上一篇我们掌握了微信客户端.微信服务器.你的服务器之间的信息互动 ...

  5. 实例:用C#.NET手把手教你做微信公众号开发(19)--使用微信支付转账到微信粉丝零钱账户

    公众号给微信用户支付费用的方式有很多种,最常用的是发红包和转账到零钱账户,上一篇文章详细讲解了使用发红包的过程,从公众号内的配置,到微信支付的配置,再到具体的类实现. 本篇主要讲解转账到零钱,具体的类 ...

  6. 实例:用C#.NET手把手教你做微信公众号开发(13)--事件消息处理之取消关注

    一.取消关注事件 用户在取消关注公众号时,微信会把这个事件推送到开发者填写的URL,方便开发者做帐号的解绑等处理. <xml><ToUserName><![CDATA[t ...

  7. 实例:用C#.NET手把手教你做微信公众号开发(12)--带参数二维码裂变推广

    为什么能裂变推广是营销学和心理学的范畴了,这里举个简单的例子来介绍.公众号有足以吸引粉丝的地方,要么是知识.要么是优惠.要么是服务,反正不同于其他人,能够吸引人关注:有了这个前提,怎么让更多的人知道这 ...

  8. 实例:用C#.NET手把手教你做微信公众号开发(11)--生成带参数二维码

    上一篇讲了普通关注的各种情景,接下来准备详细讲解带参数的二维码的应用实例.在下一篇详解之前,这里先介绍一下如何下载二维码.生成二维码表,为后续的应用做好准备. 为了满足用户渠道推广分析和用户帐号绑定等 ...

  9. 实例:用C#.NET手把手教你做微信公众号开发(10)--事件消息处理之关注公众号(普通关注)

    一.事件消息种类 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后 ...

最新文章

  1. osi七层协议和tcp/ip四层协议
  2. 通信网络设计(最小生成树+图的联通)
  3. 在 Java 应用程序中使用 Elasticsearch: 高性能 RESTful 搜索引擎和文档存储快速入门指南
  4. 北航计算机应用基础 统考,北航10秋学期《计算机应用基础》模拟题.doc
  5. C# 网络编程之webBrowser乱码问题及解决知识
  6. 逃离裁员:程序员在云时代的生存之道
  7. 详解分布式协调服务 ZooKeeper
  8. 【收集】11款Linux数据恢复工具
  9. **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...
  10. django 1.8 官方文档翻译: 2-5-6 多数据库
  11. Netty : netty 4如何解决空轮询bug
  12. 1015. 德才论 (25)-PAT乙级真题
  13. 找到指针的奇数位置 c语言,(ppt)【C语言程序设计】上机作业2010.ppt
  14. 学习笔记——正则匹配方法整理
  15. C在mac上用不了malloc.h头文件的解决方法
  16. 新版gsp计算机系统全套资料,新版GSP对计算机系统的需求表
  17. Qt5/6使用FFmpeg进行视频格式转换的两种方式
  18. 这是我网店的链接欢迎来看看
  19. 程序员是年轻人最向往的职业,突然觉得我们这个职业立马高大上了
  20. 如何修改CAD制图时光标尺寸大小?

热门文章

  1. 利用Windows ADK工具制作winPE镜像并集成相关驱动
  2. 【什么是蜂窝移动网络】
  3. vc++实现基于内容的图像检索系统(一)
  4. H5的视频解决方案(2) —— chrome自动播放问题
  5. vue之实现记事本功能
  6. RIBCHECKIBIN
  7. 如何使用Stringify为孩子的PC游戏设置时间限制
  8. ART世界探险(18) InlineMethod
  9. 诗经 - 小雅 - 皇皇者华
  10. RTOS原理与实现01:RTOS基础知识