企业微信获取token 存入redis 设置时长2小时 && 发送企业应用消息接口

1.常量类

package com.ruoyi.common.constant;/*** 微信常用常量* @author chenkai*/
public class WeChatConstants {/*** 获取企业微信access_token地址*/public static final String BASE_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";/*** 获取企业微信部门地址*/public static final String DEPARTMENT_URL = "https://qyapi.weixin.qq.com/cgi-bin/department/list";/*** 企业微信推送消息地址*/public static final String sendMessage_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN";/*** 获取企业微信access_token组装URL*/public static final String ACCESS_TOKEN_URL = BASE_URL + "?corpid=%s&corpsecret=%s";/*** 企业微信返回错误信息*/public static final String ERRCODE = "errcode";/*** 企业微信token redis key*/public static final String ACCESS_TOKEN = "access_token";/*** 企业微信agentSecret redis key*/public static final String AGENT_SECRET = "agent_secret";/*** 企业微信corpID redis key*/public static final String CORP_ID = "corp_id";}

2.消息发送文本类

package com.ruoyi.system.domain.weChat;import lombok.Data;/*** 消息发送文本* @author chenkai*/
@Data
public class TextMessage extends BaseMessage{/** 文本*/private Text text;/** 否 表示是否是保密消息,0表示否,1表示是,默认0*/private int safe;
}

3.企业微信发送基本参数类

package com.ruoyi.system.domain.weChat;import lombok.Data;/*** @author chenkai*/
@Data
public class BaseMessage {/**否 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向该企业应用的全部成员发送*/private String touser;/**否 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数*/private String toparty;/**否 标签ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数*/private String totag;/**是 消息类型*/private String msgtype;/**是 企业应用的id,整型。可在应用的设置页面查看*/private int agentid;}

4.文本类

package com.ruoyi.system.domain.weChat;
import lombok.Data;/*** 文本* @author 15553051722*/
@Data
public class Text {/**是    消息内容,最长不超过2048个字节*/private String content;
}

5.接受入参类

package com.ruoyi.system.domain.weChat.DTO;import lombok.Data;/*** 企业微信发送消息实体类* @author chenkai*/
@Data
public class MessageDTO {/**消息*/private String content;/**用户id*/private String userid;/**部门id*/private String toparty;
}

6.实现类

package com.ruoyi.system.service.impl;import com.alibaba.fastjson2.JSON;
import com.google.gson.Gson;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.WeChatConstants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.system.domain.weChat.DTO.MessageDTO;
import com.ruoyi.system.domain.weChat.Text;
import com.ruoyi.system.domain.weChat.TextMessage;
import com.ruoyi.system.service.IEnterpriseWeChatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.TimeUnit;/*** 企业微信实现类* @author chenkai*/
@Service
public class EnterpriseWeChatServiceImpl implements IEnterpriseWeChatService {@Autowiredprivate RedisCache redisCache;/*** 发送应用消息* 先从redis中获取 如获取不到或不可用 则重新获取* 并存入redis设置时长2小时 因为每天获取token的次数是有限的* @param messageDTO 消息内容 发送人 发送部门* @return accessToken*/@Overridepublic void weCharMessage(MessageDTO messageDTO) {if (StringUtils.isNull(messageDTO.getUserid())&&StringUtils.isNull(messageDTO.getToparty())){throw new ServiceException("发送人或发送部门最少选一个");}String url = WeChatConstants.sendMessage_url.replace("ACCESS_TOKEN", this.getAccessToken());// 2.获取发送对象,并转成jsonGson gson = new Gson();Text text = new Text();//发送消息实体TextMessage textMessage = new TextMessage();//非必需textMessage.setTouser(messageDTO.getUserid());textMessage.setToparty(messageDTO.getToparty());//必须textMessage.setAgentid(1000002);//设置消息类型textMessage.setMsgtype("text");//存入消息文本text.setContent(messageDTO.getContent());//将消息文本存入实体textMessage.setText(text);String jsonMessage = gson.toJson(textMessage);Map response = (Map) JSON.parse(HttpUtils.sendPost(url,jsonMessage));//获取错误日志if (response.containsKey(WeChatConstants.ERRCODE) && (Integer) response.get(WeChatConstants.ERRCODE) != 0) {throw new ServiceException("消息发送失败", (Integer) response.get(WeChatConstants.ERRCODE));}}/*** 通过corpID获取AccessToken** 从redis中获取accessToken如果为空* 或者当前accessToken校验失败* 则重新访问企业微信获取accessToken接口* 并存入redis* @return accessToken*/@Overridepublic String getAccessToken() {//获取redis里的accessTokenString accessToken = redisCache.getCacheObject(getCacheKey(WeChatConstants.ACCESS_TOKEN));//redis中有并且redis中的token可正常使用就返回redis中的token//如果redis中没有 或者 redis中的token不可正常使用 则重新获取tokenif (StringUtils.isNotEmpty(accessToken) && this.isToken(accessToken)) {return accessToken;}//获取token必携带数据 corpId agentSecret 具体获取方法 查看企业微信api文档//之前手动存入redis 组装redisKey 从redis中获取String corpId = redisCache.getCacheObject(getCacheKey(WeChatConstants.CORP_ID));String agentSecret = redisCache.getCacheObject(getCacheKey(WeChatConstants.AGENT_SECRET));if (StringUtils.isEmpty(corpId) || StringUtils.isEmpty(agentSecret)) {throw new ServiceException("企业ID和应用secret不能为空");}//将企业微信获取accessTokenURL组装String getAccessTokenUrl = String.format(WeChatConstants.ACCESS_TOKEN_URL, corpId, agentSecret);//将访问企业微信接口 返回的String数据 转换成mapMap response = (Map) JSON.parse(HttpUtils.sendGet(getAccessTokenUrl));//获取错误日志if (response.containsKey(WeChatConstants.ERRCODE) && (Integer) response.get(WeChatConstants.ERRCODE) != 0) {throw new ServiceException("获取token失败", (Integer) response.get(WeChatConstants.ERRCODE));}//获取token 并存入redis 设置时间两个小时accessToken = (String) response.get(WeChatConstants.ACCESS_TOKEN);redisCache.setCacheObject(getCacheKey(WeChatConstants.ACCESS_TOKEN), accessToken, 2, TimeUnit.HOURS);return accessToken;}/*** 校验token访问企业微信接口是否成功** @param accessToken 参数键* @return 缓存键key*/private boolean isToken(String accessToken) {Map department = (Map) JSON.parse(HttpUtils.sendGet(WeChatConstants.DEPARTMENT_URL, "access_token=" + accessToken));if (department.containsKey(WeChatConstants.ERRCODE) && (Integer) department.get(WeChatConstants.ERRCODE) != 0) {throw new ServiceException("token校验错误", (Integer) department.get(WeChatConstants.ERRCODE));}return true;}/*** 设置cache key** @param configKey 参数键* @return 缓存键key*/private String getCacheKey(String configKey) {return CacheConstants.SYS_CONFIG_KEY + configKey;}
}

【企业微信】获取token 发送应用消息相关推荐

  1. [简单便捷]springboot整合企业微信webhook快速发送消息提醒

    springboot整合企业微信webhook快速发送消息提醒(wework webhook robot) a java SDK for wework webhook robot 介绍(introdu ...

  2. 企业微信加密消息体_用企业微信小程序发送消息

    在企业开发中,经常会碰到一些消息要及时推送到企业员工的手中.so 下面来说怎么向企业微信中的员工发消息. 本人只是记录下开发过程,详细参考https://work.weixin.qq.com/api/ ...

  3. 微信公众号订阅号开发的学习(二):获取用户发送的消息、简单的自动回复、自定义菜单

    获取用户发送的消息 基础 微信服务器会发送两种类型的消息给开发者服务器. get请求 验证服务器的有效性 post请求 微信服务器会将用户发送的数据转发到开发者服务器上 实现 基于微信公众号订阅号开发 ...

  4. 微信公众号 发送模板消息和获取关注公众号人数

    微信公众号发送模板消息 1.创建模板,拿到模板ID 2.创建发送消息工具类 import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JS ...

  5. vue从url中获取token并加入到 请求头里_轻流amp;amp;企业微信——获取打卡数据...

    企业微信开放了打卡应用的api,功能包括查询打卡数据,能获取到用户.地点.时间.打卡类型等信息,在轻流中可以基于以上数据做一段时间内的迟到/事假等统计,以及更深层数据处理,方便管理. 第一步:获取ac ...

  6. MeterSphere实现“机器人定时在企业微信群中发送消息”功能

    背景 之前有过用PowerShell实现"机器人定时在企业微信群中发送消息"功能,并有输出相关教程. 但发现有一些问题:比如电脑关机了导致任务不能如期启动,于是在摸索中找到可替代P ...

  7. PowerShell实现“机器人定时在企业微信群中发送消息”功能(下)

    本章实现 由于篇幅较多,会拆分为上.下两部分来写. 本章实现: 06.机器人定时在企业微信群中发送消息功能 上章实现 01.如何在企业微信中添加群机器人 02.简单用机器人发送一条消息(postman ...

  8. PowerShell实现“机器人定时在企业微信群中发送消息”功能(上)

    本章实现 由于篇幅较多,会拆分为上.下两部分来写. 本章实现: 01.如何在企业微信中添加群机器人 02.简单用机器人发送一条消息(postman实现) 03.powershell打开 04.简单用机 ...

  9. 微信android字体颜色,企业微信使用markdown发送消息,手机端看不到font标签设置的字体颜色...

    标签设置的字体颜色 问题类型 API/组件名称 终端类型 微信版本 基础库版本 Bug 消息推送 微信安卓客户端 3.0.26(13239) 2.0.0 企业微信使用markdown发送消息,手机端看 ...

最新文章

  1. 《强化学习周刊》第28期:UNCC提出全新脑-机交互学习模式:内在互动强化学习...
  2. 15 个最佳的 jQuery 表格插件
  3. 【ARM】数据操作指令(下)
  4. 火速围观!鹅厂中间件产品遭遇暴风吐槽
  5. hibernate 级联删除
  6. 做系统ghost步骤图解_用好这工具,小孩都能会重装系统!
  7. Golang——数组遍历、最大值、求和、多维数组
  8. 深圳数字人民币专项资金至3月末已累计发放1.96亿元
  9. PHP修改表格(增删改)
  10. Linux 命令(124)—— lsof 命令
  11. ubuntu下gstreamer解码器
  12. Pandas:利用Styler对象设置Series、Dataframe在Jupyter Notebook中的输出样式(3)——格式化显示值、内置显示值格式化方法、表格外观、样式复用
  13. VMware虚拟机下载安装教程
  14. 推特情感分析-基于spark
  15. 【优化布局】matlab基于禁忌搜索算法求解基站选址问题代码
  16. java上看小说软件_i悦读小说阅读软件 For java
  17. RS导出Excel交叉表角对应的列占用多列问题
  18. geogebra动态数学软件,实用工具
  19. 《程序员》10月精彩内容:iOS Android 10 年
  20. 你好,智·世界竞赛大神社团达人专场,来听听赛场师兄的升级打怪心法

热门文章

  1. 瀑布图的一种改进方法
  2. 原语科技正式推出隐私计算开源平台Primihub!
  3. 2020未能认证证件
  4. Vue实现文字转语音,语音播报
  5. Web前端期末大作业-卫浴商店公司网页设计(HTML+CSS+JS)
  6. 计算机设计语言常用的英语,计算机设计语言
  7. redis官方文档中文版_Partitioning : 怎么样将你的数据分布在多个redis instance上?
  8. 【KylinTOP:国内高端性能测试工具学习】
  9. GPU编程之CUDA(三)——关于联想Y470
  10. Springboot+Vue实现团队邮箱邀请成员