java调用企微api详解

添加依赖

<!-- 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("&timestamp=").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);

    }
}

*如观看小伙伴有什么问题随时提问 *

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值