前言:
我之前寫過一篇文章,主要是用來獲取企業微信用戶數據,要想做到通訊錄變更 ,上篇文章遠遠不夠,我們還需要做開啓通訊錄回調通知。
我來給大家理一下這部分的邏輯:
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 需要替換成開發者自己的。
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);
}
}
}
通訊錄同步變更補充好了,如何驗證事件接收器成功的問題我沒有截圖了,因爲做的比較久了。