增加查看客服聊天记录的接口 #5

This commit is contained in:
BinaryWang
2016-07-18 12:10:12 +08:00
parent 0c723bbf5c
commit c040ba3929
6 changed files with 220 additions and 32 deletions

View File

@@ -1,14 +1,11 @@
package me.chanjar.weixin.mp.api;
import java.io.File;
import java.util.Date;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfOnlineList;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionGetResult;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionList;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionWaitCaseList;
import me.chanjar.weixin.mp.bean.kefu.result.*;
/**
* 客服接口
@@ -135,4 +132,23 @@ public interface WxMpKefuService {
* </pre>
*/
WxMpKfSessionWaitCaseList kfSessionGetWaitCase() throws WxErrorException;
//*******************获取聊天记录的接口***********************//
/**
* <pre>
* 获取聊天记录
* 此接口返回的聊天记录中,对于图片、语音、视频,分别展示成文本格式的[image]、[voice]、[video]
* 详情请见:<a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1464937269_mUtmK&token=&lang=zh_CN">获取聊天记录</a>
* 接口url格式 https://api.weixin.qq.com/customservice/msgrecord/getmsglist?access_token=ACCESS_TOKEN
* </pre>
*
* @param startTime 起始时间
* @param endTime 结束时间
* @param msgId 消息id顺序从小到大从1开始
* @param number 每次获取条数最多10000条
* @return 聊天记录对象
* @throws WxErrorException
*/
WxMpKfMsgList kfMsgList(Date startTime, Date endTime, Integer msgId, Integer number) throws WxErrorException;
}

View File

@@ -1,7 +1,10 @@
package me.chanjar.weixin.mp.api.impl;
import java.io.File;
import java.util.Date;
import com.google.gson.JsonObject;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
@@ -10,11 +13,7 @@ import me.chanjar.weixin.mp.api.WxMpKefuService;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfSessionRequest;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfOnlineList;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionGetResult;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionList;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionWaitCaseList;
import me.chanjar.weixin.mp.bean.kefu.result.*;
/**
*
@@ -22,6 +21,7 @@ import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionWaitCaseList;
*
*/
public class WxMpKefuServiceImpl implements WxMpKefuService {
public static final String API_URL_PREFIX = "https://api.weixin.qq.com/customservice";
private WxMpService wxMpService;
public WxMpKefuServiceImpl(WxMpService wxMpService) {
@@ -30,7 +30,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override
public WxMpKfList kfList() throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/customservice/getkflist";
String url = API_URL_PREFIX + "/getkflist";
String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfList.fromJson(responseContent);
@@ -38,7 +38,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override
public WxMpKfOnlineList kfOnlineList() throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist";
String url = API_URL_PREFIX + "/getonlinekflist";
String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfOnlineList.fromJson(responseContent);
@@ -47,7 +47,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override
public boolean kfAccountAdd(WxMpKfAccountRequest request)
throws WxErrorException {
String url = "https://api.weixin.qq.com/customservice/kfaccount/add";
String url = API_URL_PREFIX + "/kfaccount/add";
this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson());
return true;
@@ -56,7 +56,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override
public boolean kfAccountUpdate(WxMpKfAccountRequest request)
throws WxErrorException {
String url = "https://api.weixin.qq.com/customservice/kfaccount/update";
String url = API_URL_PREFIX + "/kfaccount/update";
this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson());
return true;
@@ -64,7 +64,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override
public boolean kfAccountInviteWorker(WxMpKfAccountRequest request) throws WxErrorException {
String url = "https://api.weixin.qq.com/customservice/kfaccount/inviteworker";
String url = API_URL_PREFIX + "/kfaccount/inviteworker";
this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson());
return true;
@@ -73,16 +73,14 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override
public boolean kfAccountUploadHeadImg(String kfAccount, File imgFile)
throws WxErrorException {
String url = "https://api.weixin.qq.com/customservice/kfaccount/uploadheadimg?kf_account="
+ kfAccount;
String url = API_URL_PREFIX + "/kfaccount/uploadheadimg?kf_account=" + kfAccount;
this.wxMpService.execute(new MediaUploadRequestExecutor(), url, imgFile);
return true;
}
@Override
public boolean kfAccountDel(String kfAccount) throws WxErrorException {
String url = "https://api.weixin.qq.com/customservice/kfaccount/del?kf_account="
+ kfAccount;
String url = API_URL_PREFIX + "/kfaccount/del?kf_account=" + kfAccount;
this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null);
return true;
}
@@ -91,7 +89,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfSessionCreate(String openid, String kfAccount)
throws WxErrorException {
WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid);
String url = "https://api.weixin.qq.com/customservice/kfsession/create";
String url = API_URL_PREFIX + "/kfsession/create";
this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson());
return true;
@@ -101,7 +99,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfSessionClose(String openid, String kfAccount)
throws WxErrorException {
WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid);
String url = "https://api.weixin.qq.com/customservice/kfsession/close";
String url = API_URL_PREFIX + "/kfsession/close";
this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson());
return true;
@@ -110,8 +108,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override
public WxMpKfSessionGetResult kfSessionGet(String openid)
throws WxErrorException {
String url = "https://api.weixin.qq.com/customservice/kfsession/getsession?openid="
+ openid;
String url = API_URL_PREFIX + "/kfsession/getsession?openid=" + openid;
String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfSessionGetResult.fromJson(responseContent);
@@ -120,8 +117,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override
public WxMpKfSessionList kfSessionList(String kfAccount)
throws WxErrorException {
String url = "https://api.weixin.qq.com/customservice/kfsession/getsessionlist?kf_account="
+ kfAccount;
String url = API_URL_PREFIX + "/kfsession/getsessionlist?kf_account=" + kfAccount;
String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfSessionList.fromJson(responseContent);
@@ -130,10 +126,28 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override
public WxMpKfSessionWaitCaseList kfSessionGetWaitCase()
throws WxErrorException {
String url = "https://api.weixin.qq.com/customservice/kfsession/getwaitcase";
String url = API_URL_PREFIX + "/kfsession/getwaitcase";
String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfSessionWaitCaseList.fromJson(responseContent);
}
@Override
public WxMpKfMsgList kfMsgList(Date startTime, Date endTime, Integer msgId, Integer number) throws WxErrorException {
if(startTime.after(endTime)){
throw new WxErrorException(WxError.newBuilder().setErrorMsg("起始时间不能晚于结束时间!").build());
}
String url = API_URL_PREFIX + "/msgrecord/getmsglist";
JsonObject param = new JsonObject();
param.addProperty("starttime", startTime.getTime() / 1000); //starttime 起始时间unix时间戳
param.addProperty("endtime", endTime.getTime() / 1000); //endtime 结束时间unix时间戳每次查询时段不能超过24小时
param.addProperty("msgid", msgId); //msgid 消息id顺序从小到大从1开始
param.addProperty("number", number); //number 每次获取条数最多10000条
String responseContent = this.wxMpService.execute(new SimplePostRequestExecutor(), url, param.toString());
return WxMpKfMsgList.fromJson(responseContent);
}
}

View File

@@ -0,0 +1,55 @@
package me.chanjar.weixin.mp.bean.kefu.result;
import com.google.gson.annotations.SerializedName;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.List;
/**
* Created by Binary Wang on 2016/7/15.
*/
public class WxMpKfMsgList {
@SerializedName("recordlist")
private List<WxMpKfMsgRecord> records;
@SerializedName("number")
private Integer number;
@SerializedName("msgid")
private Long msgId;
public List<WxMpKfMsgRecord> getRecords() {
return records;
}
public void setRecords(List<WxMpKfMsgRecord> records) {
this.records = records;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public Long getMsgId() {
return msgId;
}
public void setMsgId(Long msgId) {
this.msgId = msgId;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
public static WxMpKfMsgList fromJson(String responseContent) {
return WxMpGsonBuilder.INSTANCE.create().fromJson(responseContent, WxMpKfMsgList.class);
}
}

View File

@@ -0,0 +1,87 @@
package me.chanjar.weixin.mp.bean.kefu.result;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.google.gson.annotations.SerializedName;
import me.chanjar.weixin.mp.util.json.WxLongTimeJsonSerializer;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* Created by Binary Wang on 2016/7/18.
*/
public class WxMpKfMsgRecord {
/**
* worker 完整客服帐号,格式为:帐号前缀@公众号微信号
*/
@SerializedName("worker")
private String worker;
/**
* openid 用户标识
*/
@SerializedName("openid")
private String openid;
/**
* opercode 操作码2002客服发送信息2003客服接收消息
*/
@SerializedName("opercode")
private Integer operateCode;
/**
* text 聊天记录
*/
@SerializedName("text")
private String text;
/**
* time 操作时间unix时间戳
*/
@SerializedName("time")
@JsonSerialize(using = WxLongTimeJsonSerializer.class)
private Long time;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
public String getWorker() {
return worker;
}
public void setWorker(String worker) {
this.worker = worker;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Long getTime() {
return time;
}
public void setTime(Long time) {
this.time = time;
}
public Integer getOperateCode() {
return operateCode;
}
public void setOperateCode(Integer operateCode) {
this.operateCode = operateCode;
}
}

View File

@@ -1,7 +1,13 @@
package me.chanjar.weixin.mp.api.impl;
import java.io.File;
import java.util.Date;
import ch.qos.logback.classic.BasicConfigurator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import me.chanjar.weixin.mp.bean.kefu.result.*;
import org.joda.time.DateTime;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Guice;
@@ -14,12 +20,6 @@ import me.chanjar.weixin.mp.api.ApiTestModule;
import me.chanjar.weixin.mp.api.ApiTestModule.WxXmlMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpServiceImpl;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfInfo;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfOnlineList;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionGetResult;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionList;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionWaitCaseList;
/**
* 测试客服相关接口
@@ -145,4 +145,14 @@ public class WxMpKefuServiceImplTest {
System.err.println(result);
}
@Test
public void testKfMsgList() throws WxErrorException, JsonProcessingException {
BasicConfigurator.configureDefaultContext();
Date startTime = DateTime.now().minusDays(1).toDate();
Date endTime = DateTime.now().toDate();
WxMpKfMsgList result = this.wxService.getKefuService().kfMsgList(startTime,endTime, 0, 20);
Assert.assertNotNull(result);
System.err.println(new ObjectMapper().writeValueAsString(result));
}
}