java推送企业微信消息
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.8</version>
</dependency>
所需配置
cropId: 企業微信id
corpsecret 應用的憑證密鑰
agentid 企業應用的id
1、封裝消息體
//封裝消息體 可以直接用json也可以創建對象
public void send(String msg, String userIds) {
//1.創建文本消息對象
TextMessage message = new TextMessage();
message.setTouser(userIds);
//1.2必需
message.setMsgtype("text");
message.setAgentid(agentId);
Text text = new Text();
text.setContent(msg);
message.setText(text);
sendMessage(0, message);
}
@Data
public class TextMessage extends BaseMessage {
/**
* 文本TextMessage
*/
private Text text;
/**
* 表示是否是保密消息,0表示否,1表示是,默認0
*/
private int safe;
}
@Data
public class Text {
/**
* 消息內容,最長不超過2048個字節
*/
private String content;
}
2.請求token及推送消息
public void sendMessage(Integer mark, BaseMessage message) {
String key = "wx_accessToken:" + platformVO.getAppId() + "_secret:" + platformVO.getSecret();
String token = null;
token = redisTemplate.opsForValue().get(key);
//mark大于0代表token失效
if (null == token || mark > 0) {
log.info("獲取token");
//2.獲取access_token:根據企業id和通訊錄密鑰獲取access_token,并拼接請求url
AccessToken accessToken = WeiXinUtil.getAccessToken(platformVO.getAppId(), platformVO.getSecret());
token = accessToken.getToken();
redisTemplate.opsForValue().set(key, accessToken.getToken(), accessToken.getExpiresIn() - 4, TimeUnit.SECONDS);
}
log.info("企業微信token:" + token);
//3.發送消息:調用業務類,發送消息
String jsonMessage = JSONObject.toJSONString(message);
//2.獲取請求的url
String sendMessage_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + token;
//3.調用接口,發送消息
String result = HttpUtil.doPost(sendMessage_url, null, jsonMessage, null);
JSONObject jsonObject = JSONObject.parseObject(result, JSONObject.class);
List<String> errorCode = Lists.newArrayList();
errorCode.add("40014");
errorCode.add("42001");
//4.錯誤消息處理
if (null != jsonObject) {
if (errorCode.contains(jsonObject.getString("errcode")) && mark < 3) {
log.info("消息推送失敗 errcode:{}", jsonObject.getInteger("errcode") + "重新獲取token");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
sendMessage(mark + 1, message);
} else if (0 != jsonObject.getInteger("errcode")) {
log.error("消息推送失敗 errcode:{} errmsg:{}", jsonObject.getInteger("errcode"), jsonObject.getString("errmsg"));
} else {
log.info("企業微信消息推送成功!");
}
}
}
/**
* 所需要用到的工具類
* @author tangh
*/
@Slf4j
public class WeiXinUtil {
/**
* 微信的請求url
* 獲取access_token的接口地址(GET) 限200(次/天)
*/
public final static String ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}";
/**
* 1.發起https請求并獲取結果
*
* @param requestUrl 請求地址
* @param outputStr 提交的數據
* @return JSONObject(通過JSONObject.get ( key)的方式獲取json對象的屬性值)
*/
public static JSONObject httpRequest(String requestUrl, String outputStr) {
JSONObject jsonObject = null;
CloseableHttpResponse response = null;
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(requestUrl);
StringEntity requestEntity = new StringEntity(outputStr, "utf-8");
httpPost.setEntity(requestEntity);
httpPost.setHeader("Content-Type", "application/json;charset=UTF-8");
response = httpClient.execute(httpPost);
String result = EntityUtils.toString(response.getEntity(), "utf-8");
jsonObject = JSONObject.parseObject(result);
} catch (ConnectException ce) {
ce.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
} catch (IOException e) {
log.error("POST請求response關閉異常,錯誤信息為{}", e.getMessage(), e);
}
}
return jsonObject;
}
/**
* 發起http請求獲取返回結果
*
* @param requestUrl 請求地址
* @return
*/
public static String httpRequest(String requestUrl) {
String result = null;
HttpGet httpGet = new HttpGet(requestUrl);
CloseableHttpResponse response = null;
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
response = httpClient.execute(httpGet);
result = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
} catch (IOException e) {
log.error("GET請求response關閉異常,錯誤信息為{}", e.getMessage(), e);
}
}
return result;
}
/**
* 3.獲取access_token
*
* @param appid 憑證
* @param appsecret 密鑰
* @return
*/
public static AccessToken getAccessToken(String appid, String appsecret) {
AccessToken accessToken = null;
String requestUrl = ACCESS_TOKEN_URL.replace("{corpId}", appid).replace("{corpsecret}", appsecret);
JSONObject jsonObject = JSONObject.parseObject(httpRequest(requestUrl), JSONObject.class);
// 如果請求成功
if (null != jsonObject) {
try {
accessToken = new AccessToken();
accessToken.setToken(jsonObject.getString("access_token"));
accessToken.setExpiresIn(jsonObject.getInteger("expires_in"));
} catch (JSONException e) {
accessToken = null;
// 獲取token失敗
log.error("獲取token失敗 errcode:{} errmsg:{}" + jsonObject.getInteger("errcode") + ":" + jsonObject.getString("errmsg"));
}
}
return accessToken;
}
}
@Slf4j
public final class HttpUtil {
/**
* 超時時間
*/
private static final Integer TIMEOUT = 20000;
private HttpUtil() {
}
/**
* 發送post請求
*
* @param url url
* @param header header
* @param body body
* @param param param
* @return string
*/
public static String doPost(String url, Map<String, String> header, String body, Map<String, Object> param) {
String result = "";
BufferedReader in = null;
PrintWriter out = null;
try {
// 設置 url
url = getUrl(url, param);
URL realUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("POST");
// 設置 header
if (header != null) {
for (String key : header.keySet()) {
connection.setRequestProperty(key, header.get(key));
}
}
// 設置請求 body
connection.setDoOutput(true);
connection.setDoInput(true);
//設置連接超時和讀取超時時間
connection.setConnectTimeout(TIMEOUT);
connection.setReadTimeout(TIMEOUT);
try {
out = new PrintWriter(connection.getOutputStream());
// 保存body
out.print(body);
// 發送body
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
log.info("connection: " + connection);
log.info("body: " + out);
try {
// 獲取響應body
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 發送get請求
*
* @param url url
* @param header header
* @param param param
* @return string
*/
public static String doGet(String url, Map<String, String> header, Map<String, Object> param) {
String result = "";
BufferedReader in = null;
try {
url = getUrl(url, param);
// 設置 url
URL realUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setUseCaches(false);
connection.setRequestMethod("GET");
// 設置 header
if (header != null) {
for (String key : header.keySet()) {
connection.setRequestProperty(key, header.get(key));
}
}
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
log.error(e.getMessage());
return null;
}
return result;
}
/**
* @param url url
* @param param 請求參數
* @return String
*/
public static String getUrl(String url, Map<String, Object> param) {
if (null != param && param.size() > 0) {
StringBuilder stringBuilder = new StringBuilder(url);
stringBuilder.append("?");
Set<Map.Entry<String, Object>> entries = param.entrySet();
for (Map.Entry<String, Object> entry : entries) {
stringBuilder.append(entry.getKey() + "=" + entry.getValue() + "&");
}
url = stringBuilder.substring(0, stringBuilder.length() - 1);
}
return url;
}
}
總結
以上是生活随笔為你收集整理的java推送企业微信消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql物理备份工具Xtrabacku
- 下一篇: 对Javascript 类、原型链、继承