Browse Source

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

master
BinaryWang 9 years ago
parent
commit
c040ba3929
6 changed files with 220 additions and 32 deletions
  1. +6
    -0
      weixin-java-mp/pom.xml
  2. +21
    -5
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java
  3. +35
    -21
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java
  4. +55
    -0
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java
  5. +87
    -0
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
  6. +16
    -6
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java

+ 6
- 0
weixin-java-mp/pom.xml View File

@@ -47,6 +47,12 @@
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId> <artifactId>jetty-servlet</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency><!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.4</version>
<scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>




+ 21
- 5
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java View File

@@ -1,14 +1,11 @@
package me.chanjar.weixin.mp.api; package me.chanjar.weixin.mp.api;


import java.io.File; import java.io.File;
import java.util.Date;


import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest; 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> * </pre>
*/ */
WxMpKfSessionWaitCaseList kfSessionGetWaitCase() throws WxErrorException; 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;

} }

+ 35
- 21
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java View File

@@ -1,7 +1,10 @@
package me.chanjar.weixin.mp.api.impl; package me.chanjar.weixin.mp.api.impl;


import java.io.File; 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.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; 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.api.WxMpService;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest; 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.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 class WxMpKefuServiceImpl implements WxMpKefuService {
public static final String API_URL_PREFIX = "https://api.weixin.qq.com/customservice";
private WxMpService wxMpService; private WxMpService wxMpService;


public WxMpKefuServiceImpl(WxMpService wxMpService) { public WxMpKefuServiceImpl(WxMpService wxMpService) {
@@ -30,7 +30,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {


@Override @Override
public WxMpKfList kfList() throws WxErrorException { 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 String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null); .execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfList.fromJson(responseContent); return WxMpKfList.fromJson(responseContent);
@@ -38,7 +38,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {


@Override @Override
public WxMpKfOnlineList kfOnlineList() throws WxErrorException { 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 String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null); .execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfOnlineList.fromJson(responseContent); return WxMpKfOnlineList.fromJson(responseContent);
@@ -47,7 +47,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override @Override
public boolean kfAccountAdd(WxMpKfAccountRequest request) public boolean kfAccountAdd(WxMpKfAccountRequest request)
throws WxErrorException { 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, this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson()); request.toJson());
return true; return true;
@@ -56,7 +56,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override @Override
public boolean kfAccountUpdate(WxMpKfAccountRequest request) public boolean kfAccountUpdate(WxMpKfAccountRequest request)
throws WxErrorException { 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, this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson()); request.toJson());
return true; return true;
@@ -64,7 +64,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {


@Override @Override
public boolean kfAccountInviteWorker(WxMpKfAccountRequest request) throws WxErrorException { 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, this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson()); request.toJson());
return true; return true;
@@ -73,16 +73,14 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override @Override
public boolean kfAccountUploadHeadImg(String kfAccount, File imgFile) public boolean kfAccountUploadHeadImg(String kfAccount, File imgFile)
throws WxErrorException { 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); this.wxMpService.execute(new MediaUploadRequestExecutor(), url, imgFile);
return true; return true;
} }


@Override @Override
public boolean kfAccountDel(String kfAccount) throws WxErrorException { 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); this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null);
return true; return true;
} }
@@ -91,7 +89,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfSessionCreate(String openid, String kfAccount) public boolean kfSessionCreate(String openid, String kfAccount)
throws WxErrorException { throws WxErrorException {
WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid); 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, this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson()); request.toJson());
return true; return true;
@@ -101,7 +99,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfSessionClose(String openid, String kfAccount) public boolean kfSessionClose(String openid, String kfAccount)
throws WxErrorException { throws WxErrorException {
WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid); 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, this.wxMpService.execute(new SimplePostRequestExecutor(), url,
request.toJson()); request.toJson());
return true; return true;
@@ -110,8 +108,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override @Override
public WxMpKfSessionGetResult kfSessionGet(String openid) public WxMpKfSessionGetResult kfSessionGet(String openid)
throws WxErrorException { 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 String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null); .execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfSessionGetResult.fromJson(responseContent); return WxMpKfSessionGetResult.fromJson(responseContent);
@@ -120,8 +117,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override @Override
public WxMpKfSessionList kfSessionList(String kfAccount) public WxMpKfSessionList kfSessionList(String kfAccount)
throws WxErrorException { 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 String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null); .execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfSessionList.fromJson(responseContent); return WxMpKfSessionList.fromJson(responseContent);
@@ -130,10 +126,28 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
@Override @Override
public WxMpKfSessionWaitCaseList kfSessionGetWaitCase() public WxMpKfSessionWaitCaseList kfSessionGetWaitCase()
throws WxErrorException { throws WxErrorException {
String url = "https://api.weixin.qq.com/customservice/kfsession/getwaitcase";
String url = API_URL_PREFIX + "/kfsession/getwaitcase";
String responseContent = this.wxMpService String responseContent = this.wxMpService
.execute(new SimpleGetRequestExecutor(), url, null); .execute(new SimpleGetRequestExecutor(), url, null);
return WxMpKfSessionWaitCaseList.fromJson(responseContent); 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);
}

} }

+ 55
- 0
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java 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);
}
}

+ 87
- 0
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java 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;
}
}

+ 16
- 6
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java View File

@@ -1,7 +1,13 @@
package me.chanjar.weixin.mp.api.impl; package me.chanjar.weixin.mp.api.impl;


import java.io.File; 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.Assert;
import org.testng.annotations.DataProvider; import org.testng.annotations.DataProvider;
import org.testng.annotations.Guice; 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.ApiTestModule.WxXmlMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpServiceImpl; import me.chanjar.weixin.mp.api.WxMpServiceImpl;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest; 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); 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));
}

} }

Loading…
Cancel
Save