Java实现企业微信回调配置

这篇具有很好参考价值的文章主要介绍了Java实现企业微信回调配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、配置回调服务

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

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

Java实现企业微信回调配置

Java实现企业微信回调配置

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

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

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

二、在代码中配置Token和EncodingAESKey

Java实现企业微信回调配置

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

 三、官方加解密库下载

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

有json版本和xml版本 

json版本:

Java实现企业微信回调配置

xml版本:

Java实现企业微信回调配置

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

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有效性

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

所要参数依次写入,测试

Java实现企业微信回调配置

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

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

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

Java实现企业微信回调配置

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

如下红框所示: 

Java实现企业微信回调配置

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

Java实现企业微信回调配置

4、查看日志

Java实现企业微信回调配置

看完有所帮助请点点赞,送人玫瑰,手留余香。给作者一个👍🏻文章来源地址https://www.toymoban.com/news/detail-429278.html

到了这里,关于Java实现企业微信回调配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 Nginx 实现企业微信域名配置中的校验文件跳转

    在企业微信中配置业务域名时,通常需要在该域名的根路径下放置一个校验文件,以验证域名的所有权。然而,如果该域名是第三方的,你可能无法直接在根路径下放置文件。在这种情况下,你可以使用 Nginx 来实现校验文件的跳转,从而成功完成企业微信域名配置。 步骤1

    2024年02月09日
    浏览(61)
  • java微信支付v3系列——5.微信支付成功回调

    java微信支付v3系列——1.微信支付准备工作 java微信支付v3系列——2.微信支付基本配置 java微信支付v3系列——3.订单创建准备操作 java微信支付v3系列——4.创建订单的封装及使用 java微信支付v3系列——5.微信支付成功回调 java微信支付v3系列——6.微信支付查询订单API java微信支

    2024年01月17日
    浏览(41)
  • java对接微信支付:JSAPI支付成功之“微信回调”

    承接上一篇微信支付,现在简单说一下 微信支付回调 目录 一、支付回调 二、微信回调地址问题 1.本地/上线测试 2.控制器调用接口(代码) 总结 当用户支付成功之后,支付平台会向我们指定的服务器接口发送请求传递订单支付状态数据 如果你是再本地进行测试,那就需要使用

    2024年02月12日
    浏览(37)
  • 基于Java+Vue+uniapp微信小程序企业职工薪资查询系统设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作 ✌ 主要内容: SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P

    2024年02月04日
    浏览(47)
  • java微信小程序支付-回调(Jsapi-APIv3)

            准备:  接入前准备-小程序支付 | 微信支付商户平台文档中心 准备好了就可以获得( 第二点里需要的参数 ):         参数1 商户号 merchantId:xxxxxx(全是数字)         参数2 商户APIV3密钥 apiV3key:xxxxxxx(32位字母数字大小写串,开发自己准备的)         参

    2024年02月08日
    浏览(51)
  • 软件工程毕业设计课题(55)微信小程序毕业设计JAVA企业公司小程序系统设计与实现

    目的:本课题主要目标是设计并能够实现一个基于微信小程序公司企业站系统,前台用户使用小程序,后台管理使用基PHP开发,存储使用Mysql数据库;通过后台添加公司信息、资讯、产品等,用户通过小程序登录,查看公司信息、资讯、产品、案例等。 意义:微信小程序公司

    2024年02月04日
    浏览(56)
  • cms小猪o2o企业付款配置中微信提现配置实现商家转账到零钱(企业付款到零钱)解决:“操作失败!产品权限验证失败,请查看您当前是否具有该产品的权限“的错误提示

    在小猪o2o里面什么是商家转账到零钱功能?做什么用呢?平台收款设置里如果设置的收款方是平台而不是商户自己的话(默认),商户平台里收到客户的付款会暂存在平台的微信账户里,商户随时进行余额提现,这个提现的流程就是商家转账到零钱,一般正常设置如下(后面会提到特殊情

    2024年02月08日
    浏览(74)
  • PHP实现对微信支付v3版本回调数据的解密

    PS:本文使用了微信官方给出的demo来实现对回调数据的解密,本文主要对微信官方给出的demo如何使用作出部分个人讲解,以及对解密前后数据的格式进行展示 PHP类:这是微信官方给出的demo

    2024年02月15日
    浏览(46)
  • Java实现Kafka消费者及消息异步回调方式

    Kafka 在创建消费者进行消费数据时,由于可以理解成为是一个kafka 的单独线程,所以在Kafka消费数据时想要在外部对消费到的数据进行业务处理时是获取不到的,所以就需要实现一个消息回调的接口来进行数据的保存及使用。 消息回调接口实现代码如下 Kafka消费者代码实现如

    2024年02月06日
    浏览(52)
  • 企业微信自定义应用 企业可信IP配置 企业可信ip怎么设置

    现在创建应用想要使用需要设置企业可信IP,而配置企业可信IP需要先配置 设置可信域名 或 设置接收消息服务器URL,域名需要花钱而且配置麻烦,这里选择 设置接收消息服务器URL。 不设置就报这个错误: 真麻烦呀!!! 这里其实是一个类似防火墙的功能,只要在里面配

    2024年04月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包