本文是对:企业微信里面的微信客服进行应用,完成的整个逻辑是:微信用户发送请求,企业微信客服通过判断接收消息的时间是否在工作日来进行响应。
难点一:接口的调用
读取接口的调用:
第一步:获得接口的链接
String requestUrl = "https://qyapi.weixin.qq.com/cgi-bin/kf/sync_msg?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN",sToken.getToken());
第二步:看接口是否需要添加输入参数
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());
第二步:对读取接口的返回结果进行操作
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));
最后输出结果文章来源:https://www.uudwc.com/A/A6Ax/
文章来源地址https://www.uudwc.com/A/A6Ax/