企业微信开发者,提供的第三方接口DEMO。

企业号需要下载微信提供的加解密文件,里面加解密就是调用下载的cs帮助类。

顺便提示下:接口的地址好像不可以MVC模式的地址,我尝试的时候接收不到参数。

如:http://xxxx/Control/Action  这个地址可以做验证URL,但是接收不到数据,微信直接报错

最后只能改成带后缀的:http://xxxx/xxxx/xx.ashx  或者xx.aspx

开发思路:一个接口里面区分get和post请求,get请求是绑定到企业号的时候用,post是微信接收消息时候用

get:获取微信参数,拿到之后实现加密对比,然后返回一个字符参数,代表验证成功

post:获取微信给的XML,然后再返回一个XML字符串就行。不做任何消息回复就给他返回success

返回代码用这个就行:

HttpContext.Current.Response.Write(XML);
HttpContext.Current.Response.End();

企业微信参考资料:

验证URL

https://jingyan.baidu.com/article/154b46319f1c6e68ca8f4180.html

接收消息和回复

https://jingyan.baidu.com/article/39810a233e9d5ef637fda66b.html

公众号的参考:

验证URL

https://jingyan.baidu.com/article/8cdccae9a6ca9f715413cdf3.html

接收消息和回复

https://jingyan.baidu.com/article/f3ad7d0fa077ce49c3345be0.html

using Message.Web.Api.Open.Model;
using Message.Web.Api.Open.Util;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.SessionState;
using System.Xml;namespace Message.Web.Api.Open
{/// <summary>/// API 的摘要说明/// </summary>public class API : IHttpHandler, IRequiresSessionState{private static string post_data = "";public void ProcessRequest(HttpContext context){context.Response.ContentType = "text/plain";#region 获取调试日志if (context.Request.QueryString["log"] == "1"){context.Response.Write(post_data);context.Response.End();}#endregionif (context.Request.HttpMethod.ToLower() == "post"){//接收消息ReceiveXml();}else{//验证配置,微信第一次验证走GET斤这里CheckWechat();}}private void ReceiveXml(){Stream requestStream = System.Web.HttpContext.Current.Request.InputStream;byte[] requestByte = new byte[requestStream.Length];requestStream.Read(requestByte, 0, (int)requestStream.Length);string requestStr = Encoding.UTF8.GetString(requestByte);post_data += "得到数据:" + requestStr + "<br/>";string corpId = ConfigurationManager.AppSettings["WXCorpId"];string access_token = ConfigurationManager.AppSettings["WXToken"];string encodingAESKey = ConfigurationManager.AppSettings["WXEncodingAESKey"];string signature = HttpContext.Current.Request.QueryString["msg_signature"].ToString();string timestamp = HttpContext.Current.Request.QueryString["timestamp"].ToString();string nonce = HttpContext.Current.Request.QueryString["nonce"].ToString();Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(access_token, encodingAESKey, corpId);//解密后的requestStrint error = wxcpt.DecryptMsg(signature, timestamp, nonce, requestStr, ref requestStr);post_data += "解密结果:" + error + "<br/>";post_data += "解密数据:" + requestStr + "<br/>";WxXmlModel WxXmlModel = new WxXmlModel();#region 封装请求类//封装请求类XmlDocument requestDocXml = new XmlDocument();requestDocXml.LoadXml(requestStr);XmlElement rootElement = requestDocXml.DocumentElement;WxXmlModel.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;WxXmlModel.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;WxXmlModel.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;WxXmlModel.MsgType = rootElement.SelectSingleNode("MsgType").InnerText;switch (WxXmlModel.MsgType){case "text"://文本WxXmlModel.Content = rootElement.SelectSingleNode("Content").InnerText;break;case "event"://事件WxXmlModel.Event = rootElement.SelectSingleNode("Event").InnerText;//按钮点击事件if (WxXmlModel.Event == "taskcard_click"){WxXmlModel.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;WxXmlModel.TaskId = rootElement.SelectSingleNode("TaskId").InnerText;WxXmlModel.AgentId = rootElement.SelectSingleNode("AgentId").InnerText;}break;default:break;}#endregion//返回ResponseXML(WxXmlModel, wxcpt, timestamp, nonce);}private void ResponseXML(WxXmlModel WxXmlModel, Tencent.WXBizMsgCrypt wxcpt, string timestamp, string nonce){string XML = "success";#region 逻辑处理switch (WxXmlModel.MsgType){case "text"://文本回复//XML = GetText(WxXmlModel.ToUserName, WxXmlModel.FromUserName, WxXmlModel.Content);break;case "event"://文本回复if (WxXmlModel.Event == "taskcard_click"){}break;default://默认回复break;}#endregionpost_data += "返回数据:" + XML + "<br/>";int error = wxcpt.EncryptMsg(XML, timestamp, nonce, ref XML);post_data += "返回结果:" + error + "<br/>";//把结果返回给微信HttpContext.Current.Response.Write(XML);HttpContext.Current.Response.End();}public static string GetText(string FromUserName, string ToUserName, string Content){string XML = ReText(FromUserName, ToUserName, Content);//switch (Content)//{//    case "关键字"://        XML = ReText(FromUserName, ToUserName, "关键词回复测试");//        break;//    case "单图文"://        XML = ReArticle(FromUserName, ToUserName, "测试标题", "测试详情——百度搜索链接", "http://pic.cnblogs.com/avatar/743013/20150521120816.png", "http://www.baidu.com");//        break;//    default://        XML = ReText(FromUserName, ToUserName, "无对应关键字");//        break;//}return XML;}////// 回复文本////// 发送给谁(openid)/// 来自谁(公众账号ID)/// 回复类型文本/// 拼凑的XMLpublic static string ReText(string FromUserName, string ToUserName, string Content){string xml = "<xml>";xml += "<ToUserName><![CDATA[" + ToUserName + "]]></ToUserName>";xml += "<FromUserName><![CDATA[" + FromUserName + "]]></FromUserName>";xml += "<CreateTime>" + GetCurrentTimeUnix() + "</CreateTime>";xml += "<MsgType><![CDATA[text]]></MsgType>";xml += "<Content><![CDATA[" + Content + "]]></Content>";xml += "</xml>";//"" + Content + "0";//回复内容 FuncFlag设置为1的时候,自动星标刚才接收到的消息,适合活动统计使用return xml;}public static string GetCurrentTimeUnix(){TimeSpan cha = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)));long t = (long)cha.TotalSeconds;return t.ToString();}////// 返回随机数表示验证成功///private void CheckWechat(){if (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["echoStr"])){HttpContext.Current.Response.Write("消息并非来自微信");HttpContext.Current.Response.End();}string echoStr = "";if (CheckSignature(ref echoStr)){HttpContext.Current.Response.Write(echoStr);HttpContext.Current.Response.End();}}////// 验证微信签名///////// * 将token、timestamp、nonce三个参数进行字典序排序/// * 将三个参数字符串拼接成一个字符串进行sha1加密/// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。private bool CheckSignature(ref string echoStr){string corpId = ConfigurationManager.AppSettings["WXCorpId"];string access_token = ConfigurationManager.AppSettings["WXToken"];string encodingAESKey = ConfigurationManager.AppSettings["WXEncodingAESKey"];string signature = HttpContext.Current.Request.QueryString["msg_signature"].ToString();string timestamp = HttpContext.Current.Request.QueryString["timestamp"].ToString();string nonce = HttpContext.Current.Request.QueryString["nonce"].ToString();string echostr = HttpContext.Current.Server.UrlDecode(HttpContext.Current.Request.QueryString["echostr"].ToString());Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(access_token, encodingAESKey, corpId);//解析之后的明文echoStr = "";int ret = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref echoStr);return ret == 0;}private static string SHA1Hash(string value){SHA1 sha1 = new SHA1CryptoServiceProvider();byte[] bytes_sha1_in = UTF8Encoding.Default.GetBytes(value);byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);string str_sha1_out = BitConverter.ToString(bytes_sha1_out);str_sha1_out = str_sha1_out.Replace("-", "");return str_sha1_out;}public bool IsReusable{get{return false;}}}
}

ASP.NET 企业微信:URL验证、接收消息、回复消息、消息加解密相关推荐

  1. 对接企业微信4:接收消息与事件

    关于接收消息 为了能够让自建应用和企业微信进行双向通信,企业可以在应用的管理后台开启接收消息模式. 开启接收消息模式的企业,需要提供可用的接收消息服务器URL. 开启接收消息模式后,用户在应用里发送的 ...

  2. 如何通过企业微信、飞书、钉钉消息通知接收双因子认证动态密码?

    使用宁盾双因子认证H5令牌的用户每次登录时要切回到企业微信.飞书.钉钉工作台中,找到H5令牌小程序,点进去看动态码.记住或复制动态码后再切回登录界面输入验证. 路径合理,但实际使用场景下不够便捷.用户 ...

  3. 【.net】通过企业微信web api给指定用户发送消息

    前言 在很多业务场景中经常会遇到与微博微信进行通信的需求,今天就和大家一起研究一下如果通过企业微信web api给指定用户发送消息 一.创建应用 1.打开企业微信并登录 https://work.we ...

  4. SAP ABAP 添加企业微信群机器人并调用 API 发送消息

    SAP ABAP 添加企业微信群机器人并调用 API 发送消息 引言: 这篇文章以我在个人开源项目"任务管理服务(ZTASK)"中的应用为例,通过讲述使用企业微信机器人实现任务的通 ...

  5. 基于Java实现企业微信群聊机器人-文件上传+消息推送(保证可用)

    基于Java实现企业微信群聊机器人-文件上传+消息推送 1.pom.xml(注意版本尽量保持一致) 2.文件工具类 3.企业微信请求类 4.企业微信响应类 5.发送方法 6.企业微信机器人创建和配置 ...

  6. 教程: nodejs 做微信公众号开发,回复 xml 消息

    教程: nodejs 做微信公众号开发,回复 xml 消息 首先需要你的后台跟服务器已经可以建立连接,这个不再冗述看官方教程就好 接入指南 .此篇介绍的是如何获取用户发来的信息,并回复它. 一.接收 ...

  7. 公众号php怎么限制回复次数,刚刚上线!打破微信公众号48小时回复粉丝消息限制!...

    原标题:刚刚上线!打破微信公众号48小时回复粉丝消息限制! 众所周知微信公众号一直以来和粉丝的关系是比较封闭的,除了订阅号每日一次的推送,服务号每月四次的推送外,公众号很难主动联系粉丝. 如果粉丝没有 ...

  8. 微信企业号接入JDK6和JDK7及JDK8加解密失败处理(Java)

    微信企业号接入JDK6和JDK7及JDK8加解密失败处理(Java) 使用文章 http://blog.csdn.net/omsvip/article/details/39926493 提供的接入代码 ...

  9. 【企业微信实现免密登录以及发送消息(企业内部应用)】

    创建应用: 首先是注册企业微信,没有企业信息个人也能注册,个人注册企业微信后无法认证,如果有开发第三方应用的需求就必须进行企业认证,如果只是开发企业内部应用,则无需注册也OK. 这里需要注意一下可见范 ...

最新文章

  1. sap 教学视频网址
  2. spring 通过工厂方法配置Bean
  3. lambda表达式的使用 || Lambda Express 口诀: 拷贝小括号,写死右箭头,落地大括号||default || @FunctionalInterface||静态方法实现
  4. ImportBeanDefinitionRegistrar向容器中注册bean
  5. dojo.publish 和 dojo.subscribe
  6. java 输出全部小写_输入小写,输出大写,为什么报错?
  7. Spring Boot笔记-目前对Web后端开发的认识
  8. DxO PhotoLab 5 for mac(raw图片处理软件)
  9. 芝士超人复活卡软件多线程版本
  10. 无人机——磁力计/电子罗盘 学习及校准
  11. Python画一个中国地图玩玩
  12. turtle(海龟)库的使用
  13. 二十五、Java中的网络编程
  14. 一个设想:什么是真正的云,及利用树莓派和cloudwall打造你的真正云中心
  15. linux线程详解:线程概念、线程调度、线程安全、线程模型
  16. React Native 手势触摸事件机制详解(基础篇)
  17. Openwrt+WR703N 折腾笔记
  18. 我与数据仓库那些事-数据模型
  19. php漂亮显示数据库页面,通过PHP读取mysql数据库数据,在页面展示
  20. 如何在vue中引入阿里巴巴矢量图标库里面的图标

热门文章

  1. 关于用DELPHI开发服务器软件中的一些经验
  2. Docker 容器数据卷基本概念
  3. 【7】Django网页视图模板处理
  4. 书论40 欧阳修《试笔》
  5. STM32——TIM输入捕获
  6. K折交叉验证的深入理解
  7. 企业所得税这么缴纳,会涉及虚假申报?各位老板注意了
  8. 动态内存分配——经典笔试题
  9. openFoam代码读懂笔记
  10. Pygame:提高游戏的颜值1