Java原生http请求调用企业微信api,获取打卡记录

调用企业微信api,获取打卡记录

1、获取企业微信token

获取access_token - 接口文档 - 企业微信开发者中心

请求方式:POST(HTTPS
请求地址:https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=ACCESS_TOKEN

2、获取所有人员数据

获取部门成员 - 接口文档 - 企业微信开发者中心

请求方式:GET(HTTPS
请求地址:https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=ACCESS_TOKEN&department_id=1&fetch_child=1

3、获取打卡记录数据

​​​​​​获取打卡记录数据 - 接口文档 - 企业微信开发者中心

请求方式:POST(HTTPS
请求地址:https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=ACCESS_TOKEN

4、最后是源代码

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;

public class HttpUtil {
    public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static final String Corpid = "企业ID";//替换成自己的企业ID
    public static final String Corpsecret = "应用Secret";//替换成打卡应用的secret
    public static final String GetToken = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
    public static final String GetCheckindata = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata";

    public static final String GetUserlist = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist";

    public static final Integer MAX_NUM = 100;//企业微信打卡每次最多取100条记录

    public static void main(String[] args) throws Exception {
        String rq = GetToken + "?Corpid=" + Corpid + "&Corpsecret=" + Corpsecret;
        JSONObject gettokenRs = JSONObject.parseObject(doGet(rq));

        String token = gettokenRs.getString("access_token");//获取token

        JSONObject body = new JSONObject();
        List<String> idList = new ArrayList<>();
        //获取所有人员信息
        JSONObject getuserlistRs = JSONObject.parseObject(doGet(GetUserlist+ "?access_token=" + token+"&department_id=1&fetch_child=1"));
        JSONArray userlist = getuserlistRs.getJSONArray("userlist");
        final int ulsize = userlist.size();
        for (int i = 0; i < ulsize; i++) {
            JSONObject udata = userlist.getJSONObject(i);
            String depuserId = udata.getString("userid");
            idList.add(depuserId);
        }
        //每100人为1组取数据
        final int idlsize = idList.size();
        for (int j = 0 ; j < idlsize; j+= MAX_NUM) {
            List<String> useridlist = idList.subList(j, j+MAX_NUM>idList.size()?idList.size():j+MAX_NUM);

            body.put("opencheckindatatype", "3");
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.add(Calendar.DATE, -1);
            body.put("starttime", calendar.getTimeInMillis() / 1000);
            calendar.add(Calendar.DATE, 2);
            body.put("endtime", calendar.getTimeInMillis() / 1000);
            body.put("useridlist", useridlist);
            JSONObject checkobj = JSONObject.parseObject(doPost(GetCheckindata + "?access_token=" + token, body));//取打卡数据
            JSONArray checkindata = checkobj.getJSONArray("checkindata");
            final int ckdsize = checkindata.size();
            for (int i = 0; i < ckdsize; i++) {
                JSONObject data = checkindata.getJSONObject(i);
                String userId = data.getString("userid");
                String type = data.getString("checkin_type");
                String location = data.getString("location_detail");//打卡地点
                String longitude = data.getString("lng");
                String latitude = data.getString("lat");
                Long ckTime = data.getLong("checkin_time");//打卡时间毫秒数
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String dateTime = sdf.format(ckTime * 1000);//毫秒数转换成日期格式
                String sql = "insert into HrCardData (userId,cardType,cardDate,cardTime,addr,longitude,latitude) values ('" + userId + "','" + type + "','" + dateTime.split(" ")[0] + "','" + dateTime.split(" ")[1] + "','" + location + "','" + longitude + "','" + latitude + "')";
                System.out.println(sql);
            }
        }

    }


    /**
     * get请求
     *
     * @param getUrl
     * @return
     */
    public static String doGet(String getUrl) {
        try {
            URL url = new URL(getUrl);
            //设置连接方式
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            //设置主机连接时间超时时间3000毫秒
            conn.setConnectTimeout(3000);
            //设置读取远程返回数据的时间3000毫秒
            conn.setReadTimeout(3000);
            //发送请求
            conn.connect();
            //获取输入流
            InputStream is = conn.getInputStream();
            //封装输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            //接收读取数据
            StringBuffer sb = new StringBuffer();

            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line);
                sb.append("\r\n");
            }
            if (null != br) {
                br.close();
            }
            if (null != is) {
                is.close();
            }
            //关闭连接
            conn.disconnect();
            return sb.toString();
        } catch (Exception e) {
            e.getMessage();
        }
        return "";
    }

    /**
     * 原生http请求
     *
     * @param sendUrl 请求的Url
     * @param body    传入的参数
     * @return
     */
    public static String doPost(String sendUrl, JSONObject body) {
        OutputStreamWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        HttpURLConnection conn = null;
        try {
            URL url = new URL(sendUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            //发送POST请求必须设置为true
            conn.setDoOutput(true);
            conn.setDoInput(true);
            //设置连接超时时间和读取超时时间
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(10000);
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Accept", "application/json");
            //获取输出流
            out = new OutputStreamWriter(conn.getOutputStream());
            out.write(body.toJSONString());
            out.flush();
            out.close();
            //取得输入流,并使用Reader读取
            if (200 == conn.getResponseCode()) {
                in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result.append(line);
                    System.out.println(line);
                }
            } else {
                System.out.println("ResponseCode is an error code:" + conn.getResponseCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
        return result.toString();
    }

    /**
     * 将map转String
     *
     * @param map
     * @return
     */
    private static String mapToString(Map<String, String> map) {
        StringBuilder sb = new StringBuilder();
        int index = 0;
        for (String i : map.keySet()) {
            index++;
            if (map.size() == index) {
                sb.append(i + "=" + map.get(i));
            } else {
                sb.append(i + "=" + map.get(i) + "&");
            }
        }
        return sb.toString();
    }

}

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在Java实习中实现企业微信自建应用授权登录获取用户信息,可以按照以下步骤进行: 1. 获取应用ID和应用Secret,可以在企业微信管理后台创建自建应用时获得。 2. 配置可信域名、回调URL、授权回调域名和网页授权域名,确保域名的正确性和安全性。 3. 在Java项目中使用企业微信提供的OAuth2.0接口或者开源的Java SDK,实现授权登录功能。 4. 引导用户跳转到企业微信授权页面进行授权,授权成功后,企业微信会回调预设的回调URL,返回授权码。 5. 通过授权码获取access_token和用户信息,可以使用企业微信提供的OAuth2.0接口或者开源的Java SDK完成。 以下是一个使用Java SDK实现企业微信自建应用授权登录获取用户信息的示例代码: ```java // 1. 获取应用ID和应用Secret String appId = "your_app_id"; String appSecret = "your_app_secret"; // 2. 配置可信域名、回调URL、授权回调域名和网页授权域名 // 3. 使用Java SDK实现授权登录功能 WxCpService wxCpService = WxCpConfiguration.getCpService(appId); String redirectUrl = "https://your_callback_url"; String state = "your_state"; String authorizeUrl = wxCpService.getOauth2Service().buildAuthorizationUrl(redirectUrl, state); // 4. 引导用户跳转到企业微信授权页面进行授权 // 5. 企业微信回调预设的回调URL,返回授权码 String code = request.getParameter("code"); // 6. 通过授权码获取access_token和用户信息 WxCpOAuth2AccessToken wxCpOAuth2AccessToken = wxCpService.getOauth2Service().getAccessToken(code); String accessToken = wxCpOAuth2AccessToken.getAccessToken(); String userId = wxCpOAuth2AccessToken.getUserId(); WxCpUser wxCpUser = wxCpService.getUserService().getById(userId); ``` 注意事项: 1. 在开发过程中,需要保证应用ID、应用Secret、回调URL等参数的正确性。 2. 在获取access_token和用户信息时,需要保证请求的准确性和安全性。 3. 在获取用户信息时,需要保证授权作用域的正确性和权限的足够性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值