企业微信通讯录管理

    技术2022-07-10  141

    前言:

    源码已上传:https://github.com/tanghh0410/contractDemo.git

    我之前写过一篇文章,主要是用来获取企业微信用户数据,要想做到通讯录变更 ,上篇文章远远不够,我们还需要做开启通讯录回调通知。

    我来给大家理一下这部分的逻辑:

    1) 数据库没有用户数据,可以参考我的主要是用来获取企业微信用户数据 去获取用户数据

    2) 开启通讯录回调通知,设置消息事件服务器(文档位置:https://work.weixin.qq.com/api/doc/90000/90135/90966) 

    3) 处理企业微信人员变更的事件,不同的事件做不同的处理。

     补充设置消息事件服务器这块:

    1.你需要先写一个接口,比如我下文中的changeNews , 企业微信管理后台的token 和 key 是你需要替换到我代码中去的。

    2.设置消息事件服务器的地方写上你的接口,也就是我的changeNews,需要验证这个接口能否通过。

    2.设置消息事件服务器成功以后你再去写人员变更的逻辑。

    在哪里设置呢?

    点到系统管理后台 设置。

    1)

    2)

    3)

    需要注意的是: 这个url 你可以这么填写:

    https://baidu.com/具体接口名

    像我下图就是 https://baidu.com/changeNews,并且 token 和这个key 需要替换成开发者自己设置的。

     

     

     

     

     

    1.首先需要编写企业微信接收事件

     

    /** * 企业微信消息接收事件(用于通讯录同步或消息接收) * 接口作用: 企业微信发生通讯录变更事件要调用这个接口,无需手动调用,企业微信后台有配置这个接口名字 * * @param request * @param response * @throws IOException */ @ApiOperation(value = "1.4 企业微信接收通讯录变更事件") @RequestMapping(value = "/changeNews") public void changeNews(HttpServletRequest request, HttpServletResponse response) throws IOException { //1.1企业微信接收消息服务器配置的代码部分 // 微信加密签名 String msg_signature = request.getParameter("msg_signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); logger.warn("微信加密签名,msg_signature:"+msg_signature); logger.warn("时间戳,timestamp:"+timestamp); logger.warn("随机数,nonce:"+nonce); logger.warn("随机字符串,echostr:"+echostr); PrintWriter out = response.getWriter(); // 通过检验msg_signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 String result = null; WXBizMsgCrypt wxcpt = null; try { wxcpt = new WXBizMsgCrypt(QiWeiXinParamesUtil.token, QiWeiXinParamesUtil.encodingAESKey, QiWeiXinParamesUtil.corpId); result = wxcpt.VerifyURL(msg_signature, timestamp, nonce, echostr); //更新成员,部门信息 // accessTokenService.getEncryptRespMessage(request); if (result == null) { result = QiWeiXinParamesUtil.token; } out.print(result); out.close(); out = null; } catch (Exception e) { e.printStackTrace(); logger.error("changeNews接口报错", e); } }

    当接收通讯录变更事件成功以后,我们就可以放开我注释这个代码,这段代码主要是 用来处理业务

     

     WechatServiceImpl

    package com.wechat.demo.service.impl; import com.wechat.demo.service.WechatService; import com.wechat.demo.wechat.QiYeWeiUtil; import com.wechat.demo.wechat.MessageUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.Map; /** * @Author tanghh * @Date 2020/7/2 16:27 */ @Service public class WechatServiceImpl implements WechatService { private Logger logger = LoggerFactory.getLogger(WechatServiceImpl.class); /** * 企业微信成员通讯录变更 * @param request */ @Override public void getEncryptRespMessage(HttpServletRequest request) { String xmlMsg = ""; try { //1.解密微信发过来的消息 QiYeWeiUtil qiYeWeiUtil = new QiYeWeiUtil(); xmlMsg = qiYeWeiUtil.getDecryptMsg(request); //2.解析微信发来的请求,解析xml字符串 Map<String, String> requestMap = MessageUtil.parseXml(xmlMsg); //3.获取请求参数 //3.1 企业微信CorpID String fromUserName = requestMap.get("FromUserName"); //3.2 成员UserID String toUserName = requestMap.get("ToUserName"); //3.3 消息类型与事件 String msgType = requestMap.get("MsgType"); String eventType = requestMap.get("Event"); String changeType = requestMap.get("ChangeType"); String eventKey = requestMap.get("EventKey"); //根据消息类型与事件执行不同的操作 if ("event".equals(msgType) && "change_contact".equals(eventType)) { //新增成员 if ("create_user".equals(changeType)) { System.out.println("进入新增用户数据"); } //修改成员 if ("update_user".equals(changeType)) { //自己编写处理的逻辑 System.out.println("修改成员"); } //删除成员 if ("delete_user".equals(changeType)) { //自己编写处理的逻辑 System.out.println("修改成员"); } //添加和更新部门 if ("create_party".equals(changeType) || "update_party".equals(changeType)) { //自己编写处理的逻辑 System.out.println("添加和更新部门"); } //删除 if ("delete_party".equals(changeType)) { //错误删除 //自己编写处理的逻辑 System.out.println("错误删除"); } } } catch (Exception e) { e.printStackTrace(); logger.error("通讯录变更事件处理异常!{},{}", xmlMsg, e); } } }

     

    通讯录同步变更补充好了,如何验证事件接收器成功的问题我没有截图了,因为做的比较久了。

    Processed: 0.011, SQL: 8