首先创建一个AccessToken实体类,用于返回应用密钥
package cn.com.webservice.WeChat.util;
/**
* AccessToken实体类
*
* @author Miss.Ru
* @create 2019/3/1 0:08
*/
public class AccessToken {
/**
* 凭证/密钥
*/
private String accessToken;
/**
* 凭证的有效时间(秒)
*/
private long expiresIn;
/**
* 出错返回码,为0表示成功,非0表示调用失败
*/
private int errcode;
/**
* 返回码提示语
*/
private String errmsg;
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public long getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(long expiresIn) {
this.expiresIn = expiresIn;
}
public int getErrcode() {
return errcode;
}
public void setErrcode(int errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
}
HttpRequestUtil.java
/**
* http请求工具类
* @author Miss.Ru
* @create 2018-08-29 10:12
*/
public class HttpRequestUtil {
/**
* 向指定URL发送GET方法的请求
*
* @param requestUrl 发送请求的URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
* @throws Exception
*/
public static String sendGet(String requestUrl, String param) throws Exception {
URL u = new URL(requestUrl);
//注意:重点知识,此句判断用于信任所有的https请求
if("https".equalsIgnoreCase(u.getProtocol())){
//测试SslUtils
SslUtils.ignoreSsl();
}
String result = "";
BufferedReader in = null;
try {
String urlString = requestUrl + "?" + param;
URL url = new URL(urlString);
// 打开和URL之间的连接
URLConnection connection = url.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url 发送请求的 URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param) {
return sendPost(url, param, false, "", 0);
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param requestUrl 发送请求的 URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @param isproxy 是否使用代理模式
* @param proxyHost 代理服务器地址
* @param proxyPort 代理服务器端口号
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String requestUrl, String param, boolean isproxy, String proxyHost, int proxyPort) {
OutputStreamWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL url = new URL(requestUrl);
HttpURLConnection conn = null;
if (isproxy) {//使用代理模式
@SuppressWarnings("static-access")
Proxy proxy = new Proxy(Proxy.Type.DIRECT.HTTP, new InetSocketAddress(proxyHost, proxyPort));
conn = (HttpURLConnection) url.openConnection(proxy);
} else {
conn = (HttpURLConnection) url.openConnection();
}
// 打开和URL之间的连接
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);//设置输出流采用字节流
conn.setDoInput(true); //设置输入流采用字节流
conn.setRequestMethod("POST"); // POST方法
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.connect();
// 获取URLConnection对象对应的输出流
out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
// 发送请求参数
out.write(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
新建企业微信Util类, WeChatUtil.java
package cn.com.webservice.WeChat.util;
import cn.com.webservice.util.HttpRequestUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sun.istack.internal.logging.Logger;
import java.util.HashMap;
import java.util.Map;
/**
* 企业微信util
*
* @author Miss.Ru
*/
public class WeChatUtil {
private static Logger log = Logger.getLogger(WeChatUtil.class);
/**
* 保存应用密钥
*/
private static Map<String, AccessToken> tokenMap = new HashMap<String, AccessToken>();
/**
* 企业ID(企业微信*管理后台-企业信息-企业ID)
*/
private static String corpid = "wxf928acddfe5c";
/**
* 获取应用access_token
* API URL:https://work.weixin.qq.com/api/doc#90000/90135/91039
*
* @param corpsecret 应用的凭证密钥
* @return
* @throws Exception
*/
public static String getAccessToken(String corpsecret) throws Exception {
AccessToken token = tokenMap.get(corpsecret);
//为空或者过期重新获取应用密钥
if (token != null && token.getExpiresIn() > System.currentTimeMillis()) {
return token.getAccessToken();
}
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
String param = "corpid=" + corpid + "&corpsecret=" + corpsecret;
String result =HttpRequestUtil.sendGet(url, param);
JSONObject obj = JSONObject.parseObject(result);
int errcode = obj.getInteger("errcode");
if (errcode == 0) {
String accessToken = obj.getString("access_token");
long expriseIn = obj.getLong("expires_in");
token = new AccessToken();
token.setAccessToken(accessToken);
token.setExpiresIn(System.currentTimeMillis() + expriseIn * 1000);
tokenMap.put(corpsecret, token);
return accessToken;
} else {
log.info("获取token出错 corpsecret:" + corpsecret + " result:" + result);
return null;
}
}
/**
* 发送消息(文本)
* API URL:https://work.weixin.qq.com/api/doc#90000/90135/90236
*
* @param user 成员ID(企业微信*管理后台-通讯录-账号)
* @param message 消息内容
* @return
* @throws Exception
*/
public static boolean sendMessage(String user, String message) throws Exception {
String corpsecret = "InWpADosVsG56yuMwBl8TSZ0khvzSK2pF0";//应用的Secret
String token = WeChatUtil.getAccessToken(corpsecret);//获取access_token
String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + token;
Map<String, Object> map = new HashMap<String, Object>();
map.put("touser", user);//成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)
map.put("toparty", "");//部门ID列表,多个接收者用‘|’分隔,最多支持100个。
map.put("totag", "");//标签ID列表,多个接收者用‘|’分隔,最多支持100个
map.put("msgtype", "text");//消息类型,此时固定为:text
map.put("agentid", "0");//工作通知企业应用的id,整型(AgentId)
Map<String, Object> content = new HashMap<String, Object>();
content.put("content", message);
map.put("text", content);//消息内容,最长不超过2048个字节,超过将截断
String result = HttpRequestUtil.sendPost(url, JSON.toJSONString(map));
boolean isSuccess = false;
JSONObject obj = JSONObject.parseObject(result);
int errcode = obj.getInteger("errcode");//返回errcode
if (errcode == 0) {
isSuccess = true;
String[] users = user.split("\\|");
for (String u : users) {
log.info("给" + u + "发送文本消息成功:" + message + ",返回:" + result);
}
} else {
String[] users = user.split("\\|");
for (String u : users) {
log.info("给" + u + "发送文本消息失败:" + message + ",返回:" + result);
}
isSuccess = false;
}
return isSuccess;
}
public static void main(String[] args) throws Exception {
//测试发送企业微信文本消息
boolean result = sendMessage("chengxuyuan", "Hello Word!");
System.out.println(result);
}
}