企业微信客户联系-回调事件
Java xml报文方式
第一步 下载资源
下载企业微信提供的关于加密解密,IO解析的 工具包
点击 https://work.weixin.qq.com/api/doc/90000/90138/90307#java库
第二步 工具包
下载的压缩包打开后,按下图路径打开,将这6个工具包复制到自己的项目中,建议用一个单独的包存放,作为企业微信工具包。
第三步 回调的接口编写
这个作为这个是回调函数的访问接口例子
完整的例子
/**
* 微信回调配置验证
* @return
* @throws Exception
*/
@ApiOperation(value="微信調用API接收消息配置,验证URL")
@GetMapping(value="/callBack")
@ResponseBody
public void verificationUrl() throws IOException {
ServletRequestAttributes servletRequestAttributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if(servletRequestAttributes!=null){
HttpServletRequest request=servletRequestAttributes.getRequest();
HttpServletResponse response=servletRequestAttributes.getResponse();
if(response!=null){
// 微信加密签名
String msgSignature = request.getParameter("msg_signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
log.info("request=" + request.getRequestURL());
PrintWriter out = response.getWriter();
// 通过检验msg_signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
String result = null;
try {
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeiXinParamesUtil.TOKEN, WeiXinParamesUtil.ENCODING_AES_KEY, WeiXinParamesUtil.CORP_ID);
result = wxcpt.verifyURL(msgSignature, timestamp, nonce, echostr);
//必须要返回解密之后的明文
if (StringUtils.isBlank(result)) {
log.info("URL验证失败");
} else {
log.info("验证成功!");
}
} catch (AesException e) {
e.printStackTrace();
}
if (result == null) {
result = WeiXinParamesUtil.TOKEN;
}
out.print(result);
out.close();
}
}
}
/**
* 微信回调事件
* @return
* @throws Exception
*/
@ApiOperation(value="微信回调事件接口")
@PostMapping(value="/callBack")
public String callBack() throws IOException, AesException, ParserConfigurationException, SAXException {
log.info("开始执行企业微信回调方法");
String sMsg = null;
ServletRequestAttributes servletRequestAttributes = null;
if (RequestContextHolder.getRequestAttributes()!=null){
servletRequestAttributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if(servletRequestAttributes!=null){
HttpServletRequest request = servletRequestAttributes.getRequest();
// 微信加密签名
String sMsgSignature = request.getParameter("msg_signature");
// 时间戳
String sTimestamp = request.getParameter("timestamp");
// 随机数
String sNonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
log.info("request=" + request.getRequestURL());
log.info("echostr=" + echostr);
InputStream inputStream = request.getInputStream();
String sPostData = IOUtils.toString(inputStream, "UTF-8");
//下面这些操作都可以异步 如果处理请求比较慢,企业微信会重复推送 这里需要去重保证执行唯一
WXBizMsgCrypt msgCrypt = new WXBizMsgCrypt(WeiXinParamesUtil.TOKEN,WeiXinParamesUtil.ENCODING_AES_KEY,WeiXinParamesUtil.CORP_ID);
//解密
sMsg = msgCrypt.decryptMsg(sMsgSignature,sTimestamp,sNonce,sPostData);
log.info("企业微信传输给我们的信息结果"+sMsg);
//处理逻辑
/**
* 处理企业微信的回调 通过xml
* 目前处理的功能 有 新增 编辑 删除 企业微信用户 CustomerConsultanRel
* */
log.info("开始处理企业微信回调方法");
customerConsultantRelService.handleCallbackByXmlString(sMsg);
log.info("结束处理企业微信回调方法");
}
}
log.info("结束执行企业微信回调方法");
return sMsg;
}
第四步 配置消息接收器
有两种方式
1 客户联系 -客户,这种方式,范围较大,
url 是你的回调方法的调用接口,如果是内网环境,需要做内网击穿,我使用的是云网穿
可以自行网上查看网络击穿的教程。
Token和 EncodingAESKey
这个两个随机生成就好
2自定义的应用程序中设定,设定的值与上图一致,不同的是可以自己指定企业用户的范围,在实际的开发场景中,可以控制回调的范围。
第五步,写静态类,
将上图中的 Token和 EncodingAESKey的值,编写到静态类中。值请根据自己企业微信(自己注册也可)填写
public class WeiXinParamesUtil {
private WeiXinParamesUtil(){}
/**企业ID*/
public static final String CORP_ID = "";
/**token*/
public static final String TOKEN = "";
/**encodingAESKey*/
public static final String ENCODING_AES_KEY = "";
/**客户联系密钥*/
public static final String CUSTOMER_CONTACT_SECRET = "";
/**通讯录密钥*/
public static final String ADDRESS_BOOK_SECRET = "";
/**token失效时间设置 2 小时*/
public static final Integer EXPIRE_TIME = 2;
/**返回码key*/
public static final String ERR_CODE = "errcode";
/**
* 操作类型为添加客户 外部人员 add_external_contact
* */
public static final String CHANGE_TYPE_ADD_EXTERNAL_CONTACT ="add_external_contact";
/**
* 操作类型为添加客户 外部人员 del_external_contact
* */
public static final String CHANGE_TYPE_DEL_EXTERNAL_CONTACT ="del_external_contact";
}
第六步 启动项目,测试设定消息接收器是否成功。
以上代码完成后,启动项目,在设置消息接收器的页面点击保存,提示成功则说明,设定成功。
第七步 编写自己业务代码
在回调接口的对应处将得到的xml字符串 拿到自己的sevice层,做自己业务处理。
关于xml 格式可以自己查看企业微信的api
ps:关于详细的内容,比如加密解密等问题,可以详细企业微信的api,