首先我们要知道企业微信推送消息的步骤,企业微信官方提供了多个API供我们调用,这里我们只讲我们需要的API;
企业微信的官方开放的API地址:https://work.weixin.qq.com/api/doc
推送企业微信消息分为这么几步:
1、建立一个企业应用,我们只能给应用里面的成员发送消息,企业应用就是类似下面的应用;
2、获取accss_token,这是通过企业微信的获取token的接口获取的
请求方式:GET(HTTPS)
请求URL:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRECT
参数解释:
corpid:企业id,每个企业微信都有唯一的一个corpid;
corpsecret:应用的凭证密钥,这个是你要发送消息给应用下的成员的corpsecret
返回值:
expires_in是有效时间,单位是秒
{
"errcode":0,
"errmsg":"",
"access_token": "accesstoken000001",
"expires_in": 7200
}
3、获取到access_token以后,你就可以向应用的成员推送企业微信消息了(这里我们以最简单的发送text为例子,其它的发送图片等消息大同小异,大家可以自己查看官方文档);
推送消息的接口:
请求方式:POST(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
请求示例:
{
"touser" : "UserID1|UserID2|UserID3",//企业微信的唯一userid,非必输
"toparty" : "PartyID1|PartyID2",//部门id,非必输,如果输入了就只给指定部门发送消息
"totag" : "TagID1 | TagID2",//标签,非必输,传输了就只给指定的标签发送消息
"msgtype" : "text",//消息类型,必输,text等
"agentid" : 1,//应用id,必输,每个应用都有一个唯一的应用id
"text" : {
"content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"
},//发送的消息
"safe":0//是否安全传输
}
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
touser | 否 | 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向该企业应用的全部成员发送 |
toparty | 否 | 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数 |
totag | 否 | 标签ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数 |
msgtype | 是 | 消息类型,此时固定为:text |
agentid | 是 | 企业应用的id,整型。可在应用的设置页面查看 |
content | 是 | 消息内容,最长不超过2048个字节 |
safe | 否 | 表示是否是保密消息,0表示否,1表示是,默认0 |
返回示例:
{
"errcode" : 0,
"errmsg" : "ok",
"invaliduser" : "userid1|userid2", // 不区分大小写,返回的列表都统一转为小写
"invalidparty" : "partyid1|partyid2",
"invalidtag":"tagid1|tagid2"
}
如果部分接收人无权限或不存在,发送仍然执行,但会返回无效的部分(即invaliduser或invalidparty或invalidtag),常见的原因是接收人不在应用的可见范围内。
注:企业微信推送消息的步骤就这么几步,很简单,用户也可以根据自己的实际需求参考企业微信的api实现更多的功能,着咯就不再赘述,接下来我们看看代码的实现:
基础消息类:
package company.sendmessage;
import lombok.Data;
/**
* 消息基类(企业号 -> 普通用户)
* @author csh10609
*
*/
@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 Integer agentid;
}
推送消息类:
/**
* 文本消息
* @author csh10609
*
*/
@Data
public class TextMessage extends BaseMessage {
//文本
private Text text;
//否 表示是否是保密消息,0表示否,1表示是,默认0
private int safe;
}
具体要发送的消息:
/**
* 文本
* @author csh10609
*
*/
@Data
public class Text {
//是 消息内容,最长不超过2048个字节
private String content;
}
接收accesstoken类:
/**
* @desc : 微信通用接口凭证
*
* @author: csh10609
* @date : 2018-8-17 下午9:35:11
*/
public class AccessToken {
// 获取到的凭证
private String token;
// 凭证有效时间,单位:秒
private int expiresIn;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}
异常处理类:
import lombok.Data;
@Data
public class BizException extends RuntimeException {
private int code;
private String msg;
private EnumsUtils enumsUtils;
public BizException(EnumsUtils enumsUtils) {
this.enumsUtils = enumsUtils;
}
public BizException(int code, String msg){
this.code = code;
this.msg = msg;
}
}
异常枚举类:
import lombok.Getter;
@Getter
public enum EnumsUtils {
FAIL(000, "操作失败"),
SUCCESS(100, "操作成功"),
BASEMESSAGE_ISEMPTY(110, "基础信息不能为null"),
MSGTYPE_ISEMPTY(120, "发送消息类型不能为空"),
WEIXINPARAMES_ISEMPTY(130, "微信参数不能为null"),
AGENTID_ISEMPTY(131, "应用ID不能为空"),
CORPID_ISEMPTY(132, "企业ID不能为空"),
AGENTSECRET_ISEMPTY(133, "应用密钥不能为空"),
WEIXIN_CONNECT_FAILED(134, "请求微信接口失败"),
WEIXIN_HAPPEN_EXCEPTION(135, "请求微信接口发生未知错误"),
APPLY_TOKEN_FAILED(136, "请求应用token发生未知错误"),
SENDMESSAGE_FAILED(137, "发送企业微信消息失败"),
SENDMAIL_PARAM_ISEMPTY(138, "发送Email基础参数不能为空"),
SENDMAIL_FROM_ISEMPTY(139, "Email邮件发送人不能为空"),
SENDMAIL_TO_ISEMPTY(140, "Email邮件收件人不能为空"),
SENDMAIL_MESSAGING_EXCEPTION(141, "Email邮件发送缺少发送类");
private int code;
private String msg;
EnumsUtils(int code, String msg) {
this.code = code;
this.msg = msg;
}
}
参数检验类:
/**
* 校验参数的工具类
*
* @Author csh10609
* @date 2018-08-17
*/
public class CheckParamsUtil {
/**
* 校验基本参数BaseMessage
*
* @param message
*/
public static void checkBaseMessage(RequestMessage message) {
//baseMessage不能为空
if (null == message) {
throw new BizException(EnumsUtils.BASEMESSAGE_ISEMPTY);
}
if (StringUtils.isEmpty(message.getMsgtype())) {
throw new BizException(EnumsUtils.MSGTYPE_ISEMPTY);
}
if (null == message.getAgentid()) {
throw new BizException(EnumsUtils.AGENTID_ISEMPTY);
}
}
/**
* 校验基本参数WeiXinParames
*
* @param weiXinParames
*/
public static void checkWeiXinParames(WeiXinParames weiXinParames) {
if (null == weiXinParames) {
throw new BizException(EnumsUtils.WEIXINPARAMES_ISEMPTY);
}
if (StringUtils.isEmpty(weiXinParames.getCorpId())) {
throw new BizException(EnumsUtils.CORPID_ISEMPTY);
}
if (StringUtils.isEmpty(weiXinParames.getAgentSecret())) {
throw new BizException(EnumsUtils.AGENTSECRET_ISEMPTY);
}
}
/*
* 检查参数
* @param entity
*/
public static void checkMailParam(SendMailUtils.EmailEntity entity) {
if (null == entity) {
throw new BizException(EnumsUtils.SENDMAIL_PARAM_ISEMPTY);
}
//发件人不能为空
if (org.springframework.util.StringUtils.isEmpty(entity.getFrom())) {
throw new BizException(EnumsUtils.SENDMAIL_FROM_ISEMPTY);
}
//收件人不能为空
if (CollectionUtils.isEmpty(entity.getTo())) {
throw new BizException(EnumsUtils.SENDMAIL_TO_ISEMPTY);
}
}
}
证书信任器:
/**
* 证书信任管理器(用于https请求)
*
* @author csh10609
* @date 2018-08-17
*/
public class MyX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
我们提供别人的发送消息的接口接收参数:
/**
* 消息基类(企业号 -> 普通用户)
* @author csh10609
*
*/
@Data
public class RequestMessage {
// 否 成员ID列表
private List<String> touser;
// 否 部门ID列表
private List<String> toparty;
// 否 标签ID列表
private List<String> totag;
// 是 消息类型
private String msgtype;
// 是 企业应用的id,整型。可在应用的设置页面查看
private Integer agentid;
//文本
private Text text;
//否 表示是否是保密消息,0表示否,1表示是,默认0
private int safe;
}
接口返回参数:
package company.sendmessage;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
@Setter
@Getter
@ToString
@NoArgsConstructor
public class ResultJson<T> implements Serializable {
/**
* 返回编码
*/
private int code;
/**
* 返回消息
*/
private String msg;
/**
* 返回数据
*/
private T data;
public ResultJson(T date) {
this.data = date;
}
public ResultJson(int code, String msg) {
this.code = code;
this.msg = msg;
}
public ResultJson(int code, T data) {
this.code = code;
this.data = data;
}
public ResultJson(String msg, T data) {
this.msg = msg;
this.data = data;
}
public ResultJson(EnumsUtils enumsUtils, T data) {
this.code = enumsUtils.getCode();
this.msg = enumsUtils.getMsg();
this.data = data;
}
public ResultJson(EnumsUtils enumsUtils) {
this.code = enumsUtils.getCode();
this.msg = enumsUtils.getMsg();
}
}
发送消息的service:
package company.sendmessage;
import com.google.gson.Gson;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @desc : 发送消息
* @author: csh10609
* @date : 2018-8-17 上午10:06:23
*/
public class SendMessageService {
private static Logger log = LoggerFactory.getLogger(SendMessageService.class);
private static String sendMessage_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN";
/**
* @param accessToken
* @param message void
* @desc :0.公共方法:发送消息
*/
public void sendMessage(String accessToken, BaseMessage message, WeiXinParames weiXinParames, int cycleSize) {
//重试5次,超过五次直接失败
cycleSize++;
if(cycleSize > 5){
throw new BizException(EnumsUtils.SENDMESSAGE_FAILED);
}
//1.获取json字符串:将message对象转换为json字符串
Gson gson = new Gson();
String jsonMessage = gson.toJson(message); //使用gson.toJson(user)即可将user对象顺序转成json
log.info("请求发送消息的jsonTextMessage:" + jsonMessage);
//2.获取请求的url
sendMessage_url = sendMessage_url.replace("ACCESS_TOKEN", accessToken);
//3.调用接口,发送消息
JSONObject jsonObject = WeiXinUtil.httpRequest(sendMessage_url, "POST", jsonMessage);
//JSONObject jsonObject = JSONObject.fromObject("{\"errcode\":42001,\"errmsg\":\"ok\",\"access_token\":\"\",\"expires_in\":7200}");
log.info("发送消息的返回jsonObject:" + jsonObject);
//4.错误消息处理
if (null != jsonObject) {
int errcode = jsonObject.getInt("errcode");
if (0 == errcode) {
//批量发送推送消息时,可能存在部分用户发送消息成功,部分用户userid不合法的情侣
if(!"".equals(jsonObject.getString("invaliduser"))){
log.warn("发送企业微信成功,部分用户userId不合法,不合法的userId = " + jsonObject.getString("invaliduser"));
}else {
log.info("发送企业微信消息成功" + message);
}
}else {
//如果是由于token失效,则替换老的token,重新调用
if(40014 == errcode || 41001 == errcode || 42001 == errcode){
//重新获取token
AccessToken newToken = WeiXinUtil.getAccessToken(weiXinParames.getCorpId(), weiXinParames.getAgentSecret());
//重新发送消息
sendMessage(newToken.getToken(), message, weiXinParames, cycleSize);
//替换过期的token,所以先锁tokenMap不让别人用
String key = weiXinParames.getCorpId() + "_" + weiXinParames.getAgentSecret();
synchronized (WeiXinUtil.tokenMap){
//替换新的token
WeiXinUtil.tokenMap.put(key, newToken);
}
}else {
log.error("发送企业微信消息失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
throw new BizException(jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
}
}else {
log.info("请求发送企业微信消息返回为空,requestUrl =" + sendMessage_url);
throw new BizException(EnumsUtils.SENDMESSAGE_FAILED);
}
}
}
推送企业微信的util工具类,这个是入口方法:
package company.sendmessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
/**
* 微信发送消息工具类
*/
public class SendWeiXinUtils {
//发送企业微信消息的service
private final static SendMessageService SMS = new SendMessageService();
//企业微信发送请求接口的连接符
private final static String SYMBOL = "|";
private static Logger log = LoggerFactory.getLogger(SendWeiXinUtils.class);
/**
* 发送企业微信消息
*
* @param message
*/
public static ResultJson sendWeiXinMessage(RequestMessage message, WeiXinParames weiXinParames) {
log.info("发送企业微信消息开始,message={},params ={}", message, weiXinParames);
ResultJson resultJson = null;
TextMessage textMessage = null;
try {
//1、校验BaseMessage和weiXinParames
CheckParamsUtil.checkBaseMessage(message);
CheckParamsUtil.checkWeiXinParames(weiXinParames);
//RequestMessage转换BaseMessage
textMessage = convertTextMessage(message);
//1.获取access_token:根据企业id和通讯录密钥获取access_token,并拼接请求url
String accessToken = WeiXinUtil.getAccessToken(weiXinParames.getCorpId(), weiXinParames.getAgentSecret()).getToken();
//发送消息
SMS.sendMessage(accessToken, textMessage, weiXinParames, 1);
resultJson = new ResultJson(EnumsUtils.SUCCESS);
log.info("发送企业微信消息成功,response = " + resultJson);
} catch (BizException e) {
log.warn("发送企业微信消息失败,code ={},msg ={}", e.getEnumsUtils().getCode(), e.getEnumsUtils().getMsg());
resultJson = new ResultJson(e.getEnumsUtils().getCode(), e.getEnumsUtils().getMsg());
}
return resultJson;
}
/**
* RequestMessage转换BaseMessage
*
* @param message
* @return
*/
public static TextMessage convertTextMessage(RequestMessage message) {
TextMessage textMessage = new TextMessage();
//转换成员列表
textMessage.setTouser(StringUtils.connectBySymbol(message.getTouser(), SYMBOL));
//转换部门列表
textMessage.setToparty(StringUtils.connectBySymbol(message.getToparty(), SYMBOL));
//转换标签列表
textMessage.setTotag(StringUtils.connectBySymbol(message.getTotag(), SYMBOL));
textMessage.setMsgtype(message.getMsgtype());
textMessage.setAgentid(message.getAgentid());
textMessage.setText(message.getText());
textMessage.setSafe(message.getSafe());
return textMessage;
}
public static void main(String[] args) {
/* //0.设置消息内容
String content="unex 定时调度系统后台测试消息,只发给任务创建者!";
//1.创建文本消息对象
TextMessage message=new TextMessage();
//企业微信的userid,唯一且必须
message.setTouser("csh10609");
//1.1非必需
//message.setTouser("@all"); //不区分大小写
//textMessage.setToparty("1");
//txtMsg.setTotag(totag);
//txtMsg.setSafe(0);
//1.2必需
message.setMsgtype("text");
message.setAgentid(1000001);
Text text=new Text();
text.setContent(content);
message.setText(text);*/
String content = "unex 定时调度系统后台测试消息,只发给任务创建者!";
RequestMessage requestMessage = new RequestMessage();
List<String> list = new ArrayList<String>();
list.add("csh10609");
list.add("xxx10609");
/* list.add("tsh10648");
list.add("lsh9938");*/
requestMessage.setTouser(list);
requestMessage.setMsgtype("text");
requestMessage.setAgentid(1000001);
Text text = new Text();
text.setContent(content);
requestMessage.setText(text);
WeiXinParames weiXinParames = new WeiXinParames();
weiXinParames.setCorpId("**********");
weiXinParames.setAgentSecret("****************");
for (int i = 0; i < 1; i++) {
sendWeiXinMessage(requestMessage, weiXinParames);
}
}
}
自定义字符串工具类:
/**
* 字符串工具类
* @Author csh10609
*/
public class StringUtils {
/*
* 遍历数组,以特定的符号连接
* @param list
* @param symbol
* @return
*/
public static String connectBySymbol(List<String> list, String symbol){
StringBuffer sb = new StringBuffer();
String touser = "";
if(!CollectionUtils.isEmpty(list)){
for (String s: list) {
sb.append(s).append(symbol);
}
//去除最后面的symbol
touser = sb.substring(0,sb.length() - symbol.length());
}
return touser;
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(connectBySymbol(list, "|"));
}
}
企业微信参数类:
/**
* 微信参数
* @author csh10609
*
*/
@Data
public class WeiXinParames {
//企业ID
private String corpId;
//应用密钥
private String agentSecret;
//企业应用的id,整型。可在应用的设置页面查看
//技术与创新中心id=1000006
//private int agentId;
}
微信工具类:就是提供http请求等一些公共方法:
package company.sendmessage;
import io.swagger.models.HttpMethod;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.*;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class WeiXinUtil {
private static Logger log = LoggerFactory.getLogger(WeiXinUtil.class);
//微信的请求url
//获取access_token的接口地址(GET) 限200(次/天)
public final static String access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}";
//存储accessToken的Map,key=corpId_agentSecret,value=accessToken
public static volatile Map<String, AccessToken> tokenMap = new ConcurrentHashMap<String, AccessToken>();
/**
* 1.发起https请求并获取结果
*
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);
if (HttpMethod.GET.toString().equalsIgnoreCase(requestMethod))
httpUrlConn.connect();
// 当有数据需要提交时
if (null != outputStr) {
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 将返回的输入流转换成字符串
inputStream = httpUrlConn.getInputStream();
inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
httpUrlConn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
log.error("Weixin server connection timed out.");
throw new BizException(EnumsUtils.WEIXIN_CONNECT_FAILED);
} catch (Exception e) {
log.error("https request error:{}", e);
throw new BizException(EnumsUtils.WEIXIN_HAPPEN_EXCEPTION);
}finally {
try {
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
} catch (IOException e) {
e.printStackTrace();
}
}
return jsonObject;
}
/**
* 2.发起http请求获取返回结果
*
* @param requestUrl 请求地址
* @return
*/
public static String httpRequest(String requestUrl) {
StringBuffer buffer = new StringBuffer();
try {
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
httpUrlConn.setDoOutput(false);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
httpUrlConn.setRequestMethod("GET");
httpUrlConn.connect();
// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
//InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
} catch (Exception e) {
}
return buffer.toString();
}
/**
* 3.获取access_token
*
* @param corpId 凭证
* @param appsecret 密钥
* @return
*/
public static AccessToken getAccessToken(String corpId, String appsecret) {
AccessToken accessToken = null;
//如果tokenMap已经有缓存token,直接返回,不用请求微信接口
//注意因为token都是有失效时间的,所有返回的有可能是失败的token
String key = corpId + "_" + appsecret;
if(!StringUtils.isEmpty(tokenMap.get(key))){
accessToken = tokenMap.get(key);
return accessToken;
}
//如果是第一次请求token,通过corpId、appsecret请求企业微信的获取token的接口
//拼装请求的url
String requestUrl = access_token_url.replace("{corpId}", corpId).replace("{corpsecret}", appsecret);
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
// 如果请求成功
if (null != jsonObject) {
try {
accessToken = new AccessToken();
accessToken.setToken(jsonObject.getString("access_token"));
accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
//获取token成功,缓存进tokenMap中
tokenMap.put(key, accessToken);
} catch (JSONException e) {
// 获取token失败
log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
//解析失败原因
throw new BizException(jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
}else {
log.error("获取token返回为空, requestUrl = " + requestUrl);
//请求token失败
throw new BizException(EnumsUtils.APPLY_TOKEN_FAILED);
}
return accessToken;
}
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
String requestUrl = access_token_url.replace("{corpId}", "**************").replace("{corpsecret}", "**********************");
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
System.out.println(jsonObject);
}
}
}