添加依赖
<!-- json解析器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
<!--日志框架 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.9</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
编写HttpClient工具类(POST/GET)
package com.dehui.utils;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class HttpClientHelp {
private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); // 日志记录
private static RequestConfig requestConfig = null;
static {
// 设置请求和传输超时时间
requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();
}
/**
* 发送get请求工具类
* @param url url
* @return String 接口返回数据
*/
public static String sendGet(String url) {
//因为httpclient是一个接口不能直接进行实例化,需用其实现子类
CloseableHttpClient client = HttpClients.createDefault();
//准备get请求定义一个httpget实现get请求:
HttpGet httpget = new HttpGet(url);
HttpResponse response = null;
try {
//获取接口返回数据对象
response = client.execute(httpget);
} catch (Exception e) {
e.printStackTrace();
}
int status = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
String result = null;
try {
result = EntityUtils.toString(entity);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* post请求传输json参数
* @param url url地址
* @param Param 参数
* @return
*/
public static String sendPost(String url, String Param) {
// post请求返回结果
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = null;
HttpPost httpPost = new HttpPost(url);
// 设置请求和传输超时时间
httpPost.setConfig(requestConfig);
httpPost.setHeader("X-Requested-With","X");
try {
if (null != Param) {
// 解决中文乱码问题
StringEntity entity = new StringEntity(Param.toString(), "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
}
CloseableHttpResponse response = httpClient.execute(httpPost);
// 请求发送成功,并得到响应
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK ||
response.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED ||
response.getStatusLine().getStatusCode() == HttpStatus.SC_ACCEPTED ||
response.getStatusLine().getStatusCode() == HttpStatus.SC_NO_CONTENT) {
try {
// 读取服务器返回过来的json字符串数据
result = EntityUtils.toString(response.getEntity(), "utf-8");
// 把json字符串转换成json对象
//jsonResult = JSONObject.parseObject(str);
} catch (Exception e) {
logger.error("post请求提交失败:" + url, e);
}
}
} catch (IOException e) {
logger.error("post请求提交失败:" + url, e);
} finally {
httpPost.releaseConnection();
}
return result;
}
/**
* post请求传输String参数 例如:name=Jack&sex=1&type=2
* Content-type:application/x-www-form-urlencoded
*
* @param url url地址
* @param strParam 参数
* @return
*/
public static String httpPost(String url, String strParam) {
// post请求返回结果
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = "";
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(requestConfig);
try {
if (null != strParam) {
// 解决中文乱码问题
StringEntity entity = new StringEntity(strParam, "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/x-www-form-urlencoded");
httpPost.setEntity(entity);
}
CloseableHttpResponse response = httpClient.execute(httpPost);
// 请求发送成功,并得到响应
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
try {
// 读取服务器返回过来的json字符串数据
result = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
logger.error("post请求提交失败:" + url, e);
}
}
} catch (IOException e) {
logger.error("post请求提交失败:" + url, e);
} finally {
httpPost.releaseConnection();
}
return result;
}
}
编写调用企微API方法类
package com.dehui.utils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.util.Formatter;
/**
*
* 1.获取accessToken
* 2.获取jsapi中的ticket
* 3.生成jsapiz中的鉴权sign
* 4.根据传入的临时code获取用户的基本信息,入userinfo
* 5.(ISV版本)根据userid获取详细用户信息
*
* @author lnexin
*
*/
public class AuthHelper {
// 企微api相关
static String TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
static String TICKET_URL = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket";
static String USER_INFO_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo";
static String USER_ALL_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/get";
static String MESSAGE_URL = "https://qyapi.weixin.qq.com/cgi-bin/message/send";
// 调整到1小时50分钟
public static final long cacheTime = 1000 * 60 * 55 * 2;
private static String ACCESS_TOKEN = null;
private static String JSAPI_TICKET = null;
private static long LAST_TIME = 0;
/**
*
* @param corpId
* @param corpSecert
* @return 与企微服务器请求生成的accessToken
*/
public static String getAccessToken(String corpId, String corpSecert) {
long curTime = System.currentTimeMillis();
long differ = curTime - LAST_TIME;
if (ACCESS_TOKEN != null && differ < cacheTime)
return ACCESS_TOKEN;
ACCESS_TOKEN = requestAccessToken(corpId, corpSecert);
LAST_TIME = curTime;
return ACCESS_TOKEN;
}
/**
*
* @param accessToken
* @return 一个用于js鉴权的ticket
*/
public static String getJsapiTicket(String accessToken) {
long curTime = System.currentTimeMillis();
long differ = curTime - LAST_TIME;
if (JSAPI_TICKET != null && differ < cacheTime) {
return JSAPI_TICKET;
}
JSAPI_TICKET = requestJsapiTicket(accessToken);
return JSAPI_TICKET;
}
/**
* 根据传入的相关参数生成sign
*
* @param ticket
* @param nonceStr
* @param timeStamp
* @param url
* @return
*/
public static String sign(String ticket, String nonceStr, long timeStamp, String url) {
StringBuffer plain = new StringBuffer();
plain.append("jsapi_ticket=").append(ticket);
plain.append("&noncestr=").append(nonceStr);
plain.append("×tamp=").append(String.valueOf(timeStamp));
plain.append("&url=").append(url);
MessageDigest sha;
try {
sha = MessageDigest.getInstance("SHA-1");
sha.reset();
sha.update(plain.toString().getBytes("UTF-8"));
return bytesToHex(sha.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
private static String requestAccessToken(String corpId, String corpSecert) {
StringBuffer url = new StringBuffer(TOKEN_URL);
url.append("?corpid=").append(corpId);
url.append("&corpsecret=").append(corpSecert);
String result = null;
try {
result = HttpClientHelp.sendGet(url.toString());
} catch (Exception e) {
result = ReturnUtil.result("-1","请求accessTokenc出错!corpid:" + corpId + ",corpsecert:" + corpSecert + "异常信息:" + e,"");
}
return result;
}
private static String requestJsapiTicket(String accessToken) {
StringBuffer url = new StringBuffer(TICKET_URL);
url.append("?access_token=").append(accessToken);
String result = null;
try {
result = HttpClientHelp.sendGet(url.toString());
} catch (Exception e) {
result = ReturnUtil.result("-1", "请求JsapiTicket出错!accessToken:" + accessToken + "异常信息:" + e,"");
}
return result;
}
private static String bytesToHex(byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
/**
* 获取用户信息
*
* @param code
* 用户相应的临时code
* @param accessToken
* 根据相应corpid和corpsecret生成的access_token
* @return 用户ID等相关信息
*/
public static String getUserInfo(String code, String accessToken) {
StringBuffer url = new StringBuffer(USER_INFO_URL);
url.append("?access_token=").append(accessToken);
url.append("&code=").append(code);
String result = null;
try {
result = HttpClientHelp.sendGet(url.toString());
} catch (Exception e) {
result = ReturnUtil.result("-1", "请求User信息出错!code:" + code + "异常信息:" + e,"");
}
return result;
}
/**
* 获取用户详细信息
* @param userid 在某个corpid下的唯一用户userid
* @param accessToken 据相应corpid和corpsecret生成的access_token
* @return
*/
public static String getUser(String userid, String accessToken) {
StringBuffer url = new StringBuffer(USER_ALL_URL);
url.append("?access_token=").append(accessToken);
url.append("&userid=").append(userid);
String result = null;
try {
result = HttpClientHelp.sendGet(url.toString());
} catch (Exception e) {
result = ReturnUtil.result("-1", "请求User信息出错!userid:" + userid + "异常信息:","" );
}
return result;
}
/**
* @param accessToken
* @param param 封装参数
* @return 企微发送消息
* @throws ParseException
*/
public static String sendMessage(String accessToken,String param){
StringBuffer url = new StringBuffer(MESSAGE_URL);
url.append("?access_token=").append(accessToken);
String result = null;
try {
result = HttpClientHelp.sendPost(url.toString(),param);
} catch (Exception e) {
result = ReturnUtil.result("-1", "发送消息出错!param:" + param + "异常信息:","" );
}
return result;
}
}
编写测试类测试
package com.dehui.test;
import com.alibaba.fastjson.JSONObject;
import com.dehui.utils.AuthHelper;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: hjz
* @Date: 2020/5/29 13:03
* @Description:
*/
public class TestDemo {
public static void main(String[] args) {
String corpId ="用自己的";
String corpSecert ="用自己的";
//下边的参数也用自己企微对应的
//企微官方API地址:https://work.weixin.qq.com/api/doc/90001/90143/91201
//测试获取AccessToken
String result = AuthHelper.getAccessToken(corpId, corpSecert);
System.out.println("result: "+result);
JSONObject jsStr = JSONObject.parseObject(result);
String accessToken = jsStr.getString("access_token");
//测试发送企微消息
String FileName = "新建文件夹.txt";
//封装参数
JSONObject template = new JSONObject();
Map<String, String> map = new HashMap<String,String>();
Date currentTime = new Date();
//改变输出格式(自己想要的格式)
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
//得到字符串时间
String time = formatter.format(currentTime);
map.put("title","文件共享提醒");
map.put("description","<div class=\"gray\">"+time+"</div> <div class=\"highlight\">XXX分享给你一个文件</div> <div class=\"gray\">"+FileName+"</div>");
map.put("url","www.baidu.com");
map.put("btntxt","详情");
template.put("touser", "HeJianZhuang");
template.put("msgtype","textcard");
template.put("agentid","1000002");
template.put("textcard",map);
String sendResult = AuthHelper.sendMessage(accessToken, template.toString());
System.out.println("sendResult:"+sendResult);
}
}
*如观看小伙伴有什么问题随时提问 *