context);
}
diff --git a/src/main/java/me/chanjar/weixin/api/WxMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
similarity index 79%
rename from src/main/java/me/chanjar/weixin/api/WxMessageRouter.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
index 2a651596..f49cafe6 100644
--- a/src/main/java/me/chanjar/weixin/api/WxMessageRouter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
@@ -1,4 +1,7 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
+
+import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
+import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
import java.util.ArrayList;
import java.util.HashMap;
@@ -8,9 +11,6 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.regex.Pattern;
-import me.chanjar.weixin.bean.WxXmlMessage;
-import me.chanjar.weixin.bean.WxXmlOutMessage;
-
/**
*
* 微信消息路由器,通过代码化的配置,把来自微信的消息交给handler处理
@@ -21,7 +21,7 @@ import me.chanjar.weixin.bean.WxXmlOutMessage;
* 3. 规则的结束必须用{@link Rule#end()}或者{@link Rule#next()},否则不会生效
*
* 使用方法:
- * WxMessageRouter router = new WxMessageRouter();
+ * WxMpMessageRouter router = new WxMpMessageRouter();
* router
* .rule()
* .msgType("MSG_TYPE").event("EVENT").eventKey("EVENT_KEY").content("CONTENT")
@@ -39,7 +39,7 @@ import me.chanjar.weixin.bean.WxXmlOutMessage;
* @author qianjia
*
*/
-public class WxMessageRouter {
+public class WxMpMessageRouter {
private final List rules = new ArrayList();
@@ -57,7 +57,7 @@ public class WxMessageRouter {
* 处理微信消息
* @param wxMessage
*/
- public WxXmlOutMessage route(final WxXmlMessage wxMessage) {
+ public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) {
final List matchRules = new ArrayList();
// 收集匹配的规则
for (final Rule rule : rules) {
@@ -86,7 +86,7 @@ public class WxMessageRouter {
return null;
}
- WxXmlOutMessage res = null;
+ WxMpXmlOutMessage res = null;
for (final Rule rule : matchRules) {
// 返回最后一个匹配规则的结果
res = rule.service(wxMessage);
@@ -99,7 +99,7 @@ public class WxMessageRouter {
public static class Rule {
- private final WxMessageRouter routerBuilder;
+ private final WxMpMessageRouter routerBuilder;
private boolean async = true;
@@ -115,11 +115,11 @@ public class WxMessageRouter {
private boolean reEnter = false;
- private List handlers = new ArrayList();
+ private List handlers = new ArrayList();
- private List interceptors = new ArrayList();
+ private List interceptors = new ArrayList();
- protected Rule(WxMessageRouter routerBuilder) {
+ protected Rule(WxMpMessageRouter routerBuilder) {
this.routerBuilder = routerBuilder;
}
@@ -188,8 +188,8 @@ public class WxMessageRouter {
* @param interceptor
* @return
*/
- public Rule interceptor(WxMessageInterceptor interceptor) {
- return interceptor(interceptor, (WxMessageInterceptor[]) null);
+ public Rule interceptor(WxMpMessageInterceptor interceptor) {
+ return interceptor(interceptor, (WxMpMessageInterceptor[]) null);
}
/**
@@ -198,10 +198,10 @@ public class WxMessageRouter {
* @param otherInterceptors
* @return
*/
- public Rule interceptor(WxMessageInterceptor interceptor, WxMessageInterceptor... otherInterceptors) {
+ public Rule interceptor(WxMpMessageInterceptor interceptor, WxMpMessageInterceptor... otherInterceptors) {
this.interceptors.add(interceptor);
if (otherInterceptors != null && otherInterceptors.length > 0) {
- for (WxMessageInterceptor i : otherInterceptors) {
+ for (WxMpMessageInterceptor i : otherInterceptors) {
this.interceptors.add(i);
}
}
@@ -213,8 +213,8 @@ public class WxMessageRouter {
* @param handler
* @return
*/
- public Rule handler(WxMessageHandler handler) {
- return handler(handler, (WxMessageHandler[]) null);
+ public Rule handler(WxMpMessageHandler handler) {
+ return handler(handler, (WxMpMessageHandler[]) null);
}
/**
@@ -223,10 +223,10 @@ public class WxMessageRouter {
* @param otherHandlers
* @return
*/
- public Rule handler(WxMessageHandler handler, WxMessageHandler... otherHandlers) {
+ public Rule handler(WxMpMessageHandler handler, WxMpMessageHandler... otherHandlers) {
this.handlers.add(handler);
if (otherHandlers != null && otherHandlers.length > 0) {
- for (WxMessageHandler i : otherHandlers) {
+ for (WxMpMessageHandler i : otherHandlers) {
this.handlers.add(i);
}
}
@@ -237,7 +237,7 @@ public class WxMessageRouter {
* 规则结束,代表如果一个消息匹配该规则,那么它将不再会进入其他规则
* @return
*/
- public WxMessageRouter end() {
+ public WxMpMessageRouter end() {
this.routerBuilder.rules.add(this);
return this.routerBuilder;
}
@@ -246,12 +246,12 @@ public class WxMessageRouter {
* 规则结束,但是消息还会进入其他规则
* @return
*/
- public WxMessageRouter next() {
+ public WxMpMessageRouter next() {
this.reEnter = true;
return end();
}
- protected boolean test(WxXmlMessage wxMessage) {
+ protected boolean test(WxMpXmlMessage wxMessage) {
return
(this.msgType == null || this.msgType.equals(wxMessage.getMsgType()))
&&
@@ -270,18 +270,18 @@ public class WxMessageRouter {
* @param wxMessage
* @return true 代表继续执行别的router,false 代表停止执行别的router
*/
- protected WxXmlOutMessage service(WxXmlMessage wxMessage) {
+ protected WxMpXmlOutMessage service(WxMpXmlMessage wxMessage) {
Map context = new HashMap();
// 如果拦截器不通过
- for (WxMessageInterceptor interceptor : this.interceptors) {
+ for (WxMpMessageInterceptor interceptor : this.interceptors) {
if (!interceptor.intercept(wxMessage, context)) {
return null;
}
}
// 交给handler处理
- WxXmlOutMessage res = null;
- for (WxMessageHandler handler : this.handlers) {
+ WxMpXmlOutMessage res = null;
+ for (WxMpMessageHandler handler : this.handlers) {
// 返回最后handler的结果
res = handler.handle(wxMessage, context);
}
diff --git a/src/main/java/me/chanjar/weixin/api/WxService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
similarity index 77%
rename from src/main/java/me/chanjar/weixin/api/WxService.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
index c5db88bc..4b3a20fc 100644
--- a/src/main/java/me/chanjar/weixin/api/WxService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
@@ -1,29 +1,20 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
+
+import me.chanjar.weixin.common.bean.WxMenu;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.mp.bean.*;
+import me.chanjar.weixin.mp.bean.result.*;
+import me.chanjar.weixin.common.exception.WxErrorException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
-import me.chanjar.weixin.bean.WxCustomMessage;
-import me.chanjar.weixin.bean.WxGroup;
-import me.chanjar.weixin.bean.WxMassGroupMessage;
-import me.chanjar.weixin.bean.WxMassNews;
-import me.chanjar.weixin.bean.WxMassOpenIdsMessage;
-import me.chanjar.weixin.bean.WxMassVideo;
-import me.chanjar.weixin.bean.WxMenu;
-import me.chanjar.weixin.bean.result.WxMassSendResult;
-import me.chanjar.weixin.bean.result.WxMassUploadResult;
-import me.chanjar.weixin.bean.result.WxMediaUploadResult;
-import me.chanjar.weixin.bean.result.WxQrCodeTicket;
-import me.chanjar.weixin.bean.result.WxUser;
-import me.chanjar.weixin.bean.result.WxUserList;
-import me.chanjar.weixin.exception.WxErrorException;
-
/**
* 微信API的Service
*/
-public interface WxService {
+public interface WxMpService {
/**
*
@@ -48,7 +39,7 @@ public interface WxService {
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取access_token
*
- * @throws WxErrorException
+ * @throws me.chanjar.weixin.common.exception.WxErrorException
*/
public void accessTokenRefresh() throws WxErrorException;
@@ -64,8 +55,8 @@ public interface WxService {
*
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=上传下载多媒体文件
*
- * @param mediaType 媒体类型, 请看{@link WxConsts}
- * @param fileType 文件类型,请看{@link WxConsts}
+ * @param mediaType 媒体类型, 请看{@link me.chanjar.weixin.common.api.WxConsts}
+ * @param fileType 文件类型,请看{@link me.chanjar.weixin.common.api.WxConsts}
* @param inputStream 输入流
* @throws WxErrorException
*/
@@ -99,7 +90,7 @@ public interface WxService {
* @param message
* @throws WxErrorException
*/
- public void customMessageSend(WxCustomMessage message) throws WxErrorException;
+ public void customMessageSend(WxMpCustomMessage message) throws WxErrorException;
/**
*
@@ -109,10 +100,10 @@ public interface WxService {
*
* @param news
* @throws WxErrorException
- * @see #massGroupMessageSend(WxMassGroupMessage)
- * @see #massOpenIdsMessageSend(WxMassOpenIdsMessage)
+ * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassGroupMessage)
+ * @see #massOpenIdsMessageSend(me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage)
*/
- public WxMassUploadResult massNewsUpload(WxMassNews news) throws WxErrorException;
+ public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException;
/**
*
@@ -121,36 +112,36 @@ public interface WxService {
*
* @return
* @throws WxErrorException
- * @see #massGroupMessageSend(WxMassGroupMessage)
- * @see #massOpenIdsMessageSend(WxMassOpenIdsMessage)
+ * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassGroupMessage)
+ * @see #massOpenIdsMessageSend(me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage)
*/
- public WxMassUploadResult massVideoUpload(WxMassVideo video) throws WxErrorException;
+ public WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException;
/**
*
* 分组群发消息
- * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMassNews)} 获得media_id,然后再发送
- * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMassVideo)} 获得media_id,然后再发送
+ * 如果发送图文消息,必须先使用 {@link #massNewsUpload(me.chanjar.weixin.mp.bean.WxMpMassNews)} 获得media_id,然后再发送
+ * 如果发送视频消息,必须先使用 {@link #massVideoUpload(me.chanjar.weixin.mp.bean.WxMpMassVideo)} 获得media_id,然后再发送
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口
*
* @param message
* @throws WxErrorException
* @return
*/
- public WxMassSendResult massGroupMessageSend(WxMassGroupMessage message) throws WxErrorException;
+ public WxMpMassSendResult massGroupMessageSend(WxMpMassGroupMessage message) throws WxErrorException;
/**
*
* 按openId列表群发消息
- * 如果发送图文消息,必须先使用 {@link #massNewsUpload(WxMassNews)} 获得media_id,然后再发送
- * 如果发送视频消息,必须先使用 {@link #massVideoUpload(WxMassVideo)} 获得media_id,然后再发送
+ * 如果发送图文消息,必须先使用 {@link #massNewsUpload(me.chanjar.weixin.mp.bean.WxMpMassNews)} 获得media_id,然后再发送
+ * 如果发送视频消息,必须先使用 {@link #massVideoUpload(me.chanjar.weixin.mp.bean.WxMpMassVideo)} 获得media_id,然后再发送
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口
*
* @param message
* @return
* @throws WxErrorException
*/
- public WxMassSendResult massOpenIdsMessageSend(WxMassOpenIdsMessage message) throws WxErrorException;
+ public WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException;
/**
*
@@ -190,7 +181,7 @@ public interface WxService {
* @param name 分组名字(30个字符以内)
* @throws WxErrorException
*/
- public WxGroup groupCreate(String name) throws WxErrorException;
+ public WxMpGroup groupCreate(String name) throws WxErrorException;
/**
*
@@ -200,7 +191,7 @@ public interface WxService {
* @return
* @throws WxErrorException
*/
- public List groupGet() throws WxErrorException;
+ public List groupGet() throws WxErrorException;
/**
*
@@ -222,7 +213,7 @@ public interface WxService {
* @param group 要更新的group,group的id,name必须设置
* @throws WxErrorException
*/
- public void groupUpdate(WxGroup group) throws WxErrorException;
+ public void groupUpdate(WxMpGroup group) throws WxErrorException;
/**
*
@@ -258,7 +249,7 @@ public interface WxService {
* @return
* @throws WxErrorException
*/
- public WxUser userInfo(String openid, String lang) throws WxErrorException;
+ public WxMpUser userInfo(String openid, String lang) throws WxErrorException;
/**
*
@@ -269,7 +260,7 @@ public interface WxService {
* @return
* @throws WxErrorException
*/
- public WxUserList userList(String next_openid) throws WxErrorException;
+ public WxMpUserList userList(String next_openid) throws WxErrorException;
/**
*
@@ -281,7 +272,7 @@ public interface WxService {
* @return
* @throws WxErrorException
*/
- public WxQrCodeTicket qrCodeCreateTmpTicket(int scene_id, Integer expire_seconds) throws WxErrorException;
+ public WxMpQrCodeTicket qrCodeCreateTmpTicket(int scene_id, Integer expire_seconds) throws WxErrorException;
/**
*
@@ -292,7 +283,7 @@ public interface WxService {
* @return
* @throws WxErrorException
*/
- public WxQrCodeTicket qrCodeCreateLastTicket(int scene_id) throws WxErrorException;
+ public WxMpQrCodeTicket qrCodeCreateLastTicket(int scene_id) throws WxErrorException;
/**
*
@@ -303,7 +294,7 @@ public interface WxService {
* @return
* @throws WxErrorException
*/
- public File qrCodePicture(WxQrCodeTicket ticket) throws WxErrorException;
+ public File qrCodePicture(WxMpQrCodeTicket ticket) throws WxErrorException;
/**
*
@@ -317,8 +308,8 @@ public interface WxService {
public String shortUrl(String long_url) throws WxErrorException;
/**
- * 注入 {@link WxConfigStorage} 的实现
+ * 注入 {@link WxMpConfigStorage} 的实现
* @param wxConfigProvider
*/
- public void setWxConfigStorage(WxConfigStorage wxConfigProvider);
+ public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider);
}
diff --git a/src/main/java/me/chanjar/weixin/api/WxServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java
similarity index 74%
rename from src/main/java/me/chanjar/weixin/api/WxServiceImpl.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java
index 90ed8eac..c40af33d 100644
--- a/src/main/java/me/chanjar/weixin/api/WxServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java
@@ -1,18 +1,23 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.security.MessageDigest;
-import java.util.Arrays;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import me.chanjar.weixin.bean.WxCustomMessage;
-import me.chanjar.weixin.util.crypto.SHA1;
-import me.chanjar.weixin.util.json.GsonHelper;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.internal.Streams;
+import com.google.gson.reflect.TypeToken;
+import com.google.gson.stream.JsonReader;
+import me.chanjar.weixin.common.bean.WxAccessToken;
+import me.chanjar.weixin.common.bean.WxMenu;
+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.crypto.SHA1;
+import me.chanjar.weixin.common.util.fs.FileUtils;
+import me.chanjar.weixin.common.util.http.*;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.mp.bean.*;
+import me.chanjar.weixin.mp.bean.result.*;
+import me.chanjar.weixin.mp.util.http.QrCodeRequestExecutor;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
@@ -21,37 +26,15 @@ import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
-import me.chanjar.weixin.bean.WxAccessToken;
-import me.chanjar.weixin.bean.WxGroup;
-import me.chanjar.weixin.bean.WxMassGroupMessage;
-import me.chanjar.weixin.bean.WxMassNews;
-import me.chanjar.weixin.bean.WxMassOpenIdsMessage;
-import me.chanjar.weixin.bean.WxMassVideo;
-import me.chanjar.weixin.bean.WxMenu;
-import me.chanjar.weixin.bean.result.WxError;
-import me.chanjar.weixin.bean.result.WxMassSendResult;
-import me.chanjar.weixin.bean.result.WxMassUploadResult;
-import me.chanjar.weixin.bean.result.WxMediaUploadResult;
-import me.chanjar.weixin.bean.result.WxQrCodeTicket;
-import me.chanjar.weixin.bean.result.WxUser;
-import me.chanjar.weixin.bean.result.WxUserList;
-import me.chanjar.weixin.exception.WxErrorException;
-import me.chanjar.weixin.util.fs.FileUtils;
-import me.chanjar.weixin.util.http.MediaDownloadRequestExecutor;
-import me.chanjar.weixin.util.http.MediaUploadRequestExecutor;
-import me.chanjar.weixin.util.http.QrCodeRequestExecutor;
-import me.chanjar.weixin.util.http.RequestExecutor;
-import me.chanjar.weixin.util.http.SimpleGetRequestExecutor;
-import me.chanjar.weixin.util.http.SimplePostRequestExecutor;
-import me.chanjar.weixin.util.json.WxGsonBuilder;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.internal.Streams;
-import com.google.gson.reflect.TypeToken;
-import com.google.gson.stream.JsonReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
-public class WxServiceImpl implements WxService {
+public class WxMpServiceImpl implements WxMpService {
/**
* 全局的是否正在刷新Access Token的flag
@@ -62,13 +45,13 @@ public class WxServiceImpl implements WxService {
protected static final CloseableHttpClient httpclient = HttpClients.createDefault();
- protected WxConfigStorage wxConfigStorage;
+ protected WxMpConfigStorage wxMpConfigStorage;
protected final ThreadLocal retryTimes = new ThreadLocal();
public boolean checkSignature(String timestamp, String nonce, String signature) {
try {
- return SHA1.gen(wxConfigStorage.getToken(), timestamp, nonce).equals(signature);
+ return SHA1.gen(wxMpConfigStorage.getToken(), timestamp, nonce).equals(signature);
} catch (Exception e) {
return false;
}
@@ -78,19 +61,19 @@ public class WxServiceImpl implements WxService {
if (!GLOBAL_ACCESS_TOKEN_REFRESH_FLAG.getAndSet(true)) {
try {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"
- + "&appid=" + wxConfigStorage.getAppId()
- + "&secret=" + wxConfigStorage.getSecret()
+ + "&appid=" + wxMpConfigStorage.getAppId()
+ + "&secret=" + wxMpConfigStorage.getSecret()
;
try {
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(httpGet);
String resultContent = new BasicResponseHandler().handleResponse(response);
WxError error = WxError.fromJson(resultContent);
- if (error.getErrcode() != 0) {
+ if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
WxAccessToken accessToken = WxAccessToken.fromJson(resultContent);
- wxConfigStorage.updateAccessToken(accessToken.getAccess_token(), accessToken.getExpires_in());
+ wxMpConfigStorage.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
} catch (ClientProtocolException e) {
throw new RuntimeException(e);
} catch (IOException e) {
@@ -111,7 +94,7 @@ public class WxServiceImpl implements WxService {
}
}
- public void customMessageSend(WxCustomMessage message) throws WxErrorException {
+ 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());
}
@@ -133,7 +116,7 @@ public class WxServiceImpl implements WxService {
return WxMenu.fromJson(resultContent);
} catch (WxErrorException e) {
// 46003 不存在的菜单数据
- if (e.getError().getErrcode() == 46003) {
+ if (e.getError().getErrorCode() == 46003) {
return null;
}
throw e;
@@ -154,31 +137,31 @@ public class WxServiceImpl implements WxService {
return execute(new MediaDownloadRequestExecutor(), url, "media_id=" + media_id);
}
- public WxMassUploadResult massNewsUpload(WxMassNews news) throws WxErrorException {
+ public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews";
String responseContent = execute(new SimplePostRequestExecutor(), url, news.toJson());
- return WxMassUploadResult.fromJson(responseContent);
+ return WxMpMassUploadResult.fromJson(responseContent);
}
- public WxMassUploadResult massVideoUpload(WxMassVideo video) throws WxErrorException {
+ public WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException {
String url = "http://file.api.weixin.qq.com/cgi-bin/media/uploadvideo";
String responseContent = execute(new SimplePostRequestExecutor(), url, video.toJson());
- return WxMassUploadResult.fromJson(responseContent);
+ return WxMpMassUploadResult.fromJson(responseContent);
}
- public WxMassSendResult massGroupMessageSend(WxMassGroupMessage message) throws WxErrorException {
+ public WxMpMassSendResult massGroupMessageSend(WxMpMassGroupMessage message) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall";
String responseContent = execute(new SimplePostRequestExecutor(), url, message.toJson());
- return WxMassSendResult.fromJson(responseContent);
+ return WxMpMassSendResult.fromJson(responseContent);
}
- public WxMassSendResult massOpenIdsMessageSend(WxMassOpenIdsMessage message) throws WxErrorException {
+ public WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/message/mass/send";
String responseContent = execute(new SimplePostRequestExecutor(), url, message.toJson());
- return WxMassSendResult.fromJson(responseContent);
+ return WxMpMassSendResult.fromJson(responseContent);
}
- public WxGroup groupCreate(String name) throws WxErrorException {
+ public WxMpGroup groupCreate(String name) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/groups/create";
JsonObject json = new JsonObject();
JsonObject groupJson = new JsonObject();
@@ -189,10 +172,10 @@ public class WxServiceImpl implements WxService {
new SimplePostRequestExecutor(),
url,
json.toString());
- return WxGroup.fromJson(responseContent);
+ return WxMpGroup.fromJson(responseContent);
}
- public List groupGet() throws WxErrorException {
+ public List groupGet() throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/groups/get";
String responseContent = execute(new SimpleGetRequestExecutor(), url, null);
/*
@@ -200,7 +183,7 @@ public class WxServiceImpl implements WxService {
* 查询时返回的是 { groups : [ { id : ..., name : ..., count : ... }, ... ] }
*/
JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));
- return WxGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement.getAsJsonObject().get("groups"), new TypeToken>(){}.getType());
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement.getAsJsonObject().get("groups"), new TypeToken>(){}.getType());
}
public long userGetGroup(String openid) throws WxErrorException {
@@ -212,7 +195,7 @@ public class WxServiceImpl implements WxService {
return GsonHelper.getAsLong(tmpJsonElement.getAsJsonObject().get("groupid"));
}
- public void groupUpdate(WxGroup group) throws WxErrorException {
+ public void groupUpdate(WxMpGroup group) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/groups/update";
execute(new SimplePostRequestExecutor(), url, group.toJson());
}
@@ -233,20 +216,20 @@ public class WxServiceImpl implements WxService {
execute(new SimplePostRequestExecutor(), url, json.toString());
}
- public WxUser userInfo(String openid, String lang) throws WxErrorException {
+ public WxMpUser userInfo(String openid, String lang) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/user/info";
lang = lang == null ? "zh_CN" : lang;
String responseContent = execute(new SimpleGetRequestExecutor(), url, "openid=" + openid + "&lang=" + lang);
- return WxUser.fromJson(responseContent);
+ return WxMpUser.fromJson(responseContent);
}
- public WxUserList userList(String next_openid) throws WxErrorException {
+ public WxMpUserList userList(String next_openid) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/user/get";
String responseContent = execute(new SimpleGetRequestExecutor(), url, next_openid == null ? null : "next_openid=" + next_openid);
- return WxUserList.fromJson(responseContent);
+ return WxMpUserList.fromJson(responseContent);
}
- public WxQrCodeTicket qrCodeCreateTmpTicket(int scene_id, Integer expire_seconds) throws WxErrorException {
+ public WxMpQrCodeTicket qrCodeCreateTmpTicket(int scene_id, Integer expire_seconds) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create";
JsonObject json = new JsonObject();
json.addProperty("action_name", "QR_SCENE");
@@ -259,10 +242,10 @@ public class WxServiceImpl implements WxService {
actionInfo.add("scene", scene);
json.add("action_info", actionInfo);
String responseContent = execute(new SimplePostRequestExecutor(), url, json.toString());
- return WxQrCodeTicket.fromJson(responseContent);
+ return WxMpQrCodeTicket.fromJson(responseContent);
}
- public WxQrCodeTicket qrCodeCreateLastTicket(int scene_id) throws WxErrorException {
+ public WxMpQrCodeTicket qrCodeCreateLastTicket(int scene_id) throws WxErrorException {
String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create";
JsonObject json = new JsonObject();
json.addProperty("action_name", "QR_LIMIT_SCENE");
@@ -272,10 +255,10 @@ public class WxServiceImpl implements WxService {
actionInfo.add("scene", scene);
json.add("action_info", actionInfo);
String responseContent = execute(new SimplePostRequestExecutor(), url, json.toString());
- return WxQrCodeTicket.fromJson(responseContent);
+ return WxMpQrCodeTicket.fromJson(responseContent);
}
- public File qrCodePicture(WxQrCodeTicket ticket) throws WxErrorException {
+ public File qrCodePicture(WxMpQrCodeTicket ticket) throws WxErrorException {
String url = "https://mp.weixin.qq.com/cgi-bin/showqrcode";
return execute(new QrCodeRequestExecutor(), url, ticket);
}
@@ -299,10 +282,10 @@ public class WxServiceImpl implements WxService {
* @throws WxErrorException
*/
public T execute(RequestExecutor executor, String uri, E data) throws WxErrorException {
- if (StringUtils.isBlank(wxConfigStorage.getAccessToken())) {
+ if (StringUtils.isBlank(wxMpConfigStorage.getAccessToken())) {
accessTokenRefresh();
}
- String accessToken = wxConfigStorage.getAccessToken();
+ String accessToken = wxMpConfigStorage.getAccessToken();
String uriWithAccessToken = uri;
uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken;
@@ -316,14 +299,14 @@ public class WxServiceImpl implements WxService {
* 40001 获取access_token时AppSecret错误,或者access_token无效
* 42001 access_token超时
*/
- if (error.getErrcode() == 42001 || error.getErrcode() == 40001) {
+ if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001) {
accessTokenRefresh();
return execute(executor, uri, data);
}
/**
* -1 系统繁忙, 1000ms后重试
*/
- if (error.getErrcode() == -1) {
+ if (error.getErrorCode() == -1) {
if(retryTimes.get() == null) {
retryTimes.set(0);
}
@@ -341,7 +324,7 @@ public class WxServiceImpl implements WxService {
throw new RuntimeException(e1);
}
}
- if (error.getErrcode() != 0) {
+ if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
return null;
@@ -352,8 +335,8 @@ public class WxServiceImpl implements WxService {
}
}
- public void setWxConfigStorage(WxConfigStorage wxConfigProvider) {
- this.wxConfigStorage = wxConfigProvider;
+ public void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider) {
+ this.wxMpConfigStorage = wxConfigProvider;
}
}
diff --git a/src/main/java/me/chanjar/weixin/bean/WxCustomMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java
similarity index 54%
rename from src/main/java/me/chanjar/weixin/bean/WxCustomMessage.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java
index 48dd7220..dc3d3baa 100644
--- a/src/main/java/me/chanjar/weixin/bean/WxCustomMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java
@@ -1,59 +1,53 @@
-package me.chanjar.weixin.bean;
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.mp.bean.custombuilder.*;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
import java.util.ArrayList;
import java.util.List;
-import me.chanjar.weixin.api.WxConsts;
-import me.chanjar.weixin.bean.custombuilder.ImageBuilder;
-import me.chanjar.weixin.bean.custombuilder.MusicBuilder;
-import me.chanjar.weixin.bean.custombuilder.NewsBuilder;
-import me.chanjar.weixin.bean.custombuilder.TextBuilder;
-import me.chanjar.weixin.bean.custombuilder.VideoBuilder;
-import me.chanjar.weixin.bean.custombuilder.VoiceBuilder;
-import me.chanjar.weixin.util.json.WxGsonBuilder;
-
/**
* 客服消息
* @author chanjarster
*
*/
-public class WxCustomMessage {
+public class WxMpCustomMessage {
- private String touser;
- private String msgtype;
+ private String toUser;
+ private String msgType;
private String content;
- private String media_id;
- private String thumb_media_id;
+ private String mediaId;
+ private String thumbMediaId;
private String title;
private String description;
- private String musicurl;
- private String hqmusicurl;
+ private String musicUrl;
+ private String hqMusicUrl;
private List articles = new ArrayList();
- public String getTouser() {
- return touser;
+ public String getToUser() {
+ return toUser;
}
- public void setTouser(String touser) {
- this.touser = touser;
+ public void setToUser(String toUser) {
+ this.toUser = toUser;
}
- public String getMsgtype() {
- return msgtype;
+ public String getMsgType() {
+ return msgType;
}
/**
*
* 请使用
- * {@link WxConsts#CUSTOM_MSG_TEXT}
- * {@link WxConsts#CUSTOM_MSG_IMAGE}
- * {@link WxConsts#CUSTOM_MSG_VOICE}
- * {@link WxConsts#CUSTOM_MSG_MUSIC}
- * {@link WxConsts#CUSTOM_MSG_VIDEO}
- * {@link WxConsts#CUSTOM_MSG_NEWS}
+ * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_TEXT}
+ * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_IMAGE}
+ * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_VOICE}
+ * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_MUSIC}
+ * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_VIDEO}
+ * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_NEWS}
*
- * @param msgtype
+ * @param msgType
*/
- public void setMsgtype(String msgtype) {
- this.msgtype = msgtype;
+ public void setMsgType(String msgType) {
+ this.msgType = msgType;
}
public String getContent() {
return content;
@@ -61,17 +55,17 @@ public class WxCustomMessage {
public void setContent(String content) {
this.content = content;
}
- public String getMedia_id() {
- return media_id;
+ public String getMediaId() {
+ return mediaId;
}
- public void setMedia_id(String media_id) {
- this.media_id = media_id;
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
}
- public String getThumb_media_id() {
- return thumb_media_id;
+ public String getThumbMediaId() {
+ return thumbMediaId;
}
- public void setThumb_media_id(String thumb_media_id) {
- this.thumb_media_id = thumb_media_id;
+ public void setThumbMediaId(String thumbMediaId) {
+ this.thumbMediaId = thumbMediaId;
}
public String getTitle() {
return title;
@@ -85,17 +79,17 @@ public class WxCustomMessage {
public void setDescription(String description) {
this.description = description;
}
- public String getMusicurl() {
- return musicurl;
+ public String getMusicUrl() {
+ return musicUrl;
}
- public void setMusicurl(String musicurl) {
- this.musicurl = musicurl;
+ public void setMusicUrl(String musicUrl) {
+ this.musicUrl = musicUrl;
}
- public String getHqmusicurl() {
- return hqmusicurl;
+ public String getHqMusicUrl() {
+ return hqMusicUrl;
}
- public void setHqmusicurl(String hqmusicurl) {
- this.hqmusicurl = hqmusicurl;
+ public void setHqMusicUrl(String hqMusicUrl) {
+ this.hqMusicUrl = hqMusicUrl;
}
public List getArticles() {
return articles;
@@ -105,7 +99,7 @@ public class WxCustomMessage {
}
public String toJson() {
- return WxGsonBuilder.INSTANCE.create().toJson(this);
+ return WxMpGsonBuilder.INSTANCE.create().toJson(this);
}
public static class WxArticle {
@@ -113,7 +107,7 @@ public class WxCustomMessage {
private String title;
private String description;
private String url;
- private String picurl;
+ private String picUrl;
public String getTitle() {
return title;
@@ -133,11 +127,11 @@ public class WxCustomMessage {
public void setUrl(String url) {
this.url = url;
}
- public String getPicurl() {
- return picurl;
+ public String getPicUrl() {
+ return picUrl;
}
- public void setPicurl(String picurl) {
- this.picurl = picurl;
+ public void setPicUrl(String picUrl) {
+ this.picUrl = picUrl;
}
}
diff --git a/src/main/java/me/chanjar/weixin/bean/WxGroup.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java
similarity index 59%
rename from src/main/java/me/chanjar/weixin/bean/WxGroup.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java
index 0174f562..cfa5fcb6 100644
--- a/src/main/java/me/chanjar/weixin/bean/WxGroup.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java
@@ -1,13 +1,13 @@
-package me.chanjar.weixin.bean;
+package me.chanjar.weixin.mp.bean;
-import me.chanjar.weixin.util.json.WxGsonBuilder;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
/**
* 微信用户分组
* @author chanjarster
*
*/
-public class WxGroup {
+public class WxMpGroup {
private long id = -1;
private String name;
@@ -31,16 +31,16 @@ public class WxGroup {
this.count = count;
}
- public static WxGroup fromJson(String json) {
- return WxGsonBuilder.create().fromJson(json, WxGroup.class);
+ public static WxMpGroup fromJson(String json) {
+ return WxMpGsonBuilder.create().fromJson(json, WxMpGroup.class);
}
public String toJson() {
- return WxGsonBuilder.create().toJson(this);
+ return WxMpGsonBuilder.create().toJson(this);
}
@Override
public String toString() {
- return "WxGroup [id=" + id + ", name=" + name + ", count=" + count + "]";
+ return "WxMpGroup [id=" + id + ", name=" + name + ", count=" + count + "]";
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java
new file mode 100644
index 00000000..c8e859c0
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java
@@ -0,0 +1,69 @@
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+/**
+ * 分组群发的消息
+ *
+ * @author chanjarster
+ */
+public class WxMpMassGroupMessage {
+
+ private long groupId;
+ private String msgtype;
+ private String content;
+ private String mediaId;
+
+ public WxMpMassGroupMessage() {
+ super();
+ }
+
+ public String getMsgtype() {
+ return msgtype;
+ }
+
+ /**
+ *
+ * 请使用
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_IMAGE}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_NEWS}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_TEXT}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VIDEO}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VOICE}
+ * 如果msgtype和media_id不匹配的话,会返回系统繁忙的错误
+ *
+ * @param msgtype
+ */
+ public void setMsgtype(String msgtype) {
+ this.msgtype = msgtype;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getMediaId() {
+ return mediaId;
+ }
+
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
+ }
+
+ public String toJson() {
+ return WxMpGsonBuilder.INSTANCE.create().toJson(this);
+ }
+
+ public long getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(long groupId) {
+ this.groupId = groupId;
+ }
+
+}
diff --git a/src/main/java/me/chanjar/weixin/bean/WxMassNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java
similarity index 56%
rename from src/main/java/me/chanjar/weixin/bean/WxMassNews.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java
index 262c9adb..f3c67d5a 100644
--- a/src/main/java/me/chanjar/weixin/bean/WxMassNews.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java
@@ -1,50 +1,50 @@
-package me.chanjar.weixin.bean;
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
import java.util.ArrayList;
import java.util.List;
-import me.chanjar.weixin.util.json.WxGsonBuilder;
-
/**
* 群发时用到的图文消息素材
* @author chanjarster
*
*/
-public class WxMassNews {
+public class WxMpMassNews {
- private List articles = new ArrayList();
+ private List articles = new ArrayList();
- public List getArticles() {
+ public List getArticles() {
return articles;
}
- public void addArticle(WxMassNewsArticle article) {
+ public void addArticle(WxMpMassNewsArticle article) {
this.articles.add(article);
}
public String toJson() {
- return WxGsonBuilder.INSTANCE.create().toJson(this);
+ return WxMpGsonBuilder.INSTANCE.create().toJson(this);
}
/**
*
* 群发图文消息article
- * 1. thumb_media_id (必填) 图文消息缩略图的media_id,可以在基础支持-上传多媒体文件接口中获得
+ * 1. thumbMediaId (必填) 图文消息缩略图的media_id,可以在基础支持-上传多媒体文件接口中获得
* 2. author 图文消息的作者
* 3. title (必填) 图文消息的标题
- * 4. content_source_url 在图文消息页面点击“阅读原文”后的页面链接
+ * 4. contentSourceUrl 在图文消息页面点击“阅读原文”后的页面链接
* 5. content (必填) 图文消息页面的内容,支持HTML标签
* 6. digest 图文消息的描述
- * 7, show_cover_pic 是否显示封面,true为显示,false为不显示
+ * 7, showCoverPic 是否显示封面,true为显示,false为不显示
*
* @author chanjarster
*
*/
- public static class WxMassNewsArticle {
+ public static class WxMpMassNewsArticle {
/**
* (必填) 图文消息缩略图的media_id,可以在基础支持-上传多媒体文件接口中获得
*/
- private String thumb_media_id;
+ private String thumbMediaId;
/**
* 图文消息的作者
*/
@@ -56,7 +56,7 @@ public class WxMassNews {
/**
* 在图文消息页面点击“阅读原文”后的页面链接
*/
- private String content_source_url;
+ private String contentSourceUrl;
/**
* (必填) 图文消息页面的内容,支持HTML标签
*/
@@ -68,13 +68,13 @@ public class WxMassNews {
/**
* 是否显示封面,true为显示,false为不显示
*/
- private boolean show_cover_pic;
+ private boolean showCoverPic;
- public String getThumb_media_id() {
- return thumb_media_id;
+ public String getThumbMediaId() {
+ return thumbMediaId;
}
- public void setThumb_media_id(String thumb_media_id) {
- this.thumb_media_id = thumb_media_id;
+ public void setThumbMediaId(String thumbMediaId) {
+ this.thumbMediaId = thumbMediaId;
}
public String getAuthor() {
return author;
@@ -88,11 +88,11 @@ public class WxMassNews {
public void setTitle(String title) {
this.title = title;
}
- public String getContent_source_url() {
- return content_source_url;
+ public String getContentSourceUrl() {
+ return contentSourceUrl;
}
- public void setContent_source_url(String content_source_url) {
- this.content_source_url = content_source_url;
+ public void setContentSourceUrl(String contentSourceUrl) {
+ this.contentSourceUrl = contentSourceUrl;
}
public String getContent() {
return content;
@@ -106,11 +106,11 @@ public class WxMassNews {
public void setDigest(String digest) {
this.digest = digest;
}
- public boolean isShow_cover_pic() {
- return show_cover_pic;
+ public boolean isShowCoverPic() {
+ return showCoverPic;
}
- public void setShow_cover_pic(boolean show_cover_pic) {
- this.show_cover_pic = show_cover_pic;
+ public void setShowCoverPic(boolean showCoverPic) {
+ this.showCoverPic = showCoverPic;
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassOpenIdsMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassOpenIdsMessage.java
new file mode 100644
index 00000000..b542162b
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassOpenIdsMessage.java
@@ -0,0 +1,79 @@
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * OpenId列表群发的消息
+ *
+ * @author chanjarster
+ */
+public class WxMpMassOpenIdsMessage {
+
+ private List toUsers = new ArrayList();
+ private String msgType;
+ private String content;
+ private String mediaId;
+
+ public WxMpMassOpenIdsMessage() {
+ super();
+ }
+
+ public String getMsgType() {
+ return msgType;
+ }
+
+ /**
+ *
+ * 请使用
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_IMAGE}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_NEWS}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_TEXT}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VIDEO}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VOICE}
+ * 如果msgtype和media_id不匹配的话,会返回系统繁忙的错误
+ *
+ * @param msgType
+ */
+ public void setMsgType(String msgType) {
+ this.msgType = msgType;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getMediaId() {
+ return mediaId;
+ }
+
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
+ }
+
+ public String toJson() {
+ return WxMpGsonBuilder.INSTANCE.create().toJson(this);
+ }
+
+ /**
+ * OpenId列表,最多支持10,000个
+ * @return
+ */
+ public List getToUsers() {
+ return toUsers;
+ }
+
+ /**
+ * 添加OpenId,最多支持10,000个
+ * @param openId
+ */
+ public void addUser(String openId) {
+ this.toUsers.add(openId);
+ }
+}
diff --git a/src/main/java/me/chanjar/weixin/bean/WxMassVideo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java
similarity index 57%
rename from src/main/java/me/chanjar/weixin/bean/WxMassVideo.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java
index a0522413..3dc6c5d7 100644
--- a/src/main/java/me/chanjar/weixin/bean/WxMassVideo.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassVideo.java
@@ -1,15 +1,15 @@
-package me.chanjar.weixin.bean;
+package me.chanjar.weixin.mp.bean;
-import me.chanjar.weixin.util.json.WxGsonBuilder;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
/**
* 群发时用到的视频素材
*
* @author chanjarster
*/
-public class WxMassVideo {
+public class WxMpMassVideo {
- private String media_id;
+ private String mediaId;
private String title;
private String description;
@@ -29,15 +29,15 @@ public class WxMassVideo {
this.description = description;
}
- public String getMedia_id() {
- return media_id;
+ public String getMediaId() {
+ return mediaId;
}
- public void setMedia_id(String media_id) {
- this.media_id = media_id;
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
}
public String toJson() {
- return WxGsonBuilder.INSTANCE.create().toJson(this);
+ return WxMpGsonBuilder.INSTANCE.create().toJson(this);
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMpXmlOutImageMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMpXmlOutImageMessage.java
new file mode 100644
index 00000000..1db47004
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMpXmlOutImageMessage.java
@@ -0,0 +1,32 @@
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.util.xml.MediaIdMarshaller;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+@XmlRootElement(name = "xml")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class WxMpMpXmlOutImageMessage extends WxMpXmlOutMessage {
+
+ @XmlElement(name="Image")
+ @XmlJavaTypeAdapter(MediaIdMarshaller.class)
+ private String mediaId;
+
+ public WxMpMpXmlOutImageMessage() {
+ this.msgType = WxConsts.XML_MSG_IMAGE;
+ }
+
+ public String getMediaId() {
+ return mediaId;
+ }
+
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
+ }
+
+}
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
new file mode 100644
index 00000000..8ed9e567
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
@@ -0,0 +1,638 @@
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.common.util.xml.AdapterCDATA;
+import me.chanjar.weixin.mp.api.WxMpConfigStorage;
+import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil;
+import me.chanjar.weixin.mp.util.xml.XmlTransformer;
+import org.apache.commons.io.IOUtils;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.annotation.*;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * 微信推送过来的消息,也是同步回复给用户的消息,xml格式
+ * 相关字段的解释看微信开发者文档:
+ * http://mp.weixin.qq.com/wiki/index.php?title=接收普通消息
+ * http://mp.weixin.qq.com/wiki/index.php?title=接收事件推送
+ * http://mp.weixin.qq.com/wiki/index.php?title=接收语音识别结果
+ *
+ *
+ * @author chanjarster
+ */
+@XmlRootElement(name = "xml")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class WxMpXmlMessage {
+
+ ///////////////////////
+ // 以下都是微信推送过来的消息的xml的element所对应的属性
+ ///////////////////////
+
+ @XmlElement(name = "ToUserName")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String toUserName;
+
+ @XmlElement(name = "FromUserName")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String fromUserName;
+
+ @XmlElement(name = "CreateTime")
+ private Long createTime;
+
+ @XmlElement(name = "MsgType")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String msgType;
+
+ @XmlElement(name = "Content")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String content;
+
+ @XmlElement(name = "MsgId")
+ private Long msgId;
+
+ @XmlElement(name = "PicUrl")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String picUrl;
+
+ @XmlElement(name = "MediaId")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String mediaId;
+
+ @XmlElement(name = "Format")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String format;
+
+ @XmlElement(name = "ThumbMediaId")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String thumbMediaId;
+
+ @XmlElement(name = "Location_X")
+ private Double locationX;
+
+ @XmlElement(name = "Location_Y")
+ private Double locationY;
+
+ @XmlElement(name = "Scale")
+ private Double scale;
+
+ @XmlElement(name = "Label")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String label;
+
+ @XmlElement(name = "Title")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String title;
+
+ @XmlElement(name = "Description")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String description;
+
+ @XmlElement(name = "Url")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String url;
+
+ @XmlElement(name = "Event")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String event;
+
+ @XmlElement(name = "EventKey")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String eventKey;
+
+ @XmlElement(name = "Ticket")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String ticket;
+
+ @XmlElement(name = "Latitude")
+ private Double latitude;
+
+ @XmlElement(name = "Longitude")
+ private Double longitude;
+
+ @XmlElement(name = "Precision")
+ private Double precision;
+
+ @XmlElement(name = "Recognition")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String recognition;
+
+ ///////////////////////////////////////
+ // 群发消息返回的结果
+ ///////////////////////////////////////
+ /**
+ * 群发的结果
+ */
+ @XmlElement(name = "Status")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String status;
+ /**
+ * group_id下粉丝数;或者openid_list中的粉丝数
+ */
+ @XmlElement(name = "TotalCount")
+ private Integer totalCount;
+ /**
+ * 过滤(过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,filterCount = sentCount + errorCount
+ */
+ @XmlElement(name = "FilterCount")
+ private Integer filterCount;
+ /**
+ * 发送成功的粉丝数
+ */
+ @XmlElement(name = "SentCount")
+ private Integer sentCount;
+ /**
+ * 发送失败的粉丝数
+ */
+ @XmlElement(name = "ErrorCount")
+ private Integer errorCount;
+
+ @XmlElement(name = "ScanCodeInfo")
+ private ScanCodeInfo scanCodeInfo = new ScanCodeInfo();
+
+ @XmlElement(name = "SendPicsInfo")
+ private SendPicsInfo sendPicsInfo = new SendPicsInfo();
+
+ @XmlElement(name = "SendLocationInfo")
+ private SendLocationInfo sendLocationInfo = new SendLocationInfo();
+
+ public String getToUserName() {
+ return toUserName;
+ }
+
+ public void setToUserName(String toUserName) {
+ this.toUserName = toUserName;
+ }
+
+ public Long getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Long createTime) {
+ this.createTime = createTime;
+ }
+
+ /**
+ *
+ * 当接受用户消息时,可能会获得以下值:
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_TEXT}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_IMAGE}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_VOICE}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_VIDEO}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_LOCATION}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_LINK}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_EVENT}
+ *
+ *
+ * @return
+ */
+ public String getMsgType() {
+ return msgType;
+ }
+
+ /**
+ *
+ * 当发送消息的时候使用:
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_TEXT}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_IMAGE}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_VOICE}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_VIDEO}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_NEWS}
+ * {@link me.chanjar.weixin.common.api.WxConsts#XML_MSG_MUSIC}
+ *
+ *
+ * @param msgType
+ */
+ public void setMsgType(String msgType) {
+ this.msgType = msgType;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public Long getMsgId() {
+ return msgId;
+ }
+
+ public void setMsgId(Long msgId) {
+ this.msgId = msgId;
+ }
+
+ public String getPicUrl() {
+ return picUrl;
+ }
+
+ public void setPicUrl(String picUrl) {
+ this.picUrl = picUrl;
+ }
+
+ public String getMediaId() {
+ return mediaId;
+ }
+
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
+ }
+
+ public String getFormat() {
+ return format;
+ }
+
+ public void setFormat(String format) {
+ this.format = format;
+ }
+
+ public String getThumbMediaId() {
+ return thumbMediaId;
+ }
+
+ public void setThumbMediaId(String thumbMediaId) {
+ this.thumbMediaId = thumbMediaId;
+ }
+
+ public Double getLocationX() {
+ return locationX;
+ }
+
+ public void setLocationX(Double locationX) {
+ this.locationX = locationX;
+ }
+
+ public Double getLocationY() {
+ return locationY;
+ }
+
+ public void setLocationY(Double locationY) {
+ this.locationY = locationY;
+ }
+
+ public Double getScale() {
+ return scale;
+ }
+
+ public void setScale(Double scale) {
+ this.scale = scale;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getEvent() {
+ return event;
+ }
+
+ public void setEvent(String event) {
+ this.event = event;
+ }
+
+ public String getEventKey() {
+ return eventKey;
+ }
+
+ public void setEventKey(String eventKey) {
+ this.eventKey = eventKey;
+ }
+
+ public String getTicket() {
+ return ticket;
+ }
+
+ public void setTicket(String ticket) {
+ this.ticket = ticket;
+ }
+
+ public Double getLatitude() {
+ return latitude;
+ }
+
+ public void setLatitude(Double latitude) {
+ this.latitude = latitude;
+ }
+
+ public Double getLongitude() {
+ return longitude;
+ }
+
+ public void setLongitude(Double longitude) {
+ this.longitude = longitude;
+ }
+
+ public Double getPrecision() {
+ return precision;
+ }
+
+ public void setPrecision(Double precision) {
+ this.precision = precision;
+ }
+
+ public String getRecognition() {
+ return recognition;
+ }
+
+ public void setRecognition(String recognition) {
+ this.recognition = recognition;
+ }
+
+ public String getFromUserName() {
+ return fromUserName;
+ }
+
+ public void setFromUserName(String fromUserName) {
+ this.fromUserName = fromUserName;
+ }
+
+ public static WxMpXmlMessage fromXml(String xml) {
+ try {
+ return XmlTransformer.fromXml(WxMpXmlMessage.class, xml);
+ } catch (JAXBException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static WxMpXmlMessage fromXml(InputStream is) {
+ try {
+ return XmlTransformer.fromXml(WxMpXmlMessage.class, is);
+ } catch (JAXBException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 从加密字符串转换
+ *
+ * @param encryptedXml
+ * @param wxMpConfigStorage
+ * @param timestamp
+ * @param nonce
+ * @param msgSignature
+ * @return
+ */
+ public static WxMpXmlMessage fromEncryptedXml(
+ String encryptedXml,
+ WxMpConfigStorage wxMpConfigStorage,
+ String timestamp, String nonce, String msgSignature) {
+ WxMpCryptUtil cryptUtil = new WxMpCryptUtil(wxMpConfigStorage);
+ String plainText = cryptUtil.decrypt(msgSignature, timestamp, nonce, encryptedXml);
+ return fromXml(plainText);
+ }
+
+ public static WxMpXmlMessage fromEncryptedXml(
+ InputStream is,
+ WxMpConfigStorage wxMpConfigStorage,
+ String timestamp, String nonce, String msgSignature) {
+ try {
+ return fromEncryptedXml(IOUtils.toString(is, "UTF-8"), wxMpConfigStorage, timestamp, nonce, msgSignature);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public Integer getTotalCount() {
+ return totalCount;
+ }
+
+ public void setTotalCount(Integer totalCount) {
+ this.totalCount = totalCount;
+ }
+
+ public Integer getFilterCount() {
+ return filterCount;
+ }
+
+ public void setFilterCount(Integer filterCount) {
+ this.filterCount = filterCount;
+ }
+
+ public Integer getSentCount() {
+ return sentCount;
+ }
+
+ public void setSentCount(Integer sentCount) {
+ this.sentCount = sentCount;
+ }
+
+ public Integer getErrorCount() {
+ return errorCount;
+ }
+
+ public void setErrorCount(Integer errorCount) {
+ this.errorCount = errorCount;
+ }
+
+ public WxMpXmlMessage.ScanCodeInfo getScanCodeInfo() {
+ return scanCodeInfo;
+ }
+
+ public void setScanCodeInfo(WxMpXmlMessage.ScanCodeInfo scanCodeInfo) {
+ this.scanCodeInfo = scanCodeInfo;
+ }
+
+ public WxMpXmlMessage.SendPicsInfo getSendPicsInfo() {
+ return sendPicsInfo;
+ }
+
+ public void setSendPicsInfo(WxMpXmlMessage.SendPicsInfo sendPicsInfo) {
+ this.sendPicsInfo = sendPicsInfo;
+ }
+
+ public WxMpXmlMessage.SendLocationInfo getSendLocationInfo() {
+ return sendLocationInfo;
+ }
+
+ public void setSendLocationInfo(WxMpXmlMessage.SendLocationInfo sendLocationInfo) {
+ this.sendLocationInfo = sendLocationInfo;
+ }
+
+ @XmlRootElement(name = "ScanCodeInfo")
+ @XmlAccessorType(XmlAccessType.FIELD)
+ public static class ScanCodeInfo {
+
+ @XmlElement(name = "ScanType")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String scanType;
+
+ @XmlElement(name = "ScanResult")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String scanResult;
+
+ /**
+ * 扫描类型,一般是qrcode
+ * @return
+ */
+ public String getScanType() {
+
+ return scanType;
+ }
+
+ public void setScanType(String scanType) {
+ this.scanType = scanType;
+ }
+
+ /**
+ * 扫描结果,即二维码对应的字符串信息
+ * @return
+ */
+ public String getScanResult() {
+ return scanResult;
+ }
+
+ public void setScanResult(String scanResult) {
+ this.scanResult = scanResult;
+ }
+
+ }
+
+ @XmlRootElement(name = "SendPicsInfo")
+ @XmlAccessorType(XmlAccessType.FIELD)
+ public static class SendPicsInfo {
+
+ @XmlElement(name = "Count")
+ private Long count;
+
+ @XmlElementWrapper(name="PicList")
+ @XmlElement(name = "item")
+ protected final List- picList = new ArrayList
- ();
+
+ public Long getCount() {
+ return count;
+ }
+
+ public void setCount(Long count) {
+ this.count = count;
+ }
+
+ public List
- getPicList() {
+ return picList;
+ }
+
+ @XmlRootElement(name = "item")
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "WxXmlMessage.SendPicsInfo.Item")
+ public static class Item {
+
+ @XmlElement(name = "PicMd5Sum")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String PicMd5Sum;
+
+ public String getPicMd5Sum() {
+ return PicMd5Sum;
+ }
+
+ public void setPicMd5Sum(String picMd5Sum) {
+ PicMd5Sum = picMd5Sum;
+ }
+ }
+ }
+
+ @XmlRootElement(name = "SendLocationInfo")
+ @XmlAccessorType(XmlAccessType.FIELD)
+ public static class SendLocationInfo {
+
+ @XmlElement(name = "Location_X")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String locationX;
+
+ @XmlElement(name = "Location_Y")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String locationY;
+
+ @XmlElement(name = "Scale")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String scale;
+
+ @XmlElement(name = "Label")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String label;
+
+ @XmlElement(name = "Poiname")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String poiname;
+
+ public String getLocationX() {
+ return locationX;
+ }
+
+ public void setLocationX(String locationX) {
+ this.locationX = locationX;
+ }
+
+ public String getLocationY() {
+ return locationY;
+ }
+
+ public void setLocationY(String locationY) {
+ this.locationY = locationY;
+ }
+
+ public String getScale() {
+ return scale;
+ }
+
+ public void setScale(String scale) {
+ this.scale = scale;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public String getPoiname() {
+ return poiname;
+ }
+
+ public void setPoiname(String poiname) {
+ this.poiname = poiname;
+ }
+ }
+
+}
diff --git a/src/main/java/me/chanjar/weixin/bean/WxXmlOutMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMessage.java
similarity index 66%
rename from src/main/java/me/chanjar/weixin/bean/WxXmlOutMessage.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMessage.java
index 1b46901a..b9e4507d 100644
--- a/src/main/java/me/chanjar/weixin/bean/WxXmlOutMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMessage.java
@@ -1,4 +1,10 @@
-package me.chanjar.weixin.bean;
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.common.util.xml.AdapterCDATA;
+import me.chanjar.weixin.mp.api.WxMpConfigStorage;
+import me.chanjar.weixin.mp.bean.outxmlbuilder.*;
+import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil;
+import me.chanjar.weixin.mp.util.xml.XmlTransformer;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlAccessType;
@@ -7,66 +13,55 @@ import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import me.chanjar.weixin.api.WxConfigStorage;
-import me.chanjar.weixin.bean.outxmlbuilder.ImageBuilder;
-import me.chanjar.weixin.bean.outxmlbuilder.MusicBuilder;
-import me.chanjar.weixin.bean.outxmlbuilder.NewsBuilder;
-import me.chanjar.weixin.bean.outxmlbuilder.TextBuilder;
-import me.chanjar.weixin.bean.outxmlbuilder.VideoBuilder;
-import me.chanjar.weixin.bean.outxmlbuilder.VoiceBuilder;
-import me.chanjar.weixin.util.crypto.WxCryptUtil;
-import me.chanjar.weixin.util.xml.AdapterCDATA;
-import me.chanjar.weixin.util.xml.XmlTransformer;
-
@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
-public class WxXmlOutMessage {
+public class WxMpXmlOutMessage {
@XmlElement(name="ToUserName")
@XmlJavaTypeAdapter(AdapterCDATA.class)
- protected String ToUserName;
+ protected String toUserName;
@XmlElement(name="FromUserName")
@XmlJavaTypeAdapter(AdapterCDATA.class)
- protected String FromUserName;
+ protected String fromUserName;
@XmlElement(name="CreateTime")
- protected Long CreateTime;
+ protected Long createTime;
@XmlElement(name="MsgType")
@XmlJavaTypeAdapter(AdapterCDATA.class)
- protected String MsgType;
+ protected String msgType;
public String getToUserName() {
- return ToUserName;
+ return toUserName;
}
public void setToUserName(String toUserName) {
- ToUserName = toUserName;
+ this.toUserName = toUserName;
}
public String getFromUserName() {
- return FromUserName;
+ return fromUserName;
}
public void setFromUserName(String fromUserName) {
- FromUserName = fromUserName;
+ this.fromUserName = fromUserName;
}
public Long getCreateTime() {
- return CreateTime;
+ return createTime;
}
public void setCreateTime(Long createTime) {
- CreateTime = createTime;
+ this.createTime = createTime;
}
public String getMsgType() {
- return MsgType;
+ return msgType;
}
public void setMsgType(String msgType) {
- MsgType = msgType;
+ this.msgType = msgType;
}
public String toXml() {
@@ -81,9 +76,9 @@ public class WxXmlOutMessage {
* 转换成加密的xml格式
* @return
*/
- public String toEncryptedXml(WxConfigStorage wxConfigStorage) {
+ public String toEncryptedXml(WxMpConfigStorage wxMpConfigStorage) {
String plainXml = toXml();
- WxCryptUtil pc = new WxCryptUtil(wxConfigStorage);
+ WxMpCryptUtil pc = new WxMpCryptUtil(wxMpConfigStorage);
return pc.encrypt(plainXml);
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMewsMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMewsMessage.java
new file mode 100644
index 00000000..527dc6a7
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMewsMessage.java
@@ -0,0 +1,95 @@
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.util.xml.AdapterCDATA;
+
+import javax.xml.bind.annotation.*;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import java.util.ArrayList;
+import java.util.List;
+
+@XmlRootElement(name = "xml")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class WxMpXmlOutMewsMessage extends WxMpXmlOutMessage {
+
+ @XmlElement(name = "ArticleCount")
+ protected int articleCount;
+
+ @XmlElementWrapper(name="Articles")
+ @XmlElement(name = "item")
+ protected final List
- articles = new ArrayList
- ();
+
+ public WxMpXmlOutMewsMessage() {
+ this.msgType = WxConsts.XML_MSG_NEWS;
+ }
+
+ public int getArticleCount() {
+ return articleCount;
+ }
+
+ public void addArticle(Item item) {
+ this.articles.add(item);
+ this.articleCount = this.articles.size();
+ }
+
+ public List
- getArticles() {
+ return articles;
+ }
+
+
+ @XmlRootElement(name = "Item")
+ @XmlAccessorType(XmlAccessType.FIELD)
+ public static class Item {
+
+ @XmlElement(name = "Title")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String Title;
+
+ @XmlElement(name = "Description")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String Description;
+
+ @XmlElement(name="PicUrl")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String PicUrl;
+
+ @XmlElement(name="Url")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String Url;
+
+ public String getTitle() {
+ return Title;
+ }
+
+ public void setTitle(String title) {
+ Title = title;
+ }
+
+ public String getDescription() {
+ return Description;
+ }
+
+ public void setDescription(String description) {
+ Description = description;
+ }
+
+ public String getPicUrl() {
+ return PicUrl;
+ }
+
+ public void setPicUrl(String picUrl) {
+ PicUrl = picUrl;
+ }
+
+ public String getUrl() {
+ return Url;
+ }
+
+ public void setUrl(String url) {
+ Url = url;
+ }
+
+ }
+
+
+}
diff --git a/src/main/java/me/chanjar/weixin/bean/WxXmlOutMusicMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java
similarity index 67%
rename from src/main/java/me/chanjar/weixin/bean/WxXmlOutMusicMessage.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java
index 545b5274..782b5dbb 100644
--- a/src/main/java/me/chanjar/weixin/bean/WxXmlOutMusicMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java
@@ -1,4 +1,7 @@
-package me.chanjar.weixin.bean;
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.util.xml.AdapterCDATA;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@@ -6,18 +9,15 @@ import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import me.chanjar.weixin.api.WxConsts;
-import me.chanjar.weixin.util.xml.AdapterCDATA;
-
@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
-public class WxXmlOutMusicMessage extends WxXmlOutMessage {
+public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage {
@XmlElement(name = "Music")
protected final Music music = new Music();
- public WxXmlOutMusicMessage() {
- this.MsgType = WxConsts.XML_MSG_MUSIC;
+ public WxMpXmlOutMusicMessage() {
+ this.msgType = WxConsts.XML_MSG_MUSIC;
}
public String getTitle() {
@@ -52,12 +52,12 @@ public class WxXmlOutMusicMessage extends WxXmlOutMessage {
music.setMusicUrl(musicUrl);
}
- public String getHQMusicUrl() {
- return music.getHQMusicUrl();
+ public String getHqMusicUrl() {
+ return music.getHqMusicUrl();
}
- public void setHQMusicUrl(String hQMusicUrl) {
- music.setHQMusicUrl(hQMusicUrl);
+ public void setHqMusicUrl(String hqMusicUrl) {
+ music.setHqMusicUrl(hqMusicUrl);
}
@XmlRootElement(name = "Music")
@@ -66,62 +66,62 @@ public class WxXmlOutMusicMessage extends WxXmlOutMessage {
@XmlElement(name = "Title")
@XmlJavaTypeAdapter(AdapterCDATA.class)
- private String Title;
+ private String title;
@XmlElement(name = "Description")
@XmlJavaTypeAdapter(AdapterCDATA.class)
- private String Description;
+ private String description;
@XmlElement(name="ThumbMediaId")
@XmlJavaTypeAdapter(AdapterCDATA.class)
- private String ThumbMediaId;
+ private String thumbMediaId;
@XmlElement(name="MusicUrl")
@XmlJavaTypeAdapter(AdapterCDATA.class)
- private String MusicUrl;
+ private String musicUrl;
@XmlElement(name="HQMusicUrl")
@XmlJavaTypeAdapter(AdapterCDATA.class)
- private String HQMusicUrl;
+ private String hqMusicUrl;
public String getTitle() {
- return Title;
+ return title;
}
public void setTitle(String title) {
- Title = title;
+ this.title = title;
}
public String getDescription() {
- return Description;
+ return description;
}
public void setDescription(String description) {
- Description = description;
+ this.description = description;
}
public String getThumbMediaId() {
- return ThumbMediaId;
+ return thumbMediaId;
}
public void setThumbMediaId(String thumbMediaId) {
- ThumbMediaId = thumbMediaId;
+ this.thumbMediaId = thumbMediaId;
}
public String getMusicUrl() {
- return MusicUrl;
+ return musicUrl;
}
public void setMusicUrl(String musicUrl) {
- MusicUrl = musicUrl;
+ this.musicUrl = musicUrl;
}
- public String getHQMusicUrl() {
- return HQMusicUrl;
+ public String getHqMusicUrl() {
+ return hqMusicUrl;
}
- public void setHQMusicUrl(String hQMusicUrl) {
- HQMusicUrl = hQMusicUrl;
+ public void setHqMusicUrl(String hqMusicUrl) {
+ this.hqMusicUrl = hqMusicUrl;
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java
new file mode 100644
index 00000000..3542e07b
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java
@@ -0,0 +1,33 @@
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.util.xml.AdapterCDATA;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+@XmlRootElement(name = "xml")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class WxMpXmlOutTextMessage extends WxMpXmlOutMessage {
+
+ @XmlElement(name="Content")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String content;
+
+ public WxMpXmlOutTextMessage() {
+ this.msgType = WxConsts.XML_MSG_TEXT;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java
new file mode 100644
index 00000000..4b192cf7
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java
@@ -0,0 +1,90 @@
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.util.xml.AdapterCDATA;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+@XmlRootElement(name = "xml")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class WxMpXmlOutVideoMessage extends WxMpXmlOutMessage {
+
+ @XmlElement(name = "Video")
+ protected final Video video = new Video();
+
+ public WxMpXmlOutVideoMessage() {
+ this.msgType = WxConsts.XML_MSG_VIDEO;
+ }
+
+ public String getMediaId() {
+ return video.getMediaId();
+ }
+
+ public void setMediaId(String mediaId) {
+ video.setMediaId(mediaId);
+ }
+
+ public String getTitle() {
+ return video.getTitle();
+ }
+
+ public void setTitle(String title) {
+ video.setTitle(title);
+ }
+
+ public String getDescription() {
+ return video.getDescription();
+ }
+
+ public void setDescription(String description) {
+ video.setDescription(description);
+ }
+
+
+ @XmlRootElement(name = "Video")
+ @XmlAccessorType(XmlAccessType.FIELD)
+ private static class Video {
+
+ @XmlElement(name = "MediaId")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String mediaId;
+
+ @XmlElement(name = "Title")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String title;
+
+ @XmlElement(name = "Description")
+ @XmlJavaTypeAdapter(AdapterCDATA.class)
+ private String description;
+
+ public String getMediaId() {
+ return mediaId;
+ }
+
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java
new file mode 100644
index 00000000..59f164ba
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java
@@ -0,0 +1,32 @@
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.util.xml.MediaIdMarshaller;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+@XmlRootElement(name = "xml")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class WxMpXmlOutVoiceMessage extends WxMpXmlOutMessage {
+
+ @XmlElement(name="Voice")
+ @XmlJavaTypeAdapter(MediaIdMarshaller.class)
+ private String mediaId;
+
+ public WxMpXmlOutVoiceMessage() {
+ this.msgType = WxConsts.XML_MSG_VOICE;
+ }
+
+ public String getMediaId() {
+ return mediaId;
+ }
+
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java
new file mode 100644
index 00000000..18bf81f9
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java
@@ -0,0 +1,20 @@
+package me.chanjar.weixin.mp.bean.custombuilder;
+
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
+
+public class BaseBuilder {
+ protected String msgType;
+ protected String toUser;
+
+ public T toUser(String toUser) {
+ this.toUser = toUser;
+ return (T) this;
+ }
+
+ public WxMpCustomMessage build() {
+ WxMpCustomMessage m = new WxMpCustomMessage();
+ m.setMsgType(this.msgType);
+ m.setToUser(this.toUser);
+ return m;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java
new file mode 100644
index 00000000..1c37b46e
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java
@@ -0,0 +1,31 @@
+package me.chanjar.weixin.mp.bean.custombuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
+
+/**
+ * 获得消息builder
+ *
+ * 用法: WxMpCustomMessage m = WxMpCustomMessage.IMAGE().mediaId(...).toUser(...).build();
+ *
+ * @author chanjarster
+ *
+ */
+public final class ImageBuilder extends BaseBuilder {
+ private String mediaId;
+
+ public ImageBuilder() {
+ this.msgType = WxConsts.CUSTOM_MSG_IMAGE;
+ }
+
+ public ImageBuilder mediaId(String media_id) {
+ this.mediaId = media_id;
+ return this;
+ }
+
+ public WxMpCustomMessage build() {
+ WxMpCustomMessage m = super.build();
+ m.setMediaId(this.mediaId);
+ return m;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java
new file mode 100644
index 00000000..5c1abe38
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java
@@ -0,0 +1,64 @@
+package me.chanjar.weixin.mp.bean.custombuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
+
+/**
+ * 音乐消息builder
+ *
+ * 用法: WxMpCustomMessage m = WxMpCustomMessage.MUSIC()
+ * .musicUrl(...)
+ * .hqMusicUrl(...)
+ * .title(...)
+ * .thumbMediaId(..)
+ * .description(..)
+ * .toUser(...)
+ * .build();
+ *
+ */
+public final class MusicBuilder extends BaseBuilder {
+ private String title;
+ private String description;
+ private String thumbMediaId;
+ private String musicUrl;
+ private String hqMusicUrl;
+
+ public MusicBuilder() {
+ this.msgType = WxConsts.CUSTOM_MSG_MUSIC;
+ }
+
+ public MusicBuilder musicUrl(String musicurl) {
+ this.musicUrl = musicurl;
+ return this;
+ }
+
+ public MusicBuilder hqMusicUrl(String hqMusicurl) {
+ this.hqMusicUrl = hqMusicurl;
+ return this;
+ }
+
+ public MusicBuilder title(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public MusicBuilder description(String description) {
+ this.description = description;
+ return this;
+ }
+
+ public MusicBuilder thumbMediaId(String thumb_media_id) {
+ this.thumbMediaId = thumb_media_id;
+ return this;
+ }
+
+ public WxMpCustomMessage build() {
+ WxMpCustomMessage m = super.build();
+ m.setMusicUrl(this.musicUrl);
+ m.setHqMusicUrl(this.hqMusicUrl);
+ m.setTitle(title);
+ m.setDescription(description);
+ m.setThumbMediaId(thumbMediaId);
+ return m;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java
new file mode 100644
index 00000000..825e72f8
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java
@@ -0,0 +1,36 @@
+package me.chanjar.weixin.mp.bean.custombuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 图文消息builder
+ *
+ * 用法:
+ * WxMpCustomMessage m = WxMpCustomMessage.NEWS().addArticle(article).toUser(...).build();
+ *
+ * @author chanjarster
+ *
+ */
+public final class NewsBuilder extends BaseBuilder {
+
+ private List articles = new ArrayList();
+
+ public NewsBuilder() {
+ this.msgType = WxConsts.CUSTOM_MSG_NEWS;
+ }
+
+ public NewsBuilder addArticle(WxMpCustomMessage.WxArticle article) {
+ this.articles.add(article);
+ return this;
+ }
+
+ public WxMpCustomMessage build() {
+ WxMpCustomMessage m = super.build();
+ m.setArticles(this.articles);
+ return m;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java
new file mode 100644
index 00000000..11249d6d
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java
@@ -0,0 +1,31 @@
+package me.chanjar.weixin.mp.bean.custombuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
+
+/**
+ * 文本消息builder
+ *
+ * 用法: WxMpCustomMessage m = WxMpCustomMessage.TEXT().content(...).toUser(...).build();
+ *
+ * @author chanjarster
+ *
+ */
+public final class TextBuilder extends BaseBuilder {
+ private String content;
+
+ public TextBuilder() {
+ this.msgType = WxConsts.CUSTOM_MSG_TEXT;
+ }
+
+ public TextBuilder content(String content) {
+ this.content = content;
+ return this;
+ }
+
+ public WxMpCustomMessage build() {
+ WxMpCustomMessage m = super.build();
+ m.setContent(this.content);
+ return m;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java
new file mode 100644
index 00000000..a871d491
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java
@@ -0,0 +1,58 @@
+package me.chanjar.weixin.mp.bean.custombuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
+
+/**
+ * 视频消息builder
+ *
+ * 用法: WxMpCustomMessage m = WxMpCustomMessage.VOICE()
+ * .mediaId(...)
+ * .title(...)
+ * .thumbMediaId(..)
+ * .description(..)
+ * .toUser(...)
+ * .build();
+ *
+ * @author chanjarster
+ *
+ */
+public final class VideoBuilder extends BaseBuilder {
+ private String mediaId;
+ private String title;
+ private String description;
+ private String thumbMediaId;
+
+ public VideoBuilder() {
+ this.msgType = WxConsts.CUSTOM_MSG_VIDEO;
+ }
+
+ public VideoBuilder mediaId(String mediaId) {
+ this.mediaId = mediaId;
+ return this;
+ }
+
+ public VideoBuilder title(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public VideoBuilder description(String description) {
+ this.description = description;
+ return this;
+ }
+
+ public VideoBuilder thumbMediaId(String thumb_media_id) {
+ this.thumbMediaId = thumb_media_id;
+ return this;
+ }
+
+ public WxMpCustomMessage build() {
+ WxMpCustomMessage m = super.build();
+ m.setMediaId(this.mediaId);
+ m.setTitle(title);
+ m.setDescription(description);
+ m.setThumbMediaId(thumbMediaId);
+ return m;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java
new file mode 100644
index 00000000..3f81aeb0
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java
@@ -0,0 +1,31 @@
+package me.chanjar.weixin.mp.bean.custombuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
+
+/**
+ * 语音消息builder
+ *
+ * 用法: WxMpCustomMessage m = WxMpCustomMessage.VOICE().mediaId(...).toUser(...).build();
+ *
+ * @author chanjarster
+ *
+ */
+public final class VoiceBuilder extends BaseBuilder {
+ private String mediaId;
+
+ public VoiceBuilder() {
+ this.msgType = WxConsts.CUSTOM_MSG_VOICE;
+ }
+
+ public VoiceBuilder mediaId(String media_id) {
+ this.mediaId = media_id;
+ return this;
+ }
+
+ public WxMpCustomMessage build() {
+ WxMpCustomMessage m = super.build();
+ m.setMediaId(this.mediaId);
+ return m;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/BaseBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/BaseBuilder.java
new file mode 100644
index 00000000..77db2617
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/BaseBuilder.java
@@ -0,0 +1,29 @@
+package me.chanjar.weixin.mp.bean.outxmlbuilder;
+
+import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
+
+public abstract class BaseBuilder {
+
+ protected String toUserName;
+
+ protected String fromUserName;
+
+ public BuilderType toUser(String touser) {
+ this.toUserName = touser;
+ return (BuilderType) this;
+ }
+
+ public BuilderType fromUser(String fromusername) {
+ this.fromUserName = fromusername;
+ return (BuilderType) this;
+ }
+
+ public abstract ValueType build();
+
+ public void setCommon(WxMpXmlOutMessage m) {
+ m.setToUserName(this.toUserName);
+ m.setFromUserName(this.fromUserName);
+ m.setCreateTime(System.currentTimeMillis() / 1000l);
+ }
+
+}
diff --git a/src/main/java/me/chanjar/weixin/bean/outxmlbuilder/ImageBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java
similarity index 56%
rename from src/main/java/me/chanjar/weixin/bean/outxmlbuilder/ImageBuilder.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java
index 0cb18ccc..f127406a 100644
--- a/src/main/java/me/chanjar/weixin/bean/outxmlbuilder/ImageBuilder.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java
@@ -1,12 +1,12 @@
-package me.chanjar.weixin.bean.outxmlbuilder;
+package me.chanjar.weixin.mp.bean.outxmlbuilder;
-import me.chanjar.weixin.bean.WxXmlOutImageMessage;
+import me.chanjar.weixin.mp.bean.WxMpMpXmlOutImageMessage;
/**
* 图片消息builder
* @author chanjarster
*/
-public final class ImageBuilder extends BaseBuilder {
+public final class ImageBuilder extends BaseBuilder {
private String mediaId;
@@ -15,8 +15,8 @@ public final class ImageBuilder extends BaseBuilder {
+public final class MusicBuilder extends BaseBuilder {
private String title;
private String description;
- private String hQMusicUrl;
+ private String hqMusicUrl;
private String musicUrl;
private String thumbMediaId;
@@ -25,8 +25,8 @@ public final class MusicBuilder extends BaseBuilder {
+
+ protected final List articles = new ArrayList();
+
+ public NewsBuilder addArticle(WxMpXmlOutMewsMessage.Item item) {
+ this.articles.add(item);
+ return this;
+ }
+
+ public WxMpXmlOutMewsMessage build() {
+ WxMpXmlOutMewsMessage m = new WxMpXmlOutMewsMessage();
+ for(WxMpXmlOutMewsMessage.Item item : articles) {
+ m.addArticle(item);
+ }
+ setCommon(m);
+ return m;
+ }
+
+}
diff --git a/src/main/java/me/chanjar/weixin/bean/outxmlbuilder/TextBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/TextBuilder.java
similarity index 57%
rename from src/main/java/me/chanjar/weixin/bean/outxmlbuilder/TextBuilder.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/TextBuilder.java
index 56393a33..8352ddea 100644
--- a/src/main/java/me/chanjar/weixin/bean/outxmlbuilder/TextBuilder.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/TextBuilder.java
@@ -1,13 +1,13 @@
-package me.chanjar.weixin.bean.outxmlbuilder;
+package me.chanjar.weixin.mp.bean.outxmlbuilder;
-import me.chanjar.weixin.bean.WxXmlOutTextMessage;
+import me.chanjar.weixin.mp.bean.WxMpXmlOutTextMessage;
/**
* 文本消息builder
* @author chanjarster
*
*/
-public final class TextBuilder extends BaseBuilder {
+public final class TextBuilder extends BaseBuilder {
private String content;
public TextBuilder content(String content) {
@@ -15,8 +15,8 @@ public final class TextBuilder extends BaseBuilder {
+public final class VideoBuilder extends BaseBuilder {
private String mediaId;
private String title;
@@ -26,8 +26,8 @@ public final class VideoBuilder extends BaseBuilder {
+public final class VoiceBuilder extends BaseBuilder {
private String mediaId;
@@ -15,8 +15,8 @@ public final class VoiceBuilder extends BaseBuilder
+ * 群发消息一发送就返回的结果
+ *
+ * 真正的群发消息是否发送成功要看
+ * http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口#.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81.E7.BE.A4.E5.8F.91.E7.BB.93.E6.9E.9C
+ *
+ *
+ * @author chanjarster
+ *
+ */
+public class WxMpMassSendResult {
+
+ private String errorCode;
+ private String errorMsg;
+ private String msgId;
+
+ public String getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(String errorCode) {
+ this.errorCode = errorCode;
+ }
+
+ public String getErrorMsg() {
+ return errorMsg;
+ }
+
+ public void setErrorMsg(String errorMsg) {
+ this.errorMsg = errorMsg;
+ }
+
+ public String getMsgId() {
+ return msgId;
+ }
+
+ public void setMsgId(String msgId) {
+ this.msgId = msgId;
+ }
+
+ public static WxMpMassSendResult fromJson(String json) {
+ return WxMpGsonBuilder.create().fromJson(json, WxMpMassSendResult.class);
+ }
+
+ @Override
+ public String toString() {
+ return "WxMassSendResult [errcode=" + errorCode + ", errmsg=" + errorMsg + ", msg_id=" + msgId + "]";
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassUploadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassUploadResult.java
new file mode 100644
index 00000000..e0ed145b
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassUploadResult.java
@@ -0,0 +1,52 @@
+package me.chanjar.weixin.mp.bean.result;
+
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+/**
+ *
+ * 上传群发用的素材的结果
+ * 视频和图文消息需要在群发前上传素材
+ *
+ * @author chanjarster
+ *
+ */
+public class WxMpMassUploadResult {
+
+ private String type;
+ private String mediaId;
+ private long createdAt;
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getMediaId() {
+ return mediaId;
+ }
+
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
+ }
+
+ public long getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(long createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public static WxMpMassUploadResult fromJson(String json) {
+ return WxMpGsonBuilder.create().fromJson(json, WxMpMassUploadResult.class);
+ }
+
+ @Override
+ public String toString() {
+ return "WxUploadResult [type=" + type + ", media_id=" + mediaId + ", created_at=" + createdAt + "]";
+ }
+
+}
diff --git a/src/main/java/me/chanjar/weixin/bean/result/WxQrCodeTicket.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java
similarity index 69%
rename from src/main/java/me/chanjar/weixin/bean/result/WxQrCodeTicket.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java
index d9da02aa..bf240c57 100644
--- a/src/main/java/me/chanjar/weixin/bean/result/WxQrCodeTicket.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpQrCodeTicket.java
@@ -1,13 +1,13 @@
-package me.chanjar.weixin.bean.result;
+package me.chanjar.weixin.mp.bean.result;
-import me.chanjar.weixin.util.json.WxGsonBuilder;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
/**
* 换取二维码的Ticket
*
* @author chanjarster
*/
-public class WxQrCodeTicket {
+public class WxMpQrCodeTicket {
protected String ticket;
protected int expire_seconds = -1;
@@ -40,7 +40,7 @@ public class WxQrCodeTicket {
this.url = url;
}
- public static WxQrCodeTicket fromJson(String json) {
- return WxGsonBuilder.INSTANCE.create().fromJson(json, WxQrCodeTicket.class);
+ public static WxMpQrCodeTicket fromJson(String json) {
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpQrCodeTicket.class);
}
}
diff --git a/src/main/java/me/chanjar/weixin/bean/result/WxUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java
similarity index 57%
rename from src/main/java/me/chanjar/weixin/bean/result/WxUser.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java
index 1893604a..fa4aee6d 100644
--- a/src/main/java/me/chanjar/weixin/bean/result/WxUser.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java
@@ -1,25 +1,25 @@
-package me.chanjar.weixin.bean.result;
+package me.chanjar.weixin.mp.bean.result;
-import me.chanjar.weixin.util.json.WxGsonBuilder;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
/**
* 微信用户信息
* @author chanjarster
*
*/
-public class WxUser {
+public class WxMpUser {
protected boolean subscribe;
- protected String openid;
+ protected String openId;
protected String nickname;
protected String sex;
protected String language;
protected String city;
protected String province;
protected String country;
- protected String headimgurl;
- protected long subscribe_time;
- protected String unionid;
+ protected String headImgUrl;
+ protected long subscribeTime;
+ protected String unionId;
public boolean isSubscribe() {
return subscribe;
@@ -27,11 +27,11 @@ public class WxUser {
public void setSubscribe(boolean subscribe) {
this.subscribe = subscribe;
}
- public String getOpenid() {
- return openid;
+ public String getOpenId() {
+ return openId;
}
- public void setOpenid(String openid) {
- this.openid = openid;
+ public void setOpenId(String openId) {
+ this.openId = openId;
}
public String getNickname() {
return nickname;
@@ -69,27 +69,27 @@ public class WxUser {
public void setCountry(String country) {
this.country = country;
}
- public String getHeadimgurl() {
- return headimgurl;
+ public String getHeadImgUrl() {
+ return headImgUrl;
}
- public void setHeadimgurl(String headimgurl) {
- this.headimgurl = headimgurl;
+ public void setHeadImgUrl(String headImgUrl) {
+ this.headImgUrl = headImgUrl;
}
- public long getSubscribe_time() {
- return subscribe_time;
+ public long getSubscribeTime() {
+ return subscribeTime;
}
- public void setSubscribe_time(long subscribe_time) {
- this.subscribe_time = subscribe_time;
+ public void setSubscribeTime(long subscribeTime) {
+ this.subscribeTime = subscribeTime;
}
- public String getUnionid() {
- return unionid;
+ public String getUnionId() {
+ return unionId;
}
- public void setUnionid(String unionid) {
- this.unionid = unionid;
+ public void setUnionId(String unionId) {
+ this.unionId = unionId;
}
- public static WxUser fromJson(String json) {
- return WxGsonBuilder.INSTANCE.create().fromJson(json, WxUser.class);
+ public static WxMpUser fromJson(String json) {
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpUser.class);
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java
new file mode 100644
index 00000000..489d5bed
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUserList.java
@@ -0,0 +1,47 @@
+package me.chanjar.weixin.mp.bean.result;
+
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 关注者列表
+ * @author chanjarster
+ *
+ */
+public class WxMpUserList {
+
+ protected int total = -1;
+ protected int count = -1;
+ protected List openIds = new ArrayList();
+ protected String nextOpenId;
+ public int getTotal() {
+ return total;
+ }
+ public void setTotal(int total) {
+ this.total = total;
+ }
+ public int getCount() {
+ return count;
+ }
+ public void setCount(int count) {
+ this.count = count;
+ }
+ public List getOpenIds() {
+ return openIds;
+ }
+ public void setOpenIds(List openIds) {
+ this.openIds = openIds;
+ }
+ public String getNextOpenId() {
+ return nextOpenId;
+ }
+ public void setNextOpenId(String nextOpenId) {
+ this.nextOpenId = nextOpenId;
+ }
+
+ public static WxMpUserList fromJson(String json) {
+ return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpUserList.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java
new file mode 100755
index 00000000..39165b5c
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java
@@ -0,0 +1,41 @@
+/**
+ * 对公众平台发送给公众账号的消息加解密示例代码.
+ *
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * 针对org.apache.commons.codec.binary.Base64,
+ * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本)
+ * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi
+ */
+package me.chanjar.weixin.mp.util.crypto;
+
+import me.chanjar.weixin.mp.api.WxMpConfigStorage;
+import org.apache.commons.codec.binary.Base64;
+
+public class WxMpCryptUtil extends me.chanjar.weixin.common.util.crypto.WxCryptUtil {
+
+ /**
+ * 构造函数
+ *
+ * @param wxMpConfigStorage
+ */
+ public WxMpCryptUtil(WxMpConfigStorage wxMpConfigStorage) {
+ /*
+ * @param token 公众平台上,开发者设置的token
+ * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey
+ * @param appId 公众平台appid
+ */
+ String encodingAesKey = wxMpConfigStorage.getAesKey();
+ String token = wxMpConfigStorage.getToken();
+ String appId = wxMpConfigStorage.getAppId();
+
+ this.token = token;
+ this.appidOrCorpid = appId;
+ this.aesKey = Base64.decodeBase64(encodingAesKey + "=");
+ }
+
+}
diff --git a/src/main/java/me/chanjar/weixin/util/http/QrCodeRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java
similarity index 72%
rename from src/main/java/me/chanjar/weixin/util/http/QrCodeRequestExecutor.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java
index b33fb501..554c9b8f 100644
--- a/src/main/java/me/chanjar/weixin/util/http/QrCodeRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/QrCodeRequestExecutor.java
@@ -1,31 +1,33 @@
-package me.chanjar.weixin.util.http;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URLEncoder;
-import java.util.UUID;
+package me.chanjar.weixin.mp.util.http;
+import me.chanjar.weixin.common.bean.result.WxError;
+import me.chanjar.weixin.common.util.fs.FileUtils;
+import me.chanjar.weixin.common.util.http.InputStreamResponseHandler;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.common.util.http.Utf8ResponseHandler;
+import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
+import me.chanjar.weixin.common.exception.WxErrorException;
import org.apache.http.Header;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.ContentType;
-import me.chanjar.weixin.bean.result.WxError;
-import me.chanjar.weixin.bean.result.WxQrCodeTicket;
-import me.chanjar.weixin.exception.WxErrorException;
-import me.chanjar.weixin.util.fs.FileUtils;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.util.UUID;
/**
* 获得QrCode图片 请求执行器
* @author chanjarster
*
*/
-public class QrCodeRequestExecutor implements RequestExecutor {
+public class QrCodeRequestExecutor implements RequestExecutor {
@Override
- public File execute(String uri, WxQrCodeTicket ticket) throws WxErrorException, ClientProtocolException, IOException {
+ public File execute(String uri, WxMpQrCodeTicket ticket) throws WxErrorException, ClientProtocolException, IOException {
if (ticket != null) {
if (uri.indexOf('?') == -1) {
uri += '?';
diff --git a/src/main/java/me/chanjar/weixin/util/json/WxCustomMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpCustomMessageGsonAdapter.java
similarity index 52%
rename from src/main/java/me/chanjar/weixin/util/json/WxCustomMessageGsonAdapter.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpCustomMessageGsonAdapter.java
index 70821659..6ff4b773 100644
--- a/src/main/java/me/chanjar/weixin/util/json/WxCustomMessageGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpCustomMessageGsonAdapter.java
@@ -6,76 +6,71 @@
* arose from modification of the original source, or other redistribution of this source
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
*/
-package me.chanjar.weixin.util.json;
+package me.chanjar.weixin.mp.util.json;
-import java.lang.reflect.Type;
-
-import me.chanjar.weixin.api.WxConsts;
-import me.chanjar.weixin.bean.WxCustomMessage;
+import com.google.gson.*;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonSerializationContext;
-import com.google.gson.JsonSerializer;
+import java.lang.reflect.Type;
/**
*
* @author qianjia
*
*/
-public class WxCustomMessageGsonAdapter implements JsonSerializer {
+public class WxMpCustomMessageGsonAdapter implements JsonSerializer {
- public JsonElement serialize(WxCustomMessage message, Type typeOfSrc, JsonSerializationContext context) {
+ public JsonElement serialize(WxMpCustomMessage message, Type typeOfSrc, JsonSerializationContext context) {
JsonObject messageJson = new JsonObject();
- messageJson.addProperty("touser", message.getTouser());
- messageJson.addProperty("msgtype", message.getMsgtype());
+ messageJson.addProperty("touser", message.getToUser());
+ messageJson.addProperty("msgtype", message.getMsgType());
- if (WxConsts.CUSTOM_MSG_TEXT.equals(message.getMsgtype())) {
+ if (WxConsts.CUSTOM_MSG_TEXT.equals(message.getMsgType())) {
JsonObject text = new JsonObject();
text.addProperty("content", message.getContent());
messageJson.add("text", text);
}
- if (WxConsts.CUSTOM_MSG_IMAGE.equals(message.getMsgtype())) {
+ if (WxConsts.CUSTOM_MSG_IMAGE.equals(message.getMsgType())) {
JsonObject image = new JsonObject();
- image.addProperty("media_id", message.getMedia_id());
+ image.addProperty("media_id", message.getMediaId());
messageJson.add("image", image);
}
- if (WxConsts.CUSTOM_MSG_VOICE.equals(message.getMsgtype())) {
+ if (WxConsts.CUSTOM_MSG_VOICE.equals(message.getMsgType())) {
JsonObject voice = new JsonObject();
- voice.addProperty("media_id", message.getMedia_id());
+ voice.addProperty("media_id", message.getMediaId());
messageJson.add("voice", voice);
}
- if (WxConsts.CUSTOM_MSG_VIDEO.equals(message.getMsgtype())) {
+ if (WxConsts.CUSTOM_MSG_VIDEO.equals(message.getMsgType())) {
JsonObject video = new JsonObject();
- video.addProperty("media_id", message.getMedia_id());
- video.addProperty("thumb_media_id", message.getThumb_media_id());
+ video.addProperty("media_id", message.getMediaId());
+ video.addProperty("thumb_media_id", message.getThumbMediaId());
video.addProperty("title", message.getTitle());
video.addProperty("description", message.getDescription());
messageJson.add("video", video);
}
- if (WxConsts.CUSTOM_MSG_MUSIC.equals(message.getMsgtype())) {
+ if (WxConsts.CUSTOM_MSG_MUSIC.equals(message.getMsgType())) {
JsonObject music = new JsonObject();
music.addProperty("title", message.getTitle());
music.addProperty("description", message.getDescription());
- music.addProperty("thumb_media_id", message.getThumb_media_id());
- music.addProperty("musicurl", message.getMusicurl());
- music.addProperty("hqmusicurl", message.getHqmusicurl());
+ music.addProperty("thumb_media_id", message.getThumbMediaId());
+ music.addProperty("musicurl", message.getMusicUrl());
+ music.addProperty("hqmusicurl", message.getHqMusicUrl());
messageJson.add("music", music);
}
- if (WxConsts.CUSTOM_MSG_NEWS.equals(message.getMsgtype())) {
+ if (WxConsts.CUSTOM_MSG_NEWS.equals(message.getMsgType())) {
JsonArray articleJsonArray = new JsonArray();
- for (WxCustomMessage.WxArticle article : message.getArticles()) {
+ for (WxMpCustomMessage.WxArticle article : message.getArticles()) {
JsonObject articleJson = new JsonObject();
articleJson.addProperty("title", article.getTitle());
articleJson.addProperty("description", article.getDescription());
articleJson.addProperty("url", article.getUrl());
- articleJson.addProperty("picurl", article.getPicurl());
+ articleJson.addProperty("picurl", article.getPicUrl());
articleJsonArray.add(articleJson);
}
messageJson.add("articles", articleJsonArray);
diff --git a/src/main/java/me/chanjar/weixin/util/json/WxGroupGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java
similarity index 67%
rename from src/main/java/me/chanjar/weixin/util/json/WxGroupGsonAdapter.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java
index c95e84e9..63f0624e 100644
--- a/src/main/java/me/chanjar/weixin/util/json/WxGroupGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java
@@ -6,28 +6,22 @@
* arose from modification of the original source, or other redistribution of this source
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
*/
-package me.chanjar.weixin.util.json;
+package me.chanjar.weixin.mp.util.json;
-import java.lang.reflect.Type;
-
-import me.chanjar.weixin.bean.WxGroup;
+import com.google.gson.*;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.mp.bean.WxMpGroup;
-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 com.google.gson.JsonSerializationContext;
-import com.google.gson.JsonSerializer;
+import java.lang.reflect.Type;
/**
*
* @author qianjia
*
*/
-public class WxGroupGsonAdapter implements JsonSerializer, JsonDeserializer {
+public class WxMpGroupGsonAdapter implements JsonSerializer, JsonDeserializer {
- public JsonElement serialize(WxGroup group, Type typeOfSrc, JsonSerializationContext context) {
+ public JsonElement serialize(WxMpGroup group, Type typeOfSrc, JsonSerializationContext context) {
JsonObject json = new JsonObject();
JsonObject groupJson = new JsonObject();
groupJson.addProperty("name", group.getName());
@@ -37,8 +31,8 @@ public class WxGroupGsonAdapter implements JsonSerializer, JsonDeserial
return json;
}
- public WxGroup deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
- WxGroup group = new WxGroup();
+ public WxMpGroup deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ WxMpGroup group = new WxMpGroup();
JsonObject groupJson = json.getAsJsonObject();
if (json.getAsJsonObject().get("group") != null) {
groupJson = json.getAsJsonObject().get("group").getAsJsonObject();
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
new file mode 100644
index 00000000..021b660d
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
@@ -0,0 +1,31 @@
+package me.chanjar.weixin.mp.util.json;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import me.chanjar.weixin.mp.bean.*;
+import me.chanjar.weixin.mp.bean.result.*;
+
+public class WxMpGsonBuilder {
+
+ public static final GsonBuilder INSTANCE = new GsonBuilder();
+
+ static {
+ INSTANCE.disableHtmlEscaping();
+ INSTANCE.registerTypeAdapter(WxMpCustomMessage.class, new WxMpCustomMessageGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxMpMassNews.class, new WxMpMassNewsGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxMpMassGroupMessage.class, new WxMpMassMessageGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxMpMassOpenIdsMessage.class, new WxMpMassOpenIdsMessageGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxMpGroup.class, new WxMpGroupGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxMpUser.class, new WxUserGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxMpUserList.class, new WxUserListGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxMpMassVideo.class, new WxMpMassVideoAdapter());
+ INSTANCE.registerTypeAdapter(WxMpMassSendResult.class, new WxMpMassSendResultAdapter());
+ INSTANCE.registerTypeAdapter(WxMpMassUploadResult.class, new WxMpMassUploadResultAdapter());
+ INSTANCE.registerTypeAdapter(WxMpQrCodeTicket.class, new WxQrCodeTicketAdapter());
+ }
+
+ public static Gson create() {
+ return INSTANCE.create();
+ }
+
+}
diff --git a/src/main/java/me/chanjar/weixin/util/json/WxMassMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassMessageGsonAdapter.java
similarity index 73%
rename from src/main/java/me/chanjar/weixin/util/json/WxMassMessageGsonAdapter.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassMessageGsonAdapter.java
index fb78ab4f..5b9a9845 100644
--- a/src/main/java/me/chanjar/weixin/util/json/WxMassMessageGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassMessageGsonAdapter.java
@@ -6,35 +6,34 @@
* arose from modification of the original source, or other redistribution of this source
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
*/
-package me.chanjar.weixin.util.json;
-
-import java.lang.reflect.Type;
-
-import me.chanjar.weixin.api.WxConsts;
-import me.chanjar.weixin.bean.WxMassGroupMessage;
+package me.chanjar.weixin.mp.util.json;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage;
+
+import java.lang.reflect.Type;
/**
*
* @author qianjia
*
*/
-public class WxMassMessageGsonAdapter implements JsonSerializer {
+public class WxMpMassMessageGsonAdapter implements JsonSerializer {
- public JsonElement serialize(WxMassGroupMessage message, Type typeOfSrc, JsonSerializationContext context) {
+ public JsonElement serialize(WxMpMassGroupMessage message, Type typeOfSrc, JsonSerializationContext context) {
JsonObject messageJson = new JsonObject();
JsonObject filter = new JsonObject();
- filter.addProperty("group_id", message.getGroup_id());
+ filter.addProperty("group_id", message.getGroupId());
messageJson.add("filter", filter);
if (WxConsts.MASS_MSG_NEWS.equals(message.getMsgtype())) {
JsonObject sub = new JsonObject();
- sub.addProperty("media_id", message.getMedia_id());
+ sub.addProperty("media_id", message.getMediaId());
messageJson.add(WxConsts.MASS_MSG_NEWS, sub);
}
if (WxConsts.MASS_MSG_TEXT.equals(message.getMsgtype())) {
@@ -44,17 +43,17 @@ public class WxMassMessageGsonAdapter implements JsonSerializer {
+public class WxMpMassNewsGsonAdapter implements JsonSerializer {
- public JsonElement serialize(WxMassNews message, Type typeOfSrc, JsonSerializationContext context) {
+ public JsonElement serialize(WxMpMassNews message, Type typeOfSrc, JsonSerializationContext context) {
JsonObject newsJson = new JsonObject();
JsonArray articleJsonArray = new JsonArray();
- for (WxMassNews.WxMassNewsArticle article : message.getArticles()) {
+ for (WxMpMassNews.WxMpMassNewsArticle article : message.getArticles()) {
JsonObject articleJson = new JsonObject();
- articleJson.addProperty("thumb_media_id", article.getThumb_media_id());
+ articleJson.addProperty("thumb_media_id", article.getThumbMediaId());
articleJson.addProperty("title", article.getTitle());
articleJson.addProperty("content", article.getContent());
if (null != article.getAuthor()) {
articleJson.addProperty("author", article.getAuthor());
}
- if (null != article.getContent_source_url()) {
- articleJson.addProperty("content_source_url", article.getContent_source_url());
+ if (null != article.getContentSourceUrl()) {
+ articleJson.addProperty("content_source_url", article.getContentSourceUrl());
}
if (null != article.getDigest()) {
articleJson.addProperty("digest", article.getDigest());
}
- articleJson.addProperty("show_cover_pic", article.isShow_cover_pic() ? "1" : "0");
+ articleJson.addProperty("show_cover_pic", article.isShowCoverPic() ? "1" : "0");
articleJsonArray.add(articleJson);
}
newsJson.add("articles", articleJsonArray);
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java
new file mode 100644
index 00000000..cd03addf
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java
@@ -0,0 +1,62 @@
+/*
+ * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
+ *
+ * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
+ * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
+ * arose from modification of the original source, or other redistribution of this source
+ * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
+ */
+package me.chanjar.weixin.mp.util.json;
+
+import com.google.gson.*;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage;
+
+import java.lang.reflect.Type;
+
+/**
+ *
+ * @author qianjia
+ *
+ */
+public class WxMpMassOpenIdsMessageGsonAdapter implements JsonSerializer {
+
+ public JsonElement serialize(WxMpMassOpenIdsMessage message, Type typeOfSrc, JsonSerializationContext context) {
+ JsonObject messageJson = new JsonObject();
+
+ JsonArray toUsers = new JsonArray();
+ for (String openId : message.getToUsers()) {
+ toUsers.add(new JsonPrimitive(openId));
+ }
+ messageJson.add("touser", toUsers);
+
+ if (WxConsts.MASS_MSG_NEWS.equals(message.getMsgType())) {
+ JsonObject sub = new JsonObject();
+ sub.addProperty("media_id", message.getMediaId());
+ messageJson.add(WxConsts.MASS_MSG_NEWS, sub);
+ }
+ if (WxConsts.MASS_MSG_TEXT.equals(message.getMsgType())) {
+ JsonObject sub = new JsonObject();
+ sub.addProperty("content", message.getContent());
+ messageJson.add(WxConsts.MASS_MSG_TEXT, sub);
+ }
+ if (WxConsts.MASS_MSG_VOICE.equals(message.getMsgType())) {
+ JsonObject sub = new JsonObject();
+ sub.addProperty("media_id", message.getMediaId());
+ messageJson.add(WxConsts.MASS_MSG_VOICE, sub);
+ }
+ if (WxConsts.MASS_MSG_IMAGE.equals(message.getMsgType())) {
+ JsonObject sub = new JsonObject();
+ sub.addProperty("media_id", message.getMediaId());
+ messageJson.add(WxConsts.MASS_MSG_IMAGE, sub);
+ }
+ if (WxConsts.MASS_MSG_VIDEO.equals(message.getMsgType())) {
+ JsonObject sub = new JsonObject();
+ sub.addProperty("media_id", message.getMediaId());
+ messageJson.add(WxConsts.MASS_MSG_VIDEO, sub);
+ }
+ messageJson.addProperty("msgtype", message.getMsgType());
+ return messageJson;
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java
new file mode 100644
index 00000000..99fc02b8
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java
@@ -0,0 +1,40 @@
+/*
+ * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
+ *
+ * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
+ * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
+ * arose from modification of the original source, or other redistribution of this source
+ * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
+ */
+package me.chanjar.weixin.mp.util.json;
+
+import com.google.gson.*;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
+
+import java.lang.reflect.Type;
+
+/**
+ *
+ * @author Daniel Qian
+ *
+ */
+public class WxMpMassSendResultAdapter implements JsonDeserializer {
+
+ public WxMpMassSendResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ WxMpMassSendResult sendResult = new WxMpMassSendResult();
+ JsonObject sendResultJsonObject = json.getAsJsonObject();
+
+ if (sendResultJsonObject.get("errcode") != null && !sendResultJsonObject.get("errcode").isJsonNull()) {
+ sendResult.setErrorCode(GsonHelper.getAsString(sendResultJsonObject.get("errcode")));
+ }
+ if (sendResultJsonObject.get("errmsg") != null && !sendResultJsonObject.get("errmsg").isJsonNull()) {
+ sendResult.setErrorMsg(GsonHelper.getAsString(sendResultJsonObject.get("errmsg")));
+ }
+ if (sendResultJsonObject.get("msg_id") != null && !sendResultJsonObject.get("msg_id").isJsonNull()) {
+ sendResult.setMsgId(GsonHelper.getAsString(sendResultJsonObject.get("msg_id")));
+ }
+ return sendResult;
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassUploadResultAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassUploadResultAdapter.java
new file mode 100644
index 00000000..73f03382
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassUploadResultAdapter.java
@@ -0,0 +1,40 @@
+/*
+ * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
+ *
+ * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
+ * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
+ * arose from modification of the original source, or other redistribution of this source
+ * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
+ */
+package me.chanjar.weixin.mp.util.json;
+
+import com.google.gson.*;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
+
+import java.lang.reflect.Type;
+
+/**
+ *
+ * @author Daniel Qian
+ *
+ */
+public class WxMpMassUploadResultAdapter implements JsonDeserializer {
+
+ public WxMpMassUploadResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ WxMpMassUploadResult uploadResult = new WxMpMassUploadResult();
+ JsonObject uploadResultJsonObject = json.getAsJsonObject();
+
+ if (uploadResultJsonObject.get("type") != null && !uploadResultJsonObject.get("type").isJsonNull()) {
+ uploadResult.setType(GsonHelper.getAsString(uploadResultJsonObject.get("type")));
+ }
+ if (uploadResultJsonObject.get("media_id") != null && !uploadResultJsonObject.get("media_id").isJsonNull()) {
+ uploadResult.setMediaId(GsonHelper.getAsString(uploadResultJsonObject.get("media_id")));
+ }
+ if (uploadResultJsonObject.get("created_at") != null && !uploadResultJsonObject.get("created_at").isJsonNull()) {
+ uploadResult.setCreatedAt(GsonHelper.getAsPrimitiveLong(uploadResultJsonObject.get("created_at")));
+ }
+ return uploadResult;
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassVideoAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassVideoAdapter.java
new file mode 100644
index 00000000..d4b37b81
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassVideoAdapter.java
@@ -0,0 +1,34 @@
+/*
+ * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
+ *
+ * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
+ * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
+ * arose from modification of the original source, or other redistribution of this source
+ * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
+ */
+package me.chanjar.weixin.mp.util.json;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import me.chanjar.weixin.mp.bean.WxMpMassVideo;
+
+import java.lang.reflect.Type;
+
+/**
+ *
+ * @author Daniel Qian
+ *
+ */
+public class WxMpMassVideoAdapter implements JsonSerializer {
+
+ public JsonElement serialize(WxMpMassVideo message, Type typeOfSrc, JsonSerializationContext context) {
+ JsonObject messageJson = new JsonObject();
+ messageJson.addProperty("media_id", message.getMediaId());
+ messageJson.addProperty("description", message.getDescription());
+ messageJson.addProperty("title", message.getTitle());
+ return messageJson;
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxQrCodeTicketAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxQrCodeTicketAdapter.java
new file mode 100644
index 00000000..522d70d0
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxQrCodeTicketAdapter.java
@@ -0,0 +1,40 @@
+/*
+ * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
+ *
+ * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
+ * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
+ * arose from modification of the original source, or other redistribution of this source
+ * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
+ */
+package me.chanjar.weixin.mp.util.json;
+
+import com.google.gson.*;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
+
+import java.lang.reflect.Type;
+
+/**
+ *
+ * @author Daniel Qian
+ *
+ */
+public class WxQrCodeTicketAdapter implements JsonDeserializer {
+
+ public WxMpQrCodeTicket deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ WxMpQrCodeTicket ticket = new WxMpQrCodeTicket();
+ JsonObject ticketJsonObject = json.getAsJsonObject();
+
+ if (ticketJsonObject.get("ticket") != null && !ticketJsonObject.get("ticket").isJsonNull()) {
+ ticket.setTicket(GsonHelper.getAsString(ticketJsonObject.get("ticket")));
+ }
+ if (ticketJsonObject.get("expire_seconds") != null && !ticketJsonObject.get("expire_seconds").isJsonNull()) {
+ ticket.setExpire_seconds(GsonHelper.getAsPrimitiveInt(ticketJsonObject.get("expire_seconds")));
+ }
+ if (ticketJsonObject.get("url") != null && !ticketJsonObject.get("url").isJsonNull()) {
+ ticket.setUrl(GsonHelper.getAsString(ticketJsonObject.get("url")));
+ }
+ return ticket;
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserGsonAdapter.java
new file mode 100644
index 00000000..cbbc3080
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserGsonAdapter.java
@@ -0,0 +1,48 @@
+/*
+ * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
+ *
+ * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
+ * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
+ * arose from modification of the original source, or other redistribution of this source
+ * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
+ */
+package me.chanjar.weixin.mp.util.json;
+
+import com.google.gson.*;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.mp.bean.result.WxMpUser;
+
+import java.lang.reflect.Type;
+
+/**
+ *
+ * @author qianjia
+ *
+ */
+public class WxUserGsonAdapter implements JsonDeserializer {
+
+ public WxMpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ JsonObject o = json.getAsJsonObject();
+ WxMpUser wxMpUser = new WxMpUser();
+ wxMpUser.setSubscribe(new Integer(0).equals(GsonHelper.getInteger(o, "subscribe")) ? false : true);
+ wxMpUser.setCity(GsonHelper.getString(o, "city"));
+ wxMpUser.setCountry(GsonHelper.getString(o, "country"));
+ wxMpUser.setHeadImgUrl(GsonHelper.getString(o, "headimgurl"));
+ wxMpUser.setLanguage(GsonHelper.getString(o, "language"));
+ wxMpUser.setNickname(GsonHelper.getString(o, "nickname"));
+ wxMpUser.setOpenId(GsonHelper.getString(o, "openid"));
+ wxMpUser.setProvince(GsonHelper.getString(o, "province"));
+ wxMpUser.setSubscribeTime(GsonHelper.getLong(o, "subscribe_time"));
+ wxMpUser.setUnionId(GsonHelper.getString(o, "unionid"));
+ Integer sex = GsonHelper.getInteger(o, "sex");
+ if(new Integer(1).equals(sex)) {
+ wxMpUser.setSex("男");
+ } else if (new Integer(2).equals(sex)) {
+ wxMpUser.setSex("女");
+ } else {
+ wxMpUser.setSex("未知");
+ }
+ return wxMpUser;
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserListGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserListGsonAdapter.java
new file mode 100644
index 00000000..ec65735e
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxUserListGsonAdapter.java
@@ -0,0 +1,37 @@
+/*
+ * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
+ *
+ * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
+ * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
+ * arose from modification of the original source, or other redistribution of this source
+ * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
+ */
+package me.chanjar.weixin.mp.util.json;
+
+import com.google.gson.*;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.mp.bean.result.WxMpUserList;
+
+import java.lang.reflect.Type;
+
+/**
+ *
+ * @author qianjia
+ *
+ */
+public class WxUserListGsonAdapter implements JsonDeserializer {
+
+ public WxMpUserList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ JsonObject o = json.getAsJsonObject();
+ WxMpUserList wxMpUserList = new WxMpUserList();
+ wxMpUserList.setTotal(GsonHelper.getInteger(o, "total"));
+ wxMpUserList.setCount(GsonHelper.getInteger(o, "count"));
+ wxMpUserList.setNextOpenId(GsonHelper.getString(o, "next_openid"));
+ JsonArray data = o.get("data").getAsJsonObject().get("openid").getAsJsonArray();
+ for (int i = 0; i < data.size(); i++) {
+ wxMpUserList.getOpenIds().add(GsonHelper.getAsString(data.get(i)));
+ }
+ return wxMpUserList;
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XmlTransformer.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XmlTransformer.java
new file mode 100644
index 00000000..5e619746
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/xml/XmlTransformer.java
@@ -0,0 +1,90 @@
+package me.chanjar.weixin.mp.util.xml;
+
+import com.sun.xml.bind.marshaller.CharacterEscapeHandler;
+import me.chanjar.weixin.mp.bean.*;
+import org.xml.sax.InputSource;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import java.io.*;
+
+public class XmlTransformer {
+
+ protected static final JAXBContext JAXB_CONTEXT = initJAXBContext();
+
+ /**
+ * xml -> pojo
+ *
+ * @param clazz
+ * @param xml
+ * @return
+ * @throws JAXBException
+ */
+ @SuppressWarnings("unchecked")
+ public static T fromXml(Class clazz, String xml) throws JAXBException {
+ Unmarshaller um = JAXB_CONTEXT.createUnmarshaller();
+ T object = (T) um.unmarshal(new StringReader(xml));
+ return object;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static T fromXml(Class clazz, InputStream is) throws JAXBException {
+ Unmarshaller um = JAXB_CONTEXT.createUnmarshaller();
+ InputSource inputSource = new InputSource(is);
+ inputSource.setEncoding("utf-8");
+ T object = (T) um.unmarshal(inputSource);
+ return object;
+ }
+
+ /**
+ * pojo -> xml
+ *
+ * @param clazz
+ * @param object
+ * @return
+ * @throws JAXBException
+ */
+ public static String toXml(Class clazz, T object) throws JAXBException {
+ StringWriter stringWriter = new StringWriter();
+ toXml(clazz, object, stringWriter);
+ return stringWriter.getBuffer().toString();
+ }
+
+ public static void toXml(Class clazz, T object, Writer writer) throws JAXBException {
+ Marshaller m = JAXB_CONTEXT.createMarshaller();
+ m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+ m.setProperty(CharacterEscapeHandler.class.getName(), CHAR_ESCAPE_HANDLER);
+ m.marshal(object, writer);
+ }
+
+ protected static final CharacterEscapeHandler CHAR_ESCAPE_HANDLER = new CharacterUnescapeHandler();
+
+ protected static class CharacterUnescapeHandler implements CharacterEscapeHandler {
+ public void escape(char[] ac, int i, int j, boolean flag, Writer writer) throws IOException {
+ writer.write(ac, i, j);
+ }
+ }
+
+ private static JAXBContext initJAXBContext() {
+ /*
+ * JAXBContext对象是线程安全的,根据官方文档的建议将对象作为全局实例
+ * https://jaxb.java.net/guide/Performance_and_thread_safety.html
+ */
+ try {
+ return JAXBContext.newInstance(
+ WxMpXmlOutMessage.class,
+ WxMpMpXmlOutImageMessage.class,
+ WxMpXmlOutMewsMessage.class,
+ WxMpXmlOutMusicMessage.class,
+ WxMpXmlOutTextMessage.class,
+ WxMpXmlOutVideoMessage.class,
+ WxMpXmlOutVoiceMessage.class,
+ WxMpXmlMessage.class);
+ } catch (JAXBException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
diff --git a/src/test/java/me/chanjar/weixin/api/ApiTestModule.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
similarity index 73%
rename from src/test/java/me/chanjar/weixin/api/ApiTestModule.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
index 68a9f8a2..ca4cbc13 100644
--- a/src/test/java/me/chanjar/weixin/api/ApiTestModule.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
import java.io.InputStream;
@@ -9,10 +9,6 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
-import me.chanjar.weixin.api.WxInMemoryConfigStorage;
-import me.chanjar.weixin.api.WxServiceImpl;
-import me.chanjar.weixin.util.xml.XmlTransformer;
-
import com.google.inject.Binder;
import com.google.inject.Module;
import org.xml.sax.InputSource;
@@ -23,12 +19,12 @@ public class ApiTestModule implements Module {
public void configure(Binder binder) {
try {
InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml");
- WxXmlConfigStorage config = fromXml(WxXmlConfigStorage.class, is1);
- WxServiceImpl wxService = new WxServiceImpl();
- wxService.setWxConfigStorage(config);
+ WxXmlMpInMemoryConfigStorage config = fromXml(WxXmlMpInMemoryConfigStorage.class, is1);
+ WxMpServiceImpl wxService = new WxMpServiceImpl();
+ wxService.setWxMpConfigStorage(config);
- binder.bind(WxServiceImpl.class).toInstance(wxService);
- binder.bind(WxConfigStorage.class).toInstance(config);
+ binder.bind(WxMpServiceImpl.class).toInstance(wxService);
+ binder.bind(WxMpConfigStorage.class).toInstance(config);
} catch (JAXBException e) {
throw new RuntimeException(e);
}
@@ -44,7 +40,7 @@ public class ApiTestModule implements Module {
@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
- public static class WxXmlConfigStorage extends WxInMemoryConfigStorage {
+ public static class WxXmlMpInMemoryConfigStorage extends WxMpInMemoryConfigStorage {
protected String openId;
diff --git a/src/test/java/me/chanjar/weixin/api/WxBaseAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxBaseAPITest.java
similarity index 76%
rename from src/test/java/me/chanjar/weixin/api/WxBaseAPITest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxBaseAPITest.java
index af524615..65d88928 100644
--- a/src/test/java/me/chanjar/weixin/api/WxBaseAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxBaseAPITest.java
@@ -1,11 +1,11 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
import org.apache.commons.lang3.StringUtils;
import org.testng.Assert;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import me.chanjar.weixin.exception.WxErrorException;
+import me.chanjar.weixin.common.exception.WxErrorException;
import com.google.inject.Inject;
@@ -19,10 +19,10 @@ import com.google.inject.Inject;
public class WxBaseAPITest {
@Inject
- protected WxServiceImpl wxService;
+ protected WxMpServiceImpl wxService;
public void testRefreshAccessToken() throws WxErrorException {
- WxConfigStorage configStorage = wxService.wxConfigStorage;
+ WxMpConfigStorage configStorage = wxService.wxMpConfigStorage;
String before = configStorage.getAccessToken();
wxService.accessTokenRefresh();
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
new file mode 100644
index 00000000..04e8400e
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpCustomMessageAPITest.java
@@ -0,0 +1,34 @@
+package me.chanjar.weixin.mp.api;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import me.chanjar.weixin.common.exception.WxErrorException;
+
+import com.google.inject.Inject;
+
+/***
+ * 测试发送客服消息
+ * @author chanjarster
+ *
+ */
+@Test(groups="customMessageAPI", dependsOnGroups = "baseAPI")
+@Guice(modules = ApiTestModule.class)
+public class WxMpCustomMessageAPITest {
+
+ @Inject
+ protected WxMpServiceImpl wxService;
+
+ public void testSendCustomMessage() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) wxService.wxMpConfigStorage;
+ WxMpCustomMessage message = new WxMpCustomMessage();
+ message.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
+ message.setToUser(configStorage.getOpenId());
+ message.setContent("欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
+
+ wxService.customMessageSend(message);
+ }
+
+}
diff --git a/src/test/java/me/chanjar/weixin/api/WxGroupAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpGroupAPITest.java
similarity index 69%
rename from src/test/java/me/chanjar/weixin/api/WxGroupAPITest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpGroupAPITest.java
index 74abb563..ca6f20ed 100644
--- a/src/test/java/me/chanjar/weixin/api/WxGroupAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpGroupAPITest.java
@@ -1,13 +1,13 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
import java.util.List;
+import me.chanjar.weixin.mp.bean.WxMpGroup;
import org.testng.Assert;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import me.chanjar.weixin.bean.WxGroup;
-import me.chanjar.weixin.exception.WxErrorException;
+import me.chanjar.weixin.common.exception.WxErrorException;
import com.google.inject.Inject;
@@ -18,24 +18,24 @@ import com.google.inject.Inject;
*/
@Test(groups = "groupAPI", dependsOnGroups = "baseAPI")
@Guice(modules = ApiTestModule.class)
-public class WxGroupAPITest {
+public class WxMpGroupAPITest {
@Inject
- protected WxServiceImpl wxService;
+ protected WxMpServiceImpl wxService;
- protected WxGroup group;
+ protected WxMpGroup group;
public void testGroupCreate() throws WxErrorException {
- WxGroup res = wxService.groupCreate("测试分组1");
+ WxMpGroup res = wxService.groupCreate("测试分组1");
Assert.assertEquals(res.getName(), "测试分组1");
}
@Test(dependsOnMethods="testGroupCreate")
public void testGroupGet() throws WxErrorException {
- List groupList = wxService.groupGet();
+ List groupList = wxService.groupGet();
Assert.assertNotNull(groupList);
Assert.assertTrue(groupList.size() > 0);
- for (WxGroup g : groupList) {
+ for (WxMpGroup g : groupList) {
group = g;
Assert.assertNotNull(g.getName());
}
diff --git a/src/test/java/me/chanjar/weixin/api/WxMassMessageAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java
similarity index 55%
rename from src/test/java/me/chanjar/weixin/api/WxMassMessageAPITest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java
index c942ce38..78a48c2f 100644
--- a/src/test/java/me/chanjar/weixin/api/WxMassMessageAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java
@@ -1,23 +1,22 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
import java.io.IOException;
import java.io.InputStream;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+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.WxMpMassVideo;
+import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
+import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import me.chanjar.weixin.api.ApiTestModule.WxXmlConfigStorage;
-import me.chanjar.weixin.bean.WxMassGroupMessage;
-import me.chanjar.weixin.bean.WxMassNews;
-import me.chanjar.weixin.bean.WxMassNews.WxMassNewsArticle;
-import me.chanjar.weixin.bean.WxMassOpenIdsMessage;
-import me.chanjar.weixin.bean.WxMassVideo;
-import me.chanjar.weixin.bean.result.WxMassSendResult;
-import me.chanjar.weixin.bean.result.WxMassUploadResult;
-import me.chanjar.weixin.bean.result.WxMediaUploadResult;
-import me.chanjar.weixin.exception.WxErrorException;
+import me.chanjar.weixin.common.exception.WxErrorException;
import com.google.inject.Inject;
@@ -28,61 +27,61 @@ import com.google.inject.Inject;
*/
@Test(groups = "massAPI", dependsOnGroups = { "baseAPI", "mediaAPI", "groupAPI"})
@Guice(modules = ApiTestModule.class)
-public class WxMassMessageAPITest {
+public class WxMpMassMessageAPITest {
@Inject
- protected WxServiceImpl wxService;
+ protected WxMpServiceImpl wxService;
@Test
public void testTextMassOpenIdsMessageSend() throws WxErrorException {
// 发送群发消息
- WxXmlConfigStorage configProvider = (WxXmlConfigStorage) wxService.wxConfigStorage;
- WxMassOpenIdsMessage massMessage = new WxMassOpenIdsMessage();
- massMessage.setMsgtype(WxConsts.MASS_MSG_TEXT);
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configProvider = (ApiTestModule.WxXmlMpInMemoryConfigStorage) wxService.wxMpConfigStorage;
+ WxMpMassOpenIdsMessage massMessage = new WxMpMassOpenIdsMessage();
+ massMessage.setMsgType(WxConsts.MASS_MSG_TEXT);
massMessage.setContent("测试群发消息\n欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
- massMessage.getTouser().add(configProvider.getOpenId());
+ massMessage.getToUsers().add(configProvider.getOpenId());
- WxMassSendResult massResult = wxService.massOpenIdsMessageSend(massMessage);
+ WxMpMassSendResult massResult = wxService.massOpenIdsMessageSend(massMessage);
Assert.assertNotNull(massResult);
- Assert.assertNotNull(massResult.getMsg_id());
+ Assert.assertNotNull(massResult.getMsgId());
}
@Test(dataProvider="massMessages")
public void testMediaMassOpenIdsMessageSend(String massMsgType, String mediaId) throws WxErrorException, IOException {
// 发送群发消息
- WxXmlConfigStorage configProvider = (WxXmlConfigStorage) wxService.wxConfigStorage;
- WxMassOpenIdsMessage massMessage = new WxMassOpenIdsMessage();
- massMessage.setMsgtype(massMsgType);
- massMessage.setMedia_id(mediaId);
- massMessage.getTouser().add(configProvider.getOpenId());
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configProvider = (ApiTestModule.WxXmlMpInMemoryConfigStorage) wxService.wxMpConfigStorage;
+ WxMpMassOpenIdsMessage massMessage = new WxMpMassOpenIdsMessage();
+ massMessage.setMsgType(massMsgType);
+ massMessage.setMediaId(mediaId);
+ massMessage.getToUsers().add(configProvider.getOpenId());
- WxMassSendResult massResult = wxService.massOpenIdsMessageSend(massMessage);
+ WxMpMassSendResult massResult = wxService.massOpenIdsMessageSend(massMessage);
Assert.assertNotNull(massResult);
- Assert.assertNotNull(massResult.getMsg_id());
+ Assert.assertNotNull(massResult.getMsgId());
}
@Test
public void testTextMassGroupMessageSend() throws WxErrorException {
- WxMassGroupMessage massMessage = new WxMassGroupMessage();
+ WxMpMassGroupMessage massMessage = new WxMpMassGroupMessage();
massMessage.setMsgtype(WxConsts.MASS_MSG_TEXT);
massMessage.setContent("测试群发消息\n欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
- massMessage.setGroup_id(wxService.groupGet().get(0).getId());
+ massMessage.setGroupId(wxService.groupGet().get(0).getId());
- WxMassSendResult massResult = wxService.massGroupMessageSend(massMessage);
+ WxMpMassSendResult massResult = wxService.massGroupMessageSend(massMessage);
Assert.assertNotNull(massResult);
- Assert.assertNotNull(massResult.getMsg_id());
+ Assert.assertNotNull(massResult.getMsgId());
}
@Test(dataProvider="massMessages")
public void testMediaMassGroupMessageSend(String massMsgType, String mediaId) throws WxErrorException, IOException {
- WxMassGroupMessage massMessage = new WxMassGroupMessage();
+ WxMpMassGroupMessage massMessage = new WxMpMassGroupMessage();
massMessage.setMsgtype(massMsgType);
- massMessage.setMedia_id(mediaId);
- massMessage.setGroup_id(wxService.groupGet().get(0).getId());
+ massMessage.setMediaId(mediaId);
+ massMessage.setGroupId(wxService.groupGet().get(0).getId());
- WxMassSendResult massResult = wxService.massGroupMessageSend(massMessage);
+ WxMpMassSendResult massResult = wxService.massGroupMessageSend(massMessage);
Assert.assertNotNull(massResult);
- Assert.assertNotNull(massResult.getMsg_id());
+ Assert.assertNotNull(massResult.getMsgId());
}
@DataProvider
@@ -96,17 +95,17 @@ public class WxMassMessageAPITest {
InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.mp4");
WxMediaUploadResult uploadMediaRes = wxService.mediaUpload(WxConsts.MEDIA_VIDEO, WxConsts.FILE_MP4, inputStream);
Assert.assertNotNull(uploadMediaRes);
- Assert.assertNotNull(uploadMediaRes.getMedia_id());
+ Assert.assertNotNull(uploadMediaRes.getMediaId());
// 把视频变成可被群发的媒体
- WxMassVideo video = new WxMassVideo();
+ WxMpMassVideo video = new WxMpMassVideo();
video.setTitle("测试标题");
video.setDescription("测试描述");
- video.setMedia_id(uploadMediaRes.getMedia_id());
- WxMassUploadResult uploadResult = wxService.massVideoUpload(video);
+ video.setMediaId(uploadMediaRes.getMediaId());
+ WxMpMassUploadResult uploadResult = wxService.massVideoUpload(video);
Assert.assertNotNull(uploadResult);
- Assert.assertNotNull(uploadResult.getMedia_id());
- messages[0] = new Object[] { WxConsts.MASS_MSG_VIDEO, uploadResult.getMedia_id() };
+ Assert.assertNotNull(uploadResult.getMediaId());
+ messages[0] = new Object[] { WxConsts.MASS_MSG_VIDEO, uploadResult.getMediaId() };
}
/**
* 图片素材
@@ -115,8 +114,8 @@ public class WxMassMessageAPITest {
InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
WxMediaUploadResult uploadMediaRes = wxService.mediaUpload(WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, inputStream);
Assert.assertNotNull(uploadMediaRes);
- Assert.assertNotNull(uploadMediaRes.getMedia_id());
- messages[1] = new Object[] { WxConsts.MASS_MSG_IMAGE, uploadMediaRes.getMedia_id() };
+ Assert.assertNotNull(uploadMediaRes.getMediaId());
+ messages[1] = new Object[] { WxConsts.MASS_MSG_IMAGE, uploadMediaRes.getMediaId() };
}
/**
* 语音素材
@@ -125,8 +124,8 @@ public class WxMassMessageAPITest {
InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.mp3");
WxMediaUploadResult uploadMediaRes = wxService.mediaUpload(WxConsts.MEDIA_VOICE, WxConsts.FILE_MP3, inputStream);
Assert.assertNotNull(uploadMediaRes);
- Assert.assertNotNull(uploadMediaRes.getMedia_id());
- messages[2] = new Object[] { WxConsts.MASS_MSG_VOICE, uploadMediaRes.getMedia_id() };
+ Assert.assertNotNull(uploadMediaRes.getMediaId());
+ messages[2] = new Object[] { WxConsts.MASS_MSG_VOICE, uploadMediaRes.getMediaId() };
}
/**
* 图文素材
@@ -136,30 +135,30 @@ public class WxMassMessageAPITest {
InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
WxMediaUploadResult uploadMediaRes = wxService.mediaUpload(WxConsts.MEDIA_IMAGE, WxConsts.FILE_JPG, inputStream);
Assert.assertNotNull(uploadMediaRes);
- Assert.assertNotNull(uploadMediaRes.getMedia_id());
+ Assert.assertNotNull(uploadMediaRes.getMediaId());
// 上传图文消息
- WxMassNews news = new WxMassNews();
- WxMassNewsArticle article1 = new WxMassNewsArticle();
+ WxMpMassNews news = new WxMpMassNews();
+ WxMpMassNews.WxMpMassNewsArticle article1 = new WxMpMassNews.WxMpMassNewsArticle();
article1.setTitle("标题1");
article1.setContent("内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1");
- article1.setThumb_media_id(uploadMediaRes.getMedia_id());
+ article1.setThumbMediaId(uploadMediaRes.getMediaId());
news.addArticle(article1);
- WxMassNewsArticle article2 = new WxMassNewsArticle();
+ 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");
- article2.setThumb_media_id(uploadMediaRes.getMedia_id());
- article2.setShow_cover_pic(true);
+ article2.setThumbMediaId(uploadMediaRes.getMediaId());
+ article2.setShowCoverPic(true);
article2.setAuthor("作者2");
- article2.setContent_source_url("www.baidu.com");
+ article2.setContentSourceUrl("www.baidu.com");
article2.setDigest("摘要2");
news.addArticle(article2);
- WxMassUploadResult massUploadResult = wxService.massNewsUpload(news);
+ WxMpMassUploadResult massUploadResult = wxService.massNewsUpload(news);
Assert.assertNotNull(massUploadResult);
- Assert.assertNotNull(uploadMediaRes.getMedia_id());
- messages[3] = new Object[] { WxConsts.MASS_MSG_NEWS, massUploadResult.getMedia_id() };
+ Assert.assertNotNull(uploadMediaRes.getMediaId());
+ messages[3] = new Object[] { WxConsts.MASS_MSG_NEWS, massUploadResult.getMediaId() };
}
return messages;
}
diff --git a/src/test/java/me/chanjar/weixin/api/WxMediaAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMediaAPITest.java
similarity index 75%
rename from src/test/java/me/chanjar/weixin/api/WxMediaAPITest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMediaAPITest.java
index ff5ec5fa..e012df40 100644
--- a/src/test/java/me/chanjar/weixin/api/WxMediaAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMediaAPITest.java
@@ -1,17 +1,18 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import me.chanjar.weixin.bean.result.WxMediaUploadResult;
-import me.chanjar.weixin.exception.WxErrorException;
+import me.chanjar.weixin.common.exception.WxErrorException;
import com.google.inject.Inject;
@@ -22,10 +23,10 @@ import com.google.inject.Inject;
*/
@Test(groups="mediaAPI", dependsOnGroups="baseAPI")
@Guice(modules = ApiTestModule.class)
-public class WxMediaAPITest {
+public class WxMpMediaAPITest {
@Inject
- protected WxServiceImpl wxService;
+ protected WxMpServiceImpl wxService;
private List media_ids = new ArrayList();
@@ -34,14 +35,14 @@ public class WxMediaAPITest {
InputStream inputStream = ClassLoader.getSystemResourceAsStream(fileName);
WxMediaUploadResult res = wxService.mediaUpload(mediaType, fileType, inputStream);
Assert.assertNotNull(res.getType());
- Assert.assertNotNull(res.getCreated_at());
- Assert.assertTrue(res.getMedia_id() != null || res.getThumb_media_id() != null);
+ Assert.assertNotNull(res.getCreatedAt());
+ Assert.assertTrue(res.getMediaId() != null || res.getThumbMediaId() != null);
- if (res.getMedia_id() != null) {
- media_ids.add(res.getMedia_id());
+ if (res.getMediaId() != null) {
+ media_ids.add(res.getMediaId());
}
- if (res.getThumb_media_id() != null) {
- media_ids.add(res.getThumb_media_id());
+ if (res.getThumbMediaId() != null) {
+ media_ids.add(res.getThumbMediaId());
}
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java
new file mode 100644
index 00000000..335442b7
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMenuAPITest.java
@@ -0,0 +1,92 @@
+package me.chanjar.weixin.mp.api;
+
+import javax.xml.bind.JAXBException;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import com.google.inject.Inject;
+
+import me.chanjar.weixin.common.bean.WxMenu;
+import me.chanjar.weixin.common.bean.WxMenu.WxMenuButton;
+import me.chanjar.weixin.common.exception.WxErrorException;
+
+/**
+ * 测试菜单
+ * @author chanjarster
+ *
+ */
+@Test(groups="menuAPI", dependsOnGroups="baseAPI")
+@Guice(modules = ApiTestModule.class)
+public class WxMpMenuAPITest {
+
+ @Inject
+ protected WxMpServiceImpl wxService;
+
+ @Test(dataProvider = "menu")
+ public void testCreateMenu(WxMenu wxMenu) throws WxErrorException {
+ wxService.menuCreate(wxMenu);
+ }
+
+ @Test(dependsOnMethods = { "testCreateMenu"})
+ public void testGetMenu() throws WxErrorException {
+ Assert.assertNotNull(wxService.menuGet());
+ }
+
+ @Test(dependsOnMethods = { "testGetMenu"})
+ public void testDeleteMenu() throws WxErrorException {
+ wxService.menuDelete();
+ }
+
+ @DataProvider(name="menu")
+ public Object[][] getMenu() throws JAXBException {
+ WxMenu menu = new WxMenu();
+ WxMenuButton button1 = new WxMenuButton();
+ button1.setType(WxConsts.BUTTON_CLICK);
+ button1.setName("今日歌曲");
+ button1.setKey("V1001_TODAY_MUSIC");
+
+ WxMenuButton button2 = new WxMenuButton();
+ button2.setType(WxConsts.BUTTON_CLICK);
+ button2.setName("歌手简介");
+ button2.setKey("V1001_TODAY_SINGER");
+
+ WxMenuButton button3 = new WxMenuButton();
+ button3.setName("菜单");
+
+ menu.getButtons().add(button1);
+ menu.getButtons().add(button2);
+ menu.getButtons().add(button3);
+
+ WxMenuButton button31 = new WxMenuButton();
+ button31.setType(WxConsts.BUTTON_VIEW);
+ button31.setName("搜索");
+ button31.setUrl("http://www.soso.com/");
+
+ WxMenuButton button32 = new WxMenuButton();
+ button32.setType(WxConsts.BUTTON_VIEW);
+ button32.setName("视频");
+ button32.setUrl("http://v.qq.com/");
+
+ WxMenuButton button33 = new WxMenuButton();
+ button33.setType(WxConsts.BUTTON_CLICK);
+ button33.setName("赞一下我们");
+ button33.setKey("V1001_GOOD");
+
+ button3.getSubButtons().add(button31);
+ button3.getSubButtons().add(button32);
+ button3.getSubButtons().add(button33);
+
+ return new Object[][] {
+ new Object[] {
+ menu
+ }
+ };
+
+ }
+
+
+}
diff --git a/src/test/java/me/chanjar/weixin/api/WxMessageRouterTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java
similarity index 59%
rename from src/test/java/me/chanjar/weixin/api/WxMessageRouterTest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java
index 50423a1a..b43ca3c8 100644
--- a/src/test/java/me/chanjar/weixin/api/WxMessageRouterTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java
@@ -1,65 +1,62 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
import java.util.Map;
-import me.chanjar.weixin.api.WxConsts;
-import me.chanjar.weixin.api.WxMessageHandler;
-import me.chanjar.weixin.api.WxMessageRouter;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
+import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
-import me.chanjar.weixin.bean.WxXmlMessage;
-import me.chanjar.weixin.bean.WxXmlOutMessage;
-
/**
* 测试消息路由器
* @author chanjarster
*
*/
@Test
-public class WxMessageRouterTest {
+public class WxMpMessageRouterTest {
@Test(enabled = false)
- public void prepare(boolean async, StringBuffer sb, WxMessageRouter router) {
+ public void prepare(boolean async, StringBuffer sb, WxMpMessageRouter router) {
router
.rule()
.async(async)
.msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1").content("CONTENT_1")
- .handler(new WxEchoMessageHandler(sb, "COMBINE_4"))
+ .handler(new WxEchoMpMessageHandler(sb, "COMBINE_4"))
.end()
.rule()
.async(async)
.msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK).eventKey("KEY_1")
- .handler(new WxEchoMessageHandler(sb, "COMBINE_3"))
+ .handler(new WxEchoMpMessageHandler(sb, "COMBINE_3"))
.end()
.rule()
.async(async)
.msgType(WxConsts.XML_MSG_TEXT).event(WxConsts.EVT_CLICK)
- .handler(new WxEchoMessageHandler(sb, "COMBINE_2"))
+ .handler(new WxEchoMpMessageHandler(sb, "COMBINE_2"))
.end()
- .rule().async(async).msgType(WxConsts.XML_MSG_TEXT).handler(new WxEchoMessageHandler(sb, WxConsts.XML_MSG_TEXT)).end()
- .rule().async(async).event(WxConsts.EVT_CLICK).handler(new WxEchoMessageHandler(sb, WxConsts.EVT_CLICK)).end()
- .rule().async(async).eventKey("KEY_1").handler(new WxEchoMessageHandler(sb, "KEY_1")).end()
- .rule().async(async).content("CONTENT_1").handler(new WxEchoMessageHandler(sb, "CONTENT_1")).end()
- .rule().async(async).rContent(".*bc.*").handler(new WxEchoMessageHandler(sb, "abcd")).end()
- .rule().async(async).handler(new WxEchoMessageHandler(sb, "ALL")).end();
+ .rule().async(async).msgType(WxConsts.XML_MSG_TEXT).handler(new WxEchoMpMessageHandler(sb, WxConsts.XML_MSG_TEXT)).end()
+ .rule().async(async).event(WxConsts.EVT_CLICK).handler(new WxEchoMpMessageHandler(sb, WxConsts.EVT_CLICK)).end()
+ .rule().async(async).eventKey("KEY_1").handler(new WxEchoMpMessageHandler(sb, "KEY_1")).end()
+ .rule().async(async).content("CONTENT_1").handler(new WxEchoMpMessageHandler(sb, "CONTENT_1")).end()
+ .rule().async(async).rContent(".*bc.*").handler(new WxEchoMpMessageHandler(sb, "abcd")).end()
+ .rule().async(async).handler(new WxEchoMpMessageHandler(sb, "ALL")).end();
;
}
@Test(dataProvider="messages-1")
- public void testSync(WxXmlMessage message, String expected) {
+ public void testSync(WxMpXmlMessage message, String expected) {
StringBuffer sb = new StringBuffer();
- WxMessageRouter router = new WxMessageRouter();
+ WxMpMessageRouter router = new WxMpMessageRouter();
prepare(false, sb, router);
router.route(message);
Assert.assertEquals(sb.toString(), expected);
}
@Test(dataProvider="messages-1")
- public void testAsync(WxXmlMessage message, String expected) throws InterruptedException {
+ public void testAsync(WxMpXmlMessage message, String expected) throws InterruptedException {
StringBuffer sb = new StringBuffer();
- WxMessageRouter router = new WxMessageRouter();
+ WxMpMessageRouter router = new WxMpMessageRouter();
prepare(true, sb, router);
router.route(message);
Thread.sleep(500l);
@@ -67,16 +64,15 @@ public class WxMessageRouterTest {
}
public void testConcurrency() throws InterruptedException {
- final WxMessageRouter router = new WxMessageRouter();
- router.rule().handler(new WxMessageHandler() {
+ final WxMpMessageRouter router = new WxMpMessageRouter();
+ router.rule().handler(new WxMpMessageHandler() {
@Override
- public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map context) {
- System.out.println(wxMessage.toString());
+ public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context) {
return null;
}
}).end();
- final WxXmlMessage m = new WxXmlMessage();
+ final WxMpXmlMessage m = new WxMpXmlMessage();
Runnable r = new Runnable() {
@Override
public void run() {
@@ -95,34 +91,34 @@ public class WxMessageRouterTest {
}
@DataProvider(name="messages-1")
public Object[][] messages2() {
- WxXmlMessage message1 = new WxXmlMessage();
+ WxMpXmlMessage message1 = new WxMpXmlMessage();
message1.setMsgType(WxConsts.XML_MSG_TEXT);
- WxXmlMessage message2 = new WxXmlMessage();
+ WxMpXmlMessage message2 = new WxMpXmlMessage();
message2.setEvent(WxConsts.EVT_CLICK);
- WxXmlMessage message3 = new WxXmlMessage();
+ WxMpXmlMessage message3 = new WxMpXmlMessage();
message3.setEventKey("KEY_1");
- WxXmlMessage message4 = new WxXmlMessage();
+ WxMpXmlMessage message4 = new WxMpXmlMessage();
message4.setContent("CONTENT_1");
- WxXmlMessage message5 = new WxXmlMessage();
+ WxMpXmlMessage message5 = new WxMpXmlMessage();
message5.setContent("BLA");
- WxXmlMessage message6 = new WxXmlMessage();
+ WxMpXmlMessage message6 = new WxMpXmlMessage();
message6.setContent("abcd");
- WxXmlMessage c2 = new WxXmlMessage();
+ WxMpXmlMessage c2 = new WxMpXmlMessage();
c2.setMsgType(WxConsts.XML_MSG_TEXT);
c2.setEvent(WxConsts.EVT_CLICK);
- WxXmlMessage c3 = new WxXmlMessage();
+ WxMpXmlMessage c3 = new WxMpXmlMessage();
c3.setMsgType(WxConsts.XML_MSG_TEXT);
c3.setEvent(WxConsts.EVT_CLICK);
c3.setEventKey("KEY_1");
- WxXmlMessage c4 = new WxXmlMessage();
+ WxMpXmlMessage c4 = new WxMpXmlMessage();
c4.setMsgType(WxConsts.XML_MSG_TEXT);
c4.setEvent(WxConsts.EVT_CLICK);
c4.setEventKey("KEY_1");
@@ -130,7 +126,7 @@ public class WxMessageRouterTest {
return new Object[][] {
new Object[] { message1, WxConsts.XML_MSG_TEXT + "," },
- new Object[] { message2, WxConsts.EVT_CLICK + "," },
+ new Object[] { message2, WxConsts.EVT_CLICK + "," },
new Object[] { message3, "KEY_1," },
new Object[] { message4, "CONTENT_1," },
new Object[] { message5, "ALL," },
@@ -142,18 +138,18 @@ public class WxMessageRouterTest {
}
- public static class WxEchoMessageHandler implements WxMessageHandler {
+ public static class WxEchoMpMessageHandler implements WxMpMessageHandler {
private StringBuffer sb;
private String echoStr;
- public WxEchoMessageHandler(StringBuffer sb, String echoStr) {
+ public WxEchoMpMessageHandler(StringBuffer sb, String echoStr) {
this.sb = sb;
this.echoStr = echoStr;
}
@Override
- public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map context) {
+ public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context) {
sb.append(this.echoStr).append(',');
return null;
}
diff --git a/src/test/java/me/chanjar/weixin/api/WxQrCodeAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpQrCodeAPITest.java
similarity index 68%
rename from src/test/java/me/chanjar/weixin/api/WxQrCodeAPITest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpQrCodeAPITest.java
index 1c07072f..2a206d2e 100644
--- a/src/test/java/me/chanjar/weixin/api/WxQrCodeAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpQrCodeAPITest.java
@@ -1,13 +1,13 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
import java.io.File;
+import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
import org.testng.Assert;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import me.chanjar.weixin.bean.result.WxQrCodeTicket;
-import me.chanjar.weixin.exception.WxErrorException;
+import me.chanjar.weixin.common.exception.WxErrorException;
import com.google.inject.Inject;
@@ -18,27 +18,27 @@ import com.google.inject.Inject;
*/
@Test(groups = "qrCodeAPI", dependsOnGroups = { "baseAPI" })
@Guice(modules = ApiTestModule.class)
-public class WxQrCodeAPITest {
+public class WxMpQrCodeAPITest {
@Inject
- protected WxServiceImpl wxService;
+ protected WxMpServiceImpl wxService;
public void testQrCodeCreateTmpTicket() throws WxErrorException {
- WxQrCodeTicket ticket = wxService.qrCodeCreateTmpTicket(1, null);
+ WxMpQrCodeTicket ticket = wxService.qrCodeCreateTmpTicket(1, null);
Assert.assertNotNull(ticket.getUrl());
Assert.assertNotNull(ticket.getTicket());
Assert.assertTrue(ticket.getExpire_seconds() != -1);
}
public void testQrCodeCreateLastTicket() throws WxErrorException {
- WxQrCodeTicket ticket = wxService.qrCodeCreateLastTicket(1);
+ WxMpQrCodeTicket ticket = wxService.qrCodeCreateLastTicket(1);
Assert.assertNotNull(ticket.getUrl());
Assert.assertNotNull(ticket.getTicket());
Assert.assertTrue(ticket.getExpire_seconds() == -1);
}
public void testQrCodePicture() throws WxErrorException {
- WxQrCodeTicket ticket = wxService.qrCodeCreateLastTicket(1);
+ WxMpQrCodeTicket ticket = wxService.qrCodeCreateLastTicket(1);
File file = wxService.qrCodePicture(ticket);
Assert.assertNotNull(file);
}
diff --git a/src/test/java/me/chanjar/weixin/api/WxShortUrlAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
similarity index 73%
rename from src/test/java/me/chanjar/weixin/api/WxShortUrlAPITest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
index 3df6e217..e854ed08 100644
--- a/src/test/java/me/chanjar/weixin/api/WxShortUrlAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
@@ -1,10 +1,10 @@
-package me.chanjar.weixin.api;
+package me.chanjar.weixin.mp.api;
import org.testng.Assert;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import me.chanjar.weixin.exception.WxErrorException;
+import me.chanjar.weixin.common.exception.WxErrorException;
import com.google.inject.Inject;
@@ -15,10 +15,10 @@ import com.google.inject.Inject;
*/
@Test(groups = "shortURLAPI", dependsOnGroups = { "baseAPI" })
@Guice(modules = ApiTestModule.class)
-public class WxShortUrlAPITest {
+public class WxMpShortUrlAPITest {
@Inject
- protected WxServiceImpl wxService;
+ protected WxMpServiceImpl wxService;
public void testShortUrl() throws WxErrorException {
String shortUrl = wxService.shortUrl("www.baidu.com");
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpUserAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpUserAPITest.java
new file mode 100644
index 00000000..c29bda83
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpUserAPITest.java
@@ -0,0 +1,55 @@
+package me.chanjar.weixin.mp.api;
+
+import me.chanjar.weixin.mp.bean.result.WxMpUserList;
+import org.testng.Assert;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import me.chanjar.weixin.common.exception.WxErrorException;
+
+import com.google.inject.Inject;
+
+/**
+ * 测试用户相关的接口
+ * @author chanjarster
+ *
+ */
+@Test(groups = "userAPI", dependsOnGroups = { "baseAPI", "groupAPI" })
+@Guice(modules = ApiTestModule.class)
+public class WxMpUserAPITest {
+
+ @Inject
+ protected WxMpServiceImpl wxService;
+
+ public void testUserUpdateRemark() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configProvider = (ApiTestModule.WxXmlMpInMemoryConfigStorage) wxService.wxMpConfigStorage;
+ wxService.userUpdateRemark(configProvider.getOpenId(), "测试备注名");
+ }
+
+ public void testUserInfo() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configProvider = (ApiTestModule.WxXmlMpInMemoryConfigStorage) wxService.wxMpConfigStorage;
+ WxMpUser user = wxService.userInfo(configProvider.getOpenId(), null);
+ Assert.assertNotNull(user);
+ }
+
+ public void testUserList() throws WxErrorException {
+ WxMpUserList wxMpUserList = wxService.userList(null);
+ Assert.assertNotNull(wxMpUserList);
+ Assert.assertFalse(wxMpUserList.getCount() == -1);
+ Assert.assertFalse(wxMpUserList.getTotal() == -1);
+ Assert.assertFalse(wxMpUserList.getOpenIds().size() == -1);
+ }
+
+ public void testGroupQueryUserGroup() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) wxService.wxMpConfigStorage;
+ long groupid = wxService.userGetGroup(configStorage.getOpenId());
+ Assert.assertTrue(groupid != -1l);
+ }
+
+ public void getGroupMoveUser() throws WxErrorException {
+ ApiTestModule.WxXmlMpInMemoryConfigStorage configStorage = (ApiTestModule.WxXmlMpInMemoryConfigStorage) wxService.wxMpConfigStorage;
+ wxService.userUpdateGroup(configStorage.getOpenId(), wxService.groupGet().get(3).getId());
+ }
+
+}
diff --git a/src/test/java/me/chanjar/weixin/bean/WxCustomMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpCustomMessageTest.java
similarity index 65%
rename from src/test/java/me/chanjar/weixin/bean/WxCustomMessageTest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpCustomMessageTest.java
index d96e928b..68947b41 100644
--- a/src/test/java/me/chanjar/weixin/bean/WxCustomMessageTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpCustomMessageTest.java
@@ -1,109 +1,108 @@
-package me.chanjar.weixin.bean;
+package me.chanjar.weixin.mp.bean;
-import me.chanjar.weixin.bean.WxCustomMessage;
+import me.chanjar.weixin.common.api.WxConsts;
import org.testng.Assert;
import org.testng.annotations.Test;
-import me.chanjar.weixin.api.WxConsts;
-import me.chanjar.weixin.bean.WxCustomMessage.WxArticle;
+import me.chanjar.weixin.mp.bean.WxMpCustomMessage.WxArticle;
@Test
-public class WxCustomMessageTest {
+public class WxMpCustomMessageTest {
public void testTextReply() {
- WxCustomMessage reply = new WxCustomMessage();
- reply.setTouser("OPENID");
- reply.setMsgtype(WxConsts.CUSTOM_MSG_TEXT);
+ WxMpCustomMessage reply = new WxMpCustomMessage();
+ reply.setToUser("OPENID");
+ reply.setMsgType(WxConsts.CUSTOM_MSG_TEXT);
reply.setContent("sfsfdsdf");
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
}
public void testTextBuild() {
- WxCustomMessage reply = WxCustomMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build();
+ WxMpCustomMessage reply = WxMpCustomMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build();
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
}
public void testImageReply() {
- WxCustomMessage reply = new WxCustomMessage();
- reply.setTouser("OPENID");
- reply.setMsgtype(WxConsts.CUSTOM_MSG_IMAGE);
- reply.setMedia_id("MEDIA_ID");
+ WxMpCustomMessage reply = new WxMpCustomMessage();
+ reply.setToUser("OPENID");
+ reply.setMsgType(WxConsts.CUSTOM_MSG_IMAGE);
+ reply.setMediaId("MEDIA_ID");
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
}
public void testImageBuild() {
- WxCustomMessage reply = WxCustomMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build();
+ WxMpCustomMessage reply = WxMpCustomMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build();
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
}
public void testVoiceReply() {
- WxCustomMessage reply = new WxCustomMessage();
- reply.setTouser("OPENID");
- reply.setMsgtype(WxConsts.CUSTOM_MSG_VOICE);
- reply.setMedia_id("MEDIA_ID");
+ WxMpCustomMessage reply = new WxMpCustomMessage();
+ reply.setToUser("OPENID");
+ reply.setMsgType(WxConsts.CUSTOM_MSG_VOICE);
+ reply.setMediaId("MEDIA_ID");
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}");
}
public void testVoiceBuild() {
- WxCustomMessage reply = WxCustomMessage.VOICE().toUser("OPENID").mediaId("MEDIA_ID").build();
+ WxMpCustomMessage reply = WxMpCustomMessage.VOICE().toUser("OPENID").mediaId("MEDIA_ID").build();
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}");
}
public void testVideoReply() {
- WxCustomMessage reply = new WxCustomMessage();
- reply.setTouser("OPENID");
- reply.setMsgtype(WxConsts.CUSTOM_MSG_VIDEO);
- reply.setMedia_id("MEDIA_ID");
- reply.setThumb_media_id("MEDIA_ID");
+ WxMpCustomMessage reply = new WxMpCustomMessage();
+ reply.setToUser("OPENID");
+ reply.setMsgType(WxConsts.CUSTOM_MSG_VIDEO);
+ reply.setMediaId("MEDIA_ID");
+ reply.setThumbMediaId("MEDIA_ID");
reply.setTitle("TITLE");
reply.setDescription("DESCRIPTION");
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}");
}
public void testVideoBuild() {
- WxCustomMessage reply = WxCustomMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID").thumbMediaId("MEDIA_ID").description("DESCRIPTION").build();
+ WxMpCustomMessage reply = WxMpCustomMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID").thumbMediaId("MEDIA_ID").description("DESCRIPTION").build();
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}");
}
public void testMusicReply() {
- WxCustomMessage reply = new WxCustomMessage();
- reply.setTouser("OPENID");
- reply.setMsgtype(WxConsts.CUSTOM_MSG_MUSIC);
- reply.setThumb_media_id("MEDIA_ID");
+ WxMpCustomMessage reply = new WxMpCustomMessage();
+ reply.setToUser("OPENID");
+ reply.setMsgType(WxConsts.CUSTOM_MSG_MUSIC);
+ reply.setThumbMediaId("MEDIA_ID");
reply.setDescription("DESCRIPTION");
reply.setTitle("TITLE");
- reply.setMusicurl("MUSIC_URL");
- reply.setHqmusicurl("HQ_MUSIC_URL");
+ reply.setMusicUrl("MUSIC_URL");
+ reply.setHqMusicUrl("HQ_MUSIC_URL");
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"music\",\"music\":{\"title\":\"TITLE\",\"description\":\"DESCRIPTION\",\"thumb_media_id\":\"MEDIA_ID\",\"musicurl\":\"MUSIC_URL\",\"hqmusicurl\":\"HQ_MUSIC_URL\"}}");
}
public void testMusicBuild() {
- WxCustomMessage reply = WxCustomMessage.MUSIC()
+ WxMpCustomMessage reply = WxMpCustomMessage.MUSIC()
.toUser("OPENID")
.title("TITLE")
.thumbMediaId("MEDIA_ID")
.description("DESCRIPTION")
.musicUrl("MUSIC_URL")
- .hqmusicUrl("HQ_MUSIC_URL")
+ .hqMusicUrl("HQ_MUSIC_URL")
.build();
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"music\",\"music\":{\"title\":\"TITLE\",\"description\":\"DESCRIPTION\",\"thumb_media_id\":\"MEDIA_ID\",\"musicurl\":\"MUSIC_URL\",\"hqmusicurl\":\"HQ_MUSIC_URL\"}}");
}
public void testNewsReply() {
- WxCustomMessage reply = new WxCustomMessage();
- reply.setTouser("OPENID");
- reply.setMsgtype(WxConsts.CUSTOM_MSG_NEWS);
+ WxMpCustomMessage reply = new WxMpCustomMessage();
+ reply.setToUser("OPENID");
+ reply.setMsgType(WxConsts.CUSTOM_MSG_NEWS);
WxArticle article1 = new WxArticle();
article1.setUrl("URL");
- article1.setPicurl("PIC_URL");
+ article1.setPicUrl("PIC_URL");
article1.setDescription("Is Really A Happy Day");
article1.setTitle("Happy Day");
reply.getArticles().add(article1);
WxArticle article2 = new WxArticle();
article2.setUrl("URL");
- article2.setPicurl("PIC_URL");
+ article2.setPicUrl("PIC_URL");
article2.setDescription("Is Really A Happy Day");
article2.setTitle("Happy Day");
reply.getArticles().add(article2);
@@ -115,17 +114,17 @@ public class WxCustomMessageTest {
public void testNewsBuild() {
WxArticle article1 = new WxArticle();
article1.setUrl("URL");
- article1.setPicurl("PIC_URL");
+ article1.setPicUrl("PIC_URL");
article1.setDescription("Is Really A Happy Day");
article1.setTitle("Happy Day");
WxArticle article2 = new WxArticle();
article2.setUrl("URL");
- article2.setPicurl("PIC_URL");
+ article2.setPicUrl("PIC_URL");
article2.setDescription("Is Really A Happy Day");
article2.setTitle("Happy Day");
- WxCustomMessage reply = WxCustomMessage.NEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build();
+ WxMpCustomMessage reply = WxMpCustomMessage.NEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build();
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"articles\":[{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"},{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"}]}");
}
diff --git a/src/test/java/me/chanjar/weixin/bean/WxXmlMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java
similarity index 59%
rename from src/test/java/me/chanjar/weixin/bean/WxXmlMessageTest.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java
index 79ad7634..346681cb 100644
--- a/src/test/java/me/chanjar/weixin/bean/WxXmlMessageTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java
@@ -1,11 +1,11 @@
-package me.chanjar.weixin.bean;
+package me.chanjar.weixin.mp.bean;
-import me.chanjar.weixin.api.WxConsts;
+import me.chanjar.weixin.common.api.WxConsts;
import org.testng.Assert;
import org.testng.annotations.Test;
@Test
-public class WxXmlMessageTest {
+public class WxMpXmlMessageTest {
public void testFromXml() {
@@ -33,8 +33,27 @@ public class WxXmlMessageTest {
+ "23.137466"
+ "113.352425"
+ "119.385040"
+ + ""
+ + " "
+ + " "
+ + ""
+ + ""
+ + " 1\n"
+ + " "
+ + " - "
+ + " "
+ + "
"
+ + " "
+ + ""
+ + ""
+ + " \n"
+ + " \n"
+ + " \n"
+ + " \n"
+ + " \n"
+ + ""
+ "