Java调用第三方接口-Post方法

本文是对:企业微信里面的微信客服进行应用,完成的整个逻辑是:微信用户发送请求,企业微信客服通过判断接收消息的时间是否在工作日来进行响应。

难点一:接口的调用

读取接口的调用:

第一步:获得接口的链接

 String requestUrl = "https://qyapi.weixin.qq.com/cgi-bin/kf/sync_msg?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN",sToken.getToken());

第二步:看接口是否需要添加输入参数

因为 Post方法 是需要拼接JSON类型的数据 所以需要JSONObject

JSONObject jo = new JSONObject();
jo.put("cursor",""); //上一次调用时返回的next_cursor,第一次拉取可以不填
jo.put("limit",String.valueOf(1000));//期望请求的数据量
jo.put("voice_format",String.valueOf(0));//语音消息类型
String openKfid = "wkKqpJCAAAVfANm88k_s1HfnYYFFfgLw";
jo.put("open_kfid",openKfid);//指定拉取李西客服帐号的消息
// 读取消息接口 的调用
JSONObject jsonObject = WeixinUtil.HttpRequest(requestUrl,"POST", JSON.toJSONString(jo));

难点二:对接口的返回结果的操作

发送接口的调用

第一步:获得接口的链接

String requestUrl2 = "https://qyapi.weixin.qq.com/cgi-bin/kf/send_msg?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN",sToken.getToken());

第二步:对读取接口的返回结果进行操作

下图是 对读取接口的返回结果 因为是 {} 类型的,所以返回结果是JSONObject 类型的

用到的参数有:

open_kfid 表示客服账号;

external_userid 表示微信用户的账号;

send_time 表示微信用户发送消息 也就是企业微信客服接收到消息的时间

所以用到了jsonObject 里面的 msg_list

 JSONArray msgList =(JSONArray)jsonObject.get("msg_list");//消息列表
 String s = JSONObject.toJSONString(msgList);
 List<HashMap<String,Object>> msgList1 =  (List<HashMap<String,Object>>)msgList.parse(s);
 Map<String,Object> map = msgList1.get(msgList1.size() - 1);

 logger.error("msgList1.get(msgList1.size() - 1)---------"+map);

说明获取到了想要的msg_list

API中写道origin == 3 才表示的是微信用户发送的消息,所以需要提前进行判断

String toUser = "";
Long timeRequest = null;
if(Integer.valueOf((Integer) map.get("origin")) == 3){
        //读取消息传过来的微信用户id
          toUser = (String) map.get("external_userid");  
          logger.error("toUser-------"+toUser);
        //读取消息传过来的发送消息的时间戳
          Integer i =(Integer) map.get("send_time");  //将Integer 转 Long
          long l = i;
          timeRequest = l;  
          logger.error("send_time-------"+timeRequest);
}

第三步:将读取接口的返回结果作为发送接口的参数

将第二步获取到的send_time 进行处理 判断是机器人发送消息还是转人工客服

       /**
        * 判断是否是周末
        * @param date
         * @return
        */
        public static boolean isWeekend(Date date){
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            return dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY;
        }

        /**
        * 判断是否是工作时间
        * @param sendTime    传进来的时间戳
        * @param startWork   开始工作的时间
        * @param endWork     结束工作的时间
        * @return
        */
        public static boolean isWorkTime(Long sendTime,String startWork,String endWork) throws ParseException {
            Long sendTime1 = sendTime*1000;
            Date send = new Date(sendTime1);
            if (!isWeekend(send)){
                LocalDateTime localDateTime = send.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
                LocalTime send1 = localDateTime.toLocalTime();
                LocalTime start = LocalTime.parse(startWork, DateTimeFormatter.ofPattern("HH:mm:ss"));
                LocalTime end = LocalTime.parse(endWork, DateTimeFormatter.ofPattern("HH:mm:ss"));
                int sendStart = send1.compareTo(start);
                int sendEnd = send1.compareTo(end);
                if (sendStart >= 0 && sendEnd <= 0){
                    return true;
                }
                return false;
            }
            return false;
        }

使用发送接口需要传参数,示例如下

所以对读取接口的方法 的返回结果进行操作:

boolean isWorkTime = DateFormatUtil.isWorkTime(timeRequest, "09:00:00", "18:00:00");
//判断是否是工作时间
if(isWorkTime){
      JSONObject joSend = new JSONObject();
      joSend.put("touser",toUser);
      joSend.put("open_kfid",openKfid);
      joSend.put("msgtype","text");
    //输出内容 或者是 自动回复的内容
      Map mapText = new HashMap();
      mapText.put("content","工作时间,会话消息测试---------------");
      joSend.put("text",mapText);
}

调用接口:

JSONObject jsonObject1 = WeixinUtil.HttpRequest(requestUrl2,"POST",JSON.toJSONString(joSend));

最后输出结果

猜你喜欢

转载自blog.csdn.net/xy58451921/article/details/129794720