微信企业号开发2--消息回复

微信企业号开发—开发模式的开启 首先说微信企业号的开发模式分为:编辑模式(普通模式)和开发模式(回调模式),在编辑模式下,只能做简单的自定义菜单和自动回复消息,要想实现其他功能还得开启开发者模式。 一、编辑模式和开发模式对消息的处理流程  1.编辑模式下,所有的业务流程都配置在微信服务器上,由它处理   2.开发模式,消息通过第三方服务器处理,最后经过微信服务器把消息发送给用户        开发模式能处理的消息 阅读详情

1.说明:

普通消息是指成员向企业号应用发送的消息,包括文本、图片、语音、视频、地理位置等类型。普通消息会推送到每个应用在管理端设置的URL(以下假设该URL为http://api.3dept.com)。

  • 请求说明

Http请求方式: POST

http://api.3dept.com/?msg_signature=ASDFQWEXZCVAQFASDFASDFSS&timestamp=13500001234&nonce=123412323

文本类消息的参数列表,其他的见官方文档

参数说明
ToUserName企业号CorpID
FromUserName成员UserID
CreateTime消息创建时间(整型)
MsgType消息类型,此时固定为:text
Content文本消息内容
MsgId消息id,64位整型
AgentID企业应用的id,整型。可在应用的设置页面查看

2.步骤:

1)使用输入流获得正文,对消息进行处理和解密获得明文,得到如下xml的字符串

text消息

<xml>
   <ToUserName><![CDATA[toUser]]></ToUserName>
   <FromUserName><![CDATA[fromUser]]></FromUserName> 
   <CreateTime>1348831860</CreateTime>
   <MsgType><![CDATA[text]]></MsgType>
   <Content><![CDATA[this is a test]]></Content>
   <MsgId>1234567890123456</MsgId>
   <AgentID>1</AgentID>

</xml>


2)解析得到的xmlStr,得到一个hashmap,判断消息类型,返回相应的文本信息

3)将想要反馈的文本信息转成xmlStr,将该字符串写入response

3.相应代码

1)接受请求的servlet

/**
     * 解析post提交的数据,并转交给处理程序
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    	request.setCharacterEncoding("UTF-8");
    	response.setCharacterEncoding("UTF-8");
    	String respStr=CoreService.processRequest(request);
    				response.getWriter().print(respStr);
    }
2)处理类CoreService

package com.baosight.wechat.service;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Map;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

import com.baosight.wechat.message.resp.TextMessage;
import com.baosight.wechat.message.util.MessageUtil;
import com.qq.weixin.mp.aes.WXBizMsgCrypt;

public class CoreService {

	public static String processRequest(HttpServletRequest request) {
		String sEncryptMsg = null;
		try {
			String respContent = "请求处理异常,请稍后尝试!";

			// 解密postDate
			// 微信加密签名
			
			// 使用输入流获得正文
			ServletInputStream in = request.getInputStream();
			BufferedReader reader = new BufferedReader(
					new InputStreamReader(in));
			String sReqData = "";
			String itemStr = "";// 作为输出字符串的临时串,用于判断是否读取完毕
			while (null != (itemStr = reader.readLine())) {
				sReqData += itemStr;
			}
			// 对消息进行处理获得明文
			WXBizMsgCrypt wxcpt;
			String sMsg = null;
			String sReqMsgSig = request.getParameter("msg_signature");
			// 时间戳
			String sReqTimeStamp = request.getParameter("timestamp");
			// 随机数
			String sReqNonce = request.getParameter("nonce");
			String sToken = MessageUtil.RESP_MESSAGE_TOKEN;// 回调配置的TOKEN
			String sCorpID = MessageUtil.RESP_MESSAGE_CORPID;// 回调提供的sCorpID
			String sEncodingAESKey = MessageUtil.RESP_MESSAGE_ENCODINGAESKEY;// 回调配置的AESKey
			wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
			sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce,
					sReqData);
			// 输出解密后的文件
			System.out.println("******************after decrypt msg: " + sMsg);

			// 回复消息

			Map<String, String> requestMap = MessageUtil.parseXml(sMsg);
			String fromUserName = requestMap.get("FromUserName");
			String toUserName = requestMap.get("ToUserName");
			String msgType = requestMap.get("MsgType");
			System.out.println("fromUserName:" + fromUserName + "--toUserName:"
					+ toUserName + "--msgType" + msgType);
			// 回复文本消息
			TextMessage textMessage = new TextMessage();

			textMessage.setToUserName(fromUserName);
			textMessage.setFromUserName(toUserName);
			textMessage.setCreateTime(new Date().getTime());
			textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
			textMessage.setFuncFlag(0);

			if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
				respContent = "您发送的是文本消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
				respContent = "您发送的是图片消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
				respContent = "您发送的是地理位置消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
				respContent = "您发送的是链接消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
				respContent = "您发送的是音频消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
				// 触发事件
				String eventType = requestMap.get("Event");
				if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
					respContent = "谢谢您的关注!";
				} else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
					// 取消关注
				} else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
					// 自定义菜单
				}
			}
			textMessage.setContent(respContent);
			String sRespData = MessageUtil.textMessageToXml(textMessage);
			System.out.println(sRespData);
			sEncryptMsg = wxcpt.EncryptMsg(sRespData,
					Long.toString(new Date().getTime()), sReqNonce);
			return sEncryptMsg;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return sEncryptMsg;
	}
}
3)将xml转成相应的hashmap

 public static Map<String, String> parseXml(String xmlStr) throws Exception {
    	// 将解析结果存储在HashMap中
    	Map<String, String> map = new HashMap<String, String>();

    	// 从request中取得输入流
    	InputStream inputStream=new ByteArrayInputStream(xmlStr.getBytes());
//    	InputStream inputStream = xmlStr.getInputStream();
    	// 读取输入流
    	SAXReader reader = new SAXReader();
    	Document document = reader.read(inputStream);
    	// 得到xml根元素
    	Element root = document.getRootElement();
    	// 得到根元素的所有子节点
    	List<Element> elementList = root.elements();

    	// 遍历所有子节点
    	for (Element e : elementList)
    		map.put(e.getName(), e.getText());

    	// 释放资源
    	inputStream.close();
    	inputStream = null;

    	return map;
    }
4)加密解密相应方法查看微信官方提供的源码





python实现企业微信机器人,自动回复消息 企业微信机器人的自动回复通常涉及到两个方面:接收消息和发送回复。您可能需要设置一个Web服务来监听企业微信发送到您的回调URL的HTTP POST请求。这通常涉及到更复杂的服务器端编程,例如使用 Flask 或 Django。通常这是通过向企业微信的API发送一个GET请求完成的。首先,您需要在企业微信的管理后台注册您的应用,并获取必要的凭证,例如企业ID(CorpID)和应用的Secret。根据您具体的需求和业务逻辑,您可能需要对上述步骤进行调整和扩展。,用于发送HTTP请求。 阅读详情

相关推荐

微信企业号消息推送系统实现指南

定时任务是计算机系统中执行周期性或一次性任务的机制。它们允许系统在预定的时间执行特定的操作,无需用户介入。在消息推送系统中,定时任务扮演着至关重要的角色,它能够确保消息在特定的时间节点准确无误地发送给用户。Windows任务计划程序是一个功能丰富的工具,允许用户创建、管理和监控自动运行的计划任务。它不仅支持基本的定时任务,还可以处理复杂的任务依赖关系和条件。软件测试是保证应用程序质量的关键环节,它涵盖了从识别需求直到维护的整个软件开发生命周期。

weixin_33298352的博客 1723

企业微信自建应用开发回调事件实现方案(工作总结)

企业微信自建应用回调事件实现方案:高度解耦,高效解决方案

qq_45774406的博客 3257

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码)

项目名称(本质:栈溢出攻击)【源码在文首】和lab1一样,此题又是美国卡耐基梅隆大学的平时作业哈哈哈! 项目要求是把栈溢出,强行更改函数返回值,输出0xdeadbeef。

2301_79586491的博客 1544

xml文档的「?xml version=“1.0“ encoding=“UTF-8“?」 的作用?

<?xml version="1.0" encoding="UTF-8"?> 的作用? version="1.0"声明用的xml版本是1.0 encoding="UTF-8"声明用xml传输数据的时候的字符编码,假如文档里面有中文,编码方式不是UTF-8,传输过去再解码的话中文就会是乱码 ...

digitalkee的博客 1万+

Ta-Lib源码解析(三):蜡烛图指标 (Candlestick Indicator) #(附Python重构代码和示意图)(补充中)

蜡烛图指标为识别K线形态的指标,笔者认为重点在于定义方式所提供的思路,背后的投资逻辑可以借鉴但不建议直接参考文档的翻译内容和源码逻辑存在不一致的现象,笔者分别列出中文百科中的定义和源码实际逻辑,供大家参考技术分析理论中的一些模糊词,ta-lib中给出了精确的定义源码

量化就是探索生活 3254

浅谈python反序列化漏洞

0x01 python序列化与反序列化 Python 的序列化和反序列化是将一个类对象向字节流转化从而进行存储和传输,然后使用的时候再将字节流转化回原始的对象的一个过程。python中的序列化操作是通过pickle模块,而该模块主要包含l dumps将dict转化为str格式,loads将str格式转化为dict格式。 dump和load与文件操作结合起来, pickle.dump(obj, f...

Lethe's Blog 3220

企业微信应用模板消息

发送企业微信模板消息,需要应用上线审核后才能调试。

json_li的博客 3609

华硕电脑Win10改Win7系统:BIOS设置详解

通过上述步骤,华硕电脑用户可以将系统从Windows 10更改为Windows 7。虽然这个过程可能涉及一些技术细节和潜在的风险(如数据丢失和驱动不兼容),但只要按照指南仔细操作并做好准备工作,大多数用户应该能够成功完成系统回滚。请记住,在进行任何系统更改之前都要备份重要数据,并确保已了解所有潜在的风险和限制。希望本文能够帮助到需要回滚到Windows 7的华硕电脑用户!

nntxthml的博客 2262

超详细 企业微信推送(所有东西都可推送)

最近在研究推送每日课表,一开始是使用 微信公众号接口测试号 来推送的,但是现在公众号消息展示改了,不会显示在消息列表,而是隐藏在“订阅号消息”里面,不仔细看都看不到,很容易被忽略,如下图:所以就一直在找其他方法,想到了企业微信 - 可以显示在微信消息主页,且提醒很明显,如下图。下面讲两种方法进行推送。效果示例。

m0_64130892的博客 4万+

faster lio 回环 加入GTSAM优化的记录

对Faster lio 加入回环、gtsam优化,在室外建图遇到的问题和过程

Nico_jion的博客 2599

Verilog HDL 100道面试题及参考答案

在 Verilog HDL 中,参数(parameter)和宏定义(define)都可用于定义常量,但它们存在诸多不同之处。参数(parameter)是模块内部的常量定义,具有局部性。它在模块内部起作用,不同模块可以有同名的参数,且值可以不同。参数通常用于定义模块的一些配置信息,例如数据位宽、延迟时间等。参数的定义和使用是在模块的作用域内进行的,通过参数传递可以方便地对模块进行配置。endmodule在上述代码中,WIDTH是一个参数,用于定义加法器的位宽。通过改变WIDTH。

大模型大数据攻城狮的专栏 1734

企业微信之微信接收消息(“暂不支持此消息类型”解决方案)

如果企业微信接收的消息想要在微信端接收,可以通过如下设置: 找到“企业微信接收消息的组” -> 右下角“齿轮” -> 新消息通知 -> “仅在企业微信中接收消息” -> 关闭掉“会话消息”和“应用消息”。 【注意事项】 1、如果“仅在企业微信中接收消息”没有,需要到“企业微信”网站,找到“我的企业”->“微信插件”->“邀请关注”,扫描二维码即可。 2、如果测试在企业微信能够收到消息,但是微信里提示“暂不支持此消息类型 请在企业微信中查看”,原因是你发送的消息的类

hacker0825的博客 3万+

Oracle EBS AP发票被预付款核算创建会计科目时间超长

在客户职能部门的水电、通信和物业等费用统一管理或对接部门报销时,用户将所有费用分摊到各个末级部门,导致AP发票行数高达上千行。这引发了以下问题:1)用户过账时,创建会计科目的请求执行超过20小时未完成,只能手动取消;2)取消请求后,系统一直处于回滚状态;3)通过SQL脚本分析,发现预付发票核销分配行表记录数量庞大,单笔AP发票记录高达90多万条,类似发票共有5笔。

陈显平的专栏-Oracle EBS 352

微信公众号开发(一)

开发前首先我们要知道一些概念 各公众号区别: 1、订阅号:为媒体和个人提供一种信息传播方式,主要偏于为用户传达资讯(类似报纸杂志),主要的定位是阅读,每天可以群发1条消息; 2、服务号:为企业,政府或组织提供对用户进行服务,主要偏于服务交互(类似银行提供服务查询),每个月只可群发4条消息; 3、企业号:为企业,政府,事业单位,实现生产管理和协作运营的移动化,主要用于公司内部通讯使用,旨在为用户提...

CoderZS的博客 1633

ZYNQ microblaze boot.bin固化步骤

一,ZYNQ移植软核的原理FPGA规模巨大而且功能复杂,因此设计的每一个部分都从头开始是不切实际的。一种解决的办法是:对于较为通用的部分可以重用现有的功能模块,而把主要的时间和资源用在设计中的那些全新的、独特的部分。这就像是你在开发应用程序的时候就不用直接去写驱动物理硬件的代码,而是直接调用Windows提供的API就行了。

wangjie36的博客 2782

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# 微信企业号--接收普通消息与事件

将应用设置在回调模式时,企业可以通过回调URL接收成员回复的消息,以及成员关注、点击菜单、上报地理位置等事件。 在接收到事件后,企业可以发送被动响应消息,实现成员与企业的互动。

蓝思创工作室知识库 3470

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

简介: 本篇博文是针对本人在开发企业微信消息交互的一些经验分享,介绍一下自己开发过程中遇到的问题和解决方法,如果问题或异议,欢迎讨论,技术大佬请忽略 用户在企业微信中有2种用户操作可以发送给我们服务器 1、点菜微信企业应用的菜单 2、给企业微信发送文字或者图片等信息 企业微信要接受到用户行为(比如对企业号发消息或者点击企业号中的菜单)需要再对应的企业微信应用中配置接受消息模块: ...

搬砖狗-小强的专栏 8861

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

企业微信接收信息服务器全代码,微信企业号的消息和事件的接收处理及解密

在上篇随笔介绍了有关企业号的消息发送,官方特别声明消息是不用加密发送的。但是在回调的服务器上,也就是我们网站的服务器上,微信传过来的消息是加密的,需要我们调用类库对消息和事件进行解密操作,由于官方的例子不全,因此摸索了不少时间,最终顺利解密收到的各种消息和事件。本文主要介绍 微信企业号的消息和事件的接收处理及解密操作。1、企业号回调模式的设置和公众号一样,微信企业号如果需要进行二次开发,也是需要在...

weixin_29655399的博客 3838

java的spring boot版本企业微信接入与自动回复消息

1、准备工作 我们需要把我们自己的服务通过内网映射工具映射出去让外网能够访问到我们的服务。 具体可参考我的这一篇文章:

笙箫的博客 5501

Python结合NLP技术实现企业微信机器人自动进行消息回复

结合自然语言处理(NLP)技术,可以实现更智能的多模态消息处理。

记录点滴 2650

企业微信 + 豆包新模型:企业微信API对接文档【可向微信用户发消息】

本文介绍了一套基于企业微信API和豆包大模型的智能自动回复系统,通过轻量级Flask网关实现消息的闭环处理。该系统支持7×24小时自动客服,适用于金融、教育、零售等多场景,显著降低人力成本并提升用户体验。文章详细解析了企业微信API接口、豆包模型的技术特性与优势,提供了从环境搭建到代码实现的完整开发指南,包含文本/图片/文件消息的发送示例及异步优化方案。本系统已投入实际项目应用,具有高效、稳定、可扩展等特点。

小相探索IT世界 1万+

微信企业号开发六:回调模式之消息回复

回调模式的消息回复,可以在Post中使用输出流直接输出,输出的内容为加密的XML格式 也就是说只要会了消息加密就可以,完成消息回复,微信工具类还是去http://qydev.weixin.qq.com/wiki/index.php?title=加解密库下载与返回码 官网下载,使用WXBizMsgCrypt类中的EncryptMsg进行加密 ------------------...

牟云飞的博客 8650

原来用C#开发一个企业微信(企业公众号),这么简单?

首先去微信公众平台注册企业公众号: 本篇文章学习目标: 通过本文学习到如何使用企业号开发一个。企业聊天对话机器人。 微信企业号地址 如何注册这里不再多说。 创建你的企业应用: 这时候在你企业号管理员中就能看到你创建的,企业应用了。 2. 添加企业应用配置: 点开一个企业应用-》 点击消息配置 点击接受消息。启用API接收。 一顿鬼操作,到这里。...

个人的工作随笔和日记,主要作为一个记录风向平台 4231

微信企业号验证/发送/接收消息

1.  内网映射    由于微信企业号回调模式的URL尽支持域名方式访问,估需要注册花生壳,做一个内网穿透(需要花16块钱,购买一个免费版,购买之后,第二天才能添加上域名) 2.  微信企业号 注册微信企业号:https://qy.weixin.qq.com/ (选择团队,团队不需要认证) 通讯录:新建组织 - > 关注成员 企业号 -> 应用中心 -> 新建应用 -> 消息型应用

hichinamobile的博客 1万+

WeChat-API:Java企业级微信个人号自动化终极解决方案

> 在数字化转型浪潮中,企业微信机器人已成为客户服务、营销自动化、数据采集的关键基础设施。然而,微信协议复杂性、会话管理难题、消息类型多样性等挑战让开发者望而却步。wechat-api 作为基于Java 7+的微信个人号API客户端,通过注解驱动架构、多线程消息处理和完整的协议封装,为企业级应用提供了稳定可靠的自动化解决方案。 ## 技术挑战与解决方案对比 微信个人号自动化面临的核心技术挑战主

gitblog_00704的博客 1039

【Python+微信】【企业微信开发入坑指北】1. 数据链路打通:接收用户消息处理并回复

我们上次将企业微信自建应用与我们自己的服务器连接起来了,下面进行第二步,打通数据链路,接收用户消息处理,并回复。

同学小张的博客 2884
上一篇: 微信企业号开发1--连接
下一篇: 微信开发中文乱码问题总结
programmeryu
博客等级 码龄11年 23粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值