作者:Mintimate
Mintimate's Blog,只为与你分享
消息推送到团队微信,很多人看了标题,可能不能理解什么意思,其实:
通过上述描述,大家是不是就更能理解了呢?所以,我们项目“说话”,就是让我们Java项目日常使用过程中,一些时间触发时,使用API推送消息至开发者/团队的微信,方便团队维护。类似邮件提醒?。
本文推送是直接内置到Java项目内,如:Springboot项目后端。如果需单独搭建推送服务,给其他工程使用,可以使用PHP进行搭建:
具体来说,推送服务的思路是这样的:
实际的项目中,也可以使用:
有时候,我们搭建一些项目,会直接使用外部API除了图片。比如:使用腾讯云万象数据,识别图片分类
这样的接口,肯定是有使用次数限制,在次数快使用完毕,就可以创建一个方法,直接调用实现写好的工具包方法,对微信发送消息:
Java作为一门后端语言,数据库的重要性不用多说。如果数据库服务器崩溃了,肯定是要第一时间处理。我们可以写一个监听,来观察数据库的“存活”:
前期准备很简单,主要是
在Maven内,加入Fastjson的包:
<!--Fastjson Alibaba--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency>
如果你项目并没有使用Maven进行项目包管理,需要手动下载Fastjson,并添加至项目依赖内:
使用Fastjson,主要是用于处理JSON对象。比如:JSON对象封装、JSON和String互转以及JSON对象解析等。
直接应用springframework的包,主要是想偷懒…… 如果你有更简单的方法实现包含header的HTTP请求,也可以不用springframework的包:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.3</version> </dependency>
微信接口申请,实际上是申请企业微信的接口。但是个人也可以申请。(且后期可以选择推过微信接收推送,实际上不需要多下载安装一个企业微信在手机上。)
进入企业微信官网,注册一个企业微信。创建好后。我们选择应用管理
,并创建一个应用:
创建好后,我们获取应用AgentId和Secret:
进入我的企业页面,拉到最下边,可以看到企业ID:
如果你并不想保留企业微信在手机上,想直接推送消息到自己的个人微信,可以进入「我的企业」 → 「微信插件」,拉到下边扫描二维码,关注以后即可收到推送的消息:
综上,你应该在项目内添加了Fastjson,并申请微信接口,得到参数:
WECOM_CID
:上文步骤中获取的企业IDWECOM_SECRET
:上文步骤中获取的应用SecretAGENT_ID
:上文步骤中获取的应用AgentId之所以需要上述消息,主要是用于token的生成,可以看微信开发者文档:
而有了token,才可以对微信进行推送。进一步,系统工作时候的原理:
我们创建了一个工具类,因为实际使用,肯定是作为一个静态方法使用,不用实例对象。所以,我们创建静态方法:
// 微信接口获取 final static String GET_ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; // 个人企业微信接口参数 final static String SEND_MESSAGE_URL = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="; // 企业微信公司ID final static String WECOM_CID = ""; // 企业微信公司密钥 final static String WECOM_SECRET = ""; // 应用ID final static String AGENT_ID = ""; // 发送用户,@all代表企业微信里所有人 final static String TOUSER = "@all"; // 发送失败 final static int ERROR_CODE=0; // 发送成功 final static int SUCCESS_CODE=0; // 发送状态 static int STATUS_CODE=ERROR_CODE;
当然,我这边的状态写的可能比较少,所以只写了2个状态。大家后续可以自行更改。另外大家记得填入自己企业微信的WECOM_CID
、WECOM_SECRET
、AGENT_ID
。
静态方法内,我已经提前定义Token申请的地址,我们只需要封装参数为JSON,对其请求即可:
// 微信接口获取 final static String GET_ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
我们使用RestTemplate
发起HTTP请求,先定义一个通用包,用于后续复用:
// HTTP请求发送 private static String HttpRestClient(String url, HttpMethod method, JSONObject json) throws IOException { SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setConnectTimeout(10 * 1000); requestFactory.setReadTimeout(10 * 1000); RestTemplate client = new RestTemplate(requestFactory); HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8"); headers.setContentType(type); HttpEntity<String> requestEntity = new HttpEntity(json.toString(), headers); // 执行HTTP请求 ResponseEntity<String> response = client.exchange(url, method, requestEntity, String.class); return response.getBody(); }
之后,写一个方法对其调用:
private static int sendMessage(String sendText, String access_token) { String url = SEND_MESSAGE_URL + access_token; HttpMethod method = HttpMethod.POST; JSONObject json = new JSONObject(); JSONObject jsonText = new JSONObject(); jsonText.put("content", sendText); json.put("touser", TOUSER); json.put("agentid", AGENT_ID); json.put("msgtype", "text"); json.put("text", jsonText); //发送http请求并返回结果 try { String result = sendMessageToWechat.HttpRestClient(url, method, json); JSONObject obj = JSON.parseObject(result); //将Json字符串转化为Json对象 if ((int) obj.get("errcode") == 200) { //从Json对象中提取键值为“status”的键值对,并将键值保存在“status”字符串中 STATUS_CODE = SUCCESS_CODE; } } catch (IOException e) { e.printStackTrace(); } return STATUS_CODE; }
测试一下:
首先,创建一个私有方法,对Token
和SEND_MESSAGE_URL
(https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=)组合的链接??,发送content对象。而这个content需要和其他参数组合为JSON对象,其结构:
用Fastjson来组合JSON对象很简单:
JSONObject json = new JSONObject(); JSONObject jsonText = new JSONObject(); jsonText.put("content", sendText); json.put("touser", TOUSER); json.put("agentid", AGENT_ID); json.put("msgtype", "text"); json.put("text", jsonText);
用上问提到的方法,再次发送POST请求即可:
private static int sendMessage(String sendText, String access_token) { String url = SEND_MESSAGE_URL + access_token; HttpMethod method = HttpMethod.POST; JSONObject json = new JSONObject(); JSONObject jsonText = new JSONObject(); jsonText.put("content", sendText); json.put("touser", TOUSER); json.put("agentid", AGENT_ID); json.put("msgtype", "text"); json.put("text", jsonText); //发送http请求并返回结果 try { String result = sendMessageToWechat.HttpRestClient(url, method, json); JSONObject obj = JSON.parseObject(result); //将Json字符串转化为Json对象 if ((int) obj.get("errcode") == 200) { //从Json对象中提取键值为“status”的键值对,并将键值保存在“status”字符串中 STATUS_CODE = SUCCESS_CODE; } } catch (IOException e) { e.printStackTrace(); } return STATUS_CODE; }
理论上,这个方法执行成功,消息就可以直接发送了。但是,这个未来作为系统的工具包,不用去实例,我们再写一个方法封装一下:
public static int sendText(String Text) { if (Text == null) { return ERROR_CODE; } String access_token = getAccessToken(); if (access_token == null || access_token.equals("")) { return ERROR_CODE; } else { sendMessage(Text, access_token); } return STATUS_CODE; }
这样,Controller层,就可以直接调用该方法了。
最后,我们测试使用一下。为了方便,我就不用Test类去测试,直接使用Main方法去测试:
public static void main(String args[]) { sendMessageToWechat.sendText("Mintimate's Blogn" + "只为与你分享~????\n" + "=> Bilibili:https://space.bilibili.com/355567627\n"+ "=> 腾讯云社区:https://cloud.tencent.com/developer/user/7704194\n"+ "=====\n"+ "<a href='https://www.mintimate.cn'>查看更多</a>"); }
运行,即可以看到微信收到通知了:
有些小伙伴可能想要文中的样例代码,为此我也在Github上进行了开源:
这样的推送服务是可以完善的。比如:
如果你有看企业微信开发者文档,你会发现Token的有效期是:1800秒。你可以使用Redis进行临时存储缓存。
本文演示发送消息,但是接口是可以发送图片、语言等内容。且接受数据均为JSON,可以按本文方法实现:
使用Java,直接集成在JavaWeb项目里,固然不错,但是如果想作为一个API接口,那么使用PHP是更好的选择,还可以使用Serverless:
综上所述,就是让Java项目“说话”的方案了嗷。当然,肯定有更好的方法,但是推送到微信,也觉得是个好方法嗷~
中国最?好的一朵云飘进了华瑞银行。阿里云将进一步助力华瑞银行All in Cloud。 -...
很长时间没有更新原创文章了,但是还一直在思考和沉淀当中,后面公众号会更频繁...
查看表结构,sbtest1有主键、k_1二级索引、i_c二级索引 CREATE TABLE `sbtest1` ...
定义 this是函数运行时自动生成的内部对象,即调用函数的那个对象。(不一定很准...
一、PostgreSQL行业位置 一 行业位置 首先我们看一看RDS PostgreSQL在整个行业当...
2020年对于云计算行业来说是突破性的一年,因为公共云供应商增加了收入,而疫情...
本文转载自网络,原文链接:https://mp.weixin.qq.com/s/vlOUg46B5bcmToX-fjavJQ...
9月17日,2020云栖大会上,阿里云正式发布工业大脑3.0。 阿里云智能资深产品专家...
在TOP云(zuntop.com)科技租赁过服务器的站长都知道独立服务器在价格上比VPS主...
最近,DevOps的采用导致了企业计算的重大转变。除无服务器计算,动态配置和即付...