企业微信回调接口开发

1、从企业微信api获取加解密方法

地址:企业微信api

企业微信回调事件java工具类 企业微信接口调用_System


注意事项:这里肯定会出现下面说的异常,按照说明下载jar替换jdk原来的jar就能解决问题,如果不行那就重启电脑。

企业微信回调事件java工具类 企业微信接口调用_企业微信回调事件java工具类_02

2、企业微信操作

这里首先需要网页登录企业微信,并且要以管理员身份登录,因为下面的操作都需要管理员授权操作。

企业微信回调事件java工具类 企业微信接口调用_企业微信回调事件java工具类_03


企业微信回调事件java工具类 企业微信接口调用_System_04

3、本地代码

1、首先要获取corpid,参照下面的操作即可;

企业微信回调事件java工具类 企业微信接口调用_企业微信回调事件java工具类_05


企业微信回调事件java工具类 企业微信接口调用_xml_06


2、配置自定义配置:

wechat:
   sCorpID: ww92e8a0cb0975b937
   sToken: Qq4dP7M
   sEncodingAESKey: LJ81CzFpS2xUPLtSOyRxK0OakUIHwn9mvHjEIVAD6sp

3、引入微信加解密方法

这里把前面下载的直接放到自己的项目下面就行;

企业微信回调事件java工具类 企业微信接口调用_System_07


4、本地接收接口

这里需要两个接口,接口地址是一样的,一个get一个post;get用于验证回调是否有效;post才是微信回调用的;

直接上代码:

package com.iot.controller;


import com.iot.pojo.WechatDeprtModel;
import com.iot.pojo.WechatUserModel;
import com.qq.weixin.mp.aes.AesException;
import com.qq.weixin.mp.aes.WXBizMsgCrypt;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;


@Controller
@RequestMapping("/wechat")
public class WeChatController {

	public static Logger logger = org.slf4j.LoggerFactory.getLogger(WeChatController.class);

	@Value("${wechat.sToken}")
	String sToken;
	@Value("${wechat.sEncodingAESKey}")
	String sEncodingAESKey;
	@Value("${wechat.sCorpID}")
	String sCorpID;

	/**
	 * url验证借口
	 * @param request
	 * @return
	 * @throws AesException
	 * @throws ParserConfigurationException
	 * @throws IOException
	 * @throws SAXException
	 */
	@ResponseBody
	@RequestMapping(value = "/userBack"  ,method = RequestMethod.GET)
	public String doGetValid(HttpServletRequest request) throws AesException, ParserConfigurationException, IOException, SAXException {

		//		String sToken = "Qq4dP7M";
		//		String sEncodingAESKey = "LJ81CzFpS2xUPLtSOyRxK0OakUIHwn9mvHjEIVAD6sp";
		//		String sCorpID = "ww92e8a0cb0975b937";
		WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
		String msg_signature = request.getParameter("msg_signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		String echostr = request.getParameter("echostr");
		System.out.println("==sVerifyMsgSig=="+msg_signature);
		System.out.println("==sVerifyTimeStamp=="+timestamp);
		System.out.println("==sVerifyNonce=="+nonce);
		System.out.println("==sVerifyEchoStr=="+echostr);
		try {
			// 验证URL成功,将sEchoStr返回
			return wxcpt.VerifyURL(msg_signature, timestamp,
					nonce, echostr);
		} catch (Exception e) {
			//验证URL失败,错误原因请查看异常
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 新增用户回调接口
	 * @param request
	 * @return
	 * @throws AesException
	 * @throws ParserConfigurationException
	 * @throws IOException
	 * @throws SAXException
	 */
	@ResponseBody
	@RequestMapping(value = "/userBack"  ,method = RequestMethod.POST)
	public String doPostValid(HttpServletRequest request) throws AesException, IOException {
		logger.debug("==doPostValid====post==");
		//		String sToken = "Qq4dP7M";
		//		String sEncodingAESKey = "LJ81CzFpS2xUPLtSOyRxK0OakUIHwn9mvHjEIVAD6sp";
		//		String sCorpID = "ww92e8a0cb0975b937";
		WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
		String msg_signature = request.getParameter("msg_signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		String postData="";   // 密文,对应POST请求的数据
		//1.获取加密的请求消息:使用输入流获得加密请求消息postData
		ServletInputStream in = request.getInputStream();
		BufferedReader reader =new BufferedReader(new InputStreamReader(in));

		String tempStr="";   //作为输出字符串的临时串,用于判断是否读取完毕
		while(null!=(tempStr=reader.readLine())){
			postData+=tempStr;
		}
		String suiteXml=wxcpt.DecryptMsg( msg_signature, timestamp, nonce, postData);
		logger.info("suiteXml: " + suiteXml);
		//解析xml文件
		try {
			XMLParse(suiteXml);
		} catch (Exception e) {
			e.printStackTrace();
			logger.info("xml解析失败");
		} 

		String success = "success";
		return success;
	}
	private void XMLParse(String suiteXml) throws ParserConfigurationException, SAXException, IOException {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		StringReader sr = new StringReader(suiteXml);
		InputSource is = new InputSource(sr);
		Document document = db.parse(is);
		//获取xml根节点
		Element root = document.getDocumentElement();
		/**
		 * 获取操作类型
		 * 用户类型:create_user、update_user、delete_user
		 * 部门操作:create_party、update_party、delete_party
		 */
		String msgType = root.getElementsByTagName("ChangeType").item(0).getTextContent();
		System.out.println("操作类型:=="+msgType);
		WechatUserModel wechatUserModel = new WechatUserModel();
		WechatDeprtModel wechatDeprtModel = new WechatDeprtModel();
		if(msgType.contains("user")) {
			//用户操作
			String userName = root.getElementsByTagName("UserID").item(0).getTextContent();
			String name = root.getElementsByTagName("Name").item(0) != null ? root.getElementsByTagName("Name").item(0).getTextContent():null;
			String mobile = root.getElementsByTagName("Mobile").item(0) != null ? root.getElementsByTagName("Mobile").item(0).getTextContent():null;
			String gender = root.getElementsByTagName("Gender").item(0) != null ? root.getElementsByTagName("Gender").item(0).getTextContent():null;
			String email = root.getElementsByTagName("Email").item(0) !=null?root.getElementsByTagName("Email").item(0).getTextContent():null;
			String status = root.getElementsByTagName("Status").item(0) !=null?root.getElementsByTagName("Status").item(0).getTextContent():null;
			String alias = root.getElementsByTagName("Alias").item(0) !=null?root.getElementsByTagName("Alias").item(0).getTextContent():null;
			String position = root.getElementsByTagName("Position").item(0) !=null?root.getElementsByTagName("Position").item(0).getTextContent():null;
			String department = root.getElementsByTagName("Department").item(0) !=null?root.getElementsByTagName("Department").item(0).getTextContent():null;
			String isLeaderInDept = root.getElementsByTagName("IsLeaderInDept").item(0) !=null?root.getElementsByTagName("IsLeaderInDept").item(0).getTextContent():null;
			wechatUserModel.setAlias(alias);
			wechatUserModel.setEmail(email);
			wechatUserModel.setGender(gender);
			wechatUserModel.setMobile(mobile);
			wechatUserModel.setMsgType(msgType);
			wechatUserModel.setName(name);
			wechatUserModel.setStatus(status);
			wechatUserModel.setUserName(userName);
			wechatUserModel.setPosition(position);
			wechatUserModel.setDepartment(department);
			wechatUserModel.setIsLeaderInDept(isLeaderInDept);
			System.out.println("收到用户操作==wechatUserModel=="+wechatUserModel.toString());
		}else if (msgType.contains("party")) {
			//部门操作
			String id = root.getElementsByTagName("Id").item(0).getTextContent();
			String name = root.getElementsByTagName("Name").item(0) !=null? root.getElementsByTagName("Name").item(0).getTextContent():null;
			String parentId = root.getElementsByTagName("ParentId").item(0) !=null? root.getElementsByTagName("ParentId").item(0).getTextContent():null;
			String order = root.getElementsByTagName("Order").item(0) !=null ? root.getElementsByTagName("Order").item(0).getTextContent():null;
			wechatDeprtModel.setId(id);
			wechatDeprtModel.setMsgType(msgType);
			wechatDeprtModel.setName(name);
			wechatDeprtModel.setOrder(order);
			wechatDeprtModel.setParentId(parentId);
			System.out.println("收到部门操作==wechatDeprtModel=="+wechatDeprtModel.toString());
		}
	}
}

5、配置回调地址

这里填入你自己的毁掉地址就行,前提你的地址要实现外网可以访问。

token和key和你在配置文件里的一致就行,点击保存,看到返回配置成功就OK了。

企业微信回调事件java工具类 企业微信接口调用_java_08

到此完美解决企业微信回调接口开发。欢迎大家评论留言!