diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java index c4731cb52..fc678b420 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java @@ -1,12 +1,18 @@ package me.chanjar.weixin.mp.api; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest; -import me.chanjar.weixin.mp.bean.kefu.result.*; - import java.io.File; import java.util.Date; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +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.WxMpKfMsgList; +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; + /** * 客服接口 , * 命名采用kefu拼音的原因是: @@ -17,6 +23,14 @@ import java.util.Date; */ public interface WxMpKefuService { + /** + *
+ * 发送客服消息 + * 详情请见: 发送客服消息 + *+ */ + boolean customMessageSend(WxMpCustomMessage message) throws WxErrorException; + //*******************客服管理接口***********************// /** diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 077488b78..952cf8f5d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -3,7 +3,6 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.http.RequestExecutor; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; import me.chanjar.weixin.mp.bean.WxMpIndustry; import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage; import me.chanjar.weixin.mp.bean.WxMpMassNews; @@ -82,14 +81,6 @@ public interface WxMpService { */ WxJsapiSignature createJsapiSignature(String url) throws WxErrorException; - /** - *
- * 发送客服消息 - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=发送客服消息 - *- */ - void customMessageSend(WxMpCustomMessage message) throws WxErrorException; - /** *
* 上传群发用的图文消息,上传后才能群发图文消息
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java
index 6d6cf14c9..b65fdeaa2 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java
@@ -3,15 +3,18 @@ package me.chanjar.weixin.mp.api.impl;
import java.io.File;
import java.util.Date;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.google.gson.JsonObject;
import me.chanjar.weixin.common.bean.result.WxError;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
-import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
-import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
import me.chanjar.weixin.mp.api.WxMpKefuService;
import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
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;
@@ -27,6 +30,8 @@ import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionWaitCaseList;
*
*/
public class WxMpKefuServiceImpl implements WxMpKefuService {
+ protected final Logger log = LoggerFactory
+ .getLogger(WxMpKefuServiceImpl.class);
private static final String API_URL_PREFIX = "https://api.weixin.qq.com/customservice";
private WxMpService wxMpService;
@@ -34,19 +39,31 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
this.wxMpService = wxMpService;
}
+ @Override
+ public boolean customMessageSend(WxMpCustomMessage message)
+ throws WxErrorException {
+ String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
+ String responseContent = this.wxMpService.post(url, message.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, message.toJson(),
+ responseContent);
+ return true;
+ }
+
@Override
public WxMpKfList kfList() throws WxErrorException {
- String url = "https://api.weixin.qq.com/cgi-bin/customservice/getkflist";
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String url = API_URL_PREFIX + "/getkflist";
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfList.fromJson(responseContent);
}
@Override
public WxMpKfOnlineList kfOnlineList() throws WxErrorException {
- String url = "https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist";
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String url = API_URL_PREFIX + "/getonlinekflist";
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfOnlineList.fromJson(responseContent);
}
@@ -54,8 +71,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfAccountAdd(WxMpKfAccountRequest request)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/add";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@@ -63,16 +81,18 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfAccountUpdate(WxMpKfAccountRequest request)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/update";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@Override
public boolean kfAccountInviteWorker(WxMpKfAccountRequest request) throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/inviteworker";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@@ -80,14 +100,20 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfAccountUploadHeadImg(String kfAccount, File imgFile)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/uploadheadimg?kf_account=" + kfAccount;
- this.wxMpService.execute(new MediaUploadRequestExecutor(), url, imgFile);
+ WxMediaUploadResult responseContent = this.wxMpService
+ .execute(new MediaUploadRequestExecutor(), url, imgFile);
+ this.log.debug("\nurl:{}\nparams:{}&file:{}\nresponse:{}", url, kfAccount,
+ imgFile.getAbsolutePath(),
+ responseContent);
return true;
}
@Override
public boolean kfAccountDel(String kfAccount) throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/del?kf_account=" + kfAccount;
- this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null);
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return true;
}
@@ -96,8 +122,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
throws WxErrorException {
WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid);
String url = API_URL_PREFIX + "/kfsession/create";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@@ -106,8 +133,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
throws WxErrorException {
WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid);
String url = API_URL_PREFIX + "/kfsession/close";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@@ -115,8 +143,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public WxMpKfSessionGetResult kfSessionGet(String openid)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfsession/getsession?openid=" + openid;
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfSessionGetResult.fromJson(responseContent);
}
@@ -124,8 +153,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public WxMpKfSessionList kfSessionList(String kfAccount)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfsession/getsessionlist?kf_account=" + kfAccount;
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfSessionList.fromJson(responseContent);
}
@@ -133,8 +163,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public WxMpKfSessionWaitCaseList kfSessionGetWaitCase()
throws WxErrorException {
String url = API_URL_PREFIX + "/kfsession/getwaitcase";
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfSessionWaitCaseList.fromJson(responseContent);
}
@@ -156,7 +187,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
param.addProperty("msgid", msgId); //msgid 消息id顺序从小到大,从1开始
param.addProperty("number", number); //number 每次获取条数,最多10000条
- String responseContent = this.wxMpService.execute(new SimplePostRequestExecutor(), url, param.toString());
+ String responseContent = this.wxMpService.post(url, param.toString());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, param.toString(),
+ responseContent);
return WxMpKfMsgList.fromJson(responseContent);
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
index 2bff6482a..3f2c9808b 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
@@ -44,7 +44,6 @@ import me.chanjar.weixin.mp.api.WxMpQrcodeService;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.WxMpUserService;
import me.chanjar.weixin.mp.api.WxMpUserTagService;
-import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
import me.chanjar.weixin.mp.bean.WxMpIndustry;
import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage;
import me.chanjar.weixin.mp.bean.WxMpMassNews;
@@ -203,12 +202,6 @@ public class WxMpServiceImpl implements WxMpService {
return jsapiSignature;
}
- @Override
- public void customMessageSend(WxMpCustomMessage message) throws WxErrorException {
- String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
- execute(new SimplePostRequestExecutor(), url, message.toJson());
- }
-
@Override
public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews";
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpCustomMessageAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpCustomMessageAPITest.java
deleted file mode 100644
index 730ab7260..000000000
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpCustomMessageAPITest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package me.chanjar.weixin.mp.api;
-
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.api.WxConsts;
-import me.chanjar.weixin.common.exception.WxErrorException;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-/***
- * 测试发送客服消息
- * @author chanjarster
- *
- */
-@Test(groups="customMessageAPI")
-@Guice(modules = ApiTestModule.class)
-public class WxMpCustomMessageAPITest {
-
- @Inject
- protected WxMpServiceImpl wxService;
-
- public void testSendCustomMessage() throws WxErrorException {
- ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
- WxMpCustomMessage message = new WxMpCustomMessage();
- message.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
- message.setToUser(configStorage.getOpenId());
- message.setContent("欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
-
- this.wxService.customMessageSend(message);
- }
-
- public void testSendCustomMessageWithKfAccount() throws WxErrorException {
- ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
- WxMpCustomMessage message = new WxMpCustomMessage();
- message.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
- message.setToUser(configStorage.getOpenId());
- message.setKfAccount(configStorage.getKfAccount());
- message.setContent("欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
-
- this.wxService.customMessageSend(message);
- }
-
-}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java
index 431792e48..21096f61b 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java
@@ -11,9 +11,11 @@ import org.testng.annotations.Test;
import com.google.inject.Inject;
+import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.ApiTestModule;
import me.chanjar.weixin.mp.api.ApiTestModule.WxXmlMpInMemoryConfigStorage;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
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;
@@ -35,6 +37,31 @@ public class WxMpKefuServiceImplTest {
@Inject
protected WxMpServiceImpl wxService;
+ public void testSendCustomMessage() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService
+ .getWxMpConfigStorage();
+ WxMpCustomMessage message = new WxMpCustomMessage();
+ message.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
+ message.setToUser(configStorage.getOpenId());
+ message.setContent(
+ "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
+
+ this.wxService.getKefuService().customMessageSend(message);
+ }
+
+ public void testSendCustomMessageWithKfAccount() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService
+ .getWxMpConfigStorage();
+ WxMpCustomMessage message = new WxMpCustomMessage();
+ message.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
+ message.setToUser(configStorage.getOpenId());
+ message.setKfAccount(configStorage.getKfAccount());
+ message.setContent(
+ "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
+
+ this.wxService.getKefuService().customMessageSend(message);
+ }
+
public void testKfList() throws WxErrorException {
WxMpKfList kfList = this.wxService.getKefuService().kfList();
Assert.assertNotNull(kfList);
@@ -123,7 +150,7 @@ public class WxMpKefuServiceImplTest {
}
@Test(dataProvider = "getKfAccountAndOpenid")
- public void testKfSessionGet(String kfAccount,
+ public void testKfSessionGet(@SuppressWarnings("unused") String kfAccount,
String openid) throws WxErrorException {
WxMpKfSessionGetResult result = this.wxService.getKefuService()
.kfSessionGet(openid);
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
index 6db18923d..a6fb1e53b 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
@@ -1,5 +1,9 @@
package me.chanjar.weixin.mp.demo;
+import java.util.Map;
+import java.util.Random;
+import java.util.regex.Pattern;
+
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager;
@@ -10,10 +14,6 @@ import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
-import java.util.Map;
-import java.util.Random;
-import java.util.regex.Pattern;
-
public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMatcher {
private Random random = new Random();
@@ -57,14 +57,14 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
.toUser(wxMessage.getFromUserName())
.content("请猜一个100以内的数字")
.build();
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("放弃了吗?那请重新猜一个100以内的数字")
.build();
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
}
session.setAttribute("guessing", Boolean.TRUE);
@@ -92,7 +92,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
.toUser(wxMessage.getFromUserName())
.content("小了")
.build();
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
} else if (guessNumber > answer) {
WxMpCustomMessage m = WxMpCustomMessage
@@ -100,7 +100,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
.toUser(wxMessage.getFromUserName())
.content("大了")
.build();
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
@@ -108,7 +108,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
.content("Bingo!")
.build();
session.removeAttribute("guessing");
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
}
}