C# 企业微信:开启消息接受接收消息推送消息
前言:微信吧!接触的人都会100%各种踩坑,就算同样东西去年做过,今年来一样踩坑,因为太多你稍微不记得一点点的细节就能让你研究N久。为此,我要把这个过程详细的记录下来。
一、开启消息接受
1.拿到企业corpId,应用的Token,EncodingAESKey
2.这界面先别关,拿到 Token,EncodingAESKey后,建个接口
鉴于公司系统的架构类型,我这里创建的是一个aspx文件,代码如下:
public partial class request_WxMsgApi : System.Web.UI.Page
{protected void Page_Load(object sender, EventArgs e){//开启消息接受if (Request.HttpMethod.ToUpper() == "GET"){string signature = HttpContext.Current.Request.QueryString["msg_signature"];string timestamp = HttpContext.Current.Request.QueryString["timestamp"];string nonce = HttpContext.Current.Request.QueryString["nonce"];string echostr = HttpContext.Current.Request.QueryString["echostr"];string decryptEchoString = "";WXBizMsgCrypt wxcpt = new WXBizMsgCrypt("your token", "your EncodingAESKey", System.Configuration.ConfigurationManager.AppSettings["Corpid"]);int ret = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref decryptEchoString);if (ret != 0){//有错误的话记录日志//WriteLogFile("ERR: VerifyURL fail, ret: " + ret);}HttpContext.Current.Response.Write(decryptEchoString);HttpContext.Current.Response.End();return;}
}
}
注意:WXBizMsgCrypt类和Cryptography类,到微信官方下载即可:链接
3.写完代码,将文件更新到服务器,让这个 aspx文件能外网访问。然后再在
把这个aspx文件的链接填上去,若能正常返回,这里就会保存成功,若不能那就得再去补坑了....
二、接收消息
上面已经与微信那边打通了接口,接下来就是要正真接受消息了。开启消息是get请求,而正式使用接受消息则微信是post数据过来,所以 接口打通之后上面那些代码就没用了,因为数据传输模式和处理模式都不一样了。
我这里的接收消息,会把各种类型的文件存到数据库或者服务器,非文本的则存到服务器,放个路径到数据库
代码如下:
public partial class request_WxMsgApi : System.Web.UI.Page
{protected void Page_Load(object sender, EventArgs e){byte[] btHtml = Request.BinaryRead(Request.ContentLength);string strHtml = System.Text.Encoding.Default.GetString(btHtml);//接受消息if (Request.HttpMethod.ToUpper() == "POST"){string token = "your token";//从配置文件获取Tokenstring encodingAESKey = "your EncodingAESKey";//从配置文件获取EncodingAESKeystring corpId = System.Configuration.ConfigurationManager.AppSettings["corpid"];//从配置文件获取corpIdstring signature = HttpContext.Current.Request.QueryString["msg_signature"];string timestamp = HttpContext.Current.Request.QueryString["timestamp"];string nonce = HttpContext.Current.Request.QueryString["nonce"];string decryptEchoString = "";WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);int ret = wxcpt.DecryptMsg(signature, timestamp, nonce, strHtml, ref decryptEchoString);if (ret == 0){//WriteLogFile("ERR: VerifyURL fail, ret: " + ret);if (!string.IsNullOrEmpty(decryptEchoString)){try{XmlDocument doc = new XmlDocument();doc.LoadXml(decryptEchoString);XmlNode root = doc.FirstChild;var msgType = root["MsgType"].InnerText;//voice(MediaId),video(MediaId),text(Content),image(PicUrl),if (msgType == "voice" || msgType == "video" || msgType == "text" || msgType == "image"){var msgId = root["MsgId"].InnerText;var fromuser = root["FromUserName"].InnerText;var timesend = root["CreateTime"].InnerText;//时间戳DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));long lTime = long.Parse(timesend + "0000000");TimeSpan toNow = new TimeSpan(lTime);var cTime = dtStart.Add(toNow);var content = "";switch (msgType){case "voice":content = root["MediaId"].InnerText;break;case "video":content = root["MediaId"].InnerText;break;case "text":content = root["Content"].InnerText;break;case "image":content = root["PicUrl"].InnerText;break;default:break;}string sql = "insert into T_CmpWxMsg([MsgId],[MsgType],[FromUser],[CreateTime],[Content]) values(@MsgId,@MsgType,@FromUser,@CreateTime,@Content)";DataHelper.ExecuteNonQuery(sql, new System.Data.SqlClient.SqlParameter[]{new System.Data.SqlClient.SqlParameter("@MsgId", msgId),new System.Data.SqlClient.SqlParameter("@MsgType", msgType),new System.Data.SqlClient.SqlParameter("@FromUser", fromuser),new System.Data.SqlClient.SqlParameter("@CreateTime", cTime),new System.Data.SqlClient.SqlParameter("@Content", content)}, conString);//WriteLogFile("存入数据库成功" + cTime);//异步任务-检索未下载的媒体文件System.Threading.Tasks.Task.Factory.StartNew(() =>{//WriteLogFile("异步任务开始");try{//拉取媒体源文件string sql_ = "select ID,Content,MsgType from T_CmpWxMsg WHERE ISNULL(MediaSavePath,'')='' and MsgType in ('voice','video')";var mediaList = DataOperation.DataCenter.ExecuteReader(sql_, Base.ConString, new object[] { });foreach (var item in mediaList){string corpsecret = System.Configuration.ConfigurationManager.AppSettings["corpsecret"];//你的应用对应的secrectstring tocken = Base.GetCorpToken(corpsecret, corpId).Access_Token;//拿取tocken,注意有效时间,最好用缓存控制string url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}", tocken, item.Content);string upfile = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"file\wxMaterial");if (!System.IO.Directory.Exists(upfile))System.IO.Directory.CreateDirectory(upfile);string filePath = upfile + "\\" + item.Content + (item.MsgType == "voice" ? ".amr" : ".mp4");WebClient client = new WebClient();client.DownloadFile(url, filePath);//更新存储的物理路径string updatesql = "update T_CmpWxMsg set MediaSavePath = '" + (@"\file\wxMaterial\" + item.Content + (item.MsgType == "voice" ? ".amr" : ".mp4")) + "' where ID='" + item.ID + "'";DataHelper.ExecuteNonQuery(updatesql, Base.ConString);}}catch (Exception ex) {//WriteLogFile("异步任务执行出错:" + ex.Message);}});}}catch (Exception ex){// WriteLogFile("程序异常:" + ex.Message);}finally{//WriteLogFile("解密消息内容:" + decryptEchoString);HttpContext.Current.Response.Write(decryptEchoString);HttpContext.Current.Response.End();}}}}}
}
注意:这里用到的WXBizMsgCrypt类,在上面有提到可以到官方下载。
三、发送消息
string msg = "你好!<a href=\"https://blog.csdn.net/u012847695/article/details/102936505\">点这里查看</a>";
//按部门发送
//item = new { toparty = "438|439|471", msgtype = "text", agentid = "8", text = new { content = msg }, safe = "0" };
//按人发送
dynamic item = new { touser = "wanger|liuer", msgtype = "text", agentid = "你的应用对应的agentid", text = new { content = msg }, safe = "0" };
var body = Base.DataToJson(item);
var corpsecret = System.Configuration.ConfigurationManager.AppSettings["corpsecret"];
string tocken = Base.GetCorpToken(corpsecret).Access_Token;//获取token,注意有效时间,可用缓存控制
string url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}", tocken);
var result = Base.InfoPost(url, body);//post request 请求
JavaScriptSerializer js = new JavaScriptSerializer();
IDictionary obj = js.DeserializeObject(result) as IDictionary;
post请求代码
public static string InfoPost(string url, string body){HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));request.Timeout = 30000;//30秒request.Method = "POST";byte[] payload = System.Text.Encoding.UTF8.GetBytes(body);Stream writer = request.GetRequestStream();writer.Write(payload, 0, payload.Length);writer.Close();HttpWebResponse response = (HttpWebResponse)request.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8"));var result = reader.ReadToEnd();return result;}
下次来写个支付的,自己写的看得懂点,不然每次才坑都要各种百度查资料
以上纯属个人独自研究成果,仅供参考,转载请注明出处
C# 企业微信:开启消息接受接收消息推送消息相关推荐
- PHP7.0微信公众平台开发4: 实例一:接收普通消息和接收事件推送
PHP7.0微信公众平台开发4: 实例一:接收普通消息和接收事件推送 1. API接口的声明 2. PHP脚本代码 3. 运行结果 由于消息类型有多钟,本文中,"接收普通消息"我以 ...
- 微信小程序之发送通知消息(通过openid推送消息给用户)
微信小程序之发送通知消息(通过openid推送消息给用户) 一.获取access_token access_token是接口调用的凭证,目前有效期为两个小时,需要定时刷新,重复获取将导致上次获取的ac ...
- 小程序消息主动推送php,微信小程序有几种推送消息的方式
微信小程序有5种推送消息的方式,分别为:1.小票机订单提醒,实现对商家的消息提醒:2.短信提醒:3.模板消息,各种动态可及时掌握:4.公众号订单提醒:5.消息主动推送,商家主动出击.推销自己的最好手段 ...
- 企业微信SDK接口API调用-触发推送企业微信微信好友
企业微信SDK接口API调用-触发推送企业微信微信好友 /** * 触发企业微信推送微信好友列表 * @author wechat:happybabby110 * @bl ...
- 企业微信推送消息延迟_企业微信发送应用消息,员工无法接收到推送消息。
请求消息体:[touser=18666211235,toparty=,totag=,agentid=1000040,msgtype=text,content=,media_id=,title=,des ...
- 微信公众号开发C#系列-7、消息管理-接收事件推送
1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...
- Java给特定用户发通知_微信公众平台向特定用户推送消息
最近研究微信公众平台,这里整理了一下向特定用户推送消息的思路 一.首先需要将微信的openid与系统用户绑定. 在用户关注公众平台的时候,回复一个链接,要求用户绑定,可以设计如下消息进行回复,(ope ...
- 关于微信小程序uniapp版的推送消息
1.按钮触发推送消息 <button type="primary" size="mini" @tap="pushMesage"> ...
- iOS 当APP接收到推送消息时,对推送消息进行处理
结合最近做的项目来总结一下,在我们接收到推送通知后我们将要怎么处理这条推送消息,也为以后再做相关推送的时候能够更快处理. 首先要说明两个概念:本地通知和远程推送.本地通知是由本地应用触发的,接收会比较 ...
- uniapp如何使用微信小程序的订阅信息推送消息给用户?
1.首先获取小程序用户登录openId // 获取openidasync opid() {let self = thiswx.login({success(res) {if (res.code) { ...
最新文章
- Linux分区的认识
- GTA 5真香!哦不,我在用深度学习做自动驾驶
- java设计模式---抽象工厂模式
- 企业信息管理- 近期功能改善(3)
- @EqualsAndHashCode()注解详解
- app android de,Android Deobfuscation
- 如何在graphpad表示出正负误差_Graphpad Prism:SCI科研论文中误差连线图怎么做
- 职场新鲜人必读:那些被“误读”的真经
- Java 程序设计基础知识
- GT-P3110如何root
- html word 分页
- gradle报错this sometimes occurs after a network connection timeout.解决
- 云和人工智烈日当头,华为HPC解决方案如何应对?
- 华为云Stack深度驱动金融行业智能化升级
- 在JDBC中使用预编译Statement 以及它的优点
- r语言随机森林_随机森林+时间序列(R语言版)
- 台式计算机的CPU上安装有小风扇,台式电脑cpu风扇安装教程
- javascript css(层叠样式表)
- matlab2016泰勒,matlab泰勒逼近
- jQuery 判断 checkbox 是否被选中的几种方法
热门文章
- 图解java虚拟机_分享java虚拟机原理图解
- 如何解决Word只能用安全模式打开
- 结合盒子模型,发布一张你的卡片
- 最后采用加权求和的方式得到样本的_论文阅读笔记《Principal characteristic networks for few-shot...
- 263企业邮箱imap服务器,263企业邮箱实现IMAP邮箱搬家功能
- 计算机专业对口升学考哪些科目,对口升学考试科目
- 入学吉他选购,有哪些适合初学者入门的吉他品牌推荐?
- 微擎弹出确认授权获取用户头像
- Android NCNN识别文字(OCR)
- 安徽师大附中%你赛day9 T2 富 解题报告