企业微信回调接口开发
1、从企业微信api获取加解密方法
地址:企业微信api
注意事项:这里肯定会出现下面说的异常,按照说明下载jar替换jdk原来的jar就能解决问题,如果不行那就重启电脑。
2、企业微信操作
这里首先需要网页登录企业微信,并且要以管理员身份登录,因为下面的操作都需要管理员授权操作。
3、本地代码
1、首先要获取corpid,参照下面的操作即可;
2、配置自定义配置:
wechat:
sCorpID: ww92e8a0cb0975b937
sToken: Qq4dP7M
sEncodingAESKey: LJ81CzFpS2xUPLtSOyRxK0OakUIHwn9mvHjEIVAD6sp
3、引入微信加解密方法
这里把前面下载的直接放到自己的项目下面就行;
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了。
到此完美解决企业微信回调接口开发。欢迎大家评论留言!