欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现企业微信通讯录管理

程序员文章站 2023-12-01 16:21:28
前言:我之前写过一篇文章,主要是用来获取企业微信用户数据,要想做到通讯录变更 ,上篇文章远远不够,我们还需要做开启通讯录回调通知对于不同的变更事件企业微信提供了不同的变更事件,我们需要对不同的事件进行处理。1.首先需要编写企业微信接收事件Controller /** * 企业微信消息接收事件(用于通讯录同步或消息接收) * 接口作用: 企业微信发生通讯录变更事件要调用这个接口,无需手动调用,企业微信后台有配置这个接口名字 * *.....

前言:

源码已上传: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.接收事件处理器成功以后你再去写人员变更的逻辑。

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

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

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

 Java实现企业微信通讯录管理

Java实现企业微信通讯录管理

Java实现企业微信通讯录管理

 

 

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);
        }
    }

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

Java实现企业微信通讯录管理

 

 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);
        }
    }
}

 

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

本文地址:https://blog.csdn.net/tangthh123/article/details/107056907