企业微信开发:接受消息和发送消息

2023-11-19

简介: 本篇博文是针对本人在开发企业微信消息交互的一些经验分享,介绍一下自己开发过程中遇到的问题和解决方法,如果问题或异议,欢迎讨论,技术大佬请忽略

用户在企业微信中有2种用户操作可以发送给我们服务器

1、点菜微信企业应用的菜单

2、给企业微信发送文字或者图片等信息

企业微信要接受到用户行为(比如对企业号发消息或者点击企业号中的菜单)需要再对应的企业微信应用中配置接受消息模块:

1、首先进入企业微信配置接受消息

2、配置对应的URL,Token以及EncodingAESKey:

在后台编写程序解析用户行为操作并回复用户不同消息

1、接受微信发过来的加密报文解析用户行为操作

 public void ProcessRequest(HttpContext context)
        {

            var Request = context.Request;
            var Response = context.Response;
            context.Response.ContentType = "text/plain";
            //context.Response.ContentType = "text/xml";
            //公众平台上开发者设置的token, corpID, EncodingAESKey
            string sCorpID = System.Configuration.ConfigurationManager.AppSettings["sCorpID"];

            string sToken = "";
            string sEncodingAESKey =  "";
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);

            string sVerifyMsgSig = Request.QueryString["msg_signature"];
            string sVerifyTimeStamp = Request.QueryString["timestamp"];
            string sVerifyNonce = Request.QueryString["nonce"];
            string sVerifyEchoStr = Request.QueryString["echostr"] ?? "";
            int ret = 0;
            string sEchoStr = "";
            //获取表单提交内容
            string postStr = string.Empty;
            using (System.IO.StreamReader sr = new System.IO.StreamReader(Request.InputStream))
            {
                postStr = sr.ReadToEnd();
            }
            if (!string.IsNullOrEmpty(postStr))
            {
                var xmldoc = new XmlDocument();
                xmldoc.LoadXml(postStr);
                XmlNode root = xmldoc.FirstChild;
                string sPostData = root["Encrypt"].InnerText;
                ret = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, postStr, ref sEchoStr);
                if (ret != 0)
                {
                    SH.Utilities.Base.Log.LogHelper.Info("WeChat", "ERR: VerifyURL fail, ret: " + ret);
                    return;
                }

                //封装请求类
                XmlDocument requestDocXml = new XmlDocument();
                requestDocXml.LoadXml(sEchoStr);
                XmlElement rootElement = requestDocXml.DocumentElement;
                WxXmlModel WxXmlModel = new WxXmlModel();
                WxXmlModel.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
                WxXmlModel.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
                WxXmlModel.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
                WxXmlModel.MsgType = rootElement.SelectSingleNode("MsgType").InnerText;
                WxXmlModel.AgentID = rootElement.SelectSingleNode("AgentID").InnerText;
                WxXmlModel.CompanyId = companyid;

                switch (WxXmlModel.MsgType)
                {
                    case "text"://文本
                        WxXmlModel.Content = rootElement.SelectSingleNode("Content").InnerText;
                        break;
                    case "image"://图片
                        WxXmlModel.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
                        break;
                    case "event"://事件
                        WxXmlModel.Event = rootElement.SelectSingleNode("Event").InnerText;
                        if (WxXmlModel.Event == "click")//菜单点击
                        {
                            WxXmlModel.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;
                            SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
                        }
                        break;
                    default:
                        break;
                }

                string sReplyMsg = ResponseXML(WxXmlModel);//回复消息
                ret = wxcpt.EncryptMsg(sReplyMsg, sVerifyTimeStamp, sVerifyNonce, ref sEchoStr);
                if (ret != 0)
                {
                    return;
                }
                Response.Write(sEchoStr);
                Response.End();
                return;
            }
            else
            {
                string sEncryptMsg = "";
                ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEncryptMsg);
                if (ret != 0)
                {
                    SH.Utilities.Base.Log.LogHelper.Info("", "ERR: VerifyURL fail, ret: " + ret);
                    Response.Write("");
                    Response.End();
                    return;
                }
                Response.Write(sEncryptMsg);
                Response.End();
                return;
            }
        }

2、根据不同用户行为操作做不同的消息类型回复

private string ResponseXML(WxXmlModel WxXmlModel)
{
	string XML = "";
	switch (WxXmlModel.MsgType)
	{
		case "text"://文本回复
			//批号查询
			if (SH.WebApp.Extension.Utilities.IsBatchNumber(WxXmlModel))
			{
				WxXmlModel.EventKey = "BatchNumber_Search";
				XML = SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
			}
			//流转卡查询
			else if (SH.WebApp.Extension.Utilities.IsTransferCard(WxXmlModel))
			{
				WxXmlModel.EventKey = "TransferCard_Search";
				XML = SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
			}
			//默认自动回复
			else
			{
				XML = ResponseMessage.GetText(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.Content);
			}
			break;
		case "event":
			switch (WxXmlModel.Event)
			{
				//点击菜单
				case "click":
					if (string.IsNullOrEmpty(WxXmlModel.EventKey))
					{
						XML = SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
					}
					break;
				case "SCAN":
					XML = ResponseMessage.ScanQrcode(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.EventKey);//扫描带参数二维码已关注 直接推送事件
					break;
			}
			break;
		default://默认回复
			break;
	}
	return XML;
}

3、图文消息发送,更多格式请查阅企业微信开发API:https://work.weixin.qq.com/api/doc#90000/90135/90236

SH.Business.ReportModule.Financial FinancialBLL = new Business.ReportModule.Financial();
var url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}", Access_Token.GetAccessToken(WxXmlModel.AgentID));
Hashtable ht = new Hashtable();
ht["touser"] = WxXmlModel.FromUserName;
ht["toparty"] = "";
ht["totag"] = "";
ht["msgtype"] = "news";
ht["agentid"] = WxXmlModel.AgentID;

Hashtable news = new Hashtable();
List<Hashtable> articles = new List<Hashtable>();
Hashtable mianArticle = new Hashtable();
mianArticle["title"] = "财务对账";
mianArticle["url"] = "";
mianArticle["picurl"] = WebURL + "/Content/image/Financial_Reconciliation.jpg";
articles.Add(mianArticle);
string sSalesNo = SH.Business.Utilities.GetSalespower(WxXmlModel.FromUserName);
var list = FinancialBLL.Financial_Reconciliation(WxXmlModel.CompanyId, sSalesNo);
foreach (var items in list)
{
	Hashtable article = new Hashtable();
	article["title"] = string.Format("对账期间:{0}\r应收开票:{1}万米 {2}万元", SH.Business.Utilities.DateFormat(items["dReceivableDate"].ToString()), items["nQty"], items["nAmount"]);
	article["description"] = "";
	article["url"] = WebURL + "/Query/Financial/InvoiceByCompany?iCompanyId=" + WxXmlModel.CompanyId + "&date=" + items["dReceivableDate"] + "&AgentId=" + WxXmlModel.AgentID;
	articles.Add(article);
}
news["articles"] = articles;
ht["news"] = news;

string responseText = HttpHelper.Instance.post(url, ht.ToJson());

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

企业微信开发:接受消息和发送消息 的相关文章

随机推荐

  • 2022深圳福田区专精特新小巨人企业申报条件,补贴50万

    深圳福田区专精特新小巨人企业申报后 可获得50万补贴 需要申报认证及补贴的企业 在中华人民共和国境内工商注册登记 连续经营3年以上并具有独立法人资格的中小企业 想要申报的企业 都需要在了解规则条件的基础上才能提前做好准备 用华夏泰科进行便捷
  • 华为OD机试 - 统计射击比赛成绩(Java)

    题目描述 给定一个射击比赛成绩单 包含多个选手若干次射击的成绩分数 请对每个选手按其最高3个分数之和进行降序排名 输出降序排名后的选手ID序列 条件如下 一个选手可以有多个射击成绩的分数 且次序不固定 如果一个选手成绩少于3个 则认为选手的
  • C语言中 error: expected ‘;‘, ‘,‘ or ‘)‘ before ‘&‘ token 解决方法

    问题描述 近期发现包括我在内的很多同学在用DEV C 编译的时候会出现 error expected or before token 这个如下图的错误提示 很多同学很不解 和其他人比较代码后 明明就没有错呀 为什么呢 经过查找相关资料 其实
  • 机器学习——高斯过程

    高斯过程 所谓高斯 即高斯分布 所谓过程 即随机过程 高斯分布 一维高斯 p x N
  • MATLAB代码:考虑P2G和碳捕集设备的热电联供综合能源系统优化调度模型

    MATLAB代码 考虑P2G和碳捕集设备的热电联供综合能源系统优化调度模型 关键词 碳捕集 综合能源系统 电转气P2G 热电联产 低碳调度 参考文档 Modeling and Optimization of Combined Heat an
  • 魅族7.0系统手机最简单激活Xposed框架的流程

    对于喜欢研究手机的朋友而言 常常会使用到XPOSED框架及种类繁多功能极强的模块 对于5 0以下的系统版本 只要手机能获得root权限 安装和激活XPOSED框架是异常轻易的 但随着系统版本的不断迭代 5 0以后的系统 激活XPOSED框架
  • Xray和burpsuite联动被动扫描

    想挖点src又没啥思路 试着挂个自动漏扫工具xray 又看到能与burp联动实现自动扫就想尝试一下 搞好进自己网站测试了一下 的确是爬虫式漏扫 访问量属实大 不过自己设置设置还是一个很不错的工具 安装配置 是在ddosi org这里找的破解
  • 经典问题(20)天平与砝码问题

    题目 如果有砝码序列 1 3 9 27 81 243 729 我们至少可以称量1000以内的所有整数重量 比如 5 9 3 1 即 9 放入对侧盘 3 1 放入同侧盘 再比如 19 27 9 1 编程的目标是 给定一个重量 求 天平称重时
  • Acwing-4729. 解密

    如果dt小于0 或者r不是整数 或者m r是奇数的话 m 2 与 m 2 的奇偶性相同 那么方程无解 输出NO include
  • 三进制计算机基本原理,三进制(三进制计算机)

    如题 越详细越好 最好再举个例子 十进制转任何进制都是采用整数除n取余倒序排列 小数乘n取整顺序排列的方法 比如 32 12 转 三进制 整数部分 32除以3商10余210除以3商3余13除以3商1余01除以3商 十进制数换三进制短除三 三
  • java_web:基于三层架构实现学生信息管理1.0(对学生信息的增删改查)

    学生信息管理1 0 涉及的知识点 三层架构理论 简单理解三层架构就是 上层调用下层 下层为上层提供服务 最上层 视图层 由jsp servlet组成 中间层 服务层 组装数据访问层所实现的功能 最下层 数据访问层 实现单一得某项功能 为服务
  • CSS常用样式

    目录 引入CSS样式的三种方式 内联 行内 样式 内部样式表 外部样式表 基础选择器 标签选择器 标签 各种样式 类选择器 类名 各种样式 id选择器 id号 各种样式 字体样式 font 文本样式 鼠标样式 cursor 背景样式 bac
  • MySql保留两位小数

    1 格式化小数函数format x d format 函数会对小数部分进行四舍五入操作 整数部分从右向左每3位一个逗号进行格式化输出 三位小数 整数 不足两位的情况 0 001的情况 2 随机函数ROUND X D 三位小数 整数 不足两位
  • Python03-pytest框架

    Python03 pytest测试框架 pytest简介 支持参数化可以细分控制测试用例 支持简单的单元测试和复杂的功能测试 还支持selenium appium等自动化测试 接口自动化测试 支持第三方插件 可以自定义扩展 pytestht
  • Centos7下安装Zookeeper

    一 配置java环境 1 安装JDK yum install y java 1 8 0 openjdk 2 查看版本 root zookeeper java version openjdk version 1 8 0 362 OpenJDK
  • Python3.6读取excel指定数据并根据邮件列表群发

    python3 6版本 python下载地址 https www python org getit excel 工作簿名 shuju xlsx 会上传附件 sheet表1名称 数据 sheet表2名称 邮箱 请下载附件后填上正确的邮箱 实现
  • dev c++ 配置openGL

    折腾了一早上 总算成功了 亲测有效 参考了很多博客 但是都不完整 现把解决方案分享如下 WINDOWS配置 确保你的WINDOWS SYSTEM32文件下有如下文件 glu32 dll glut32 dll glut dll opengl3
  • 实训八 利用三层交换机实现不同VLAN间通信

    原理 在交换网络中 通过VLAN对一个物理网络进行了逻辑划分 不同的VLAN之间是无法直接访问的 必须通过三层的路由设备进行连接 一般利用路由器或三层交换机来实现不同VLAN之间的互相访问 三层交换机和路由器具备网络层的功能 能够根据数据的
  • python使用scipy.stats检验正态分布

    from scipy import stats import numpy as np np random seed 1 x stats norm rvs loc 0 scale 1 size 100 print list x 夏皮罗一威尔克
  • 企业微信开发:接受消息和发送消息

    简介 本篇博文是针对本人在开发企业微信消息交互的一些经验分享 介绍一下自己开发过程中遇到的问题和解决方法 如果问题或异议 欢迎讨论 技术大佬请忽略 用户在企业微信中有2种用户操作可以发送给我们服务器 1 点菜微信企业应用的菜单 2 给企业微