Java实现企业微信回调配置

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

一、配置回调服务

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

分别是: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、查看日志

看完有所帮助请点点赞,送人玫瑰,手留余香。给作者一个👍🏻

  • 33
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
企业微信回调是指企业微信通过HTTP POST请求将业务数据回调到指定的URL上。为了实现回调功能,需要在企业微信开发者中心进行相应的配置和编码实现。 首先,在企业微信开发者中心,需要进行回调URL配置。这可以通过在服务商后台的应用管理中找到对应的小程序,然后配置回调URL实现。这些步骤可以根据企业微信开发文档的指导进行具体操作。 总结起来,实现企业微信回调功能需要在企业微信开发者中心进行回调URL配置,引入相关依赖并进行编码实现。具体的操作步骤可以根据企业微信开发文档进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java实现企业微信回调配置](https://blog.csdn.net/LIU_ZHAO_YANG/article/details/129137077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [【企业微信急速救心丸】(一)第三方应用开发 - Java整合企业微信回调](https://blog.csdn.net/qq_43097201/article/details/123784211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值