Java 对接企业微信(文本消息推送)

Java 对接企业微信(文本消息推送)

背景

公司的项目,通知信息打算接入企业微信通知。提前做下实验。

版本

JDK 21

SpringBoot 3.1.5

weixin-java-cp 4.5.0

hutool-all 5.8.23

jedis 5.1.0

说明:暂时只是一个springboot小demo,后续根据项目会有组件和结构的修改。

代码

代码比较简单,配置好参数直接调用即可。

这里全部贴到这里,后面会讲解每一步所需要的参数来源及怎么配置。

POM

xml 复制代码
    <properties>
        <java.version>21</java.version>
        <snakeyaml.version>2.2</snakeyaml.version>
        <jakarta.validation-api.version>3.0.2</jakarta.validation-api.version>
        <hibernate-validator.version>8.0.1.Final</hibernate-validator.version>
        <fastjson.version>2.0.43</fastjson.version>
        <weixin-java-cp.version>4.5.0</weixin-java-cp.version>
        <hutool-all.version>5.8.23</hutool-all.version>
        <jedis.version>5.1.0</jedis.version>
    </properties>
<dependencies>
        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool-all.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>${jedis.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-cp -->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-cp</artifactId>
            <version>${weixin-java-cp.version}</version>
        </dependency>

        <dependency>
            <groupId>jakarta.validation</groupId>
            <artifactId>jakarta.validation-api</artifactId>
            <version>${jakarta.validation-api.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>${hibernate-validator.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
    </dependencies>

配置实体

java 复制代码
@Data
@Component
@ConfigurationProperties(value = "wechat2")
public class WechatConfig {
    /**
     * 要发送消息的应用的两个字段
     */
    @Value("${wechat2.agentid}")
    private Integer agentId;
    /**
     *
     */
    @Value("${wechat2.secret}")
    private String secret;
    /**
     * 企业id
     */
    @Value("${wechat2.corpid}")
    private String corpId;
    /**
     * 用于访问redis的密码,没设置就不需要这个字段
     */
    @Value("${wechat2.redis-pwd}")
    private String redisPwd;
}

工具类

java 复制代码
@Slf4j
@Component
public class WechatConfigUtil {
    @Resource
    private WechatConfig wechatConfig;

    /**
     * 配置企业微信服务
     *
     * @return -
     */
    public WxCpService wxCpService() {
        WxCpService wxCpService = new WxCpServiceImpl();
        WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl();
        config.setAgentId(wechatConfig.getAgentId());
        config.setCorpSecret(wechatConfig.getSecret());
        config.setCorpId(wechatConfig.getCorpId());
        resetTokenAndJsApi(wxCpService, config);
        return wxCpService;
    }

    /**
     * 重置token
     *
     * @param wxCpService       -
     * @param wxCpDefaultConfig -
     */
    public void resetTokenAndJsApi(WxCpService wxCpService, WxCpDefaultConfigImpl wxCpDefaultConfig) {
        JedisPool jedisPool = new JedisPool();
        Jedis jedis = jedisPool.getResource();
        if (StringUtils.isNotBlank(wechatConfig.getRedisPwd())) {
            jedis.auth(wechatConfig.getRedisPwd());
        }
        wxCpService.setWxCpConfigStorage(wxCpDefaultConfig);
        String wxAccessToken = "wx" + wechatConfig.getAgentId();
        // 根据应用id获取对应token
        String json = jedis.get(wxAccessToken);
        if (!StringUtils.isEmpty(json)) {
            wxCpDefaultConfig = JSON.parseObject(json, WxCpDefaultConfigImpl.class);
        }
        // token到期
        if (wxCpDefaultConfig.isAccessTokenExpired()) {
            try {
                String accessToken;
                accessToken = wxCpService.getAccessToken(false);
                wxCpDefaultConfig.setAccessToken(accessToken);
            } catch (WxErrorException e) {
                log.error(e.getMessage());
            }
        }
        // 缓存token
        jedis.set(wxAccessToken, JSON.toJSONString(wxCpDefaultConfig));
        jedis.close();
    }
}

发送消息

java 复制代码
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
@Component
public class SendWxCpMsg {
    @Autowired
    private WechatConfigUtil wechatConfigUtil;

    public void sendToWxCp(String username) {
        // 微信消息对象
        WxCpMessageServiceImpl wxCpMessageService = new WxCpMessageServiceImpl(wechatConfigUtil.wxCpService());
        WxCpMessage wxCpMessage = new WxCpMessage();
        wxCpMessage.setSafe("0");
        // 设置消息形式,这里设置为卡片消息
        wxCpMessage.setMsgType("textcard");

        var time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"));
        // 设置发送用户
        wxCpMessage.setToUser(username);
        // 发送的标题
        wxCpMessage.setTitle("通知标题-TEST");
        // 发送内容
        wxCpMessage.setDescription("祝新年快乐,幸福安康!"
                + "\n" + "当前时间为:"
                + time + "\n"
                + "点击下方领取祝福");
        // 设置跳转url
        wxCpMessage.setUrl("https://developer.work.weixin.qq.com/community/question");
        wxCpMessage.setBtnTxt("前往");
        try {
            // 发送消息
            WxCpMessageSendResult send = wxCpMessageService.send(wxCpMessage);
            log.info("send result:{}", send);
        } catch (WxErrorException e) {
            log.error("发送信息接口调用出错: {}", e.getMessage());
        }
    }
}

测试

java 复制代码
@RestController
public class MsgSendController {
    @Resource
    private SendWxCpMsg sendWxCpMsg;

    @GetMapping("/send")
    private void send() {
        sendWxCpMsg.sendToWxCp("Xxxxxx.Xxx");
    }
}

配置文件

yml 复制代码
wechat2:
  corpid: xxxxxxx1
  agentid: 1000002
  secret: xxxxxxx2
  redis-pwd:

配置文件中的参数来源

secret

corpid

agentid

执行

到这里,基本的配置已经OK,可以跑下代码。

异常

会报如下异常:

text 复制代码
【错误信息】:错误代码:60020, 错误信息:访问ip不在白名单之中;请确认访问ip是否在服务商白名单IP列表,微信原始报文:{"errcode":60020,"errmsg":"not allow to access from your ip, hint: [170201673442683], from ip: xxx.7xx.xxx.10, more info at https://open.work.weixin.qq.com/devtool/query?e=60020"}

原因

没有配置可信域名

这里如何配置?

见官网:设置可信域名时,提示"检查域名所有权不通过"

注意:它这里必须要有域名可以公网访问,必须要企业微信能调通,不然不会通过的。

OK,也就是到这里,就终止了实验。

后面公司申请流程通过之后,拿到公司域名再来实验,bye。

文档

相关推荐
计算机毕设指导69 分钟前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study11 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data14 分钟前
二叉树oj题解析
java·数据结构
牙牙70519 分钟前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins
paopaokaka_luck27 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭39 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师40 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
The_Ticker1 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法