企业微信客户群事件通知

企业微信: https://work.weixin.qq.com/

 概述


企业微信在推送消息给企业时,会对消息内容做AES加密,以XML格式POST到企业应用的URL上。
企业在被动响应时,也需要对数据加密,以XML格式返回给企业微信。

 通知回调地址配置

 image.png

获取access_token

请求方式: GET(HTTPS
请求地址: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET

 public final static String access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}";/*** 获取access_token** @param appid 凭证* @param appsecret 密钥* @return*/public static AccessToken getAccessToken(String appid, String appsecret) {AccessToken accessToken = null;String requestUrl = access_token_url.replace("{corpId}", appid).replace("{corpsecret}", appsecret);JSONObject jsonObject = httpRequest(requestUrl, "GET", null);// 如果请求成功if (null != jsonObject) {try {accessToken = new AccessToken();accessToken.setToken(jsonObject.getString("access_token"));accessToken.setExpiresIn(jsonObject.getInt("expires_in"));} catch (JSONException e) {accessToken = null;// 获取token失败log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}}return accessToken;}

获取客户群列表

请求方式:POST(HTTPS
请求地址:https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/list?access_token=ACCESS_TOKEN

/*** 获取客户群列表* @param accessToken* @param limit* @return*/public List<String> getGroupList(String accessToken, String limit){HashMap<String, Object> result = new HashMap<>();result.put("limit",limit);String jsonString = JSONObject.toJSONString(result);
//            System.out.println("jsonString = " + jsonString);//1.获取调用地址groupList_url = groupList_url.replace("ACCESS_TOKEN",accessToken);//2.调用接口,查询客户列表net.sf.json.JSONObject jsonObject = WeiXinUtil.httpRequest(groupList_url, "POST", jsonString);if (null != jsonObject) {String group_chat_list = jsonObject.getString("group_chat_list");List<Chat> chatList = JSONObject.parseObject(group_chat_list, new TypeReference<List<Chat>>() {});//list用来存放客户群idArrayList<String> arrayList = new ArrayList<>();for (Chat chat : chatList) {arrayList.add(chat.getChatId());}//3.异常处理if (0 != jsonObject.getInt("errcode")) {log.error("获取客户群列表失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}return arrayList;}return null;}

获取客户群详情

/*** 获取客户群详情* @param accessToken* @param chatId* @param needName* @return*/public Map<String, Object> groupListDetails(String accessToken, String chatId, String needName){HashMap<String, Object> result = new HashMap<>();result.put("chat_id",chatId);result.put("need_name",needName);String jsonString = JSONObject.toJSONString(result);
//        System.out.println("jsonString = " + jsonString);//1.获取调用地址groupListDetails_url = groupListDetails_url.replace("ACCESS_TOKEN",accessToken);//2.调用企业微信地址net.sf.json.JSONObject jsonObject = WeiXinUtil.httpRequest(groupListDetails_url, "POST", jsonString);System.out.println("jsonObject = " + jsonObject);if (null != jsonObject) {String group_chat = jsonObject.getString("group_chat");
//            System.out.println("group_chat = " + group_chat);GroupChat groupChat = JSONObject.parseObject(group_chat, GroupChat.class);
//            System.out.println("groupChat = " + groupChat);List<Member> memberList = groupChat.getMemberList();//获取到最近一次入群的用户memberList.sort(new Comparator<Member>() {@Overridepublic int compare(Member o1, Member o2) {return Long.compare(o2.getJoinTime(),o1.getJoinTime());}});//结果处理HashMap<String, Object> resultMap = new HashMap<>();resultMap.put("chatName",groupChat.getName());resultMap.put("member",memberList.get(0));//3.异常处理if (0 != jsonObject.getInt("errcode")) {log.error("获取客户群列表失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}return resultMap;}return null;}

加解密库下载地址 :加解密库下载与返回码 - 接口文档 - 企业微信开发者中心

  • com\qq\weixin\mp\aes目录下是用户需要用到的接入企业微信的接口,其中WXBizMsgCrypt.java文件提供的WXBizMsgCrypt类封装了用户接入企业微信的三个接口,其它的类文件用户用于实现加解密,用户无须关心。sample.java文件提供了接口的使用示例。
  • WXBizMsgCrypt封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证接收消息的url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.java文件。
  • 请开发者使用jdk1.6或以上的版本。针对org.apache.commons.codec.binary.Base64,需要导入jar包commons-codec-1.9(或comm ons-codec-1.8等其他版本),我们有提供,官方下载地址:下载
  • 异常java.security.InvalidKeyException:illegal Key Size的解决方案:在官方网站下载JCE无限制权限策略文件(请到官网下载对应的版本, 例如JDK7的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html ):下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。
  • 如果安装了JRE,将两个jar文件放到%JRE_HOME% \lib\security目录下覆盖原来的文件,如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件。

示例: 对用户回复的消息解密

/*------------使用示例:对用户回复的消息解密---------------用户回复消息或者点击事件响应时,企业会收到回调消息,此消息是经过企业微信加密之后的密文以post形式发送给企业,密文格式请参考官方文档假设企业收到企业微信的回调消息如下:POST /cgi-bin/wxpush? msg_signature=477715d11cdb4164915debcba66cb864d751f3e6&timestamp=1409659813&nonce=1372623149 HTTP/1.1Host: qy.weixin.qq.comContent-Length: 613<xml>		<ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName><Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt><AgentID><![CDATA[218]]></AgentID></xml>企业收到post请求之后应该		1.解析出url上的参数,包括消息体签名(msg_signature),时间戳(timestamp)以及随机数字串(nonce)2.验证消息体签名的正确性。3.将post请求的数据进行xml解析,并将<Encrypt>标签的内容进行解密,解密出来的明文即是用户回复消息的明文,明文格式请参考官方文档第2,3步可以用企业微信提供的库函数DecryptMsg来实现。
*/
public static void main(String[] args) {// String sReqMsgSig = HttpUtils.ParseUrl("msg_signature");String sReqMsgSig = "477715d11cdb4164915debcba66cb864d751f3e6";// String sReqTimeStamp = HttpUtils.ParseUrl("timestamp");String sReqTimeStamp = "1409659813";// String sReqNonce = HttpUtils.ParseUrl("nonce");String sReqNonce = "1372623149";// post请求的密文数据// sReqData = HttpUtils.PostData();String sReqData = "<xml><ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName><Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt><AgentID><![CDATA[218]]></AgentID></xml>";try {String sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData);System.out.println("after decrypt msg: " + sMsg);// TODO: 解析出明文xml标签的内容进行处理// For example:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();StringReader sr = new StringReader(sMsg);InputSource is = new InputSource(sr);Document document = db.parse(is);Element root = document.getDocumentElement();NodeList nodelist1 = root.getElementsByTagName("Content");String Content = nodelist1.item(0).getTextContent();System.out.println("Content:" + Content);} catch (Exception e) {// TODO// 解密失败,失败原因请查看异常e.printStackTrace();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45397.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android APP被关闭后无法收到推送消息(尝试)

1. Android端进程被杀死后&#xff0c;目前自带的保护后台接收消息活跃机制。暂时没有什么好的机制保持任何情况下都活跃 文章参考&#xff1a;http://blog.csdn.net/marswin89/article/details/50917098 android原生系统用home键杀进程可以起来&#xff0c;如果是强行停止…

通知与服务——消息通知——通知推送Notification

手机通知栏存放的是App主动推给用户的提醒消息&#xff0c;每条消息包括消息图标、消息标题、消息内容等&#xff0c;这些消息元素由通知建造器Notification.Builder设定。 常用方法如下&#xff1a; setSmallIcon&#xff1a;设置应用名称左边的小图标。setLargeIcon&#xff…

Android Notification(通知消息)

Android Notification通知消息 Android Notification(通知消息)样式一、核心文件源码二、主界面页面三、单击通知跳转的Activity四、单击通知跳转的页面五、最终效果 Android Notification(通知消息)样式 ① 为小图标 ② 为App名称 ③ 为标题 ④ 为内容 ⑤ 为大图标 一、核心文…

Android直接回复通知

Android直接回复通知 通知直接回复 Android N/7.0 Android直接回复通知 前言创建通知 创建notification对象添加一个Action添加一个广播接收Action事件添加直接回复输入框把直接回复的内容发送到广播接收器结合Hands Up带来超棒的用户体验 Hands Up直接回复通知不消失的问题总结…

Android 实现微信,QQ的程序前后台切换:back键切换后台;点击通知栏恢复前台。

实现类似微信&#xff0c;QQ的前后台切换&#xff1a;back键切换后台&#xff1b;点击通知栏恢复前台。 1、back键切换后台的实现&#xff1a; 这个实现需要在主activity重写onbackpressed()方法。代码如下&#xff1a; Overridepublic void onBackPressed() {Intent intent…

Python源码学习笔记:Python虚拟机

Python虚拟机 注&#xff1a;本篇是根据教程学习记录的笔记&#xff0c;部分内容与教程是相同的&#xff0c;因为转载需要填链接&#xff0c;但是没有&#xff0c;所以填的原创&#xff0c;如果侵权会直接删除。此外&#xff0c;本篇内容大部分都咨询了ChatGPT&#xff0c;为笔…

Windows PyCharm 2022/2023 使用Centos7 的虚拟环境 venv 实现文件实时同步 代码代码Git自动识别 解决 Samba Cannot Save File 的问题

前期准备 git报错 fatal: unsafe repository 解决方法 因为是远程文件夹&#xff0c;老版本时没这个问题&#xff0c;新版本git或者pycharm有这个限制&#xff0c;不能自动识别更改的代码&#xff0c;报unsafe.directory的问题&#xff0c;直接暴力解决&#xff0c;加* git c…

接口间参数传递的一种解决方案

引言 做过接口自动化测试的同学肯定都熟悉在全链路测试过程中&#xff0c;很多业务场景的完成并非由单一接口实现&#xff0c;而是由很多接口组成的一条链路实现。例如你在淘宝上购物场景。 不同于单接口测试&#xff0c;这种链路型的接口自动化测试&#xff0c;由于接口间有参…

计算机应用设计大赛获奖信息,北京大学第六届“计算机应用设计大赛”圆满落幕...

6月6日下午&#xff0c;北京大学创新创意系列赛事颁奖典礼在英杰交流中心月光厅举行&#xff0c;会上颁发了计算机应用设计大赛、“挑战杯”系列竞赛、数学建模与计算机应用竞赛和“禁毒教育”创意大赛四项赛事的各类奖项。信息科学技术学院2013级本科生王迪作为获奖代表上台领…

魔物学院计算机,测试 | 你属于魔法学校什么学院的?

原标题&#xff1a;测试 | 你属于魔法学校什么学院的&#xff1f; 本Part长年主持&#xff1a;绿茶 本Part今日主人公&#xff1a;心理测试 如果你有机会在霍格沃茨魔法学校读书,依据你的性格,分院帽会把你分到哪个学院呢?你适合哪个学院呢?是高贵的斯莱特林,还是勇敢的格兰芬…

uniapp 微信小程序通过 wx.openCustomerServiceChat对接客服。

直接上解决方案&#xff0c;直接在绑定的方法中调用wx.openCustomerServiceChat 方法即可。 需要注意的几点。 hbuilder x 需升级到 3.4.3 版本以上。使用的&#xff0c;微信开发者工具中是看不到效果的&#xff0c;需要打包后&#xff0c;在微信中扫码查看。&#xff08;体验…

微软丢出王炸:微软发布重磅更新Windows Copilot

在今天凌晨结束的微软 Build 2023 大会上&#xff0c;微软发布了重磅更新Windows Copilot. 微软此前把 GPT-4 接入Office 套件而推出的 Copilot&#xff0c;将全面集成到 Windows 系统。 Windows Copilot 注册直通&#xff1a; https:/forms.office.com/pages/responsepage.asp…

仿QQ聊天程序

仿QQ聊天程序 转载请标明出处&#xff1a;牟尼的专栏 http://blog.csdn.net/u012027907 一、设计内容及要求 1.1综述 A.系统概述 我们要做的就是类似QQ这样的面向企业内部的聊天软件&#xff0c;基本功能和QQ类似。首先&#xff0c;系统分为两大部分&#xff0c;第一部分是…

仿微信语音聊天

如上图&#xff0c;是常见的仿微信的聊天程序&#xff0c;实现的效果如上图所示&#xff0c;由于项目太大&#xff0c;本文只讲录音部分。本项目示例代码&#xff1a;https://github.com/xiangzhihong/weixinAudio 主要用到4个核心类&#xff1a; 自定义录音按钮&#xff08;R…

Android 仿微信实现语音聊天功能

在此感谢鸿洋大神&#xff0c;因为我这是在慕课上看大神的视频做出来的。 代码中我已经添加了很多很多注释&#xff0c;不光是为了大家&#xff0c;也是为了自己能够更加透彻的理解该功能 支持原创&#xff0c;也不算原创了哈哈~ http://blog.csdn.net/lhk147852369/article/…

【Unity人物动画】SALSA With RandomEyes (语音生成嘴型/人物说话) 使用

SALSA使用探索 之前做项目时想实现人物说话的效果&#xff0c;因为我们的语音是AI合成的&#xff0c;有很多片段&#xff0c;如果能根据语音生成嘴部的动画&#xff0c;那将极大便利我们的工作。后面是找到了SALSA的这款插件&#xff0c;并摸索出使用方法。 1 插件介绍 官方网…

仿QQ聊天程序(java)

简易版qq聊天&#xff1a;qq聊天[简易版] (resourcecode.cn) 推荐java最新聊天项目&#xff08;java仿微信聊天&#xff09;: java 简单仿微信聊天(springboot)_Garry1115的博客-CSDN博客_springboot 模拟微信 转载请标明出处&#xff1a;牟尼的专栏 牟尼的博客_CSDN博客-算法…

LaTeX数学公式输入初级入门

LaTeX最强大的功能就是显示美丽的数学公式&#xff0c;下面我们来看这些公式是怎么实现的。 1、数学公式的前后要加上 $ 或 \( 和 \)&#xff0c;比如&#xff1a;$f(x) 3x 7$ 和 \(f(x) 3x 7\) 效果是一样的&#xff1b; 如果用 \[ 和 \]&#xff0c;或者使用 $$ 和 $$&a…

《LaTex》LaTex数学公式简介

LaTex数学公式简介 文章目录 一、引用数学公式的方法二、LaTex数学公式的基本代码1. 符号1.1. 常规的数学符号&#xff1a;直接从键盘输入1.2. 任何1.3. 存在1.4. 属于1.5. 小于等于1.6. 大于等于1.7. 约等于1.8. 更多数学符号 2. 希腊字母2.1. 阿尔法2.2. 贝塔2.3. 伽马2.4. 希…

LaTex数学公式简介

LaTex数学公式简介目录 一、引用数学公式的方法二、LaTex数学公式的基本代码1. 符号1.1. 常规的数学符号&#xff1a;直接从键盘输入1.2 标志符1.3 希腊字母1.4 运算符1.4.1 三角函数1.4.2 极限1.4.3 项数和指数1.4.4 积分1.4.5 矩阵 三、补充四、参考文献 一、引用数学公式的方…