* 验证推送过来的消息的正确性
@@ -74,14 +81,6 @@ public interface WxMpService {
*/
WxJsapiSignature createJsapiSignature(String url) throws WxErrorException;
- /**
- *
- * 发送客服消息
- * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=发送客服消息
- *
- */
- void customMessageSend(WxMpCustomMessage message) throws WxErrorException;
-
/**
*
* 上传群发用的图文消息,上传后才能群发图文消息
@@ -152,6 +151,20 @@ public interface WxMpService {
*/
WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) throws WxErrorException;
+ /**
+ *
+ * 构造第三方使用网站应用授权登录的url
+ * 详情请见: 网站应用微信登录开发指南
+ * URL格式为:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
+ *
+ *
+ * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode
+ * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
+ * @param state 非必填,用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
+ * @return url
+ */
+ String buildQrConnectUrl(String redirectURI, String scope, String state);
+
/**
*
* 构造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();
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserBlacklistService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserBlacklistService.java
new file mode 100644
index 00000000..d93384f0
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserBlacklistService.java
@@ -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 {
+ /**
+ *
+ * 获取公众号的黑名单列表
+ * 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
+ *
+ */
+ WxMpUserBlacklistGetResult getBlacklist(String nextOpenid) throws WxErrorException;
+
+ /**
+ *
+ * 拉黑用户
+ * 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
+ *
+ */
+ void pushToBlacklist(List openidList) throws WxErrorException;
+
+ /**
+ *
+ * 取消拉黑用户
+ * 详情请见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1471422259_pJMWA&token=&lang=zh_CN
+ *
+ */
+ void pullFromBlacklist(List openidList) throws WxErrorException;
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java
new file mode 100644
index 00000000..bcf657fa
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java
@@ -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 {
+
+ /**
+ *
+ * 创建标签
+ * 一个公众号,最多可以创建100个标签。
+ * 详情请见:用户标签管理
+ * 接口url格式: https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN
+ *
+ *
+ * @param name 标签名字(30个字符以内)
+ */
+ WxUserTag tagCreate(String name) throws WxErrorException;
+
+ /**
+ *
+ * 获取公众号已创建的标签
+ * 详情请见:用户标签管理
+ * 接口url格式: https://api.weixin.qq.com/cgi-bin/tags/get?access_token=ACCESS_TOKEN
+ *
+ *
+ */
+ List tagGet() throws WxErrorException;
+
+ /**
+ *
+ * 编辑标签
+ * 详情请见:用户标签管理
+ * 接口url格式: https://api.weixin.qq.com/cgi-bin/tags/update?access_token=ACCESS_TOKEN
+ *
+ *
+ */
+ Boolean tagUpdate(Integer id, String name) throws WxErrorException;
+
+ /**
+ *
+ * 删除标签
+ * 详情请见:用户标签管理
+ * 接口url格式: https://api.weixin.qq.com/cgi-bin/tags/delete?access_token=ACCESS_TOKEN
+ *
+ *
+ */
+ Boolean tagDelete(Integer id) throws WxErrorException;
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
index b65d1ff4..63e13809 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
@@ -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;
}
/**
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
index 092d6af1..b82b7eaa 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java
@@ -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 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>() {
- }.getType());
+ return WxDataCubeUserSummary.fromJson(responseContent);
}
@Override
public List 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>() {
- }.getType());
+ return WxDataCubeUserCumulate.fromJson(responseContent);
}
@Override
public List 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>() {
- }.getType());
+ return WxDataCubeArticleResult.fromJson(responseContent);
}
@Override
public List 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>() {
- }.getType());
+ return WxDataCubeArticleTotal.fromJson(responseContent);
}
@Override
public List 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>() {
- }.getType());
+ return WxDataCubeArticleResult.fromJson(responseContent);
}
@Override
public List 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>() {
- }.getType());
+ return WxDataCubeArticleResult.fromJson(responseContent);
}
@Override
public List 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>() {
- }.getType());
+ return WxDataCubeArticleResult.fromJson(responseContent);
}
@Override
public List 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>() {
- }.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>() {
- }.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>() {
- }.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>() {
- }.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>() {
- }.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>() {
- }.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>() {
- }.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>() {
- }.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>() {
- }.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>() {
- }.getType());
+ return WxDataCubeInterfaceResult.fromJson(responseContent);
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java
index 5f97a83a..bfceff61 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java
@@ -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;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java
index 6d6cf14c..b65fdeaa 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java
@@ -3,15 +3,18 @@ package me.chanjar.weixin.mp.api.impl;
import java.io.File;
import java.util.Date;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.google.gson.JsonObject;
import me.chanjar.weixin.common.bean.result.WxError;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
-import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
-import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
import me.chanjar.weixin.mp.api.WxMpKefuService;
import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfSessionRequest;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList;
@@ -27,6 +30,8 @@ import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionWaitCaseList;
*
*/
public class WxMpKefuServiceImpl implements WxMpKefuService {
+ protected final Logger log = LoggerFactory
+ .getLogger(WxMpKefuServiceImpl.class);
private static final String API_URL_PREFIX = "https://api.weixin.qq.com/customservice";
private WxMpService wxMpService;
@@ -34,19 +39,31 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
this.wxMpService = wxMpService;
}
+ @Override
+ public boolean customMessageSend(WxMpCustomMessage message)
+ throws WxErrorException {
+ String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
+ String responseContent = this.wxMpService.post(url, message.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, message.toJson(),
+ responseContent);
+ return true;
+ }
+
@Override
public WxMpKfList kfList() throws WxErrorException {
- String url = "https://api.weixin.qq.com/cgi-bin/customservice/getkflist";
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String url = API_URL_PREFIX + "/getkflist";
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfList.fromJson(responseContent);
}
@Override
public WxMpKfOnlineList kfOnlineList() throws WxErrorException {
- String url = "https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist";
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String url = API_URL_PREFIX + "/getonlinekflist";
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfOnlineList.fromJson(responseContent);
}
@@ -54,8 +71,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfAccountAdd(WxMpKfAccountRequest request)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/add";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@@ -63,16 +81,18 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfAccountUpdate(WxMpKfAccountRequest request)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/update";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@Override
public boolean kfAccountInviteWorker(WxMpKfAccountRequest request) throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/inviteworker";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@@ -80,14 +100,20 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public boolean kfAccountUploadHeadImg(String kfAccount, File imgFile)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/uploadheadimg?kf_account=" + kfAccount;
- this.wxMpService.execute(new MediaUploadRequestExecutor(), url, imgFile);
+ WxMediaUploadResult responseContent = this.wxMpService
+ .execute(new MediaUploadRequestExecutor(), url, imgFile);
+ this.log.debug("\nurl:{}\nparams:{}&file:{}\nresponse:{}", url, kfAccount,
+ imgFile.getAbsolutePath(),
+ responseContent);
return true;
}
@Override
public boolean kfAccountDel(String kfAccount) throws WxErrorException {
String url = API_URL_PREFIX + "/kfaccount/del?kf_account=" + kfAccount;
- this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null);
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return true;
}
@@ -96,8 +122,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
throws WxErrorException {
WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid);
String url = API_URL_PREFIX + "/kfsession/create";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@@ -106,8 +133,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
throws WxErrorException {
WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid);
String url = API_URL_PREFIX + "/kfsession/close";
- this.wxMpService.execute(new SimplePostRequestExecutor(), url,
- request.toJson());
+ String responseContent = this.wxMpService.post(url, request.toJson());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, request.toJson(),
+ responseContent);
return true;
}
@@ -115,8 +143,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public WxMpKfSessionGetResult kfSessionGet(String openid)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfsession/getsession?openid=" + openid;
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfSessionGetResult.fromJson(responseContent);
}
@@ -124,8 +153,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public WxMpKfSessionList kfSessionList(String kfAccount)
throws WxErrorException {
String url = API_URL_PREFIX + "/kfsession/getsessionlist?kf_account=" + kfAccount;
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfSessionList.fromJson(responseContent);
}
@@ -133,8 +163,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
public WxMpKfSessionWaitCaseList kfSessionGetWaitCase()
throws WxErrorException {
String url = API_URL_PREFIX + "/kfsession/getwaitcase";
- String responseContent = this.wxMpService
- .execute(new SimpleGetRequestExecutor(), url, null);
+ String responseContent = this.wxMpService.get(url, null);
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, null,
+ responseContent);
return WxMpKfSessionWaitCaseList.fromJson(responseContent);
}
@@ -156,7 +187,9 @@ public class WxMpKefuServiceImpl implements WxMpKefuService {
param.addProperty("msgid", msgId); //msgid 消息id顺序从小到大,从1开始
param.addProperty("number", number); //number 每次获取条数,最多10000条
- String responseContent = this.wxMpService.execute(new SimplePostRequestExecutor(), url, param.toString());
+ String responseContent = this.wxMpService.post(url, param.toString());
+ this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, param.toString(),
+ responseContent);
return WxMpKfMsgList.fromJson(responseContent);
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
index 43777c16..f1c8388e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
@@ -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,13 +290,30 @@ 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);
+ if (state != null) {
+ url.append("&state=").append(state);
+ }
+ url.append("#wechat_redirect");
+ 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();
}
@@ -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;
+ }
+
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java
new file mode 100644
index 00000000..b0b35343
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java
@@ -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 openidList) throws WxErrorException {
+ Map 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 openidList) throws WxErrorException {
+ Map map = new HashMap<>();
+ map.put("openid_list", openidList);
+ String url = API_BLACKLIST_PREFIX + "/batchunblacklist";
+ this.wxMpService.execute(new SimplePostRequestExecutor(), url, new Gson().toJson(map));
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
new file mode 100644
index 00000000..c2167556
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
@@ -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 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);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
index 823558fe..047961ea 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
@@ -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")
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
index ce1f4269..3dd28459 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
@@ -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 fromJson(String json) {
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(
+ JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+ new TypeToken>() {
+ }.getType());
+ }
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
index 1832f734..37401cf8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
@@ -1,8 +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 java.util.List;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
/**
* 图文分析数据接口返回结果对象
@@ -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 details) {
this.details = details;
}
-
+
+ public static List fromJson(String json) {
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(
+ JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+ new TypeToken>() {
+ }.getType());
+ }
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
index 4abbe277..82a45dcf 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
@@ -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 fromJson(String json) {
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(
+ JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+ new TypeToken>() {
+ }.getType());
+ }
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
index bbeb3b36..908dfca8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
@@ -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 fromJson(String json) {
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(
+ JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+ new TypeToken>() {
+ }.getType());
+ }
+
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
index 7192cfb4..039bd189 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
@@ -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;
/**
*
* 累计用户数据接口的返回JSON数据包
- * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
+ * 详情查看文档:用户分析数据接口
*
*/
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 fromJson(String json) {
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(
+ JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+ new TypeToken>() {
+ }.getType());
+ }
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
index cfb41842..4802027e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
@@ -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;
/**
*
* 用户增减数据接口的返回JSON数据包
- * http://mp.weixin.qq.com/wiki/3/ecfed6e1a0a03b5f35e5efac98e864b7.html
+ * 详情查看文档:用户分析数据接口
*
*/
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 fromJson(String json) {
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(
+ JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+ new TypeToken>() {
+ }.getType());
+ }
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
index 3fe2002c..7f326ac1 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
@@ -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
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserBlacklistGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserBlacklistGetResult.java
new file mode 100644
index 00000000..3cfbc009
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserBlacklistGetResult.java
@@ -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 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 getOpenidList() {
+ return this.openidList;
+ }
+
+ public void setOpenidList(List 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);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
new file mode 100644
index 00000000..d9e07d04
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
@@ -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 listFromJson(String json) {
+ return WxMpGsonBuilder.create().fromJson(
+ new JsonParser().parse(json).getAsJsonObject().get("tags"),
+ new TypeToken>(){}.getType());
+ }
+
+ public String toJson() {
+ return WxMpGsonBuilder.create().toJson(this);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxLongTimeJsonSerializer.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxLongTimeJsonSerializer.java
deleted file mode 100644
index 388139f2..00000000
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxLongTimeJsonSerializer.java
+++ /dev/null
@@ -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 {
- 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));
- }
-}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
index bf920fff..ab3d5769 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
@@ -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() {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java
index 79fb5f0b..60361249 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java
@@ -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, JsonDeserializer {
- @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, JsonDeserializer {
+ @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;
+ }
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java
index fcf1d403..74ccd154 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpUserCumulateGsonAdapter.java
@@ -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 {
- 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 {
- 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 {
+ @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;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java
index 61ecac41..39e3d1dc 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XStreamTransformer.java
@@ -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_2_XSTREAM_INSTANCE = configXStreamInstance();
+ protected static final Map, 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 configXStreamInstance() {
- Map map = new HashMap<>();
+ private static Map, XStream> configXStreamInstance() {
+ Map, XStream> map = new HashMap<>();
map.put(WxMpXmlMessage.class, config_WxMpXmlMessage());
map.put(WxMpXmlOutMusicMessage.class, config_WxMpXmlOutMusicMessage());
map.put(WxMpXmlOutNewsMessage.class, config_WxMpXmlOutNewsMessage());
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
index 4980faca..f4b79ae2 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
@@ -31,6 +31,7 @@ public class ApiTestModule implements Module {
}
}
+ @SuppressWarnings("unchecked")
public static T fromXml(Class clazz, InputStream is) {
XStream xstream = XStreamInitializer.getInstance();
xstream.alias("xml", clazz);
@@ -42,15 +43,16 @@ public class ApiTestModule implements Module {
public static class WxXmlMpInMemoryConfigStorage
extends WxMpInMemoryConfigStorage {
- private String openId;
+ private String openid;
private String kfAccount;
+ private String qrconnectRedirectUrl;
- public String getOpenId() {
- return this.openId;
+ public String getOpenid() {
+ return this.openid;
}
- public void setOpenId(String openId) {
- this.openId = openId;
+ public void setOpenid(String openid) {
+ this.openid = openid;
}
@Override
@@ -66,6 +68,14 @@ public class ApiTestModule implements Module {
this.kfAccount = kfAccount;
}
+ public String getQrconnectRedirectUrl() {
+ return this.qrconnectRedirectUrl;
+ }
+
+ public void setQrconnectRedirectUrl(String qrconnectRedirectUrl) {
+ this.qrconnectRedirectUrl = qrconnectRedirectUrl;
+ }
+
}
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBusyRetryTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBusyRetryTest.java
index c9edbdc5..a302cc2f 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBusyRetryTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBusyRetryTest.java
@@ -1,17 +1,18 @@
package me.chanjar.weixin.mp.api;
-import me.chanjar.weixin.common.bean.result.WxError;
-import me.chanjar.weixin.common.exception.WxErrorException;
-import me.chanjar.weixin.common.util.http.RequestExecutor;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import me.chanjar.weixin.common.bean.result.WxError;
+import me.chanjar.weixin.common.exception.WxErrorException;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+
@Test
public class WxMpBusyRetryTest {
@@ -20,7 +21,9 @@ public class WxMpBusyRetryTest {
WxMpService service = new WxMpServiceImpl() {
@Override
- protected T executeInternal(RequestExecutor executor, String uri, E data) throws WxErrorException {
+ protected synchronized T executeInternal(
+ RequestExecutor executor, String uri, E data)
+ throws WxErrorException {
WxError error = new WxError();
error.setErrorCode(-1);
throw new WxErrorException(error);
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpCustomMessageAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpCustomMessageAPITest.java
deleted file mode 100644
index 730ab726..00000000
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpCustomMessageAPITest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package me.chanjar.weixin.mp.api;
-
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.api.WxConsts;
-import me.chanjar.weixin.common.exception.WxErrorException;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-/***
- * 测试发送客服消息
- * @author chanjarster
- *
- */
-@Test(groups="customMessageAPI")
-@Guice(modules = ApiTestModule.class)
-public class WxMpCustomMessageAPITest {
-
- @Inject
- protected WxMpServiceImpl wxService;
-
- public void testSendCustomMessage() throws WxErrorException {
- ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
- WxMpCustomMessage message = new WxMpCustomMessage();
- message.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
- message.setToUser(configStorage.getOpenId());
- message.setContent("欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
-
- this.wxService.customMessageSend(message);
- }
-
- public void testSendCustomMessageWithKfAccount() throws WxErrorException {
- ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
- WxMpCustomMessage message = new WxMpCustomMessage();
- message.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
- message.setToUser(configStorage.getOpenId());
- message.setKfAccount(configStorage.getKfAccount());
- message.setContent("欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
-
- this.wxService.customMessageSend(message);
- }
-
-}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java
index c6a4556d..d4c49a0b 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java
@@ -1,14 +1,14 @@
package me.chanjar.weixin.mp.api;
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.exception.WxErrorException;
-import me.chanjar.weixin.common.util.crypto.SHA1;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.testng.Assert;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import java.security.NoSuchAlgorithmException;
+import com.google.inject.Inject;
+
+import me.chanjar.weixin.common.exception.WxErrorException;
+import me.chanjar.weixin.common.util.crypto.SHA1;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
/**
* 测试jsapi ticket接口
@@ -29,7 +29,7 @@ public class WxMpJsAPITest {
Assert.assertNotNull(jsapiTicket);
}
- public void test() throws NoSuchAlgorithmException {
+ public void test() {
long timestamp = 1419835025l;
String url = "http://omstest.vmall.com:23568/thirdparty/wechat/vcode/gotoshare?quantity=1&batchName=MATE7";
String noncestr = "82693e11-b9bc-448e-892f-f5289f46cd0f";
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java
index 168f96cf..ee99b6e1 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java
@@ -41,7 +41,7 @@ public class WxMpMassMessageAPITest {
WxMpMassOpenIdsMessage massMessage = new WxMpMassOpenIdsMessage();
massMessage.setMsgType(WxConsts.MASS_MSG_TEXT);
massMessage.setContent("测试群发消息\n欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
- massMessage.getToUsers().add(configProvider.getOpenId());
+ massMessage.getToUsers().add(configProvider.getOpenid());
WxMpMassSendResult massResult = this.wxService
.massOpenIdsMessageSend(massMessage);
@@ -58,7 +58,7 @@ public class WxMpMassMessageAPITest {
WxMpMassOpenIdsMessage massMessage = new WxMpMassOpenIdsMessage();
massMessage.setMsgType(massMsgType);
massMessage.setMediaId(mediaId);
- massMessage.getToUsers().add(configProvider.getOpenId());
+ massMessage.getToUsers().add(configProvider.getOpenid());
WxMpMassSendResult massResult = this.wxService
.massOpenIdsMessageSend(massMessage);
@@ -73,13 +73,13 @@ public class WxMpMassMessageAPITest {
massMessage.setContent("测试群发消息\n欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
massMessage
.setGroupId(this.wxService.getGroupService().groupGet().get(0).getId());
-
+
WxMpMassSendResult massResult = this.wxService
.massGroupMessageSend(massMessage);
Assert.assertNotNull(massResult);
Assert.assertNotNull(massResult.getMsgId());
}
-
+
@Test(dataProvider="massMessages")
public void testMediaMassGroupMessageSend(String massMsgType, String mediaId)
throws WxErrorException {
@@ -94,7 +94,7 @@ public class WxMpMassMessageAPITest {
Assert.assertNotNull(massResult);
Assert.assertNotNull(massResult.getMsgId());
}
-
+
@DataProvider
public Object[][] massMessages() throws WxErrorException, IOException {
Object[][] messages = new Object[4][];
@@ -109,7 +109,7 @@ public class WxMpMassMessageAPITest {
.mediaUpload(WxConsts.MEDIA_VIDEO, WxConsts.FILE_MP4, inputStream);
Assert.assertNotNull(uploadMediaRes);
Assert.assertNotNull(uploadMediaRes.getMediaId());
-
+
// 把视频变成可被群发的媒体
WxMpMassVideo video = new WxMpMassVideo();
video.setTitle("测试标题");
@@ -155,7 +155,7 @@ public class WxMpMassMessageAPITest {
.mediaUpload(WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, inputStream);
Assert.assertNotNull(uploadMediaRes);
Assert.assertNotNull(uploadMediaRes.getMediaId());
-
+
// 上传图文消息
WxMpMassNews news = new WxMpMassNews();
WxMpMassNews.WxMpMassNewsArticle article1 = new WxMpMassNews.WxMpMassNewsArticle();
@@ -163,7 +163,7 @@ public class WxMpMassMessageAPITest {
article1.setContent("内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1");
article1.setThumbMediaId(uploadMediaRes.getMediaId());
news.addArticle(article1);
-
+
WxMpMassNews.WxMpMassNewsArticle article2 = new WxMpMassNews.WxMpMassNewsArticle();
article2.setTitle("标题2");
article2.setContent("内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2");
@@ -173,7 +173,7 @@ public class WxMpMassMessageAPITest {
article2.setContentSourceUrl("www.baidu.com");
article2.setDigest("摘要2");
news.addArticle(article2);
-
+
WxMpMassUploadResult massUploadResult = this.wxService
.massNewsUpload(news);
Assert.assertNotNull(massUploadResult);
@@ -183,5 +183,5 @@ public class WxMpMassMessageAPITest {
return messages;
}
-
+
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
index bfb8cf58..1111f96a 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
@@ -1,10 +1,10 @@
package me.chanjar.weixin.mp.api.impl;
import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
+import org.apache.commons.lang3.time.FastDateFormat;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Guice;
@@ -28,39 +28,39 @@ import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary;
*/
@Guice(modules = ApiTestModule.class)
public class WxMpDataCubeServiceImplTest {
- private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
- "yyyy-MM-dd");
+ private FastDateFormat simpleDateFormat = FastDateFormat
+ .getInstance("yyyy-MM-dd");
@Inject
protected WxMpServiceImpl wxService;
@DataProvider
public Object[][] oneDay() throws ParseException {
- return new Object[][] { { simpleDateFormat.parse("2016-08-22") } };
+ return new Object[][] { { this.simpleDateFormat.parse("2016-08-22") } };
}
@DataProvider
public Object[][] threeDays() throws ParseException {
- return new Object[][] { { simpleDateFormat.parse("2016-08-20"),
- simpleDateFormat.parse("2016-08-22") } };
+ return new Object[][] { { this.simpleDateFormat.parse("2016-08-20"),
+ this.simpleDateFormat.parse("2016-08-22") } };
}
@DataProvider
public Object[][] sevenDays() throws ParseException {
- return new Object[][] { { simpleDateFormat.parse("2016-08-16"),
- simpleDateFormat.parse("2016-08-22") } };
+ return new Object[][] { { this.simpleDateFormat.parse("2016-08-16"),
+ this.simpleDateFormat.parse("2016-08-22") } };
}
@DataProvider
public Object[][] fifteenDays() throws ParseException {
- return new Object[][] { { simpleDateFormat.parse("2016-08-14"),
- simpleDateFormat.parse("2016-08-27") } };
+ return new Object[][] { { this.simpleDateFormat.parse("2016-08-14"),
+ this.simpleDateFormat.parse("2016-08-27") } };
}
@DataProvider
public Object[][] thirtyDays() throws ParseException {
- return new Object[][] { { simpleDateFormat.parse("2016-07-30"),
- simpleDateFormat.parse("2016-08-27") } };
+ return new Object[][] { { this.simpleDateFormat.parse("2016-07-30"),
+ this.simpleDateFormat.parse("2016-08-27") } };
}
@Test(dataProvider = "sevenDays")
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImplTest.java
index 249af392..5d114cc4 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImplTest.java
@@ -12,9 +12,10 @@ import java.util.List;
/**
* 测试分组接口
- *
+ *
* @author chanjarster
*/
+@Deprecated
@Test(groups = "groupAPI")
@Guice(modules = ApiTestModule.class)
public class WxMpGroupServiceImplTest {
@@ -23,7 +24,7 @@ public class WxMpGroupServiceImplTest {
protected WxMpServiceImpl wxService;
protected WxMpGroup group;
-
+
public void testGroupCreate() throws WxErrorException {
WxMpGroup res = this.wxService.getGroupService().groupCreate("测试分组1");
Assert.assertEquals(res.getName(), "测试分组1");
@@ -39,11 +40,22 @@ public class WxMpGroupServiceImplTest {
Assert.assertNotNull(g.getName());
}
}
-
+
@Test(dependsOnMethods={"testGroupGet", "testGroupCreate"})
public void getGroupUpdate() throws WxErrorException {
this.group.setName("分组改名");
this.wxService.getGroupService().groupUpdate(this.group);
}
+ public void testGroupQueryUserGroup() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
+ long groupid = this.wxService.getGroupService().userGetGroup(configStorage.getOpenid());
+ Assert.assertTrue(groupid != -1l);
+ }
+
+ public void testGroupMoveUser() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
+ this.wxService.getGroupService().userUpdateGroup(configStorage.getOpenid(), this.wxService.getGroupService().groupGet().get(3).getId());
+ }
+
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java
index c1812ab0..66ff3c30 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java
@@ -9,13 +9,13 @@ import org.testng.annotations.DataProvider;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.inject.Inject;
+import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.ApiTestModule;
import me.chanjar.weixin.mp.api.ApiTestModule.WxXmlMpInMemoryConfigStorage;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfInfo;
import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList;
@@ -37,6 +37,31 @@ public class WxMpKefuServiceImplTest {
@Inject
protected WxMpServiceImpl wxService;
+ public void testSendCustomMessage() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService
+ .getWxMpConfigStorage();
+ WxMpCustomMessage message = new WxMpCustomMessage();
+ message.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
+ message.setToUser(configStorage.getOpenid());
+ message.setContent(
+ "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
+
+ this.wxService.getKefuService().customMessageSend(message);
+ }
+
+ public void testSendCustomMessageWithKfAccount() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService
+ .getWxMpConfigStorage();
+ WxMpCustomMessage message = new WxMpCustomMessage();
+ message.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
+ message.setToUser(configStorage.getOpenid());
+ message.setKfAccount(configStorage.getKfAccount());
+ message.setContent(
+ "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
+
+ this.wxService.getKefuService().customMessageSend(message);
+ }
+
public void testKfList() throws WxErrorException {
WxMpKfList kfList = this.wxService.getKefuService().kfList();
Assert.assertNotNull(kfList);
@@ -80,7 +105,7 @@ public class WxMpKefuServiceImplTest {
"testKfAccountAdd" }, dataProvider = "getKfAccount")
public void testKfAccountInviteWorker(String kfAccount) throws WxErrorException {
WxMpKfAccountRequest request = WxMpKfAccountRequest.builder()
- .kfAccount(kfAccount).inviteWx("www_ucredit_com").build();
+ .kfAccount(kfAccount).inviteWx(" ").build();
Assert.assertTrue(this.wxService.getKefuService().kfAccountInviteWorker(request));
}
@@ -105,7 +130,7 @@ public class WxMpKefuServiceImplTest {
WxXmlMpInMemoryConfigStorage configStorage = (WxXmlMpInMemoryConfigStorage) this.wxService
.getWxMpConfigStorage();
return new Object[][] {
- { configStorage.getKfAccount(), configStorage.getOpenId() } };
+ { configStorage.getKfAccount(), configStorage.getOpenid() } };
}
@Test(dataProvider = "getKfAccountAndOpenid")
@@ -125,7 +150,7 @@ public class WxMpKefuServiceImplTest {
}
@Test(dataProvider = "getKfAccountAndOpenid")
- public void testKfSessionGet(String kfAccount,
+ public void testKfSessionGet(@SuppressWarnings("unused") String kfAccount,
String openid) throws WxErrorException {
WxMpKfSessionGetResult result = this.wxService.getKefuService()
.kfSessionGet(openid);
@@ -150,20 +175,20 @@ public class WxMpKefuServiceImplTest {
}
@Test
- public void testKfMsgList() throws WxErrorException, JsonProcessingException {
+ public void testKfMsgList() throws WxErrorException {
Date startTime = DateTime.now().minusDays(1).toDate();
Date endTime = DateTime.now().minusDays(0).toDate();
WxMpKfMsgList result = this.wxService.getKefuService().kfMsgList(startTime,endTime, 1L, 50);
Assert.assertNotNull(result);
- System.err.println(new ObjectMapper().writeValueAsString(result));
+ System.err.println(result);
}
@Test
- public void testKfMsgListAll() throws WxErrorException, JsonProcessingException {
+ public void testKfMsgListAll() throws WxErrorException {
Date startTime = DateTime.now().minusDays(1).toDate();
Date endTime = DateTime.now().minusDays(0).toDate();
WxMpKfMsgList result = this.wxService.getKefuService().kfMsgList(startTime,endTime);
Assert.assertNotNull(result);
- System.err.println(new ObjectMapper().writeValueAsString(result));
+ System.err.println(result);
}
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
new file mode 100644
index 00000000..33242ba4
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
@@ -0,0 +1,159 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import org.testng.Assert;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import com.google.inject.Inject;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.api.ApiTestModule;
+import me.chanjar.weixin.mp.api.ApiTestModule.WxXmlMpInMemoryConfigStorage;
+
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMpServiceImplTest {
+
+ @Inject
+ private WxMpServiceImpl wxService;
+
+ @Test
+ public void testCheckSignature() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testGetAccessToken() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testGetAccessTokenBoolean() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testGetJsapiTicket() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testGetJsapiTicketBoolean() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testCreateJsapiSignature() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testCustomMessageSend() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testMassNewsUpload() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testMassVideoUpload() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testMassGroupMessageSend() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testMassOpenIdsMessageSend() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testMassMessagePreview() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testShortUrl() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testTemplateSend() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testSetIndustry() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testGetIndustry() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testSemanticQuery() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testOauth2buildAuthorizationUrl() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testBuildQrConnectUrl() {
+ String qrconnectRedirectUrl = ((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getQrconnectRedirectUrl();
+ String qrConnectUrl = this.wxService.buildQrConnectUrl(qrconnectRedirectUrl,
+ WxConsts.QRCONNECT_SCOPE_SNSAPI_LOGIN, null);
+ Assert.assertNotNull(qrConnectUrl);
+ System.out.println(qrConnectUrl);
+ }
+
+ @Test
+ public void testOauth2getAccessToken() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testOauth2refreshAccessToken() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testOauth2getUserInfo() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testOauth2validateAccessToken() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testGetCallbackIP() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testGet() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testPost() {
+ Assert.fail("Not yet implemented");
+ }
+
+ @Test
+ public void testExecute() {
+ Assert.fail("Not yet implemented");
+ }
+
+}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImplTest.java
new file mode 100644
index 00000000..6d31ea97
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImplTest.java
@@ -0,0 +1,52 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import me.chanjar.weixin.mp.api.ApiTestModule;
+import me.chanjar.weixin.mp.bean.result.WxMpUserBlacklistGetResult;
+import org.testng.Assert;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author miller
+ */
+@Test(groups = "userAPI")
+@Guice(modules = ApiTestModule.class)
+public class WxMpUserBlacklistServiceImplTest {
+ @Inject
+ protected WxMpServiceImpl wxService;
+
+ @Test
+ public void testGetBlacklist() throws Exception {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService
+ .getWxMpConfigStorage();
+ WxMpUserBlacklistGetResult wxMpUserBlacklistGetResult = this.wxService.getBlackListService().getBlacklist(configStorage.getOpenid());
+ Assert.assertNotNull(wxMpUserBlacklistGetResult);
+ Assert.assertFalse(wxMpUserBlacklistGetResult.getCount() == -1);
+ Assert.assertFalse(wxMpUserBlacklistGetResult.getTotal() == -1);
+ Assert.assertFalse(wxMpUserBlacklistGetResult.getOpenidList().size() == -1);
+ System.out.println(wxMpUserBlacklistGetResult);
+ }
+
+ @Test
+ public void testPushToBlacklist() throws Exception {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService
+ .getWxMpConfigStorage();
+ List openidList = new ArrayList<>();
+ openidList.add(configStorage.getOpenid());
+ this.wxService.getBlackListService().pushToBlacklist(openidList);
+ }
+
+ @Test
+ public void testPullFromBlacklist() throws Exception {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService
+ .getWxMpConfigStorage();
+ List openidList = new ArrayList<>();
+ openidList.add(configStorage.getOpenid());
+ this.wxService.getBlackListService().pullFromBlacklist(openidList);
+ }
+
+}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
index 07503516..95671b40 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
@@ -26,12 +26,12 @@ public class WxMpUserServiceImplTest {
public void testUserUpdateRemark() throws WxErrorException {
ApiTestModule.WxXmlMpInMemoryConfigStorage configProvider = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
- this.wxService.getUserService().userUpdateRemark(configProvider.getOpenId(), "测试备注名");
+ this.wxService.getUserService().userUpdateRemark(configProvider.getOpenid(), "测试备注名");
}
public void testUserInfo() throws WxErrorException {
ApiTestModule.WxXmlMpInMemoryConfigStorage configProvider = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
- WxMpUser user = this.wxService.getUserService().userInfo(configProvider.getOpenId(), null);
+ WxMpUser user = this.wxService.getUserService().userInfo(configProvider.getOpenid(), null);
Assert.assertNotNull(user);
System.out.println(user);
}
@@ -45,15 +45,4 @@ public class WxMpUserServiceImplTest {
System.out.println(wxMpUserList);
}
- public void testGroupQueryUserGroup() throws WxErrorException {
- ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
- long groupid = this.wxService.getGroupService().userGetGroup(configStorage.getOpenId());
- Assert.assertTrue(groupid != -1l);
- }
-
- public void testGroupMoveUser() throws WxErrorException {
- ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage();
- this.wxService.getGroupService().userUpdateGroup(configStorage.getOpenId(), this.wxService.getGroupService().groupGet().get(3).getId());
- }
-
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java
new file mode 100644
index 00000000..6471b88c
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java
@@ -0,0 +1,58 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import java.util.List;
+
+import org.testng.Assert;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import com.google.inject.Inject;
+
+import me.chanjar.weixin.mp.api.ApiTestModule;
+import me.chanjar.weixin.mp.bean.tag.WxUserTag;
+
+/**
+ *
+ * @author binarywang(https://github.com/binarywang)
+ * Created by Binary Wang on 2016/9/2.
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMpUserTagServiceImplTest {
+ @Inject
+ protected WxMpServiceImpl wxService;
+
+ private Integer tagId;
+
+ @Test
+ public void testTagCreate() throws Exception {
+ String tagName = "测试标签" + System.currentTimeMillis();
+ WxUserTag res = this.wxService.getUserTagService().tagCreate(tagName);
+ System.out.println(res);
+ this.tagId = res.getId();
+ Assert.assertEquals(tagName, res.getName());
+ }
+
+ @Test
+ public void testTagGet() throws Exception {
+ List res = this.wxService.getUserTagService().tagGet();
+ System.out.println(res);
+ Assert.assertNotNull(res);
+ }
+
+ @Test(dependsOnMethods = { "testTagCreate" })
+ public void testTagUpdate() throws Exception {
+ String tagName = "修改标签" + System.currentTimeMillis();
+ Boolean res = this.wxService.getUserTagService().tagUpdate(this.tagId, tagName);
+ System.out.println(res);
+ Assert.assertTrue(res);
+ }
+
+ @Test(dependsOnMethods = { "testTagCreate" })
+ public void testTagDelete() throws Exception {
+ Boolean res = this.wxService.getUserTagService().tagDelete(this.tagId);
+ System.out.println(res);
+ Assert.assertTrue(res);
+ }
+
+}
\ No newline at end of file
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
index 6db18923..a6fb1e53 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
@@ -1,5 +1,9 @@
package me.chanjar.weixin.mp.demo;
+import java.util.Map;
+import java.util.Random;
+import java.util.regex.Pattern;
+
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager;
@@ -10,10 +14,6 @@ import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
-import java.util.Map;
-import java.util.Random;
-import java.util.regex.Pattern;
-
public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMatcher {
private Random random = new Random();
@@ -57,14 +57,14 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
.toUser(wxMessage.getFromUserName())
.content("请猜一个100以内的数字")
.build();
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("放弃了吗?那请重新猜一个100以内的数字")
.build();
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
}
session.setAttribute("guessing", Boolean.TRUE);
@@ -92,7 +92,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
.toUser(wxMessage.getFromUserName())
.content("小了")
.build();
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
} else if (guessNumber > answer) {
WxMpCustomMessage m = WxMpCustomMessage
@@ -100,7 +100,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
.toUser(wxMessage.getFromUserName())
.content("大了")
.build();
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
@@ -108,7 +108,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
.content("Bingo!")
.build();
session.removeAttribute("guessing");
- wxMpService.customMessageSend(m);
+ wxMpService.getKefuService().customMessageSend(m);
}
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
index e8ee2fab..d052af6c 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
@@ -1,5 +1,12 @@
package me.chanjar.weixin.mp.demo;
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
import me.chanjar.weixin.common.util.StringUtils;
import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpMessageRouter;
@@ -7,21 +14,12 @@ import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
/**
* @author Daniel Qian
*/
public class WxMpEndpointServlet extends HttpServlet {
-
- /**
- *
- */
private static final long serialVersionUID = 1L;
+
protected WxMpConfigStorage wxMpConfigStorage;
protected WxMpService wxMpService;
protected WxMpMessageRouter wxMpMessageRouter;
@@ -33,7 +31,8 @@ public class WxMpEndpointServlet extends HttpServlet {
this.wxMpMessageRouter = wxMpMessageRouter;
}
- @Override protected void service(HttpServletRequest request, HttpServletResponse response)
+ @Override
+ protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java
index 15ec942a..4008e1fb 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java
@@ -1,29 +1,28 @@
package me.chanjar.weixin.mp.demo;
-import me.chanjar.weixin.common.exception.WxErrorException;
-import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
-import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-public class WxMpOAuth2Servlet extends HttpServlet {
+import me.chanjar.weixin.common.exception.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
+import me.chanjar.weixin.mp.bean.result.WxMpUser;
- /**
- *
- */
+public class WxMpOAuth2Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
+
protected WxMpService wxMpService;
public WxMpOAuth2Servlet(WxMpService wxMpService) {
this.wxMpService = wxMpService;
}
- @Override protected void service(HttpServletRequest request, HttpServletResponse response)
+ @Override
+ protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
diff --git a/weixin-java-mp/src/test/resources/test-config.sample.xml b/weixin-java-mp/src/test/resources/test-config.sample.xml
index 1f79bea2..0df87b09 100644
--- a/weixin-java-mp/src/test/resources/test-config.sample.xml
+++ b/weixin-java-mp/src/test/resources/test-config.sample.xml
@@ -5,7 +5,8 @@
公众号EncodingAESKey
可以不填写
可以不填写
- 某个加你公众号的用户的openId
+ 某个加你公众号的用户的openId
网页授权获取用户信息回调地址
+ 网页应用授权登陆回调地址
完整客服账号,格式为:账号前缀@公众号微信号