Java调用企业微信接口获取应用密钥,并发送消息

本文介绍如何通过Java调用企业微信API,包括获取应用密钥和发送文本消息的具体实现。通过创建AccessToken实体类管理和缓存密钥,并利用HttpRequestUtil进行HTTP请求,实现了与企业微信的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先创建一个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);
	    }
	}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值