java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java企业微信回调配置

Java实现企业微信回调配置的详细步骤与测试

作者:Xi-Yuan

这篇文章主要给大家介绍了关于Java实现企业微信回调配置的详细步骤与测试,企业微信回调是指企业微信通过HTTP POST请求将业务数据回调到指定的URL上,文中给出了详细的代码示例,需要的朋友可以参考下

在使用前阅读官方文档:回调配置文档

一、配置回调服务

一、在企业微信管理后台配置三个配置

分别是:URLTokenEncodingAESKey。打开企业微信后台-->管理工具-->通讯录同步配置回调地址如下所示

1.1、URL为回调服务地址,由开发者搭建(直白点就是后台回调域名地址,你给企业微信的URL,例如http://127.0.0.1:8085/qiyewx/getCallBack)服务器如果是云服务要配置域名

1.2、Token用于计算签名,由英文或数字组成且长度不超过32位的自定义字符串。(可随机获取,但要复制到本地代码,后面会用到)

1.3、EncodingAESKey用于消息内容加密,由英文或数字组成且长度为43位的自定义字符串。(可随机获取,但要复制到本地代码,后面会用到)

二、在代码中配置Token和EncodingAESKey

# 企业微信配置
qiyewx:
  url: 
  corpid: 
  corpsecret: 
  #回调配置
  token: XXXXXX
  encodingAESKey: XXXXXX

 三、官方加解密库下载

1、点击如下链接自行下载,下载后结构如下图所示:

有json版本和xml版本 

json版本:

xml版本:

加解密库下载与返回码 - 接口文档 - 企业微信开发者中心

2、将下载的示例代码复制到你的项目代码中

二、编码实现

一、引入相关项目依赖

<!--企业微信相关-->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <!-- 企业微信json格式包-->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20200518</version>
        </dependency>
<!-- dom4j解析xml -->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

二、支持Http Get请求验证URL有效性与支持Http Post请求接收业务数据

切记:将将下载的示例代码复制到你的项目代码中,下面的代码中有使用。

1、coontroller

/**
     * 企业微信回调
     * 3.1 支持Http Get请求验证URL有效性
     * 3.2 支持Http Post请求接收业务数据
     *
     * @return
     */
    @RequestMapping(value = "/getCallBack", method = {RequestMethod.GET, RequestMethod.POST})
    public Object CompanyWeChatChangeNotice(HttpServletRequest request, @RequestBody(required = false) String body) {
       Map<String, String[]> parameterMap = request.getParameterMap();
        String jsonString = JSONObject.toJSONString(parameterMap);
        log.info("企业微信回调参数:{},  解析参数:{}", jsonString, body);
        if (body == null) {
            Object result = qyWxService.verificationUrl(request);
            return result;
        }
        Map<String, String> resultMap = qyWxService.getRequestParameter(request, body);
        System.err.println(resultMap);
        return "success";
    }

2、验证URL有效性 

 /**
     * 验证回调URL
     *
     * @param request
     * @return
     */
    public Object verificationUrl(HttpServletRequest request) {
        log.info("=========验证URL有效性开始=========");
        String sEchoStr; //需要返回的明文
        try {
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(qyWxConfig.getToken(), qyWxConfig.getEncodingAESKey(), qyWxConfig.getCorpid());
            String msgSignature = request.getParameter("msg_signature");
            String timeStamp = request.getParameter("timestamp");
            String nonce = request.getParameter("nonce");
            String echostr = request.getParameter("echostr");
            log.info("企业微信加密签名: {},时间戳: {},随机数: {},加密的字符串: {}", msgSignature, timeStamp, nonce, echostr);
            sEchoStr = wxcpt.VerifyURL(msgSignature,
                    timeStamp,
                    nonce,
                    echostr);
            log.info("给企业微信返回的明文,{}", sEchoStr);
            log.info("=========验证URL有效性结束=========");
            return sEchoStr;
        } catch (AesException e) {
            log.error("验证URL失败,错误原因请查看异常:{}", e.getCode());
            throw new AesException(e.getCode());
        }
    }

3、回调参数解析

 /**
     * 企业微信回调参数解析
     *
     * @param request
     * @param body
     * @return
     */
    public Map<String, String> getRequestParameter(HttpServletRequest request, String body) {
        log.info("=========参数解析开始=========");
        try {
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(qyWxConfig.getToken(), qyWxConfig.getEncodingAESKey(), qyWxConfig.getCorpid());
            String msgSignature = request.getParameter("msg_signature");
            String timeStamp = request.getParameter("timestamp");
            String nonce = request.getParameter("nonce");
            log.info("企业微信加密签名: {},时间戳: {},随机数: {}", msgSignature, timeStamp, nonce);
            String sMsg = wxcpt.DecryptMsg(msgSignature, timeStamp, nonce, body);
            Map<String, String> resultMap = new HashMap<String, String>(16);
            resultMap = ConstantUtil.parseXmlToMap(sMsg, resultMap);
            log.info("decrypt密文转为map结果为{}", resultMap);
            log.info("=========参数解析结束=========");
            return resultMap;
        } catch (AesException e) {
            log.error("密文参数解析失败,错误原因请查看异常:{}", e.getMessage());
            throw new AesException(e.getCode());
        }
    }

4、XML转map工具

package com.ruoyi.system.qiwechat.utils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.StringReader;
import java.util.Iterator;
import java.util.Map;
/**
 * @author XiYuan
 * @date 2023/2/20
 * @Description: XML转换Map
 */
public class ConstantUtil {
    /**
     * 将xml转换为Map。 支持xml标签多层嵌套,并以"."分隔多级标签(不包括根节点)。 不支持XML标签重复时的情况
     *
     * @param xml
     * @param map
     * @return
     */
    public static Map<String, String> parseXmlToMap(String xml, Map<String, String> map) {
        try {
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new StringReader(xml));
            Element root = doc.getRootElement();
            String path = "";
            if (map.containsKey(root.getName().trim())) {
                path = map.get(root.getName().trim());
                map.remove(root.getName().trim());
            }
            for (Iterator i = root.elementIterator(); i.hasNext();) {
                Element element = (Element) i.next();
                if (element.isTextOnly()) {
                    if (path.length() > 0) {
                        map.put(path + element.getName().trim(), element.getTextTrim());
                    } else {
                        map.put(element.getName().trim(), element.getTextTrim());
                    }
                } else {
                    map.put(element.getName().trim(), path+ element.getName().trim() + ".");
                    parseXmlToMap(element.asXML(), map);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
}
 

5、配置文件config

package com.ruoyi.common.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class QyWxConfig {
    /**
     *  请求路径
     */
    @Value("${qiyewx.url}")
    private String url;
    /**
     * 企业微信ID
     */
    @Value("${qiyewx.corpid}")
    private String corpid;
    /**
     * 企业应用的凭证密钥
     */
    @Value("${qiyewx.corpsecret}")
    private String corpsecret;
    /**
     * 开发者设置的token
     */
    @Value("${qiyewx.token}")
    private String token;
    /**
     * 开发者设置的EncodingAESKey
     */
    @Value("${qiyewx.encodingAESKey}")
    private String encodingAESKey;
}

三、测试示例

一、测试3.1 支持Http Get请求验证URL有效性

企业微信开发者中心测试工具  

所要参数依次写入,测试

二、测试3.2支持Http Post请求接收业务数据 

1、演示关于接收客户变更事件回调通知,企业微信开发者中心 回调

2、通俗点就是手机企业微信添加客户将数据回调到本地,按照文档说明讲相关参数设置好。如图所示:

 3、对返回结果按照自己需求进行处理

如下红框所示: 

 备注:要根据事件的类型Event判断回调的事件,在回调事件中根据ChangeType判断事件性质

4、查看日志

总结

到此这篇关于Java实现企业微信回调配置的详细步骤与测试的文章就介绍到这了,更多相关Java企业微信回调配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文