mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2026-02-18 06:06:23 +08:00
@@ -8,8 +8,10 @@ import java.util.List;
|
||||
/**
|
||||
* 用户分组相关操作接口
|
||||
* @author Binary Wang
|
||||
* 分组接口属于老接口,不知道啥时候被替换成用户标签接口
|
||||
*
|
||||
*/
|
||||
@Deprecated
|
||||
public interface WxMpGroupService {
|
||||
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 发送客服消息
|
||||
* 详情请见: <a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547&token=&lang=zh_CN">发送客服消息</a>
|
||||
* </pre>
|
||||
*/
|
||||
boolean customMessageSend(WxMpCustomMessage message) throws WxErrorException;
|
||||
|
||||
//*******************客服管理接口***********************//
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,18 +1,5 @@
|
||||
package me.chanjar.weixin.mp.api;
|
||||
|
||||
import me.chanjar.weixin.common.session.InternalSession;
|
||||
import me.chanjar.weixin.common.session.InternalSessionManager;
|
||||
import me.chanjar.weixin.common.session.StandardSessionManager;
|
||||
import me.chanjar.weixin.common.session.WxSessionManager;
|
||||
import me.chanjar.weixin.common.util.LogExceptionHandler;
|
||||
import me.chanjar.weixin.common.api.WxErrorExceptionHandler;
|
||||
import me.chanjar.weixin.common.api.WxMessageDuplicateChecker;
|
||||
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
@@ -20,6 +7,20 @@ import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import me.chanjar.weixin.common.api.WxErrorExceptionHandler;
|
||||
import me.chanjar.weixin.common.api.WxMessageDuplicateChecker;
|
||||
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
|
||||
import me.chanjar.weixin.common.session.InternalSession;
|
||||
import me.chanjar.weixin.common.session.InternalSessionManager;
|
||||
import me.chanjar.weixin.common.session.StandardSessionManager;
|
||||
import me.chanjar.weixin.common.session.WxSessionManager;
|
||||
import me.chanjar.weixin.common.util.LogExceptionHandler;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 微信消息路由器,通过代码化的配置,把来自微信的消息交给handler处理
|
||||
@@ -155,7 +156,7 @@ public class WxMpMessageRouter {
|
||||
}
|
||||
|
||||
WxMpXmlOutMessage res = null;
|
||||
final List<Future> futures = new ArrayList<>();
|
||||
final List<Future<?>> futures = new ArrayList<>();
|
||||
for (final WxMpMessageRouterRule rule : matchRules) {
|
||||
// 返回最后一个非异步的rule的执行结果
|
||||
if(rule.isAsync()) {
|
||||
@@ -179,7 +180,7 @@ public class WxMpMessageRouter {
|
||||
this.executorService.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
for (Future future : futures) {
|
||||
for (Future<?> future : futures) {
|
||||
try {
|
||||
future.get();
|
||||
WxMpMessageRouter.this.log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUserName());
|
||||
|
||||
@@ -3,18 +3,25 @@ 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.*;
|
||||
import me.chanjar.weixin.mp.bean.result.*;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
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.WxMpSemanticQuery;
|
||||
import me.chanjar.weixin.mp.bean.WxMpTemplateMessage;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpUser;
|
||||
|
||||
/**
|
||||
* 微信API的Service
|
||||
*/
|
||||
public interface WxMpService {
|
||||
|
||||
SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 验证推送过来的消息的正确性
|
||||
@@ -74,14 +81,6 @@ public interface WxMpService {
|
||||
*/
|
||||
WxJsapiSignature createJsapiSignature(String url) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 发送客服消息
|
||||
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=发送客服消息
|
||||
* </pre>
|
||||
*/
|
||||
void customMessageSend(WxMpCustomMessage message) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 上传群发用的图文消息,上传后才能群发图文消息
|
||||
@@ -152,6 +151,20 @@ public interface WxMpService {
|
||||
*/
|
||||
WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 构造第三方使用网站应用授权登录的url
|
||||
* 详情请见: <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN">网站应用微信登录开发指南</a>
|
||||
* URL格式为:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
|
||||
* </pre>
|
||||
*
|
||||
* @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode
|
||||
* @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
|
||||
* @param state 非必填,用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
|
||||
* @return url
|
||||
*/
|
||||
String buildQrConnectUrl(String redirectURI, String scope, String state);
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 构造oauth2授权的url连接
|
||||
@@ -314,8 +327,16 @@ public interface WxMpService {
|
||||
*
|
||||
* @return WxMpGroupService
|
||||
*/
|
||||
|
||||
WxMpGroupService getGroupService();
|
||||
|
||||
/**
|
||||
* 返回用户标签相关接口的方法实现类,以方便调用个其各种接口
|
||||
*
|
||||
* @return WxMpUserTagService
|
||||
*/
|
||||
WxMpUserTagService getUserTagService();
|
||||
|
||||
/**
|
||||
* 返回二维码相关接口的方法实现类,以方便调用个其各种接口
|
||||
*
|
||||
@@ -343,4 +364,11 @@ public interface WxMpService {
|
||||
* @return WxMpDataCubeService
|
||||
*/
|
||||
WxMpDataCubeService getDataCubeService();
|
||||
|
||||
/**
|
||||
* 返回用户黑名单管理相关接口的方法实现类,以方便调用其各种借口
|
||||
*
|
||||
* @return WxMpUserBlackListService
|
||||
*/
|
||||
WxMpUserBlacklistService getBlackListService();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package me.chanjar.weixin.mp.api;
|
||||
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpUserBlacklistGetResult;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author miller
|
||||
*/
|
||||
public interface WxMpUserBlacklistService {
|
||||
/**
|
||||
* <pre>
|
||||
* 获取公众号的黑名单列表
|
||||
* 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
|
||||
* </pre>
|
||||
*/
|
||||
WxMpUserBlacklistGetResult getBlacklist(String nextOpenid) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 拉黑用户
|
||||
* 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
|
||||
* </pre>
|
||||
*/
|
||||
void pushToBlacklist(List<String> openidList) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 取消拉黑用户
|
||||
* 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
|
||||
* </pre>
|
||||
*/
|
||||
void pullFromBlacklist(List<String> openidList) throws WxErrorException;
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package me.chanjar.weixin.mp.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.mp.bean.tag.WxUserTag;
|
||||
|
||||
/**
|
||||
* 用户标签管理相关接口
|
||||
* Created by Binary Wang on 2016/9/2.
|
||||
* @author binarywang(https://github.com/binarywang)
|
||||
*
|
||||
*/
|
||||
public interface WxMpUserTagService {
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 创建标签
|
||||
* 一个公众号,最多可以创建100个标签。
|
||||
* 详情请见:<a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">用户标签管理</a>
|
||||
* 接口url格式: https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN
|
||||
* </pre>
|
||||
*
|
||||
* @param name 标签名字(30个字符以内)
|
||||
*/
|
||||
WxUserTag tagCreate(String name) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 获取公众号已创建的标签
|
||||
* 详情请见:<a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">用户标签管理</a>
|
||||
* 接口url格式: https://api.weixin.qq.com/cgi-bin/tags/get?access_token=ACCESS_TOKEN
|
||||
* </pre>
|
||||
*
|
||||
*/
|
||||
List<WxUserTag> tagGet() throws WxErrorException;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 编辑标签
|
||||
* 详情请见:<a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">用户标签管理</a>
|
||||
* 接口url格式: https://api.weixin.qq.com/cgi-bin/tags/update?access_token=ACCESS_TOKEN
|
||||
* </pre>
|
||||
*
|
||||
*/
|
||||
Boolean tagUpdate(Integer id, String name) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 删除标签
|
||||
* 详情请见:<a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140837&token=&lang=zh_CN">用户标签管理</a>
|
||||
* 接口url格式: https://api.weixin.qq.com/cgi-bin/tags/delete?access_token=ACCESS_TOKEN
|
||||
* </pre>
|
||||
*
|
||||
*/
|
||||
Boolean tagDelete(Integer id) throws WxErrorException;
|
||||
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package me.chanjar.weixin.mp.api.impl;
|
||||
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
@@ -111,16 +110,12 @@ public class WxMpCardServiceImpl implements WxMpCardService {
|
||||
signParam[optionalSignParam.length] = String.valueOf(timestamp);
|
||||
signParam[optionalSignParam.length + 1] = nonceStr;
|
||||
signParam[optionalSignParam.length + 2] = cardApiTicket;
|
||||
try {
|
||||
String signature = SHA1.gen(signParam);
|
||||
WxCardApiSignature cardApiSignature = new WxCardApiSignature();
|
||||
cardApiSignature.setTimestamp(timestamp);
|
||||
cardApiSignature.setNonceStr(nonceStr);
|
||||
cardApiSignature.setSignature(signature);
|
||||
return cardApiSignature;
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build());
|
||||
}
|
||||
String signature = SHA1.gen(signParam);
|
||||
WxCardApiSignature cardApiSignature = new WxCardApiSignature();
|
||||
cardApiSignature.setTimestamp(timestamp);
|
||||
cardApiSignature.setNonceStr(nonceStr);
|
||||
cardApiSignature.setSignature(signature);
|
||||
return cardApiSignature;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
package me.chanjar.weixin.mp.api.impl;
|
||||
|
||||
import java.text.Format;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang3.time.FastDateFormat;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.mp.api.WxMpDataCubeService;
|
||||
import me.chanjar.weixin.mp.api.WxMpService;
|
||||
@@ -12,12 +19,6 @@ import me.chanjar.weixin.mp.bean.datacube.WxDataCubeInterfaceResult;
|
||||
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult;
|
||||
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
|
||||
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by Binary Wang on 2016/8/23.
|
||||
@@ -27,6 +28,9 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
protected final Logger log = LoggerFactory.getLogger(WxMpDataCubeServiceImpl.class);
|
||||
|
||||
private static final String API_URL_PREFIX = "https://api.weixin.qq.com/datacube";
|
||||
|
||||
private final Format dateFormat = FastDateFormat.getInstance("yyyy-MM-dd");
|
||||
|
||||
private WxMpService wxMpService;
|
||||
|
||||
public WxMpDataCubeServiceImpl(WxMpService wxMpService) {
|
||||
@@ -37,104 +41,88 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
public List<WxDataCubeUserSummary> getUserSummary(Date beginDate, Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getusersummary";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeUserSummary>>() {
|
||||
}.getType());
|
||||
return WxDataCubeUserSummary.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxDataCubeUserCumulate> getUserCumulate(Date beginDate, Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getusercumulate";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeUserCumulate>>() {
|
||||
}.getType());
|
||||
return WxDataCubeUserCumulate.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxDataCubeArticleResult> getArticleSummary(Date beginDate, Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getarticlesummary";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeArticleResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeArticleResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxDataCubeArticleTotal> getArticleTotal(Date beginDate, Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getarticletotal";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeArticleTotal>>() {
|
||||
}.getType());
|
||||
return WxDataCubeArticleTotal.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxDataCubeArticleResult> getUserRead(Date beginDate, Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getuserread";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeArticleResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeArticleResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxDataCubeArticleResult> getUserReadHour(Date beginDate, Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getuserreadhour";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeArticleResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeArticleResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxDataCubeArticleResult> getUserShare(Date beginDate, Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getusershare";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeArticleResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeArticleResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxDataCubeArticleResult> getUserShareHour(Date beginDate, Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getusersharehour";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeArticleResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeArticleResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -142,13 +130,11 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getupstreammsg";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeMsgResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeMsgResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -156,13 +142,11 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getupstreammsghour";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeMsgResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeMsgResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -170,13 +154,11 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getupstreammsgweek";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeMsgResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeMsgResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -184,13 +166,11 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getupstreammsgmonth";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeMsgResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeMsgResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -198,13 +178,11 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getupstreammsgdist";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeMsgResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeMsgResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -212,13 +190,11 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getupstreammsgdistweek";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeMsgResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeMsgResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -226,13 +202,11 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getupstreammsgdistmonth";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeMsgResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeMsgResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -240,13 +214,11 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getinterfacesummary";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeInterfaceResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeInterfaceResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -254,12 +226,10 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService {
|
||||
Date endDate) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/getinterfacesummaryhour";
|
||||
JsonObject param = new JsonObject();
|
||||
param.addProperty("begin_date", WxMpService.SIMPLE_DATE_FORMAT.format(beginDate));
|
||||
param.addProperty("end_date", WxMpService.SIMPLE_DATE_FORMAT.format(endDate));
|
||||
param.addProperty("begin_date", this.dateFormat.format(beginDate));
|
||||
param.addProperty("end_date", this.dateFormat.format(endDate));
|
||||
String responseContent = this.wxMpService.post(url, param.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent);
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(new JsonParser().parse(responseContent).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeInterfaceResult>>() {
|
||||
}.getType());
|
||||
return WxDataCubeInterfaceResult.fromJson(responseContent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
package me.chanjar.weixin.mp.api.impl;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
|
||||
import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
|
||||
@@ -16,9 +13,12 @@ import me.chanjar.weixin.mp.api.WxMpService;
|
||||
import me.chanjar.weixin.mp.bean.WxMpGroup;
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by Binary Wang on 2016/7/21.
|
||||
*/
|
||||
@Deprecated
|
||||
public class WxMpGroupServiceImpl implements WxMpGroupService {
|
||||
private static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/groups";
|
||||
private WxMpService wxMpService;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,10 +12,38 @@ import me.chanjar.weixin.common.session.StandardSessionManager;
|
||||
import me.chanjar.weixin.common.session.WxSessionManager;
|
||||
import me.chanjar.weixin.common.util.RandomUtils;
|
||||
import me.chanjar.weixin.common.util.crypto.SHA1;
|
||||
import me.chanjar.weixin.common.util.http.*;
|
||||
import me.chanjar.weixin.mp.api.*;
|
||||
import me.chanjar.weixin.mp.bean.*;
|
||||
import me.chanjar.weixin.mp.bean.result.*;
|
||||
import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder;
|
||||
import me.chanjar.weixin.common.util.http.DefaultApacheHttpClientBuilder;
|
||||
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.mp.api.WxMpCardService;
|
||||
import me.chanjar.weixin.mp.api.WxMpConfigStorage;
|
||||
import me.chanjar.weixin.mp.api.WxMpDataCubeService;
|
||||
import me.chanjar.weixin.mp.api.WxMpGroupService;
|
||||
import me.chanjar.weixin.mp.api.WxMpKefuService;
|
||||
import me.chanjar.weixin.mp.api.WxMpMaterialService;
|
||||
import me.chanjar.weixin.mp.api.WxMpMenuService;
|
||||
import me.chanjar.weixin.mp.api.WxMpPayService;
|
||||
import me.chanjar.weixin.mp.api.WxMpQrcodeService;
|
||||
import me.chanjar.weixin.mp.api.WxMpService;
|
||||
import me.chanjar.weixin.mp.api.WxMpUserBlacklistService;
|
||||
import me.chanjar.weixin.mp.api.WxMpUserService;
|
||||
import me.chanjar.weixin.mp.api.WxMpUserTagService;
|
||||
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.WxMpSemanticQuery;
|
||||
import me.chanjar.weixin.mp.bean.WxMpTemplateMessage;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpUser;
|
||||
import org.apache.http.HttpHost;
|
||||
import org.apache.http.client.config.RequestConfig;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
@@ -28,7 +56,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
public class WxMpServiceImpl implements WxMpService {
|
||||
|
||||
@@ -46,8 +73,8 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
*/
|
||||
private final Object globalJsapiTicketRefreshLock = new Object();
|
||||
|
||||
private WxMpConfigStorage wxMpConfigStorage;
|
||||
|
||||
private WxMpConfigStorage configStorage;
|
||||
|
||||
private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this);
|
||||
|
||||
private WxMpMaterialService materialService = new WxMpMaterialServiceImpl(this);
|
||||
@@ -58,6 +85,8 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
|
||||
private WxMpGroupService groupService = new WxMpGroupServiceImpl(this);
|
||||
|
||||
private WxMpUserTagService tagService = new WxMpUserTagServiceImpl(this);
|
||||
|
||||
private WxMpQrcodeService qrCodeService = new WxMpQrcodeServiceImpl(this);
|
||||
|
||||
private WxMpCardService cardService = new WxMpCardServiceImpl(this);
|
||||
@@ -66,6 +95,8 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
|
||||
private WxMpDataCubeService dataCubeService = new WxMpDataCubeServiceImpl(this);
|
||||
|
||||
private WxMpUserBlacklistService blackListService = new WxMpUserBlacklistServiceImpl(this);
|
||||
|
||||
private CloseableHttpClient httpClient;
|
||||
|
||||
private HttpHost httpProxy;
|
||||
@@ -79,7 +110,8 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
@Override
|
||||
public boolean checkSignature(String timestamp, String nonce, String signature) {
|
||||
try {
|
||||
return SHA1.gen(this.wxMpConfigStorage.getToken(), timestamp, nonce).equals(signature);
|
||||
return SHA1.gen(this.configStorage.getToken(), timestamp, nonce)
|
||||
.equals(signature);
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
@@ -93,14 +125,14 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
@Override
|
||||
public String getAccessToken(boolean forceRefresh) throws WxErrorException {
|
||||
if (forceRefresh) {
|
||||
this.wxMpConfigStorage.expireAccessToken();
|
||||
this.configStorage.expireAccessToken();
|
||||
}
|
||||
if (this.wxMpConfigStorage.isAccessTokenExpired()) {
|
||||
if (this.configStorage.isAccessTokenExpired()) {
|
||||
synchronized (this.globalAccessTokenRefreshLock) {
|
||||
if (this.wxMpConfigStorage.isAccessTokenExpired()) {
|
||||
if (this.configStorage.isAccessTokenExpired()) {
|
||||
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
|
||||
"&appid=" + this.wxMpConfigStorage.getAppId() +
|
||||
"&secret=" + this.wxMpConfigStorage.getSecret();
|
||||
"&appid=" + this.configStorage.getAppId() + "&secret="
|
||||
+ this.configStorage.getSecret();
|
||||
try {
|
||||
HttpGet httpGet = new HttpGet(url);
|
||||
if (this.httpProxy != null) {
|
||||
@@ -114,7 +146,8 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
throw new WxErrorException(error);
|
||||
}
|
||||
WxAccessToken accessToken = WxAccessToken.fromJson(resultContent);
|
||||
this.wxMpConfigStorage.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
|
||||
this.configStorage.updateAccessToken(accessToken.getAccessToken(),
|
||||
accessToken.getExpiresIn());
|
||||
}finally {
|
||||
httpGet.releaseConnection();
|
||||
}
|
||||
@@ -124,7 +157,7 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
}
|
||||
}
|
||||
}
|
||||
return this.wxMpConfigStorage.getAccessToken();
|
||||
return this.configStorage.getAccessToken();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -135,23 +168,23 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
@Override
|
||||
public String getJsapiTicket(boolean forceRefresh) throws WxErrorException {
|
||||
if (forceRefresh) {
|
||||
this.wxMpConfigStorage.expireJsapiTicket();
|
||||
this.configStorage.expireJsapiTicket();
|
||||
}
|
||||
|
||||
if (this.wxMpConfigStorage.isJsapiTicketExpired()) {
|
||||
if (this.configStorage.isJsapiTicketExpired()) {
|
||||
synchronized (this.globalJsapiTicketRefreshLock) {
|
||||
if (this.wxMpConfigStorage.isJsapiTicketExpired()) {
|
||||
if (this.configStorage.isJsapiTicketExpired()) {
|
||||
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi";
|
||||
String responseContent = execute(new SimpleGetRequestExecutor(), url, null);
|
||||
JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
|
||||
JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
|
||||
String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
|
||||
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
|
||||
this.wxMpConfigStorage.updateJsapiTicket(jsapiTicket, expiresInSeconds);
|
||||
this.configStorage.updateJsapiTicket(jsapiTicket, expiresInSeconds);
|
||||
}
|
||||
}
|
||||
}
|
||||
return this.wxMpConfigStorage.getJsapiTicket();
|
||||
return this.configStorage.getJsapiTicket();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -159,29 +192,15 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
long timestamp = System.currentTimeMillis() / 1000;
|
||||
String noncestr = RandomUtils.getRandomStr();
|
||||
String jsapiTicket = getJsapiTicket(false);
|
||||
try {
|
||||
String signature = SHA1.genWithAmple(
|
||||
"jsapi_ticket=" + jsapiTicket,
|
||||
"noncestr=" + noncestr,
|
||||
"timestamp=" + timestamp,
|
||||
"url=" + url
|
||||
);
|
||||
WxJsapiSignature jsapiSignature = new WxJsapiSignature();
|
||||
jsapiSignature.setAppid(this.wxMpConfigStorage.getAppId());
|
||||
jsapiSignature.setTimestamp(timestamp);
|
||||
jsapiSignature.setNoncestr(noncestr);
|
||||
jsapiSignature.setUrl(url);
|
||||
jsapiSignature.setSignature(signature);
|
||||
return jsapiSignature;
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@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());
|
||||
String signature = SHA1.genWithAmple("jsapi_ticket=" + jsapiTicket,
|
||||
"noncestr=" + noncestr, "timestamp=" + timestamp, "url=" + url);
|
||||
WxJsapiSignature jsapiSignature = new WxJsapiSignature();
|
||||
jsapiSignature.setAppid(this.configStorage.getAppId());
|
||||
jsapiSignature.setTimestamp(timestamp);
|
||||
jsapiSignature.setNoncestr(noncestr);
|
||||
jsapiSignature.setUrl(url);
|
||||
jsapiSignature.setSignature(signature);
|
||||
return jsapiSignature;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -271,7 +290,7 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
public String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state) {
|
||||
StringBuilder url = new StringBuilder();
|
||||
url.append("https://open.weixin.qq.com/connect/oauth2/authorize?");
|
||||
url.append("appid=").append(this.wxMpConfigStorage.getAppId());
|
||||
url.append("appid=").append(this.configStorage.getAppId());
|
||||
url.append("&redirect_uri=").append(URIUtil.encodeURIComponent(redirectURI));
|
||||
url.append("&response_type=code");
|
||||
url.append("&scope=").append(scope);
|
||||
@@ -282,6 +301,23 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
return url.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String buildQrConnectUrl(String redirectURI, String scope,
|
||||
String state) {
|
||||
StringBuilder url = new StringBuilder();
|
||||
url.append("https://open.weixin.qq.com/connect/qrconnect?");
|
||||
url.append("appid=").append(this.configStorage.getAppId());
|
||||
url.append("&redirect_uri=").append(URIUtil.encodeURIComponent(redirectURI));
|
||||
url.append("&response_type=code");
|
||||
url.append("&scope=").append(scope);
|
||||
if (state != null) {
|
||||
url.append("&state=").append(state);
|
||||
}
|
||||
|
||||
url.append("#wechat_redirect");
|
||||
return url.toString();
|
||||
}
|
||||
|
||||
private WxMpOAuth2AccessToken getOAuth2AccessToken(StringBuilder url) throws WxErrorException {
|
||||
try {
|
||||
RequestExecutor<String, String> executor = new SimpleGetRequestExecutor();
|
||||
@@ -296,8 +332,8 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException {
|
||||
StringBuilder url = new StringBuilder();
|
||||
url.append("https://api.weixin.qq.com/sns/oauth2/access_token?");
|
||||
url.append("appid=").append(this.wxMpConfigStorage.getAppId());
|
||||
url.append("&secret=").append(this.wxMpConfigStorage.getSecret());
|
||||
url.append("appid=").append(this.configStorage.getAppId());
|
||||
url.append("&secret=").append(this.configStorage.getSecret());
|
||||
url.append("&code=").append(code);
|
||||
url.append("&grant_type=authorization_code");
|
||||
|
||||
@@ -308,7 +344,7 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
public WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException {
|
||||
StringBuilder url = new StringBuilder();
|
||||
url.append("https://api.weixin.qq.com/sns/oauth2/refresh_token?");
|
||||
url.append("appid=").append(this.wxMpConfigStorage.getAppId());
|
||||
url.append("appid=").append(this.configStorage.getAppId());
|
||||
url.append("&grant_type=refresh_token");
|
||||
url.append("&refresh_token=").append(refreshToken);
|
||||
|
||||
@@ -428,7 +464,7 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
*/
|
||||
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001) {
|
||||
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
|
||||
this.wxMpConfigStorage.expireAccessToken();
|
||||
this.configStorage.expireAccessToken();
|
||||
return execute(executor, uri, data);
|
||||
}
|
||||
if (error.getErrorCode() != 0) {
|
||||
@@ -439,7 +475,7 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public HttpHost getHttpProxy() {
|
||||
return this.httpProxy;
|
||||
}
|
||||
@@ -450,33 +486,39 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
|
||||
@Override
|
||||
public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) {
|
||||
this.wxMpConfigStorage = wxConfigProvider;
|
||||
this.configStorage = wxConfigProvider;
|
||||
this.initHttpClient();
|
||||
}
|
||||
|
||||
private void initHttpClient() {
|
||||
ApacheHttpClientBuilder apacheHttpClientBuilder = this.wxMpConfigStorage.getApacheHttpClientBuilder();
|
||||
ApacheHttpClientBuilder apacheHttpClientBuilder = this.configStorage
|
||||
.getApacheHttpClientBuilder();
|
||||
if (null == apacheHttpClientBuilder) {
|
||||
apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get();
|
||||
}
|
||||
|
||||
apacheHttpClientBuilder.httpProxyHost(this.wxMpConfigStorage.getHttpProxyHost())
|
||||
.httpProxyPort(this.wxMpConfigStorage.getHttpProxyPort())
|
||||
.httpProxyUsername(this.wxMpConfigStorage.getHttpProxyUsername())
|
||||
.httpProxyPassword(this.wxMpConfigStorage.getHttpProxyPassword());
|
||||
|
||||
if (this.wxMpConfigStorage.getSSLContext() != null){
|
||||
apacheHttpClientBuilder.httpProxyHost(this.configStorage.getHttpProxyHost())
|
||||
.httpProxyPort(this.configStorage.getHttpProxyPort())
|
||||
.httpProxyUsername(this.configStorage.getHttpProxyUsername())
|
||||
.httpProxyPassword(this.configStorage.getHttpProxyPassword());
|
||||
|
||||
if (this.configStorage.getSSLContext() != null) {
|
||||
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
|
||||
this.wxMpConfigStorage.getSSLContext(), new String[] { "TLSv1" }, null, new DefaultHostnameVerifier());
|
||||
this.configStorage.getSSLContext(), new String[] { "TLSv1" }, null,
|
||||
new DefaultHostnameVerifier());
|
||||
apacheHttpClientBuilder.sslConnectionSocketFactory(sslsf);
|
||||
}
|
||||
|
||||
if (this.configStorage.getHttpProxyHost() != null && this.configStorage.getHttpProxyPort() > 0) {
|
||||
this.httpProxy = new HttpHost(this.configStorage.getHttpProxyHost(), this.configStorage.getHttpProxyPort());
|
||||
}
|
||||
|
||||
this.httpClient = apacheHttpClientBuilder.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMpConfigStorage getWxMpConfigStorage() {
|
||||
return this.wxMpConfigStorage;
|
||||
return this.configStorage;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -514,6 +556,11 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
return this.groupService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMpUserTagService getUserTagService() {
|
||||
return this.tagService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMpQrcodeService getQrcodeService() {
|
||||
return this.qrCodeService;
|
||||
@@ -534,4 +581,9 @@ public class WxMpServiceImpl implements WxMpService {
|
||||
return this.dataCubeService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMpUserBlacklistService getBlackListService() {
|
||||
return this.blackListService;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package me.chanjar.weixin.mp.api.impl;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonObject;
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
|
||||
import me.chanjar.weixin.mp.api.WxMpService;
|
||||
import me.chanjar.weixin.mp.api.WxMpUserBlacklistService;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpUserBlacklistGetResult;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author miller
|
||||
*/
|
||||
public class WxMpUserBlacklistServiceImpl implements WxMpUserBlacklistService {
|
||||
private static final String API_BLACKLIST_PREFIX = "https://api.weixin.qq.com/cgi-bin/tags/members";
|
||||
private WxMpService wxMpService;
|
||||
|
||||
public WxMpUserBlacklistServiceImpl(WxMpService wxMpService) {
|
||||
this.wxMpService = wxMpService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMpUserBlacklistGetResult getBlacklist(String nextOpenid) throws WxErrorException {
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
jsonObject.addProperty("begin_openid", nextOpenid);
|
||||
String url = API_BLACKLIST_PREFIX + "/getblacklist";
|
||||
String responseContent = this.wxMpService.execute(new SimplePostRequestExecutor(), url, jsonObject.toString());
|
||||
return WxMpUserBlacklistGetResult.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pushToBlacklist(List<String> openidList) throws WxErrorException {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("openid_list", openidList);
|
||||
String url = API_BLACKLIST_PREFIX + "/batchblacklist";
|
||||
this.wxMpService.execute(new SimplePostRequestExecutor(), url, new Gson().toJson(map));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pullFromBlacklist(List<String> openidList) throws WxErrorException {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("openid_list", openidList);
|
||||
String url = API_BLACKLIST_PREFIX + "/batchunblacklist";
|
||||
this.wxMpService.execute(new SimplePostRequestExecutor(), url, new Gson().toJson(map));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
package me.chanjar.weixin.mp.api.impl;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
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.exception.WxErrorException;
|
||||
import me.chanjar.weixin.mp.api.WxMpService;
|
||||
import me.chanjar.weixin.mp.api.WxMpUserTagService;
|
||||
import me.chanjar.weixin.mp.bean.tag.WxUserTag;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author binarywang(https://github.com/binarywang)
|
||||
* Created by Binary Wang on 2016/9/2.
|
||||
*/
|
||||
public class WxMpUserTagServiceImpl implements WxMpUserTagService {
|
||||
protected final Logger log = LoggerFactory
|
||||
.getLogger(WxMpDataCubeServiceImpl.class);
|
||||
private static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/tags";
|
||||
|
||||
private WxMpService wxMpService;
|
||||
|
||||
public WxMpUserTagServiceImpl(WxMpService wxMpService) {
|
||||
this.wxMpService = wxMpService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxUserTag tagCreate(String name) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/create";
|
||||
JsonObject json = new JsonObject();
|
||||
JsonObject tagJson = new JsonObject();
|
||||
tagJson.addProperty("name", name);
|
||||
json.add("tag", tagJson);
|
||||
|
||||
String responseContent = this.wxMpService.post(url, json.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(),
|
||||
responseContent);
|
||||
return WxUserTag.fromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxUserTag> tagGet() throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/get";
|
||||
|
||||
String responseContent = this.wxMpService.get(url, null);
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, "[empty]",
|
||||
responseContent);
|
||||
return WxUserTag.listFromJson(responseContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean tagUpdate(Integer id, String name) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/update";
|
||||
|
||||
JsonObject json = new JsonObject();
|
||||
JsonObject tagJson = new JsonObject();
|
||||
tagJson.addProperty("id", id);
|
||||
tagJson.addProperty("name", name);
|
||||
json.add("tag", tagJson);
|
||||
|
||||
String responseContent = this.wxMpService.post(url, json.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(), responseContent);
|
||||
WxError wxError = WxError.fromJson(responseContent);
|
||||
if (wxError.getErrorCode() == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
throw new WxErrorException(wxError);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean tagDelete(Integer id) throws WxErrorException {
|
||||
String url = API_URL_PREFIX + "/delete";
|
||||
|
||||
JsonObject json = new JsonObject();
|
||||
JsonObject tagJson = new JsonObject();
|
||||
tagJson.addProperty("id", id);
|
||||
json.add("tag", tagJson);
|
||||
|
||||
String responseContent = this.wxMpService.post(url, json.toString());
|
||||
this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(),
|
||||
responseContent);
|
||||
WxError wxError = WxError.fromJson(responseContent);
|
||||
if (wxError.getErrorCode() == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
throw new WxErrorException(wxError);
|
||||
}
|
||||
}
|
||||
@@ -6,8 +6,6 @@ import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import me.chanjar.weixin.mp.util.json.WxLongTimeJsonSerializer;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
@@ -49,7 +47,6 @@ public class WxMpXmlMessage implements Serializable {
|
||||
private String fromUserName;
|
||||
|
||||
@XStreamAlias("CreateTime")
|
||||
@JsonSerialize(using = WxLongTimeJsonSerializer.class)
|
||||
private Long createTime;
|
||||
|
||||
@XStreamAlias("MsgType")
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
package me.chanjar.weixin.mp.bean.datacube;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
|
||||
/**
|
||||
* 图文分析数据接口返回结果对象
|
||||
@@ -9,6 +15,8 @@ import com.google.gson.annotations.SerializedName;
|
||||
*/
|
||||
public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
|
||||
|
||||
private static final JsonParser JSON_PARSER = new JsonParser();
|
||||
|
||||
/**
|
||||
* ref_hour
|
||||
* 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
|
||||
@@ -203,5 +211,11 @@ public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
|
||||
public void setUserSource(Integer userSource) {
|
||||
this.userSource = userSource;
|
||||
}
|
||||
|
||||
|
||||
public static List<WxDataCubeArticleResult> fromJson(String json) {
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(
|
||||
JSON_PARSER.parse(json).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeArticleResult>>() {
|
||||
}.getType());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
package me.chanjar.weixin.mp.bean.datacube;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
|
||||
/**
|
||||
* 图文分析数据接口返回结果对象
|
||||
* @author binarywang(https://github.com/binarywang)
|
||||
@@ -11,6 +15,8 @@ import java.util.List;
|
||||
*/
|
||||
public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
|
||||
|
||||
private static final JsonParser JSON_PARSER = new JsonParser();
|
||||
|
||||
/**
|
||||
* msgid
|
||||
* 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个
|
||||
@@ -55,5 +61,11 @@ public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
|
||||
public void setDetails(List<WxDataCubeArticleTotalDetail> details) {
|
||||
this.details = details;
|
||||
}
|
||||
|
||||
|
||||
public static List<WxDataCubeArticleTotal> fromJson(String json) {
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(
|
||||
JSON_PARSER.parse(json).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeArticleTotal>>() {
|
||||
}.getType());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
package me.chanjar.weixin.mp.bean.datacube;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
|
||||
/**
|
||||
* 接口分析数据接口返回结果对象
|
||||
@@ -9,6 +15,8 @@ import com.google.gson.annotations.SerializedName;
|
||||
*/
|
||||
public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult {
|
||||
|
||||
private static final JsonParser JSON_PARSER = new JsonParser();
|
||||
|
||||
/**
|
||||
* ref_hour
|
||||
* 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
|
||||
@@ -83,5 +91,12 @@ public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult {
|
||||
public void setMaxTimeCost(Integer maxTimeCost) {
|
||||
this.maxTimeCost = maxTimeCost;
|
||||
}
|
||||
|
||||
public static List<WxDataCubeInterfaceResult> fromJson(String json) {
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(
|
||||
JSON_PARSER.parse(json).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeInterfaceResult>>() {
|
||||
}.getType());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
package me.chanjar.weixin.mp.bean.datacube;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
|
||||
/**
|
||||
* 消息分析数据接口返回结果对象
|
||||
@@ -9,6 +15,8 @@ import com.google.gson.annotations.SerializedName;
|
||||
*/
|
||||
public class WxDataCubeMsgResult extends WxDataCubeBaseResult {
|
||||
|
||||
private static final JsonParser JSON_PARSER = new JsonParser();
|
||||
|
||||
/**
|
||||
* ref_hour
|
||||
* 数据的小时,包括从000到2300,分别代表的是[000,100)到[2300,2400),即每日的第1小时和最后1小时
|
||||
@@ -114,4 +122,11 @@ public class WxDataCubeMsgResult extends WxDataCubeBaseResult {
|
||||
this.oriPageReadUser = oriPageReadUser;
|
||||
}
|
||||
|
||||
public static List<WxDataCubeMsgResult> fromJson(String json) {
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(
|
||||
JSON_PARSER.parse(json).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeMsgResult>>() {
|
||||
}.getType());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,19 +1,27 @@
|
||||
package me.chanjar.weixin.mp.bean.datacube;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 累计用户数据接口的返回JSON数据包
|
||||
* http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
|
||||
* 详情查看文档:<a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141082&token=&lang=zh_CN">用户分析数据接口</a>
|
||||
* </pre>
|
||||
*/
|
||||
public class WxDataCubeUserCumulate implements Serializable {
|
||||
|
||||
private static final JsonParser JSON_PARSER = new JsonParser();
|
||||
|
||||
private static final long serialVersionUID = -3570981300225093657L;
|
||||
|
||||
private Date refDate;
|
||||
@@ -40,4 +48,11 @@ public class WxDataCubeUserCumulate implements Serializable {
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
|
||||
}
|
||||
|
||||
public static List<WxDataCubeUserCumulate> fromJson(String json) {
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(
|
||||
JSON_PARSER.parse(json).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeUserCumulate>>() {
|
||||
}.getType());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,28 @@
|
||||
package me.chanjar.weixin.mp.bean.datacube;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 用户增减数据接口的返回JSON数据包
|
||||
* http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
|
||||
* 详情查看文档:<a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141082&token=&lang=zh_CN">用户分析数据接口</a>
|
||||
* </pre>
|
||||
*/
|
||||
public class WxDataCubeUserSummary implements Serializable {
|
||||
private static final long serialVersionUID = -2336654489906694173L;
|
||||
|
||||
private static final JsonParser JSON_PARSER = new JsonParser();
|
||||
|
||||
private Date refDate;
|
||||
|
||||
private Integer userSource;
|
||||
@@ -59,4 +67,11 @@ public class WxDataCubeUserSummary implements Serializable {
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
|
||||
}
|
||||
|
||||
public static List<WxDataCubeUserSummary> fromJson(String json) {
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(
|
||||
JSON_PARSER.parse(json).getAsJsonObject().get("list"),
|
||||
new TypeToken<List<WxDataCubeUserSummary>>() {
|
||||
}.getType());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
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;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
/**
|
||||
* Created by Binary Wang on 2016/7/18.
|
||||
*/
|
||||
@@ -38,7 +37,6 @@ public class WxMpKfMsgRecord {
|
||||
* time 操作时间,unix时间戳
|
||||
*/
|
||||
@SerializedName("time")
|
||||
@JsonSerialize(using = WxLongTimeJsonSerializer.class)
|
||||
private Long time;
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
package me.chanjar.weixin.mp.bean.result;
|
||||
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author miller
|
||||
*/
|
||||
public class WxMpUserBlacklistGetResult {
|
||||
protected int total = -1;
|
||||
protected int count = -1;
|
||||
protected List<String> openidList = new ArrayList<>();
|
||||
protected String nextOpenid;
|
||||
|
||||
public static WxMpUserBlacklistGetResult fromJson(String json) {
|
||||
return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpUserBlacklistGetResult.class);
|
||||
}
|
||||
|
||||
public int getTotal() {
|
||||
return this.total;
|
||||
}
|
||||
|
||||
public void setTotal(int total) {
|
||||
this.total = total;
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
return this.count;
|
||||
}
|
||||
|
||||
public void setCount(int count) {
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
public List<String> getOpenidList() {
|
||||
return this.openidList;
|
||||
}
|
||||
|
||||
public void setOpenidList(List<String> openidList) {
|
||||
this.openidList = openidList;
|
||||
}
|
||||
|
||||
public String getNextOpenid() {
|
||||
return this.nextOpenid;
|
||||
}
|
||||
|
||||
public void setNextOpenid(String nextOpenid) {
|
||||
this.nextOpenid = nextOpenid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxMpGsonBuilder.INSTANCE.create().toJson(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package me.chanjar.weixin.mp.bean.tag;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
|
||||
|
||||
/**
|
||||
* 用户标签对象
|
||||
* @author binarywang(https://github.com/binarywang)
|
||||
* Created by Binary Wang on 2016/9/2.
|
||||
*/
|
||||
public class WxUserTag {
|
||||
/**
|
||||
* id 标签id,由微信分配
|
||||
*/
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* name 标签名,UTF8编码
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* count 此标签下粉丝数
|
||||
*/
|
||||
private Integer count;
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Integer getCount() {
|
||||
return this.count;
|
||||
}
|
||||
|
||||
public void setCount(Integer count) {
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public static WxUserTag fromJson(String json) {
|
||||
return WxMpGsonBuilder.create().fromJson(
|
||||
new JsonParser().parse(json).getAsJsonObject().get("tag"),
|
||||
WxUserTag.class);
|
||||
}
|
||||
|
||||
public static List<WxUserTag> listFromJson(String json) {
|
||||
return WxMpGsonBuilder.create().fromJson(
|
||||
new JsonParser().parse(json).getAsJsonObject().get("tags"),
|
||||
new TypeToken<List<WxUserTag>>(){}.getType());
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
return WxMpGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package me.chanjar.weixin.mp.util.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
|
||||
/**
|
||||
* Created by Binary Wang on 2016/7/13.
|
||||
*/
|
||||
public class WxLongTimeJsonSerializer extends JsonSerializer<Long> {
|
||||
private static SimpleDateFormat DF = new SimpleDateFormat(
|
||||
"yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
@Override
|
||||
public void serialize(Long value, JsonGenerator gen,
|
||||
SerializerProvider serializers)
|
||||
throws IOException {
|
||||
gen.writeString(DF.format(value * 1000));
|
||||
}
|
||||
}
|
||||
@@ -45,6 +45,7 @@ public class WxMpGsonBuilder {
|
||||
INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter());
|
||||
INSTANCE.registerTypeAdapter(WxMediaImgUploadResult.class, new WxMediaImgUploadResultGsonAdapter());
|
||||
INSTANCE.registerTypeAdapter(WxMpIndustry.class, new WxMpIndustryGsonAdapter());
|
||||
INSTANCE.registerTypeAdapter(WxMpUserBlacklistGetResult.class, new WxUserBlacklistGetResultGsonAdapter());
|
||||
}
|
||||
|
||||
public static Gson create() {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package me.chanjar.weixin.mp.util.json;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
import com.google.gson.JsonDeserializationContext;
|
||||
import com.google.gson.JsonDeserializer;
|
||||
import com.google.gson.JsonElement;
|
||||
@@ -7,38 +9,43 @@ import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParseException;
|
||||
import com.google.gson.JsonSerializationContext;
|
||||
import com.google.gson.JsonSerializer;
|
||||
|
||||
import me.chanjar.weixin.common.util.json.GsonHelper;
|
||||
import me.chanjar.weixin.mp.bean.Industry;
|
||||
import me.chanjar.weixin.mp.bean.WxMpIndustry;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
/**
|
||||
* @author miller
|
||||
*/
|
||||
public class WxMpIndustryGsonAdapter implements JsonSerializer<WxMpIndustry>, JsonDeserializer<WxMpIndustry> {
|
||||
@Override
|
||||
public JsonElement serialize(WxMpIndustry wxMpIndustry, Type type, JsonSerializationContext jsonSerializationContext) {
|
||||
JsonObject json = new JsonObject();
|
||||
json.addProperty("industry_id1", wxMpIndustry.getPrimaryIndustry().getId());
|
||||
json.addProperty("industry_id2", wxMpIndustry.getSecondIndustry().getId());
|
||||
return json;
|
||||
}
|
||||
public class WxMpIndustryGsonAdapter
|
||||
implements JsonSerializer<WxMpIndustry>, JsonDeserializer<WxMpIndustry> {
|
||||
@Override
|
||||
public JsonElement serialize(WxMpIndustry wxMpIndustry, Type type,
|
||||
JsonSerializationContext jsonSerializationContext) {
|
||||
JsonObject json = new JsonObject();
|
||||
json.addProperty("industry_id1", wxMpIndustry.getPrimaryIndustry().getId());
|
||||
json.addProperty("industry_id2", wxMpIndustry.getSecondIndustry().getId());
|
||||
return json;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMpIndustry deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
|
||||
WxMpIndustry wxMpIndustry = new WxMpIndustry();
|
||||
JsonObject primaryIndustry = jsonElement.getAsJsonObject().get("primary_industry").getAsJsonObject();
|
||||
wxMpIndustry.setPrimaryIndustry(convertFromJson(primaryIndustry));
|
||||
JsonObject secondaryIndustry = jsonElement.getAsJsonObject().get("secondary_industry").getAsJsonObject();
|
||||
wxMpIndustry.setSecondIndustry(convertFromJson(secondaryIndustry));
|
||||
return wxMpIndustry;
|
||||
}
|
||||
@Override
|
||||
public WxMpIndustry deserialize(JsonElement jsonElement, Type type,
|
||||
JsonDeserializationContext jsonDeserializationContext)
|
||||
throws JsonParseException {
|
||||
WxMpIndustry wxMpIndustry = new WxMpIndustry();
|
||||
JsonObject primaryIndustry = jsonElement.getAsJsonObject()
|
||||
.get("primary_industry").getAsJsonObject();
|
||||
wxMpIndustry.setPrimaryIndustry(convertFromJson(primaryIndustry));
|
||||
JsonObject secondaryIndustry = jsonElement.getAsJsonObject()
|
||||
.get("secondary_industry").getAsJsonObject();
|
||||
wxMpIndustry.setSecondIndustry(convertFromJson(secondaryIndustry));
|
||||
return wxMpIndustry;
|
||||
}
|
||||
|
||||
private Industry convertFromJson(JsonObject json) {
|
||||
Industry industry = new Industry();
|
||||
industry.setFirstClass(GsonHelper.getString(json, "first_class"));
|
||||
industry.setSecondClass(GsonHelper.getString(json, "second_class"));
|
||||
return industry;
|
||||
}
|
||||
private static Industry convertFromJson(JsonObject json) {
|
||||
Industry industry = new Industry();
|
||||
industry.setFirstClass(GsonHelper.getString(json, "first_class"));
|
||||
industry.setSecondClass(GsonHelper.getString(json, "second_class"));
|
||||
return industry;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,13 +8,19 @@
|
||||
*/
|
||||
package me.chanjar.weixin.mp.util.json;
|
||||
|
||||
import com.google.gson.*;
|
||||
import me.chanjar.weixin.common.util.json.GsonHelper;
|
||||
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
import org.apache.commons.lang3.time.FastDateFormat;
|
||||
|
||||
import com.google.gson.JsonDeserializationContext;
|
||||
import com.google.gson.JsonDeserializer;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParseException;
|
||||
|
||||
import me.chanjar.weixin.common.util.json.GsonHelper;
|
||||
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -23,7 +29,8 @@ import java.text.SimpleDateFormat;
|
||||
*/
|
||||
public class WxMpUserCumulateGsonAdapter implements JsonDeserializer<WxDataCubeUserCumulate> {
|
||||
|
||||
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
|
||||
private static final FastDateFormat DATE_FORMAT = FastDateFormat
|
||||
.getInstance("yyyy-MM-dd");
|
||||
|
||||
@Override
|
||||
public WxDataCubeUserCumulate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
|
||||
@@ -33,7 +40,7 @@ public class WxMpUserCumulateGsonAdapter implements JsonDeserializer<WxDataCubeU
|
||||
try {
|
||||
String refDate = GsonHelper.getString(summaryJsonObject, "ref_date");
|
||||
if (refDate != null) {
|
||||
cumulate.setRefDate(SIMPLE_DATE_FORMAT.parse(refDate));
|
||||
cumulate.setRefDate(DATE_FORMAT.parse(refDate));
|
||||
}
|
||||
cumulate.setCumulateUser(GsonHelper.getInteger(summaryJsonObject, "cumulate_user"));
|
||||
} catch (ParseException e) {
|
||||
|
||||
@@ -8,20 +8,27 @@
|
||||
*/
|
||||
package me.chanjar.weixin.mp.util.json;
|
||||
|
||||
import com.google.gson.*;
|
||||
import me.chanjar.weixin.common.util.json.GsonHelper;
|
||||
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
import org.apache.commons.lang3.time.FastDateFormat;
|
||||
|
||||
import com.google.gson.JsonDeserializationContext;
|
||||
import com.google.gson.JsonDeserializer;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParseException;
|
||||
|
||||
import me.chanjar.weixin.common.util.json.GsonHelper;
|
||||
import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
|
||||
|
||||
/**
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
public class WxMpUserSummaryGsonAdapter implements JsonDeserializer<WxDataCubeUserSummary> {
|
||||
|
||||
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
|
||||
private static final FastDateFormat DATE_FORMAT = FastDateFormat
|
||||
.getInstance("yyyy-MM-dd");
|
||||
|
||||
@Override
|
||||
public WxDataCubeUserSummary deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
||||
@@ -32,7 +39,7 @@ public class WxMpUserSummaryGsonAdapter implements JsonDeserializer<WxDataCubeUs
|
||||
try {
|
||||
String refDate = GsonHelper.getString(summaryJsonObject, "ref_date");
|
||||
if (refDate != null) {
|
||||
summary.setRefDate(SIMPLE_DATE_FORMAT.parse(refDate));
|
||||
summary.setRefDate(DATE_FORMAT.parse(refDate));
|
||||
}
|
||||
summary.setUserSource(GsonHelper.getInteger(summaryJsonObject, "user_source"));
|
||||
summary.setNewUser(GsonHelper.getInteger(summaryJsonObject, "new_user"));
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package me.chanjar.weixin.mp.util.json;
|
||||
|
||||
import com.google.gson.*;
|
||||
import me.chanjar.weixin.common.util.json.GsonHelper;
|
||||
import me.chanjar.weixin.mp.bean.result.WxMpUserBlacklistGetResult;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
/**
|
||||
* @author miller
|
||||
*/
|
||||
public class WxUserBlacklistGetResultGsonAdapter implements JsonDeserializer<WxMpUserBlacklistGetResult> {
|
||||
@Override
|
||||
public WxMpUserBlacklistGetResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
|
||||
JsonObject o = json.getAsJsonObject();
|
||||
WxMpUserBlacklistGetResult wxMpUserBlacklistGetResult = new WxMpUserBlacklistGetResult();
|
||||
wxMpUserBlacklistGetResult.setTotal(GsonHelper.getInteger(o, "total"));
|
||||
wxMpUserBlacklistGetResult.setCount(GsonHelper.getInteger(o, "count"));
|
||||
wxMpUserBlacklistGetResult.setNextOpenid(GsonHelper.getString(o, "next_openid"));
|
||||
if (o.get("data") != null && !o.get("data").isJsonNull() && !o.get("data").getAsJsonObject().get("openid").isJsonNull()) {
|
||||
JsonArray data = o.get("data").getAsJsonObject().get("openid").getAsJsonArray();
|
||||
for (int i = 0; i < data.size(); i++) {
|
||||
wxMpUserBlacklistGetResult.getOpenidList().add(GsonHelper.getAsString(data.get(i)));
|
||||
}
|
||||
}
|
||||
return wxMpUserBlacklistGetResult;
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,25 @@
|
||||
package me.chanjar.weixin.mp.util.xml;
|
||||
|
||||
import com.thoughtworks.xstream.XStream;
|
||||
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
|
||||
import me.chanjar.weixin.mp.bean.*;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.thoughtworks.xstream.XStream;
|
||||
|
||||
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutImageMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutMusicMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutNewsMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutTextMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutTransferCustomerServiceMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutVideoMessage;
|
||||
import me.chanjar.weixin.mp.bean.WxMpXmlOutVoiceMessage;
|
||||
|
||||
public class XStreamTransformer {
|
||||
|
||||
protected static final Map<Class, XStream> CLASS_2_XSTREAM_INSTANCE = configXStreamInstance();
|
||||
protected static final Map<Class<?>, XStream> CLASS_2_XSTREAM_INSTANCE = configXStreamInstance();
|
||||
|
||||
/**
|
||||
* xml -> pojo
|
||||
@@ -32,7 +41,7 @@ public class XStreamTransformer {
|
||||
* @param clz 类型
|
||||
* @param xStream xml解析器
|
||||
*/
|
||||
public static void register(Class clz,XStream xStream){
|
||||
public static void register(Class<?> clz, XStream xStream) {
|
||||
CLASS_2_XSTREAM_INSTANCE.put(clz,xStream);
|
||||
}
|
||||
|
||||
@@ -44,8 +53,8 @@ public class XStreamTransformer {
|
||||
return CLASS_2_XSTREAM_INSTANCE.get(clazz).toXML(object);
|
||||
}
|
||||
|
||||
private static Map<Class, XStream> configXStreamInstance() {
|
||||
Map<Class, XStream> map = new HashMap<>();
|
||||
private static Map<Class<?>, XStream> configXStreamInstance() {
|
||||
Map<Class<?>, XStream> map = new HashMap<>();
|
||||
map.put(WxMpXmlMessage.class, config_WxMpXmlMessage());
|
||||
map.put(WxMpXmlOutMusicMessage.class, config_WxMpXmlOutMusicMessage());
|
||||
map.put(WxMpXmlOutNewsMessage.class, config_WxMpXmlOutNewsMessage());
|
||||
|
||||
Reference in New Issue
Block a user