| @@ -22,7 +22,7 @@ import me.chanjar.weixin.mp.api.WxMpMessageRouter; | |||||
| import me.chanjar.weixin.mp.api.WxMpServiceImpl; | import me.chanjar.weixin.mp.api.WxMpServiceImpl; | ||||
| import me.chanjar.weixin.mp.bean.WxMpXmlMessage; | import me.chanjar.weixin.mp.bean.WxMpXmlMessage; | ||||
| import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; | import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; | ||||
| import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfOnlineList; | |||||
| import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfOnlineList; | |||||
| /** | /** | ||||
| * | * | ||||
| @@ -3,9 +3,12 @@ package me.chanjar.weixin.mp.api; | |||||
| import java.io.File; | import java.io.File; | ||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.mp.bean.customerservice.request.WxMpKfAccountRequest; | |||||
| import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfList; | |||||
| import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfOnlineList; | |||||
| 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; | |||||
| /** | /** | ||||
| * 客服接口 , | * 客服接口 , | ||||
| @@ -15,59 +18,112 @@ import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfOnlineList; | |||||
| * @author Binary Wang | * @author Binary Wang | ||||
| * | * | ||||
| */ | */ | ||||
| public interface WxMpKefuService { | |||||
| public interface WxMpKefuService { | |||||
| //*******************客服管理接口***********************// | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 获取客服基本信息 | * 获取客服基本信息 | ||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | ||||
| * https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token=ACCESS_TOKEN | |||||
| * 接口url格式:https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token=ACCESS_TOKEN | |||||
| * </pre> | * </pre> | ||||
| */ | */ | ||||
| WxMpKfList kfList() throws WxErrorException; | WxMpKfList kfList() throws WxErrorException; | ||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 获取在线客服接待信息 | * 获取在线客服接待信息 | ||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | ||||
| * https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist?access_token=ACCESS_TOKEN | |||||
| * 接口url格式:https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist?access_token=ACCESS_TOKEN | |||||
| * </pre> | * </pre> | ||||
| */ | */ | ||||
| WxMpKfOnlineList kfOnlineList() throws WxErrorException; | WxMpKfOnlineList kfOnlineList() throws WxErrorException; | ||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 添加客服账号 | * 添加客服账号 | ||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | ||||
| * https://api.weixin.qq.com/customservice/kfaccount/add?access_token=ACCESS_TOKEN | |||||
| * 接口url格式:https://api.weixin.qq.com/customservice/kfaccount/add?access_token=ACCESS_TOKEN | |||||
| * </pre> | * </pre> | ||||
| */ | */ | ||||
| boolean kfAccountAdd(WxMpKfAccountRequest request) throws WxErrorException; | boolean kfAccountAdd(WxMpKfAccountRequest request) throws WxErrorException; | ||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 设置客服信息(更新) | * 设置客服信息(更新) | ||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | ||||
| * https://api.weixin.qq.com/customservice/kfaccount/update?access_token=ACCESS_TOKEN | |||||
| * 接口url格式:https://api.weixin.qq.com/customservice/kfaccount/update?access_token=ACCESS_TOKEN | |||||
| * </pre> | * </pre> | ||||
| */ | */ | ||||
| boolean kfAccountUpdate(WxMpKfAccountRequest request) throws WxErrorException; | boolean kfAccountUpdate(WxMpKfAccountRequest request) throws WxErrorException; | ||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 上传客服头像 | * 上传客服头像 | ||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | ||||
| * http://api.weixin.qq.com/customservice/kfaccount/uploadheadimg?access_token=ACCESS_TOKEN&kf_account=KFACCOUNT | |||||
| * 接口url格式:http://api.weixin.qq.com/customservice/kfaccount/uploadheadimg?access_token=ACCESS_TOKEN&kf_account=KFACCOUNT | |||||
| * </pre> | * </pre> | ||||
| */ | */ | ||||
| boolean kfAccountUploadHeadImg(String kfAccount, File imgFile) throws WxErrorException; | |||||
| boolean kfAccountUploadHeadImg(String kfAccount, File imgFile) | |||||
| throws WxErrorException; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 删除客服账号 | * 删除客服账号 | ||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | * 详情请见:<a href="http://mp.weixin.qq.com/wiki/18/749901f4e123170fb8a4d447ae6040ba.html">客服管理</a> | ||||
| * https://api.weixin.qq.com/customservice/kfaccount/del?access_token=ACCESS_TOKEN&kf_account=KFACCOUNT | |||||
| * 接口url格式:https://api.weixin.qq.com/customservice/kfaccount/del?access_token=ACCESS_TOKEN&kf_account=KFACCOUNT | |||||
| * </pre> | * </pre> | ||||
| */ | */ | ||||
| boolean kfAccountDel(String kfAccount) throws WxErrorException; | boolean kfAccountDel(String kfAccount) throws WxErrorException; | ||||
| //*******************多客服会话控制接口***********************// | |||||
| /** | |||||
| * <pre> | |||||
| * 创建会话 | |||||
| * 开发者可以使用本接口,为多客服的客服工号创建会话,将某个客户直接指定给客服工号接待,需要注意此接口不会受客服自动接入数以及自动接入开关限制。只能为在线的客服(PC客户端在线,或者已绑定多客服助手)创建会话。 | |||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/4/4b256cfb246b22ad020e07cf8a61a738.html">多客服会话控制接口</a> | |||||
| * 接口url格式: https://api.weixin.qq.com/customservice/kfsession/create?access_token=ACCESS_TOKEN | |||||
| * </pre> | |||||
| */ | |||||
| boolean kfSessionCreate(String openid, String kfAccount, String text) throws WxErrorException; | |||||
| /** | |||||
| * <pre> | |||||
| * 关闭会话 | |||||
| * 开发者可以使用本接口,关闭一个会话。 | |||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/4/4b256cfb246b22ad020e07cf8a61a738.html">多客服会话控制接口</a> | |||||
| * 接口url格式: https://api.weixin.qq.com/customservice/kfsession/close?access_token=ACCESS_TOKEN | |||||
| * </pre> | |||||
| */ | |||||
| boolean kfSessionClose(String openid, String kfAccount, String text) throws WxErrorException; | |||||
| /** | |||||
| * <pre> | |||||
| * 获取客户的会话状态 | |||||
| * 开发者可以通过本接口获取客户当前的会话状态。 | |||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/4/4b256cfb246b22ad020e07cf8a61a738.html">多客服会话控制接口</a> | |||||
| * 接口url格式: https://api.weixin.qq.com/customservice/kfsession/getsession?access_token=ACCESS_TOKEN&openid=OPENID | |||||
| * </pre> | |||||
| */ | |||||
| WxMpKfSessionGetResult kfSessionGet(String openid) throws WxErrorException; | |||||
| /** | |||||
| * <pre> | |||||
| * 获取客服的会话列表 | |||||
| * 开发者可以通过本接口获取某个客服正在接待的会话列表。 | |||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/4/4b256cfb246b22ad020e07cf8a61a738.html">多客服会话控制接口</a> | |||||
| * 接口url格式: https://api.weixin.qq.com/customservice/kfsession/getsessionlist?access_token=ACCESS_TOKEN&kf_account=KFACCOUNT | |||||
| * </pre> | |||||
| */ | |||||
| WxMpKfSessionList kfSessionList(String kfAccount) throws WxErrorException; | |||||
| /** | |||||
| * <pre> | |||||
| * 获取未接入会话列表 | |||||
| * 开发者可以通过本接口获取当前正在等待队列中的会话列表,此接口最多返回最早进入队列的100个未接入会话。 | |||||
| * 详情请见:<a href="http://mp.weixin.qq.com/wiki/4/4b256cfb246b22ad020e07cf8a61a738.html">多客服会话控制接口</a> | |||||
| * 接口url格式: https://api.weixin.qq.com/customservice/kfsession/getwaitcase?access_token=ACCESS_TOKEN | |||||
| * </pre> | |||||
| */ | |||||
| WxMpKfSessionWaitCaseList kfSessionGetWaitCase() throws WxErrorException; | |||||
| } | } | ||||
| @@ -1,10 +1,48 @@ | |||||
| package me.chanjar.weixin.mp.api; | package me.chanjar.weixin.mp.api; | ||||
| import com.google.gson.*; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import java.io.InputStream; | |||||
| import java.io.StringReader; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.net.URLEncoder; | |||||
| import java.nio.charset.StandardCharsets; | |||||
| import java.security.NoSuchAlgorithmException; | |||||
| import java.util.Arrays; | |||||
| import java.util.Date; | |||||
| import java.util.HashMap; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.Map.Entry; | |||||
| import java.util.SortedMap; | |||||
| import java.util.TreeMap; | |||||
| import java.util.UUID; | |||||
| import org.apache.http.Consts; | |||||
| import org.apache.http.HttpHost; | |||||
| import org.apache.http.client.ClientProtocolException; | |||||
| import org.apache.http.client.config.RequestConfig; | |||||
| import org.apache.http.client.methods.CloseableHttpResponse; | |||||
| import org.apache.http.client.methods.HttpGet; | |||||
| import org.apache.http.client.methods.HttpPost; | |||||
| import org.apache.http.conn.ssl.SSLConnectionSocketFactory; | |||||
| import org.apache.http.entity.StringEntity; | |||||
| import org.apache.http.impl.client.BasicResponseHandler; | |||||
| import org.apache.http.impl.client.CloseableHttpClient; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| import org.slf4j.helpers.MessageFormatter; | |||||
| import com.google.gson.JsonArray; | |||||
| import com.google.gson.JsonElement; | |||||
| import com.google.gson.JsonObject; | |||||
| import com.google.gson.JsonParser; | |||||
| import com.google.gson.JsonPrimitive; | |||||
| import com.google.gson.internal.Streams; | import com.google.gson.internal.Streams; | ||||
| import com.google.gson.reflect.TypeToken; | import com.google.gson.reflect.TypeToken; | ||||
| import com.google.gson.stream.JsonReader; | import com.google.gson.stream.JsonReader; | ||||
| import com.thoughtworks.xstream.XStream; | import com.thoughtworks.xstream.XStream; | ||||
| import me.chanjar.weixin.common.api.WxConsts; | import me.chanjar.weixin.common.api.WxConsts; | ||||
| import me.chanjar.weixin.common.bean.WxAccessToken; | import me.chanjar.weixin.common.bean.WxAccessToken; | ||||
| import me.chanjar.weixin.common.bean.WxCardApiSignature; | import me.chanjar.weixin.common.bean.WxCardApiSignature; | ||||
| @@ -19,43 +57,62 @@ import me.chanjar.weixin.common.util.RandomUtils; | |||||
| import me.chanjar.weixin.common.util.crypto.SHA1; | import me.chanjar.weixin.common.util.crypto.SHA1; | ||||
| import me.chanjar.weixin.common.util.crypto.WxCryptUtil; | import me.chanjar.weixin.common.util.crypto.WxCryptUtil; | ||||
| import me.chanjar.weixin.common.util.fs.FileUtils; | import me.chanjar.weixin.common.util.fs.FileUtils; | ||||
| import me.chanjar.weixin.common.util.http.*; | |||||
| import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; | |||||
| import me.chanjar.weixin.common.util.http.DefaultApacheHttpHttpClientBuilder; | |||||
| import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.RequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.URIUtil; | |||||
| import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; | |||||
| import me.chanjar.weixin.common.util.json.GsonHelper; | import me.chanjar.weixin.common.util.json.GsonHelper; | ||||
| import me.chanjar.weixin.common.util.json.WxGsonBuilder; | import me.chanjar.weixin.common.util.json.WxGsonBuilder; | ||||
| import me.chanjar.weixin.common.util.xml.XStreamInitializer; | import me.chanjar.weixin.common.util.xml.XStreamInitializer; | ||||
| import me.chanjar.weixin.mp.api.impl.WxMpKefuServiceImpl; | import me.chanjar.weixin.mp.api.impl.WxMpKefuServiceImpl; | ||||
| import me.chanjar.weixin.mp.bean.*; | |||||
| import me.chanjar.weixin.mp.bean.result.*; | |||||
| import me.chanjar.weixin.mp.util.http.*; | |||||
| import me.chanjar.weixin.mp.bean.WxMpCustomMessage; | |||||
| import me.chanjar.weixin.mp.bean.WxMpGroup; | |||||
| import me.chanjar.weixin.mp.bean.WxMpIndustry; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassNews; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMassVideo; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMaterial; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMaterialArticleUpdate; | |||||
| import me.chanjar.weixin.mp.bean.WxMpMaterialNews; | |||||
| import me.chanjar.weixin.mp.bean.WxMpSemanticQuery; | |||||
| import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpCardResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpMaterialCountResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpMaterialFileBatchGetResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpMaterialNewsBatchGetResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpMaterialUploadResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpMaterialVideoInfoResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpPayCallback; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpPayRefundResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpPayResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpPrepayIdResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpUser; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpUserCumulate; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpUserList; | |||||
| import me.chanjar.weixin.mp.bean.result.WxMpUserSummary; | |||||
| import me.chanjar.weixin.mp.bean.result.WxRedpackResult; | |||||
| import me.chanjar.weixin.mp.util.http.MaterialDeleteRequestExecutor; | |||||
| import me.chanjar.weixin.mp.util.http.MaterialNewsInfoRequestExecutor; | |||||
| import me.chanjar.weixin.mp.util.http.MaterialUploadRequestExecutor; | |||||
| import me.chanjar.weixin.mp.util.http.MaterialVideoInfoRequestExecutor; | |||||
| import me.chanjar.weixin.mp.util.http.MaterialVoiceAndImageDownloadRequestExecutor; | |||||
| import me.chanjar.weixin.mp.util.http.MediaImgUploadRequestExecutor; | |||||
| import me.chanjar.weixin.mp.util.http.QrCodeRequestExecutor; | |||||
| import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | ||||
| import org.apache.commons.io.Charsets; | |||||
| import org.apache.http.Consts; | |||||
| import org.apache.http.HttpHost; | |||||
| import org.apache.http.client.ClientProtocolException; | |||||
| import org.apache.http.client.config.RequestConfig; | |||||
| import org.apache.http.client.methods.CloseableHttpResponse; | |||||
| import org.apache.http.client.methods.HttpGet; | |||||
| import org.apache.http.client.methods.HttpPost; | |||||
| import org.apache.http.conn.ssl.SSLConnectionSocketFactory; | |||||
| import org.apache.http.entity.StringEntity; | |||||
| import org.apache.http.impl.client.BasicResponseHandler; | |||||
| import org.apache.http.impl.client.CloseableHttpClient; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| import org.slf4j.helpers.MessageFormatter; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import java.io.InputStream; | |||||
| import java.io.StringReader; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.net.URLEncoder; | |||||
| import java.nio.charset.StandardCharsets; | |||||
| import java.security.NoSuchAlgorithmException; | |||||
| import java.util.*; | |||||
| import java.util.Map.Entry; | |||||
| public class WxMpServiceImpl implements WxMpService { | public class WxMpServiceImpl implements WxMpService { | ||||
| protected final Logger log = LoggerFactory.getLogger(WxMpServiceImpl.class); | protected final Logger log = LoggerFactory.getLogger(WxMpServiceImpl.class); | ||||
| @@ -8,9 +8,13 @@ import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; | import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; | ||||
| import me.chanjar.weixin.mp.api.WxMpKefuService; | 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.customerservice.request.WxMpKfAccountRequest; | |||||
| import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfList; | |||||
| import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfOnlineList; | |||||
| 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; | |||||
| /** | /** | ||||
| * | * | ||||
| @@ -27,45 +31,103 @@ 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 = "https://api.weixin.qq.com/cgi-bin/customservice/getkflist"; | ||||
| String responseContent = this.wxMpService.execute( | |||||
| new SimpleGetRequestExecutor(), url, null); | |||||
| String responseContent = this.wxMpService | |||||
| .execute(new SimpleGetRequestExecutor(), url, null); | |||||
| return WxMpKfList.fromJson(responseContent); | return WxMpKfList.fromJson(responseContent); | ||||
| } | } | ||||
| @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 = "https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist"; | ||||
| String responseContent = this.wxMpService.execute( | |||||
| new SimpleGetRequestExecutor(), url, null); | |||||
| String responseContent = this.wxMpService | |||||
| .execute(new SimpleGetRequestExecutor(), url, null); | |||||
| return WxMpKfOnlineList.fromJson(responseContent); | return WxMpKfOnlineList.fromJson(responseContent); | ||||
| } | } | ||||
| @Override | @Override | ||||
| public boolean kfAccountAdd(WxMpKfAccountRequest request) throws WxErrorException { | |||||
| public boolean kfAccountAdd(WxMpKfAccountRequest request) | |||||
| throws WxErrorException { | |||||
| String url = "https://api.weixin.qq.com/customservice/kfaccount/add"; | String url = "https://api.weixin.qq.com/customservice/kfaccount/add"; | ||||
| this.wxMpService.execute(new SimplePostRequestExecutor(), url, request.toJson()); | |||||
| this.wxMpService.execute(new SimplePostRequestExecutor(), url, | |||||
| request.toJson()); | |||||
| return true; | return true; | ||||
| } | } | ||||
| @Override | @Override | ||||
| public boolean kfAccountUpdate(WxMpKfAccountRequest request) throws WxErrorException { | |||||
| public boolean kfAccountUpdate(WxMpKfAccountRequest request) | |||||
| throws WxErrorException { | |||||
| String url = "https://api.weixin.qq.com/customservice/kfaccount/update"; | String url = "https://api.weixin.qq.com/customservice/kfaccount/update"; | ||||
| this.wxMpService.execute(new SimplePostRequestExecutor(), url, request.toJson()); | |||||
| this.wxMpService.execute(new SimplePostRequestExecutor(), url, | |||||
| request.toJson()); | |||||
| return true; | return true; | ||||
| } | } | ||||
| @Override | @Override | ||||
| public boolean kfAccountUploadHeadImg(String kfAccount, File imgFile) throws WxErrorException { | |||||
| String url = "https://api.weixin.qq.com/customservice/kfaccount/uploadheadimg?kf_account=" + kfAccount ; | |||||
| public boolean kfAccountUploadHeadImg(String kfAccount, File imgFile) | |||||
| throws WxErrorException { | |||||
| String url = "https://api.weixin.qq.com/customservice/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 = "https://api.weixin.qq.com/customservice/kfaccount/del?kf_account=" | |||||
| + kfAccount; | |||||
| this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null); | this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null); | ||||
| return true; | return true; | ||||
| } | } | ||||
| @Override | |||||
| public boolean kfSessionCreate(String openid, String kfAccount, String text) | |||||
| throws WxErrorException { | |||||
| WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid, | |||||
| text); | |||||
| String url = "https://api.weixin.qq.com/customservice/kfsession/create"; | |||||
| this.wxMpService.execute(new SimplePostRequestExecutor(), url, | |||||
| request.toJson()); | |||||
| return true; | |||||
| } | |||||
| @Override | |||||
| public boolean kfSessionClose(String openid, String kfAccount, String text) | |||||
| throws WxErrorException { | |||||
| WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid, | |||||
| text); | |||||
| String url = "https://api.weixin.qq.com/customservice/kfsession/close"; | |||||
| this.wxMpService.execute(new SimplePostRequestExecutor(), url, | |||||
| request.toJson()); | |||||
| return true; | |||||
| } | |||||
| @Override | |||||
| public WxMpKfSessionGetResult kfSessionGet(String openid) | |||||
| throws WxErrorException { | |||||
| String url = "https://api.weixin.qq.com/customservice/kfsession/getsession?openid=" | |||||
| + openid; | |||||
| String responseContent = this.wxMpService | |||||
| .execute(new SimpleGetRequestExecutor(), url, null); | |||||
| return WxMpKfSessionGetResult.fromJson(responseContent); | |||||
| } | |||||
| @Override | |||||
| public WxMpKfSessionList kfSessionList(String kfAccount) | |||||
| throws WxErrorException { | |||||
| String url = "https://api.weixin.qq.com/customservice/kfsession/getsessionlist?kf_account=" | |||||
| + kfAccount; | |||||
| String responseContent = this.wxMpService | |||||
| .execute(new SimpleGetRequestExecutor(), url, null); | |||||
| return WxMpKfSessionList.fromJson(responseContent); | |||||
| } | |||||
| @Override | |||||
| public WxMpKfSessionWaitCaseList kfSessionGetWaitCase() | |||||
| throws WxErrorException { | |||||
| String url = "https://api.weixin.qq.com/customservice/kfsession/getwaitcase"; | |||||
| String responseContent = this.wxMpService | |||||
| .execute(new SimpleGetRequestExecutor(), url, null); | |||||
| return WxMpKfSessionWaitCaseList.fromJson(responseContent); | |||||
| } | |||||
| } | } | ||||
| @@ -1,4 +1,4 @@ | |||||
| package me.chanjar.weixin.mp.bean.customerservice.request; | |||||
| package me.chanjar.weixin.mp.bean.kefu.request; | |||||
| import java.io.Serializable; | import java.io.Serializable; | ||||
| @@ -0,0 +1,66 @@ | |||||
| package me.chanjar.weixin.mp.bean.kefu.request; | |||||
| import java.io.Serializable; | |||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | |||||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||||
| import com.google.gson.annotations.SerializedName; | |||||
| import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
| public class WxMpKfSessionRequest implements Serializable { | |||||
| private static final long serialVersionUID = -5451863610674856927L; | |||||
| /** | |||||
| * kf_account 完整客服账号,格式为:账号前缀@公众号微信号 | |||||
| */ | |||||
| @SerializedName("kf_account") | |||||
| private String kfAccount; | |||||
| /** | |||||
| * openid 客户openid | |||||
| */ | |||||
| @SerializedName("openid") | |||||
| private String openid; | |||||
| /** | |||||
| * text 附加信息,文本会展示在客服人员的多客服客户端 | |||||
| * 目前看起来无用,主要是老版的多客服客户端使用 | |||||
| */ | |||||
| @SerializedName("text") | |||||
| @Deprecated | |||||
| private String text; | |||||
| public WxMpKfSessionRequest(String kfAccount, String openid, String text) { | |||||
| this.kfAccount = kfAccount; | |||||
| this.openid = openid; | |||||
| this.text = text; | |||||
| } | |||||
| @Override | |||||
| public String toString() { | |||||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | |||||
| } | |||||
| public String toJson() { | |||||
| return WxMpGsonBuilder.INSTANCE.create().toJson(this); | |||||
| } | |||||
| public String getKfAccount() { | |||||
| return this.kfAccount; | |||||
| } | |||||
| public void setKfAccount(String kfAccount) { | |||||
| this.kfAccount = kfAccount; | |||||
| } | |||||
| public String getText() { | |||||
| return this.text; | |||||
| } | |||||
| public void setText(String text) { | |||||
| this.text = text; | |||||
| } | |||||
| } | |||||
| @@ -1,8 +1,9 @@ | |||||
| package me.chanjar.weixin.mp.bean.customerservice.result; | |||||
| package me.chanjar.weixin.mp.bean.kefu.result; | |||||
| import java.io.Serializable; | import java.io.Serializable; | ||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | import org.apache.commons.lang3.builder.ToStringBuilder; | ||||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||||
| import com.google.gson.annotations.Expose; | import com.google.gson.annotations.Expose; | ||||
| import com.google.gson.annotations.SerializedName; | import com.google.gson.annotations.SerializedName; | ||||
| @@ -20,38 +21,38 @@ public class WxMpKfInfo implements Serializable { | |||||
| */ | */ | ||||
| @SerializedName("kf_account") | @SerializedName("kf_account") | ||||
| private String account; | private String account; | ||||
| /** | /** | ||||
| * kf_headimgurl 客服头像地址 | * kf_headimgurl 客服头像地址 | ||||
| */ | */ | ||||
| @SerializedName("kf_headimgurl") | @SerializedName("kf_headimgurl") | ||||
| private String headImgUrl; | private String headImgUrl; | ||||
| /** | /** | ||||
| * kf_id 客服工号 | * kf_id 客服工号 | ||||
| */ | */ | ||||
| @SerializedName("kf_id") | @SerializedName("kf_id") | ||||
| private String id; | private String id; | ||||
| /** | /** | ||||
| * kf_nick 客服昵称 | * kf_nick 客服昵称 | ||||
| */ | */ | ||||
| @SerializedName("kf_nick") | @SerializedName("kf_nick") | ||||
| private String nick; | private String nick; | ||||
| /** | /** | ||||
| * status 客服在线状态 1:pc在线,2:手机在线。若pc和手机同时在线则为 1+2=3 | * status 客服在线状态 1:pc在线,2:手机在线。若pc和手机同时在线则为 1+2=3 | ||||
| */ | */ | ||||
| @SerializedName("status") | @SerializedName("status") | ||||
| private Integer status; | private Integer status; | ||||
| /** | /** | ||||
| * auto_accept 客服设置的最大自动接入数 | * auto_accept 客服设置的最大自动接入数 | ||||
| */ | */ | ||||
| @Expose | @Expose | ||||
| @SerializedName("auto_accept") | @SerializedName("auto_accept") | ||||
| private Integer autoAccept; | private Integer autoAccept; | ||||
| /** | /** | ||||
| * accepted_case 客服当前正在接待的会话数 | * accepted_case 客服当前正在接待的会话数 | ||||
| * @return | * @return | ||||
| @@ -118,6 +119,6 @@ public class WxMpKfInfo implements Serializable { | |||||
| @Override | @Override | ||||
| public String toString() { | public String toString() { | ||||
| return ToStringBuilder.reflectionToString(this); | |||||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,8 +1,9 @@ | |||||
| package me.chanjar.weixin.mp.bean.customerservice.result; | |||||
| package me.chanjar.weixin.mp.bean.kefu.result; | |||||
| import java.util.List; | import java.util.List; | ||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | import org.apache.commons.lang3.builder.ToStringBuilder; | ||||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||||
| import com.google.gson.annotations.SerializedName; | import com.google.gson.annotations.SerializedName; | ||||
| @@ -18,7 +19,7 @@ public class WxMpKfList { | |||||
| @Override | @Override | ||||
| public String toString() { | public String toString() { | ||||
| return ToStringBuilder.reflectionToString(this); | |||||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | |||||
| } | } | ||||
| public List<WxMpKfInfo> getKfList() { | public List<WxMpKfInfo> getKfList() { | ||||
| @@ -1,8 +1,9 @@ | |||||
| package me.chanjar.weixin.mp.bean.customerservice.result; | |||||
| package me.chanjar.weixin.mp.bean.kefu.result; | |||||
| import java.util.List; | import java.util.List; | ||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | import org.apache.commons.lang3.builder.ToStringBuilder; | ||||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||||
| import com.google.gson.annotations.SerializedName; | import com.google.gson.annotations.SerializedName; | ||||
| @@ -18,7 +19,7 @@ public class WxMpKfOnlineList { | |||||
| @Override | @Override | ||||
| public String toString() { | public String toString() { | ||||
| return ToStringBuilder.reflectionToString(this); | |||||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | |||||
| } | } | ||||
| public List<WxMpKfInfo> getKfOnlineList() { | public List<WxMpKfInfo> getKfOnlineList() { | ||||
| @@ -0,0 +1,61 @@ | |||||
| package me.chanjar.weixin.mp.bean.kefu.result; | |||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | |||||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||||
| import com.google.gson.annotations.SerializedName; | |||||
| /** | |||||
| * | |||||
| * @author Binary Wang | |||||
| * | |||||
| */ | |||||
| public class WxMpKfSession { | |||||
| /** | |||||
| * kf_account 正在接待的客服,为空表示没有人在接待 | |||||
| */ | |||||
| @SerializedName("kf_account") | |||||
| private String kfAccount; | |||||
| /** | |||||
| * createtime 会话接入的时间 或者 来访时间,UNIX时间戳 | |||||
| */ | |||||
| @SerializedName("createtime") | |||||
| private long createTime; | |||||
| /** | |||||
| * openid 客户openid | |||||
| */ | |||||
| @SerializedName("openid") | |||||
| private String openid; | |||||
| @Override | |||||
| public String toString() { | |||||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | |||||
| } | |||||
| public String getKfAccount() { | |||||
| return this.kfAccount; | |||||
| } | |||||
| public void setKfAccount(String kfAccount) { | |||||
| this.kfAccount = kfAccount; | |||||
| } | |||||
| public long getCreateTime() { | |||||
| return this.createTime; | |||||
| } | |||||
| public void setCreateTime(long createTime) { | |||||
| this.createTime = createTime; | |||||
| } | |||||
| public String getOpenid() { | |||||
| return this.openid; | |||||
| } | |||||
| public void setOpenid(String openid) { | |||||
| this.openid = openid; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,53 @@ | |||||
| package me.chanjar.weixin.mp.bean.kefu.result; | |||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | |||||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||||
| import com.google.gson.annotations.SerializedName; | |||||
| import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
| /** | |||||
| * | |||||
| * @author Binary Wang | |||||
| * | |||||
| */ | |||||
| public class WxMpKfSessionGetResult { | |||||
| /** | |||||
| * kf_account 正在接待的客服,为空表示没有人在接待 | |||||
| */ | |||||
| @SerializedName("kf_account") | |||||
| private String kfAccount; | |||||
| /** | |||||
| * createtime 会话接入的时间 ,UNIX时间戳 | |||||
| */ | |||||
| @SerializedName("createtime") | |||||
| private long createTime; | |||||
| @Override | |||||
| public String toString() { | |||||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | |||||
| } | |||||
| public static WxMpKfSessionGetResult fromJson(String json) { | |||||
| return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpKfSessionGetResult.class); | |||||
| } | |||||
| public String getKfAccount() { | |||||
| return this.kfAccount; | |||||
| } | |||||
| public void setKfAccount(String kfAccount) { | |||||
| this.kfAccount = kfAccount; | |||||
| } | |||||
| public long getCreateTime() { | |||||
| return this.createTime; | |||||
| } | |||||
| public void setCreateTime(long createTime) { | |||||
| this.createTime = createTime; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,41 @@ | |||||
| package me.chanjar.weixin.mp.bean.kefu.result; | |||||
| import java.util.List; | |||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | |||||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||||
| import com.google.gson.annotations.SerializedName; | |||||
| import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
| /** | |||||
| * | |||||
| * @author Binary Wang | |||||
| * | |||||
| */ | |||||
| public class WxMpKfSessionList { | |||||
| /** | |||||
| * 会话列表 | |||||
| */ | |||||
| @SerializedName("sessionlist") | |||||
| private List<WxMpKfSession> kfSessionList; | |||||
| @Override | |||||
| public String toString() { | |||||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | |||||
| } | |||||
| public static WxMpKfSessionList fromJson(String json) { | |||||
| return WxMpGsonBuilder.INSTANCE.create().fromJson(json, | |||||
| WxMpKfSessionList.class); | |||||
| } | |||||
| public List<WxMpKfSession> getKfSessionList() { | |||||
| return this.kfSessionList; | |||||
| } | |||||
| public void setKfSessionList(List<WxMpKfSession> kfSessionList) { | |||||
| this.kfSessionList = kfSessionList; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,48 @@ | |||||
| package me.chanjar.weixin.mp.bean.kefu.result; | |||||
| import java.util.List; | |||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | |||||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||||
| import com.google.gson.annotations.SerializedName; | |||||
| import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
| /** | |||||
| * | |||||
| * @author Binary Wang | |||||
| * | |||||
| */ | |||||
| public class WxMpKfSessionWaitCaseList { | |||||
| /** | |||||
| * count 未接入会话数量 | |||||
| */ | |||||
| @SerializedName("count") | |||||
| private Long count; | |||||
| /** | |||||
| * waitcaselist 未接入会话列表,最多返回100条数据 | |||||
| */ | |||||
| @SerializedName("waitcaselist") | |||||
| private List<WxMpKfSession> kfSessionWaitCaseList; | |||||
| @Override | |||||
| public String toString() { | |||||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); | |||||
| } | |||||
| public static WxMpKfSessionWaitCaseList fromJson(String json) { | |||||
| return WxMpGsonBuilder.INSTANCE.create().fromJson(json, | |||||
| WxMpKfSessionWaitCaseList.class); | |||||
| } | |||||
| public List<WxMpKfSession> getKfSessionWaitCaseList() { | |||||
| return this.kfSessionWaitCaseList; | |||||
| } | |||||
| public void setKfSessionWaitCaseList(List<WxMpKfSession> kfSessionWaitCaseList) { | |||||
| this.kfSessionWaitCaseList = kfSessionWaitCaseList; | |||||
| } | |||||
| } | |||||
| @@ -1,5 +1,8 @@ | |||||
| package me.chanjar.weixin.mp.api.impl; | package me.chanjar.weixin.mp.api.impl; | ||||
| import java.io.File; | |||||
| import org.testng.Assert; | |||||
| import org.testng.annotations.DataProvider; | import org.testng.annotations.DataProvider; | ||||
| import org.testng.annotations.Guice; | import org.testng.annotations.Guice; | ||||
| import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
| @@ -9,15 +12,14 @@ import com.google.inject.Inject; | |||||
| import me.chanjar.weixin.common.exception.WxErrorException; | import me.chanjar.weixin.common.exception.WxErrorException; | ||||
| import me.chanjar.weixin.mp.api.ApiTestModule; | 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.WxMpConfigStorage; | |||||
| import me.chanjar.weixin.mp.api.WxMpServiceImpl; | import me.chanjar.weixin.mp.api.WxMpServiceImpl; | ||||
| import me.chanjar.weixin.mp.bean.customerservice.request.WxMpKfAccountRequest; | |||||
| import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfList; | |||||
| import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfOnlineList; | |||||
| import java.io.File; | |||||
| import org.testng.Assert; | |||||
| 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; | |||||
| /** | /** | ||||
| * 测试客服相关接口 | * 测试客服相关接口 | ||||
| @@ -34,14 +36,18 @@ public class WxMpKefuImplTest { | |||||
| public void testKfList() throws WxErrorException { | public void testKfList() throws WxErrorException { | ||||
| WxMpKfList kfList = this.wxService.getKefuService().kfList(); | WxMpKfList kfList = this.wxService.getKefuService().kfList(); | ||||
| Assert.assertNotNull(kfList); | Assert.assertNotNull(kfList); | ||||
| System.err.println(kfList); | |||||
| for (WxMpKfInfo k : kfList.getKfList()) { | |||||
| System.err.println(k); | |||||
| } | |||||
| } | } | ||||
| public void testKfOnlineList() throws WxErrorException { | public void testKfOnlineList() throws WxErrorException { | ||||
| WxMpKfOnlineList kfOnlineList = this.wxService.getKefuService() | WxMpKfOnlineList kfOnlineList = this.wxService.getKefuService() | ||||
| .kfOnlineList(); | .kfOnlineList(); | ||||
| Assert.assertNotNull(kfOnlineList); | Assert.assertNotNull(kfOnlineList); | ||||
| System.err.println(kfOnlineList); | |||||
| for (WxMpKfInfo k : kfOnlineList.getKfOnlineList()) { | |||||
| System.err.println(k); | |||||
| } | |||||
| } | } | ||||
| @DataProvider | @DataProvider | ||||
| @@ -76,11 +82,59 @@ public class WxMpKefuImplTest { | |||||
| Assert.assertTrue(result); | Assert.assertTrue(result); | ||||
| } | } | ||||
| @Test(dependsOnMethods = { | |||||
| "testKfAccountUploadHeadImg" }, dataProvider = "getKfAccount") | |||||
| @Test(dataProvider = "getKfAccount") | |||||
| public void testKfAccountDel(String kfAccount) throws WxErrorException { | public void testKfAccountDel(String kfAccount) throws WxErrorException { | ||||
| boolean result = this.wxService.getKefuService().kfAccountDel(kfAccount); | boolean result = this.wxService.getKefuService().kfAccountDel(kfAccount); | ||||
| Assert.assertTrue(result); | Assert.assertTrue(result); | ||||
| } | } | ||||
| @DataProvider | |||||
| public Object[][] getKfAccountAndOpenid() { | |||||
| WxXmlMpInMemoryConfigStorage configStorage = (WxXmlMpInMemoryConfigStorage) this.wxService | |||||
| .getWxMpConfigStorage(); | |||||
| return new Object[][] { | |||||
| { configStorage.getKfAccount(), configStorage.getOpenId() } }; | |||||
| } | |||||
| @Test(dataProvider = "getKfAccountAndOpenid") | |||||
| public void testKfSessionCreate(String kfAccount, String openid) | |||||
| throws WxErrorException { | |||||
| boolean result = this.wxService.getKefuService().kfSessionCreate(openid, | |||||
| kfAccount, "welcome"); | |||||
| Assert.assertTrue(result); | |||||
| } | |||||
| @Test(dataProvider = "getKfAccountAndOpenid") | |||||
| public void testKfSessionClose(String kfAccount, String openid) | |||||
| throws WxErrorException { | |||||
| boolean result = this.wxService.getKefuService().kfSessionClose(openid, | |||||
| kfAccount, "bye bye"); | |||||
| Assert.assertTrue(result); | |||||
| } | |||||
| @Test(dataProvider = "getKfAccountAndOpenid") | |||||
| public void testKfSessionGet(@SuppressWarnings("unused") String kfAccount, | |||||
| String openid) throws WxErrorException { | |||||
| WxMpKfSessionGetResult result = this.wxService.getKefuService() | |||||
| .kfSessionGet(openid); | |||||
| Assert.assertNotNull(result); | |||||
| System.err.println(result); | |||||
| } | |||||
| @Test(dataProvider = "getKfAccount") | |||||
| public void testKfSessionList(String kfAccount) throws WxErrorException { | |||||
| WxMpKfSessionList result = this.wxService.getKefuService() | |||||
| .kfSessionList(kfAccount); | |||||
| Assert.assertNotNull(result); | |||||
| System.err.println(result); | |||||
| } | |||||
| @Test | |||||
| public void testKfSessionGetWaitCase() throws WxErrorException { | |||||
| WxMpKfSessionWaitCaseList result = this.wxService.getKefuService() | |||||
| .kfSessionGetWaitCase(); | |||||
| Assert.assertNotNull(result); | |||||
| System.err.println(result); | |||||
| } | |||||
| } | } | ||||
| @@ -4,7 +4,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder; | |||||
| import org.testng.Assert; | import org.testng.Assert; | ||||
| import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
| import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfList; | |||||
| import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList; | |||||
| @Test | @Test | ||||
| public class WxMpKfListTest { | public class WxMpKfListTest { | ||||
| @@ -4,7 +4,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder; | |||||
| import org.testng.Assert; | import org.testng.Assert; | ||||
| import org.testng.annotations.Test; | import org.testng.annotations.Test; | ||||
| import me.chanjar.weixin.mp.bean.customerservice.result.WxMpKfOnlineList; | |||||
| import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfOnlineList; | |||||
| @Test | @Test | ||||
| public class WxMpKfOnlineListTest { | public class WxMpKfOnlineListTest { | ||||