From c6a4f4548fe9ef9c250e5358627059223f8daa40 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 11 Aug 2019 11:25:52 +0800 Subject: [PATCH 01/79] =?UTF-8?q?:bug:=20#1152=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E7=94=A8=E6=88=B7=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java index c75f7566..b9844d39 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java @@ -10,7 +10,6 @@ import me.chanjar.weixin.cp.api.WxCpUserService; import me.chanjar.weixin.cp.bean.WxCpInviteResult; import me.chanjar.weixin.cp.bean.WxCpUser; import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.util.List; @@ -61,7 +60,7 @@ public class WxCpUserServiceImpl implements WxCpUserService { } jsonObject.add("useridlist", jsonArray); - this.mainService.post(USER_BATCH_DELETE, jsonObject.toString()); + this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(USER_BATCH_DELETE), jsonObject.toString()); } @Override @@ -94,7 +93,8 @@ public class WxCpUserServiceImpl implements WxCpUserService { } @Override - public List listSimpleByDepartment(Long departId, Boolean fetchChild, Integer status) throws WxErrorException { + public List listSimpleByDepartment(Long departId, Boolean fetchChild, Integer status) + throws WxErrorException { String params = ""; if (fetchChild != null) { params += "&fetch_child=" + (fetchChild ? "1" : "0"); @@ -117,7 +117,8 @@ public class WxCpUserServiceImpl implements WxCpUserService { } @Override - public WxCpInviteResult invite(List userIds, List partyIds, List tagIds) throws WxErrorException { + public WxCpInviteResult invite(List userIds, List partyIds, List tagIds) + throws WxErrorException { JsonObject jsonObject = new JsonObject(); if (userIds != null) { JsonArray jsonArray = new JsonArray(); From 6e1d7fcef0baa8c403fa39c9fb3330ca81dd2955 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 11 Aug 2019 11:26:36 +0800 Subject: [PATCH 02/79] =?UTF-8?q?:art:=20=E8=A7=84=E8=8C=83=E5=8C=96?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- quality-checks/google_checks.xml | 1 - .../cp/api/impl/BaseWxCpServiceImpl.java | 32 ++++++++++--------- .../cp/api/impl/BaseWxCpTpServiceImpl.java | 8 +++-- .../cp/api/impl/WxCpAgentServiceImpl.java | 4 +-- .../cp/api/impl/WxCpChatServiceImpl.java | 20 +++++++----- .../impl/WxCpExternalContactServiceImpl.java | 16 +++++----- .../cp/api/impl/WxCpMediaServiceImpl.java | 7 ++-- .../weixin/cp/api/impl/WxCpOaServiceImpl.java | 27 +++++++++------- 8 files changed, 64 insertions(+), 51 deletions(-) diff --git a/quality-checks/google_checks.xml b/quality-checks/google_checks.xml index b7a7e96c..1f76bfaf 100644 --- a/quality-checks/google_checks.xml +++ b/quality-checks/google_checks.xml @@ -27,7 +27,6 @@ - diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java index c7f10f6b..326717b1 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java @@ -36,34 +36,36 @@ import java.util.Map; import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.*; /** + * . + * * @author chanjarster */ @Slf4j public abstract class BaseWxCpServiceImpl implements WxCpService, RequestHttp { - private WxCpUserService userService = new WxCpUserServiceImpl(this); - private WxCpChatService chatService = new WxCpChatServiceImpl(this); + private WxCpUserService userService = new WxCpUserServiceImpl(this); + private WxCpChatService chatService = new WxCpChatServiceImpl(this); private WxCpDepartmentService departmentService = new WxCpDepartmentServiceImpl(this); - private WxCpMediaService mediaService = new WxCpMediaServiceImpl(this); - private WxCpMenuService menuService = new WxCpMenuServiceImpl(this); - private WxCpOAuth2Service oauth2Service = new WxCpOAuth2ServiceImpl(this); - private WxCpTagService tagService = new WxCpTagServiceImpl(this); - private WxCpAgentService agentService = new WxCpAgentServiceImpl(this); - private WxCpOaService oaService = new WxCpOaServiceImpl(this); - private WxCpTaskCardService taskCardService = new WxCpTaskCardServiceImpl(this); + private WxCpMediaService mediaService = new WxCpMediaServiceImpl(this); + private WxCpMenuService menuService = new WxCpMenuServiceImpl(this); + private WxCpOAuth2Service oauth2Service = new WxCpOAuth2ServiceImpl(this); + private WxCpTagService tagService = new WxCpTagServiceImpl(this); + private WxCpAgentService agentService = new WxCpAgentServiceImpl(this); + private WxCpOaService oaService = new WxCpOaServiceImpl(this); + private WxCpTaskCardService taskCardService = new WxCpTaskCardServiceImpl(this); private WxCpExternalContactService externalContactService = new WxCpExternalContactServiceImpl(this); /** - * 全局的是否正在刷新access token的锁 + * 全局的是否正在刷新access token的锁. */ protected final Object globalAccessTokenRefreshLock = new Object(); /** - * 全局的是否正在刷新jsapi_ticket的锁 + * 全局的是否正在刷新jsapi_ticket的锁. */ protected final Object globalJsapiTicketRefreshLock = new Object(); /** - * 全局的是否正在刷新agent的jsapi_ticket的锁 + * 全局的是否正在刷新agent的jsapi_ticket的锁. */ protected final Object globalAgentJsapiTicketRefreshLock = new Object(); @@ -72,7 +74,7 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH private WxSessionManager sessionManager = new StandardSessionManager(); /** - * 临时文件目录 + * 临时文件目录. */ private File tmpDirFile; private int retrySleepMillis = 1000; @@ -183,8 +185,8 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH params.put("js_code", jsCode); params.put("grant_type", "authorization_code"); - String result = this.get(this.configStorage.getApiUrl(JSCODE_TO_SESSION), Joiner.on("&").withKeyValueSeparator("=").join(params)); - return WxCpMaJsCode2SessionResult.fromJson(result); + final String url = this.configStorage.getApiUrl(JSCODE_TO_SESSION); + return WxCpMaJsCode2SessionResult.fromJson(this.get(url, Joiner.on("&").withKeyValueSeparator("=").join(params))); } @Override diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java index 92c6ac29..a0585af1 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java @@ -26,6 +26,8 @@ import java.util.HashMap; import java.util.Map; /** + * . + * * @author zhenjun cai */ @Slf4j @@ -73,7 +75,7 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ @Override public String getSuiteTicket(boolean forceRefresh) throws WxErrorException { -// suite ticket由微信服务器推送,不能强制刷新 +// suite ticket由微信服务器推送,不能强制刷新 // if (forceRefresh) { // this.configStorage.expireSuiteTicket(); // } @@ -93,8 +95,8 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ params.put("js_code", jsCode); params.put("grant_type", "authorization_code"); - String result = this.get(configStorage.getApiUrl(WxCpApiPathConsts.Tp.JSCODE_TO_SESSION), Joiner.on("&").withKeyValueSeparator("=").join(params)); - return WxCpMaJsCode2SessionResult.fromJson(result); + final String url = configStorage.getApiUrl(WxCpApiPathConsts.Tp.JSCODE_TO_SESSION); + return WxCpMaJsCode2SessionResult.fromJson(this.get(url, Joiner.on("&").withKeyValueSeparator("=").join(params))); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java index 6a9b7746..fd2beb4a 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java @@ -36,8 +36,8 @@ public class WxCpAgentServiceImpl implements WxCpAgentService { throw new IllegalArgumentException("缺少agentid参数"); } - String responseContent = this.mainService.get(String.format(this.mainService.getWxCpConfigStorage().getApiUrl(AGENT_GET), agentId), null); - return WxCpAgent.fromJson(responseContent); + final String url = String.format(this.mainService.getWxCpConfigStorage().getApiUrl(AGENT_GET), agentId); + return WxCpAgent.fromJson(this.mainService.get(url, null)); } @Override diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java index bd5baf01..b1f374c0 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java @@ -43,13 +43,14 @@ public class WxCpChatServiceImpl implements WxCpChatService { if (StringUtils.isNotBlank(chatId)) { data.put("chatid", chatId); } - String result = this.cpService.post(this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_CREATE), WxGsonBuilder.create().toJson(data)); + final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_CREATE); + String result = this.cpService.post(url, WxGsonBuilder.create().toJson(data)); return new JsonParser().parse(result).getAsJsonObject().get("chatid").getAsString(); } @Override public String create(String name, String owner, List users, String chatId) throws WxErrorException { - return chatCreate(name, owner, users, chatId); + return this.chatCreate(name, owner, users, chatId); } @Override @@ -72,24 +73,27 @@ public class WxCpChatServiceImpl implements WxCpChatService { data.put("del_user_list", usersToDelete); } - this.cpService.post(this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_UPDATE), WxGsonBuilder.create().toJson(data)); + final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_UPDATE); + this.cpService.post(url, WxGsonBuilder.create().toJson(data)); } @Override - public void update(String chatId, String name, String owner, List usersToAdd, List usersToDelete) throws WxErrorException { + public void update(String chatId, String name, String owner, List usersToAdd, List usersToDelete) + throws WxErrorException { chatUpdate(chatId, name, owner, usersToAdd, usersToDelete); } @Override public WxCpChat chatGet(String chatId) throws WxErrorException { - String result = this.cpService.get(this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_GET_CHATID + chatId), null); - return WxCpGsonBuilder.create() - .fromJson(JSON_PARSER.parse(result).getAsJsonObject().getAsJsonObject("chat_info").toString(), WxCpChat.class); + final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_GET_CHATID + chatId); + String result = this.cpService.get(url, null); + final String chatInfo = JSON_PARSER.parse(result).getAsJsonObject().getAsJsonObject("chat_info").toString(); + return WxCpGsonBuilder.create().fromJson(chatInfo, WxCpChat.class); } @Override public WxCpChat get(String chatId) throws WxErrorException { - return chatGet(chatId); + return this.chatGet(chatId); } @Override diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java index 18910008..8a5b7d56 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java @@ -20,22 +20,22 @@ public class WxCpExternalContactServiceImpl implements WxCpExternalContactServic @Override public WxCpUserExternalContactInfo getExternalContact(String userId) throws WxErrorException { - String responseContent = this.mainService.get(this.mainService.getWxCpConfigStorage().getApiUrl(GET_EXTERNAL_CONTACT + userId), null); - + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_EXTERNAL_CONTACT + userId); + String responseContent = this.mainService.get(url, null); return WxCpUserExternalContactInfo.fromJson(responseContent); } @Override public List listExternalContacts(String userId) throws WxErrorException { - String responseContent = this.mainService.get(this.mainService.getWxCpConfigStorage().getApiUrl(LIST_EXTERNAL_CONTACT + userId), null); - WxCpUserExternalContactList list = WxCpUserExternalContactList.fromJson(responseContent); - return list.getExternalUserId(); + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(LIST_EXTERNAL_CONTACT + userId); + String responseContent = this.mainService.get(url, null); + return WxCpUserExternalContactList.fromJson(responseContent).getExternalUserId(); } @Override public List listFollowUser() throws WxErrorException { - String responseContent = this.mainService.get(this.mainService.getWxCpConfigStorage().getApiUrl(GET_FOLLOW_USER_LIST), null); - WxCpUserWithExternalPermission list = WxCpUserWithExternalPermission.fromJson(responseContent); - return list.getFollowUser(); + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_FOLLOW_USER_LIST); + String responseContent = this.mainService.get(url, null); + return WxCpUserWithExternalPermission.fromJson(responseContent).getFollowUser(); } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java index 05e13cfc..55579ff0 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java @@ -6,6 +6,7 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.fs.FileUtils; import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; +import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.cp.api.WxCpMediaService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; @@ -59,8 +60,8 @@ public class WxCpMediaServiceImpl implements WxCpMediaService { @Override public String uploadImg(File file) throws WxErrorException { - final WxMediaUploadResult result = this.mainService - .execute(MediaUploadRequestExecutor.create(this.mainService.getRequestHttp()), this.mainService.getWxCpConfigStorage().getApiUrl(IMG_UPLOAD), file); - return result.getUrl(); + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(IMG_UPLOAD); + return this.mainService.execute(MediaUploadRequestExecutor.create(this.mainService.getRequestHttp()), url, file) + .getUrl(); } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java index 5d7d758c..b8449ced 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java @@ -22,6 +22,8 @@ import java.util.List; import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Oa.*; /** + * . + * * @author Element * @date 2019-04-06 11:20 */ @@ -60,7 +62,8 @@ public class WxCpOaServiceImpl implements WxCpOaService { jsonObject.add("useridlist", jsonArray); - String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_DATA), jsonObject.toString()); + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_DATA); + String responseContent = this.mainService.post(url, jsonObject.toString()); JsonElement tmpJsonElement = new JsonParser().parse(responseContent); return WxCpGsonBuilder.create() .fromJson( @@ -89,7 +92,8 @@ public class WxCpOaServiceImpl implements WxCpOaService { jsonObject.addProperty("datetime", datetime.getTime() / 1000L); jsonObject.add("useridlist", jsonArray); - String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_OPTION), jsonObject.toString()); + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_OPTION); + String responseContent = this.mainService.post(url, jsonObject.toString()); JsonElement tmpJsonElement = new JsonParser().parse(responseContent); return WxCpGsonBuilder.create() @@ -109,12 +113,14 @@ public class WxCpOaServiceImpl implements WxCpOaService { jsonObject.addProperty("next_spnum", nextSpnum); } - String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(GET_APPROVAL_DATA), jsonObject.toString()); + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_APPROVAL_DATA); + String responseContent = this.mainService.post(url, jsonObject.toString()); return WxCpGsonBuilder.create().fromJson(responseContent, WxCpApprovalDataResult.class); } @Override - public List getDialRecord(Date startTime, Date endTime, Integer offset, Integer limit) throws WxErrorException { + public List getDialRecord(Date startTime, Date endTime, Integer offset, Integer limit) + throws WxErrorException { JsonObject jsonObject = new JsonObject(); if (offset == null) { @@ -141,14 +147,13 @@ public class WxCpOaServiceImpl implements WxCpOaService { jsonObject.addProperty("end_time", endtimestamp); } - String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(GET_DIAL_RECORD), jsonObject.toString()); + final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_DIAL_RECORD); + String responseContent = this.mainService.post(url, jsonObject.toString()); JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return WxCpGsonBuilder.create() - .fromJson( - tmpJsonElement.getAsJsonObject().get("record"), - new TypeToken>() { - }.getType() - ); + return WxCpGsonBuilder.create().fromJson(tmpJsonElement.getAsJsonObject().get("record"), + new TypeToken>() { + }.getType() + ); } } From d1586aec259835f27e821a8ee0ad61dedce39825 Mon Sep 17 00:00:00 2001 From: billytomato Date: Thu, 15 Aug 2019 13:26:43 +0800 Subject: [PATCH 03/79] =?UTF-8?q?#1157=20=E5=A2=9E=E5=8A=A0=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E6=A3=80=E6=B5=8B=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/common/api/WxConsts.java | 15 +++++ .../weixin/common/bean/WxNetCheckResult.java | 43 ++++++++++++++ .../common/util/json/WxGsonBuilder.java | 3 + .../json/WxNetCheckResultGsonAdapter.java | 51 +++++++++++++++++ .../me/chanjar/weixin/mp/api/WxMpService.java | 15 +++++ .../mp/api/impl/BaseWxMpServiceImpl.java | 10 ++++ .../chanjar/weixin/mp/enums/WxMpApiUrl.java | 4 ++ .../mp/api/impl/BaseWxMpServiceImplTest.java | 56 +++++++++++++++++++ 8 files changed, 197 insertions(+) create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxNetCheckResult.java create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxNetCheckResultGsonAdapter.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java index 37820bbd..e63b4a8c 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java @@ -380,4 +380,19 @@ public class WxConsts { public static final String VIDEO = "video"; } + + /** + * 网络检测入参. + */ + public static class NetCheckArgs { + public static final String ACTIONDNS = "dns"; + public static final String ACTIONPING = "ping"; + public static final String ACTIONALL = "all"; + public static final String OPERATORUNICOM = "UNICOM"; + public static final String OPERATORCHINANET = "CHINANET"; + public static final String OPERATORCAP = "CAP"; + public static final String OPERATORDEFAULT = "DEFAULT"; + } + + } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxNetCheckResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxNetCheckResult.java new file mode 100644 index 00000000..2df2417f --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxNetCheckResult.java @@ -0,0 +1,43 @@ +package me.chanjar.weixin.common.bean; + +import lombok.Data; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 网络检测. + * @author billytomato + */ +@Data +public class WxNetCheckResult implements Serializable { + + private static final long serialVersionUID = 6918924418847404172L; + + private List dnsInfos = new ArrayList<>(); + private List pingInfos = new ArrayList<>(); + + public static WxNetCheckResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxNetCheckResult.class); + } + + @Data + public static class WxNetCheckDnsInfo implements Serializable{ + private static final long serialVersionUID = 82631178029516008L; + private String ip; + private String realOperator; + } + + @Data + public static class WxNetCheckPingInfo implements Serializable{ + private static final long serialVersionUID = -1871970825359178319L; + private String ip; + private String fromOperator; + private String packageLoss; + private String time; + } +} + + diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java index 97740efb..b52bad95 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java @@ -3,6 +3,7 @@ package me.chanjar.weixin.common.util.json; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.bean.WxNetCheckResult; import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; @@ -21,6 +22,8 @@ public class WxGsonBuilder { INSTANCE.registerTypeAdapter(WxError.class, new WxErrorAdapter()); INSTANCE.registerTypeAdapter(WxMenu.class, new WxMenuGsonAdapter()); INSTANCE.registerTypeAdapter(WxMediaUploadResult.class, new WxMediaUploadResultAdapter()); + INSTANCE.registerTypeAdapter(WxNetCheckResult.class, new WxNetCheckResultGsonAdapter()); + } public static Gson create() { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxNetCheckResultGsonAdapter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxNetCheckResultGsonAdapter.java new file mode 100644 index 00000000..65c15fbc --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxNetCheckResultGsonAdapter.java @@ -0,0 +1,51 @@ +package me.chanjar.weixin.common.util.json; + +import com.google.gson.*; +import me.chanjar.weixin.common.bean.WxNetCheckResult; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + + +/** + * @author billytomato + */ +public class WxNetCheckResultGsonAdapter implements JsonDeserializer { + + + @Override + public WxNetCheckResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + WxNetCheckResult result = new WxNetCheckResult(); + + JsonArray dnssJson = json.getAsJsonObject().get("dns").getAsJsonArray(); + List dnsInfoList = new ArrayList<>(); + if (dnssJson != null && dnssJson.size() > 0) { + for (int i = 0; i < dnssJson.size(); i++) { + JsonObject buttonJson = dnssJson.get(i).getAsJsonObject(); + WxNetCheckResult.WxNetCheckDnsInfo dnsInfo = new WxNetCheckResult.WxNetCheckDnsInfo(); + dnsInfo.setIp(GsonHelper.getString(buttonJson, "ip")); + dnsInfo.setRealOperator(GsonHelper.getString(buttonJson, "real_operator")); + dnsInfoList.add(dnsInfo); + } + } + + JsonArray pingsJson = json.getAsJsonObject().get("ping").getAsJsonArray(); + List pingInfoList = new ArrayList<>(); + if (pingsJson != null && pingsJson.size() > 0) { + for (int i = 0; i < pingsJson.size(); i++) { + JsonObject pingJson = pingsJson.get(i).getAsJsonObject(); + WxNetCheckResult.WxNetCheckPingInfo pingInfo = new WxNetCheckResult.WxNetCheckPingInfo(); + pingInfo.setIp(GsonHelper.getString(pingJson, "ip")); + pingInfo.setFromOperator(GsonHelper.getString(pingJson, "from_operator")); + pingInfo.setPackageLoss(GsonHelper.getString(pingJson, "package_loss")); + pingInfo.setTime(GsonHelper.getString(pingJson, "time")); + pingInfoList.add(pingInfo); + } + } + result.setDnsInfos(dnsInfoList); + result.setPingInfos(pingInfoList); + return result; + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index be8000d3..e8b91a82 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -1,6 +1,7 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.WxNetCheckResult; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; import me.chanjar.weixin.common.util.http.RequestExecutor; @@ -178,6 +179,20 @@ public interface WxMpService { */ String[] getCallbackIP() throws WxErrorException; + + /** + *
+   *  网络检测
+   *  https://mp.weixin.qq.com/wiki?t=resource/res_main&id=21541575776DtsuT
+   *  为了帮助开发者排查回调连接失败的问题,提供这个网络检测的API。它可以对开发者URL做域名解析,然后对所有IP进行一次ping操作,得到丢包率和耗时。
+   * 
+ * + * @param action 执行的检测动作 + * @param operator 指定平台从某个运营商进行检测 + * @throws WxErrorException + */ + WxNetCheckResult netCheck(String action, String operator) throws WxErrorException; + /** *
    * 获取公众号的自动回复规则.
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
index f7969eae..59a0efeb 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
@@ -8,6 +8,7 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
+import me.chanjar.weixin.common.bean.WxNetCheckResult;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.session.StandardSessionManager;
@@ -236,6 +237,15 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
     return ipArray;
   }
 
+  @Override
+  public WxNetCheckResult netCheck(String action, String operator) throws WxErrorException {
+    JsonObject o = new JsonObject();
+    o.addProperty("action", action);
+    o.addProperty("check_operator", operator);
+    String responseContent = this.post(NETCHECK_URL, o.toString());
+    return WxNetCheckResult.fromJson(responseContent);
+  }
+
   @Override
   public WxMpCurrentAutoReplyInfo getCurrentAutoReplyInfo() throws WxErrorException {
     return WxMpCurrentAutoReplyInfo.fromJson(this.get(GET_CURRENT_AUTOREPLY_INFO_URL, null));
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
index 77124c68..63cbe958 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
@@ -110,6 +110,10 @@ public interface WxMpApiUrl {
      * 获取微信服务器IP地址.
      */
     GET_CALLBACK_IP_URL(API_DEFAULT_HOST_URL, "/cgi-bin/getcallbackip"),
+    /**
+     * 网络检测.
+     */
+    NETCHECK_URL(API_DEFAULT_HOST_URL, "/cgi-bin/callback/check"),
     /**
      * 第三方使用网站应用授权登录的url.
      */
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
index ff0d7537..7f3e6ab3 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
@@ -1,10 +1,13 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import com.google.inject.Inject;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.bean.WxNetCheckResult;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.test.ApiTestModule;
 import me.chanjar.weixin.mp.util.WxMpConfigStorageHolder;
+import org.testng.Assert;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
@@ -37,4 +40,57 @@ public class BaseWxMpServiceImplTest {
     assertThat(this.wxService.switchoverTo("another").getAccessToken()).isNotEmpty();
     assertThat(WxMpConfigStorageHolder.get()).isEqualTo("another");
   }
+
+  @Test
+  public void testNetCheck() throws WxErrorException {
+    WxNetCheckResult result = this.wxService.netCheck(WxConsts.NetCheckArgs.ACTIONALL, WxConsts.NetCheckArgs.OPERATORDEFAULT);
+    Assert.assertNotNull(result);
+
+  }
+
+  @Test
+  public void testNectCheckResult() {
+    String json = "{\n" +
+      "    \"dns\": [\n" +
+      "        {\n" +
+      "            \"ip\": \"111.161.64.40\", \n" +
+      "            \"real_operator\": \"UNICOM\"\n" +
+      "        }, \n" +
+      "        {\n" +
+      "            \"ip\": \"111.161.64.48\", \n" +
+      "            \"real_operator\": \"UNICOM\"\n" +
+      "        }\n" +
+      "    ], \n" +
+      "    \"ping\": [\n" +
+      "        {\n" +
+      "            \"ip\": \"111.161.64.40\", \n" +
+      "            \"from_operator\": \"UNICOM\"," +
+      "            \"package_loss\": \"0%\", \n" +
+      "            \"time\": \"23.079ms\"\n" +
+      "        }, \n" +
+      "        {\n" +
+      "            \"ip\": \"111.161.64.48\", \n" +
+      "            \"from_operator\": \"UNICOM\", \n" +
+      "            \"package_loss\": \"0%\", \n" +
+      "            \"time\": \"21.434ms\"\n" +
+      "        }\n" +
+      "    ]\n" +
+      "}";
+    WxNetCheckResult result = WxNetCheckResult.fromJson(json);
+    Assert.assertNotNull(result);
+    Assert.assertNotNull(result.getDnsInfos());
+
+    WxNetCheckResult.WxNetCheckDnsInfo dnsInfo = new WxNetCheckResult.WxNetCheckDnsInfo();
+    dnsInfo.setIp("111.161.64.40");
+    dnsInfo.setRealOperator("UNICOM");
+    Assert.assertEquals(result.getDnsInfos().get(0), dnsInfo);
+
+    WxNetCheckResult.WxNetCheckPingInfo pingInfo = new WxNetCheckResult.WxNetCheckPingInfo();
+    pingInfo.setTime("21.434ms");
+    pingInfo.setFromOperator("UNICOM");
+    pingInfo.setIp("111.161.64.48");
+    pingInfo.setPackageLoss("0%");
+    Assert.assertEquals(result.getPingInfos().get(1), pingInfo);
+
+  }
 }

From ecc407a6e900677025f6af99c8b65de2c7b1526e Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 18 Aug 2019 10:13:13 +0800
Subject: [PATCH 04/79] =?UTF-8?q?:bug:=20#1161=20=E5=BE=AE=E4=BF=A1?=
 =?UTF-8?q?=E6=94=AF=E4=BB=98=E4=BF=AE=E5=A4=8DEntPayRequest=E7=B1=BB?=
 =?UTF-8?q?=E7=9A=84toString=E6=96=B9=E6=B3=95=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wxpay/bean/entpay/EntPayRequest.java      |  7 ++-----
 .../wxpay/bean/entpay/EntPayRequestTest.java  | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+), 5 deletions(-)
 create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java
index fd04fb83..24c1c185 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java
@@ -25,6 +25,8 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 @AllArgsConstructor
 @XStreamAlias("xml")
 public class EntPayRequest extends BaseWxPayRequest {
+  private static final long serialVersionUID = 8647710192770447579L;
+
   /**
    * 
    * 字段名:公众账号appid.
@@ -189,11 +191,6 @@ public class EntPayRequest extends BaseWxPayRequest {
     this.mchId = mchId;
   }
 
-  @Override
-  public String toString() {
-    return WxGsonBuilder.create().toJson(this);
-  }
-
   @Override
   protected String[] getIgnoredParamsForSign() {
     return new String[]{"sign_type"};
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java
new file mode 100644
index 00000000..2a2f030f
--- /dev/null
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java
@@ -0,0 +1,19 @@
+package com.github.binarywang.wxpay.bean.entpay;
+
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+/**
+ * .
+ *
+ * @author Binary Wang
+ * @date 2019-08-18
+ */
+public class EntPayRequestTest {
+
+  @Test
+  public void testToString() {
+    System.out.println(EntPayRequest.newBuilder().mchId("123").build().toString());
+  }
+}

From 5e8d4a2ec62c4b146a6729d04316cafd7146d37e Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 18 Aug 2019 10:21:15 +0800
Subject: [PATCH 05/79] =?UTF-8?q?:sparkles:=20#1160=20WxOpenComponentServi?=
 =?UTF-8?q?ce=E6=8E=A5=E5=8F=A3=E7=B1=BB=E6=8F=90=E4=BE=9Bget=E5=92=8Cpost?=
 =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95=EF=BC=8C=E6=96=B9=E4=BE=BF?=
 =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=80=85=E6=89=A9=E5=B1=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../open/api/WxOpenComponentService.java      | 141 +++++++++---------
 .../api/impl/WxOpenComponentServiceImpl.java  |  16 +-
 2 files changed, 84 insertions(+), 73 deletions(-)

diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index 2beec638..a2742bc2 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -12,6 +12,8 @@ import me.chanjar.weixin.open.bean.result.*;
 import java.util.List;
 
 /**
+ * .
+ *
  * @author 007
  */
 public interface WxOpenComponentService {
@@ -27,45 +29,45 @@ public interface WxOpenComponentService {
   String COMPONENT_LOGIN_PAGE_URL = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s&auth_type=xxx&biz_appid=xxx";
 
   /**
-   * 手机端打开授权链接
+   * 手机端打开授权链接.
    */
   String COMPONENT_MOBILE_LOGIN_PAGE_URL = "https://mp.weixin.qq.com/safe/bindcomponent?action=bindcomponent&no_scan=1&auth_type=3&component_appid=%s&pre_auth_code=%s&redirect_uri=%s&auth_type=xxx&biz_appid=xxx#wechat_redirect";
   String CONNECT_OAUTH2_AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s&component_appid=%s#wechat_redirect";
 
   /**
-   * 用code换取oauth2的access token
+   * 用code换取oauth2的access token.
    */
   String OAUTH2_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/component/access_token?appid=%s&code=%s&grant_type=authorization_code&component_appid=%s";
   /**
-   * 刷新oauth2的access token
+   * 刷新oauth2的access token.
    */
   String OAUTH2_REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/component/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s&component_appid=%s";
 
   String MINIAPP_JSCODE_2_SESSION = "https://api.weixin.qq.com/sns/component/jscode2session?appid=%s&js_code=%s&grant_type=authorization_code&component_appid=%s";
 
-  String CREATE_OPEN_URL= "https://api.weixin.qq.com/cgi-bin/open/create";
+  String CREATE_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/create";
 
   /**
-   * 快速创建小程序接口
+   * 快速创建小程序接口.
    */
   String FAST_REGISTER_WEAPP_URL = "https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp?action=create";
   String FAST_REGISTER_WEAPP_SEARCH_URL = "https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp?action=search";
 
-
   WxMpService getWxMpServiceByAppid(String appid);
 
   /**
-   * 获取指定appid的开放平台小程序服务(继承一般小程序服务能力)
+   * 获取指定appid的开放平台小程序服务(继承一般小程序服务能力).
    *
-   * @param appid
-   * @return
+   * @param appid .
+   * @return .
    */
   WxOpenMaService getWxMaServiceByAppid(String appid);
 
   /**
-   * 获取指定appid的快速创建的小程序服务
-   * @param appid
-   * @return
+   * 获取指定appid的快速创建的小程序服务.
+   *
+   * @param appid .
+   * @return .
    */
   WxOpenFastMaService getWxFastMaServiceByAppid(String appid);
 
@@ -75,62 +77,72 @@ public interface WxOpenComponentService {
 
   String getComponentAccessToken(boolean forceRefresh) throws WxErrorException;
 
+  String post(String uri, String postData) throws WxErrorException;
+
+  String post(String uri, String postData, String accessTokenKey) throws WxErrorException;
+
+  String get(String uri) throws WxErrorException;
+
+  String get(String uri, String accessTokenKey) throws WxErrorException;
+
   /**
-   * 获取用户授权页URL(来路URL和成功跳转URL 的域名都需要为三方平台设置的 登录授权的发起页域名)
+   * 获取用户授权页URL(来路URL和成功跳转URL 的域名都需要为三方平台设置的 登录授权的发起页域名).
    */
-  String getPreAuthUrl(String redirectURI) throws WxErrorException;
+  String getPreAuthUrl(String redirectUri) throws WxErrorException;
 
   /**
-   * authType 要授权的帐号类型:1则商户点击链接后,手机端仅展示公众号、2表示仅展示小程序,3表示公众号和小程序都展示。如果为未指定,则默认小程序和公众号都展示。第三方平台开发者可以使用本字段来控制授权的帐号类型。
-   * bizAppid 指定授权唯一的小程序或公众号
-   * 注:auth_type、biz_appid两个字段互斥。
+   * .
+   *
+   * @param authType 要授权的帐号类型:1则商户点击链接后,手机端仅展示公众号、2表示仅展示小程序,3表示公众号和小程序都展示。如果为未指定,则默认小程序和公众号都展示。第三方平台开发者可以使用本字段来控制授权的帐号类型。
+   * @param bizAppid 指定授权唯一的小程序或公众号
+   *                 注:authType、bizAppid 互斥。
    */
-  String getPreAuthUrl(String redirectURI, String authType, String bizAppid) throws WxErrorException;
+  String getPreAuthUrl(String redirectUri, String authType, String bizAppid) throws WxErrorException;
 
   /**
-   * 获取预授权链接(手机端预授权)
+   * 获取预授权链接(手机端预授权).
    *
-   * @param redirectURI
-   * @return
-   * @throws WxErrorException
+   * @param redirectUri .
+   * @return .
+   * @throws WxErrorException .
    */
-  String getMobilePreAuthUrl(String redirectURI) throws WxErrorException;
+  String getMobilePreAuthUrl(String redirectUri) throws WxErrorException;
 
   /**
-   * 获取预授权链接(手机端预授权)
+   * 获取预授权链接(手机端预授权).
    *
-   * @param redirectURI
-   * @param authType
-   * @param bizAppid
-   * @return
-   * @throws WxErrorException
+   * @param redirectUri .
+   * @param authType    .
+   * @param bizAppid    .
+   * @return .
+   * @throws WxErrorException .
    */
-  String getMobilePreAuthUrl(String redirectURI, String authType, String bizAppid) throws WxErrorException;
+  String getMobilePreAuthUrl(String redirectUri, String authType, String bizAppid) throws WxErrorException;
 
   String route(WxOpenXmlMessage wxMessage) throws WxErrorException;
 
   /**
-   * 使用授权码换取公众号或小程序的接口调用凭据和授权信息
+   * 使用授权码换取公众号或小程序的接口调用凭据和授权信息.
    */
   WxOpenQueryAuthResult getQueryAuth(String authorizationCode) throws WxErrorException;
 
   /**
-   * 获取授权方的帐号基本信息
+   * 获取授权方的帐号基本信息.
    */
   WxOpenAuthorizerInfoResult getAuthorizerInfo(String authorizerAppid) throws WxErrorException;
 
   /**
-   * 获取授权方的选项设置信息
+   * 获取授权方的选项设置信息.
    */
   WxOpenAuthorizerOptionResult getAuthorizerOption(String authorizerAppid, String optionName) throws WxErrorException;
 
   /**
-   * 获取所有授权方列表
+   * 获取所有授权方列表.
    */
   WxOpenAuthorizerListResult getAuthorizerList(int begin, int len) throws WxErrorException;
 
   /**
-   * 设置授权方的选项信息
+   * 设置授权方的选项信息.
    */
   void setAuthorizerOption(String authorizerAppid, String optionName, String optionValue) throws WxErrorException;
 
@@ -142,13 +154,12 @@ public interface WxOpenComponentService {
 
   WxMpOAuth2AccessToken oauth2refreshAccessToken(String appid, String refreshToken) throws WxErrorException;
 
-  String oauth2buildAuthorizationUrl(String appid, String redirectURI, String scope, String state);
+  String oauth2buildAuthorizationUrl(String appid, String redirectUri, String scope, String state);
 
   WxMaJscode2SessionResult miniappJscode2Session(String appId, String jsCode) throws WxErrorException;
 
   /**
-   * 代小程序实现业务
-   * 

+ * 代小程序实现业务. * 小程序代码模版库管理:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1506504150_nMMh6&token=&lang=zh_CN * access_token 为 component_access_token */ @@ -158,7 +169,7 @@ public interface WxOpenComponentService { String DELETE_TEMPLATE_URL = "https://api.weixin.qq.com/wxa/deletetemplate"; /** - * 获取草稿箱内的所有临时代码草稿 + * 获取草稿箱内的所有临时代码草稿. * * @return 草稿箱代码模板列表(draftId) * @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档 @@ -166,7 +177,7 @@ public interface WxOpenComponentService { List getTemplateDraftList() throws WxErrorException; /** - * 获取代码模版库中的所有小程序代码模版 + * 获取代码模版库中的所有小程序代码模版. * * @return 小程序代码模版列表(templateId) * @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档 @@ -174,7 +185,7 @@ public interface WxOpenComponentService { List getTemplateList() throws WxErrorException; /** - * 将草稿箱的草稿选为小程序代码模版 + * 将草稿箱的草稿选为小程序代码模版. * * @param draftId 草稿ID,本字段可通过“获取草稿箱内的所有临时代码草稿”接口获得 * @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档 @@ -183,7 +194,7 @@ public interface WxOpenComponentService { void addToTemplate(long draftId) throws WxErrorException; /** - * 删除指定小程序代码模版 + * 删除指定小程序代码模版. * * @param templateId 要删除的模版ID * @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档 @@ -193,45 +204,41 @@ public interface WxOpenComponentService { /** * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1498704199_1bcax&token=6df5e3650041eff2cd3ec3662425ad8d7beec8d9&lang=zh_CN - * 创建 开放平台帐号并绑定公众号/小程序 - * + * 创建 开放平台帐号并绑定公众号/小程序. * https://api.weixin.qq.com/cgi-bin/open/create * * @param appId 公众号/小程序的appId - * @return + * @return . */ WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException; /** - * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN - * 第三方平台快速创建小程序 - *

-   *      注意:创建任务逻辑串行,单次任务结束后才可以使用相同信息下发第二次任务,请注意规避任务阻塞
-   *  
- * @param name 企业名(需与工商部门登记信息一致) - * @param code 企业代码 - * @param codeType 企业代码类型 1:统一社会信用代码(18位) 2:组织机构代码(9位xxxxxxxx-x) 3:营业执照注册号(15位) + * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN + * 第三方平台快速创建小程序. + * 注意:创建任务逻辑串行,单次任务结束后才可以使用相同信息下发第二次任务,请注意规避任务阻塞 + * + * @param name 企业名(需与工商部门登记信息一致) + * @param code 企业代码 + * @param codeType 企业代码类型 1:统一社会信用代码(18位) 2:组织机构代码(9位xxxxxxxx-x) 3:营业执照注册号(15位) * @param legalPersonaWechat 法人微信号 - * @param legalPersonaName 法人姓名(绑定银行卡) - * @param componentPhone 第三方联系电话(方便法人与第三方联系) - * @return - * @throws WxErrorException + * @param legalPersonaName 法人姓名(绑定银行卡) + * @param componentPhone 第三方联系电话(方便法人与第三方联系) + * @return . + * @throws WxErrorException . */ WxOpenResult fastRegisterWeapp(String name, String code, String codeType, String legalPersonaWechat, String legalPersonaName, String componentPhone) throws WxErrorException; /** - * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN - * 查询第三方平台快速创建小程序的任务状态 - *
-   *      注意:该接口只提供当下任务结果查询,不建议过分依赖该接口查询所创建小程序。
-   *            小程序的成功状态可在第三方服务器中自行对账、查询。
-   *            不要频繁调用search接口,消息接收需通过服务器查看。调用search接口会消耗接口整体调用quato
-   *  
+ * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN + * 查询第三方平台快速创建小程序的任务状态 + * 注意:该接口只提供当下任务结果查询,不建议过分依赖该接口查询所创建小程序。 + * 小程序的成功状态可在第三方服务器中自行对账、查询。 + * 不要频繁调用search接口,消息接收需通过服务器查看。调用search接口会消耗接口整体调用quato * - * @param name 企业名(需与工商部门登记信息一致) + * @param name 企业名(需与工商部门登记信息一致) * @param legalPersonaWechat 法人微信号 - * @param legalPersonaName 法人姓名(绑定银行卡) - * @throws WxErrorException + * @param legalPersonaName 法人姓名(绑定银行卡) + * @throws WxErrorException . */ WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWechat, String legalPersonaName) throws WxErrorException; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java index 03d072cd..0db4cb47 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java @@ -126,11 +126,13 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { return this.getWxOpenConfigStorage().getComponentAccessToken(); } - private String post(String uri, String postData) throws WxErrorException { + @Override + public String post(String uri, String postData) throws WxErrorException { return post(uri, postData, "component_access_token"); } - private String post(String uri, String postData, String accessTokenKey) throws WxErrorException { + @Override + public String post(String uri, String postData, String accessTokenKey) throws WxErrorException { String componentAccessToken = getComponentAccessToken(false); String uriWithComponentAccessToken = uri + (uri.contains("?") ? "&" : "?") + accessTokenKey + "=" + componentAccessToken; try { @@ -157,11 +159,13 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { } } - private String get(String uri) throws WxErrorException { + @Override + public String get(String uri) throws WxErrorException { return get(uri, "component_access_token"); } - private String get(String uri, String accessTokenKey) throws WxErrorException { + @Override + public String get(String uri, String accessTokenKey) throws WxErrorException { String componentAccessToken = getComponentAccessToken(false); String uriWithComponentAccessToken = uri + (uri.contains("?") ? "&" : "?") + accessTokenKey + "=" + componentAccessToken; try { @@ -189,8 +193,8 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { } @Override - public String getPreAuthUrl(String redirectURI) throws WxErrorException { - return getPreAuthUrl(redirectURI, null, null); + public String getPreAuthUrl(String redirectUri) throws WxErrorException { + return getPreAuthUrl(redirectUri, null, null); } @Override From fa79568a478d8238efc03843c8f9458e572bb2bb Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 18 Aug 2019 10:29:04 +0800 Subject: [PATCH 06/79] =?UTF-8?q?:white=5Fcheck=5Fmark:=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=9B=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/cp/bean/WxCpTpXmlPackage.java | 110 +++++++++--------- .../weixin/cp/bean/WxCpTpXmlPackageTest.java | 28 +++++ 2 files changed, 83 insertions(+), 55 deletions(-) create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java index 82c33f52..0e22b626 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java @@ -1,55 +1,55 @@ -package me.chanjar.weixin.cp.bean; - -import java.io.Serializable; -import java.util.Map; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamConverter; -import lombok.Data; -import me.chanjar.weixin.common.util.XmlUtils; -import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; -import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder; -import me.chanjar.weixin.cp.config.WxCpConfigStorage; -import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; -import me.chanjar.weixin.cp.util.xml.XStreamTransformer; - -/** - * 回调消息包. - * https://work.weixin.qq.com/api/doc#90001/90143/91116 - * - * @author zhenjun cai - */ -@XStreamAlias("xml") -@Data -public class WxCpTpXmlPackage implements Serializable { - - private static final long serialVersionUID = 6031833682211475786L; - /** - * 使用dom4j解析的存放所有xml属性和值的map. - */ - private Map allFieldsMap; - - @XStreamAlias("ToUserName") - @XStreamConverter(value = XStreamCDataConverter.class) - protected String toUserName; - - @XStreamAlias("AgentID") - @XStreamConverter(value = XStreamCDataConverter.class) - protected String agentId; - - @XStreamAlias("Encrypt") - @XStreamConverter(value = XStreamCDataConverter.class) - protected String msgEncrypt; - - public static WxCpTpXmlPackage fromXml(String xml) { - //修改微信变态的消息内容格式,方便解析 - //xml = xml.replace("", ""); - final WxCpTpXmlPackage xmlPackage = XStreamTransformer.fromXml(WxCpTpXmlPackage.class, xml); - xmlPackage.setAllFieldsMap(XmlUtils.xml2Map(xml)); - return xmlPackage; - } -} +package me.chanjar.weixin.cp.bean; + +import java.io.Serializable; +import java.util.Map; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamConverter; +import lombok.Data; +import me.chanjar.weixin.common.util.XmlUtils; +import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; +import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder; +import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder; +import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder; +import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder; +import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder; +import me.chanjar.weixin.cp.config.WxCpConfigStorage; +import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; +import me.chanjar.weixin.cp.util.xml.XStreamTransformer; + +/** + * 回调消息包. + * https://work.weixin.qq.com/api/doc#90001/90143/91116 + * + * @author zhenjun cai + */ +@XStreamAlias("xml") +@Data +public class WxCpTpXmlPackage implements Serializable { + private static final long serialVersionUID = 6031833682211475786L; + + /** + * 使用dom4j解析的存放所有xml属性和值的map. + */ + private Map allFieldsMap; + + @XStreamAlias("ToUserName") + @XStreamConverter(value = XStreamCDataConverter.class) + protected String toUserName; + + @XStreamAlias("AgentID") + @XStreamConverter(value = XStreamCDataConverter.class) + protected String agentId; + + @XStreamAlias("Encrypt") + @XStreamConverter(value = XStreamCDataConverter.class) + protected String msgEncrypt; + + public static WxCpTpXmlPackage fromXml(String xml) { + //修改微信变态的消息内容格式,方便解析 + //xml = xml.replace("", ""); + final WxCpTpXmlPackage xmlPackage = XStreamTransformer.fromXml(WxCpTpXmlPackage.class, xml); + xmlPackage.setAllFieldsMap(XmlUtils.xml2Map(xml)); + return xmlPackage; + } +} diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java new file mode 100644 index 00000000..7b0e75a5 --- /dev/null +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java @@ -0,0 +1,28 @@ +package me.chanjar.weixin.cp.bean; + +import org.testng.annotations.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.testng.Assert.*; + +/** + * . + * + * @author Binary Wang + * @date 2019-08-18 + */ +public class WxCpTpXmlPackageTest { + + @Test + public void testFromXml() { + WxCpTpXmlPackage result = WxCpTpXmlPackage.fromXml(" \n" + + " \n" + + " \n" + + " \n" + + "\n"); + assertThat(result).isNotNull(); + assertThat(result.getToUserName()).isEqualTo("toUser"); + assertThat(result.getAgentId()).isEqualTo("toAgentID"); + assertThat(result.getMsgEncrypt()).isEqualTo("msg_encrypt"); + } +} From 4a58e2736e343191431994150c361f39d20bc528 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 18 Aug 2019 11:38:45 +0800 Subject: [PATCH 07/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.1.B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-miniapp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- weixin-java-open/pom.xml | 2 +- weixin-java-pay/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index d137dac0..d0bcd5c8 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.5.0 + 3.5.1.B pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index 1c5b89d1..9dab3160 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java com.github.binarywang - 3.5.0 + 3.5.1.B ../../ 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index 366d2532..1ce8a998 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.0 + 3.5.1.B ../../ diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index 3e726899..c61cb7ca 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java com.github.binarywang - 3.5.0 + 3.5.1.B ../../ 4.0.0 diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 9795b05d..78b48341 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.0 + 3.5.1.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 10269ebd..573ab6f5 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.0 + 3.5.1.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index fb7cf4f6..51f0316d 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.0 + 3.5.1.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 8792a55e..7057d720 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.0 + 3.5.1.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 7a2c2457..74533f66 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.0 + 3.5.1.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 03188c8c..53c5e5c1 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.5.0 + 3.5.1.B 4.0.0 From 4eb86b05a6d9c432e5a8f4c1b7c165be8381c92b Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 18 Aug 2019 20:57:42 +0800 Subject: [PATCH 08/79] =?UTF-8?q?:white=5Fcheck=5Fmark:=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/cp/api/impl/WxCpAgentServiceImplTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java index 90d2f14a..b785fc0a 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java @@ -6,13 +6,17 @@ import me.chanjar.weixin.cp.api.ApiTestModule; import me.chanjar.weixin.cp.api.WxCpAgentService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpAgent; +import me.chanjar.weixin.cp.config.WxCpConfigStorage; +import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; +import me.chanjar.weixin.cp.constant.WxCpConsts; import org.testng.annotations.Guice; import org.testng.annotations.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.contentOf; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; @@ -71,7 +75,9 @@ public class WxCpAgentServiceImplTest { @Test public void testGet() throws Exception { String returnJson = "{\"errcode\": 0,\"errmsg\": \"ok\",\"agentid\": 9,\"name\": \"测试应用\",\"square_logo_url\": \"http://wx.qlogo.cn/mmhead/alksjf;lasdjf;lasjfuodiuj3rj2o34j/0\",\"description\": \"这是一个企业号应用\",\"allow_userinfos\": {\"user\": [{\"userid\": \"0009854\"}, {\"userid\": \"1723\"}, {\"userid\": \"5625\"}]},\"allow_partys\": {\"partyid\": [42762742]},\"allow_tags\": {\"tagid\": [23, 22, 35, 19, 32, 125, 133, 46, 150, 38, 183, 9, 7]},\"close\": 0,\"redirect_domain\": \"weixin.com.cn\",\"report_location_flag\": 0,\"isreportenter\": 0,\"home_url\": \"\"}"; - when(wxService.get(String.format(wxService.getWxCpConfigStorage().getApiUrl(WxCpApiPathConsts.Agent.AGENT_GET), 9), null)).thenReturn(returnJson); + final WxCpConfigStorage configStorage = new WxCpDefaultConfigImpl(); + when(wxService.getWxCpConfigStorage()).thenReturn(configStorage); + when(wxService.get(String.format(configStorage.getApiUrl(WxCpApiPathConsts.Agent.AGENT_GET), 9), null)).thenReturn(returnJson); when(wxService.getAgentService()).thenReturn(new WxCpAgentServiceImpl(wxService)); WxCpAgentService wxAgentService = this.wxService.getAgentService(); From 6a7367ec0bc70d40cafe1598003e450c600080b8 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 18 Aug 2019 21:15:18 +0800 Subject: [PATCH 09/79] =?UTF-8?q?:bug:=20#1109=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E8=8E=B7=E5=8F=96=E6=B0=B8=E4=B9=85=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E7=A0=81=E8=A7=A3=E6=9E=90=E4=BB=A3=E7=A0=81=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/cp/api/WxCpTpService.java | 21 +-- .../cp/api/impl/BaseWxCpTpServiceImpl.java | 11 +- .../api/impl/BaseWxCpTpServiceImplTest.java | 172 ++++++++++++++++++ 3 files changed, 188 insertions(+), 16 deletions(-) create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTpService.java index 40ffcf55..edc2f552 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTpService.java @@ -15,7 +15,6 @@ import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; * @author zhenjun cai */ public interface WxCpTpService { - /** *
    * 验证推送过来的消息的正确性
@@ -84,15 +83,15 @@ public interface WxCpTpService {
   WxAccessToken getCorpToken(String authCorpid, String permanentCode) throws WxErrorException;
 
   /**
-   * 获取企业永久授权码
+   * 获取企业永久授权码 .
    *
-   * @param authCode
-   * @return
+   * @param authCode .
+   * @return .
    */
   WxCpTpCorp getPermanentCode(String authCode) throws WxErrorException;
 
   /**
-   * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求
+   * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求.
    *
    * @param url        接口地址
    * @param queryParam 请求参数
@@ -100,7 +99,7 @@ public interface WxCpTpService {
   String get(String url, String queryParam) throws WxErrorException;
 
   /**
-   * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求
+   * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求.
    *
    * @param url      接口地址
    * @param postData 请求body字符串
@@ -124,7 +123,7 @@ public interface WxCpTpService {
 
   /**
    * 
-   * 设置当微信系统响应系统繁忙时,要等待多少 retrySleepMillis(ms) * 2^(重试次数 - 1) 再发起重试
+   * 设置当微信系统响应系统繁忙时,要等待多少 retrySleepMillis(ms) * 2^(重试次数 - 1) 再发起重试.
    * 默认:1000ms
    * 
* @@ -134,7 +133,7 @@ public interface WxCpTpService { /** *
-   * 设置当微信系统响应系统繁忙时,最大重试次数
+   * 设置当微信系统响应系统繁忙时,最大重试次数.
    * 默认:5次
    * 
* @@ -148,21 +147,21 @@ public interface WxCpTpService { void initHttp(); /** - * 获取WxMpConfigStorage 对象 + * 获取WxMpConfigStorage 对象. * * @return WxMpConfigStorage */ WxCpTpConfigStorage getWxCpTpConfigStorage(); /** - * 注入 {@link WxCpTpConfigStorage} 的实现 + * 注入 {@link WxCpTpConfigStorage} 的实现. * * @param wxConfigProvider 配置对象 */ void setWxCpTpConfigStorage(WxCpTpConfigStorage wxConfigProvider); /** - * http请求对象 + * http请求对象. */ RequestHttp getRequestHttp(); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java index a0585af1..dbf4dabf 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java @@ -25,6 +25,8 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.*; + /** * . * @@ -95,7 +97,7 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ params.put("js_code", jsCode); params.put("grant_type", "authorization_code"); - final String url = configStorage.getApiUrl(WxCpApiPathConsts.Tp.JSCODE_TO_SESSION); + final String url = configStorage.getApiUrl(JSCODE_TO_SESSION); return WxCpMaJsCode2SessionResult.fromJson(this.get(url, Joiner.on("&").withKeyValueSeparator("=").join(params))); } @@ -105,20 +107,19 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("auth_corpid", authCorpid); jsonObject.addProperty("permanent_code", permanentCode); - String result = post(configStorage.getApiUrl(WxCpApiPathConsts.Tp.GET_CORP_TOKEN), jsonObject.toString()); + String result = post(configStorage.getApiUrl(GET_CORP_TOKEN), jsonObject.toString()); return WxAccessToken.fromJson(result); } - @Override public WxCpTpCorp getPermanentCode(String authCode) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("auth_code", authCode); - String result = post(configStorage.getApiUrl(WxCpApiPathConsts.Tp.GET_PERMANENT_CODE), jsonObject.toString()); + String result = post(configStorage.getApiUrl(GET_PERMANENT_CODE), jsonObject.toString()); jsonObject = new JsonParser().parse(result).getAsJsonObject(); - WxCpTpCorp wxCpTpCorp = WxCpTpCorp.fromJson(jsonObject.get("auth_corp_info").getAsString()); + WxCpTpCorp wxCpTpCorp = WxCpTpCorp.fromJson(jsonObject.get("auth_corp_info").getAsJsonObject().toString()); wxCpTpCorp.setPermanentCode(jsonObject.get("permanent_code").getAsString()); return wxCpTpCorp; } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java new file mode 100644 index 00000000..5de54f54 --- /dev/null +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java @@ -0,0 +1,172 @@ +package me.chanjar.weixin.cp.api.impl; + +import com.google.gson.JsonObject; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.api.WxCpTpService; +import me.chanjar.weixin.cp.bean.WxCpTpCorp; +import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; +import me.chanjar.weixin.cp.config.impl.WxCpTpDefaultConfigImpl; +import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; +import org.testng.annotations.Test; + +import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.GET_PERMANENT_CODE; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.*; +import static org.testng.Assert.*; + +/** + * 测试代码. + * + * @author Binary Wang + * @date 2019-08-18 + */ +public class BaseWxCpTpServiceImplTest { + private WxCpTpService tpService = spy(new WxCpTpServiceImpl()); + + @Test + public void testCheckSignature() { + } + + @Test + public void testGetSuiteAccessToken() { + } + + @Test + public void testGetSuiteTicket() { + } + + @Test + public void testTestGetSuiteTicket() { + } + + @Test + public void testJsCode2Session() { + } + + @Test + public void testGetCorpToken() { + } + + @Test + public void testGetPermanentCode() throws WxErrorException { + String returnJson = "{\n" + + " \"errcode\":0 ,\n" + + " \"errmsg\":\"ok\" ,\n" + + " \"access_token\": \"xxxxxx\", \n" + + " \"expires_in\": 7200, \n" + + " \"permanent_code\": \"xxxx\", \n" + + " \"dealer_corp_info\": \n" + + " {\n" + + " \"corpid\": \"xxxx\",\n" + + " \"corp_name\": \"name\"\n" + + " },\n" + + " \"auth_corp_info\": \n" + + " {\n" + + " \"corpid\": \"xxxx\",\n" + + " \"corp_name\": \"name\",\n" + + " \"corp_type\": \"verified\",\n" + + " \"corp_square_logo_url\": \"yyyyy\",\n" + + " \"corp_user_max\": 50,\n" + + " \"corp_agent_max\": 30,\n" + + " \"corp_full_name\":\"full_name\",\n" + + " \"verified_end_time\":1431775834,\n" + + " \"subject_type\": 1,\n" + + " \"corp_wxqrcode\": \"zzzzz\",\n" + + " \"corp_scale\": \"1-50人\",\n" + + " \"corp_industry\": \"IT服务\",\n" + + " \"corp_sub_industry\": \"计算机软件/硬件/信息服务\",\n" + + " \"location\":\"广东省广州市\"\n" + + " },\n" + + " \"auth_info\":\n" + + " {\n" + + " \"agent\" :\n" + + " [\n" + + " {\n" + + " \"agentid\":1,\n" + + " \"name\":\"NAME\",\n" + + " \"round_logo_url\":\"xxxxxx\",\n" + + " \"square_logo_url\":\"yyyyyy\",\n" + + " \"appid\":1,\n" + + " \"privilege\":\n" + + " {\n" + + " \"level\":1,\n" + + " \"allow_party\":[1,2,3],\n" + + " \"allow_user\":[\"zhansan\",\"lisi\"],\n" + + " \"allow_tag\":[1,2,3],\n" + + " \"extra_party\":[4,5,6],\n" + + " \"extra_user\":[\"wangwu\"],\n" + + " \"extra_tag\":[4,5,6]\n" + + " }\n" + + " },\n" + + " {\n" + + " \"agentid\":2,\n" + + " \"name\":\"NAME2\",\n" + + " \"round_logo_url\":\"xxxxxx\",\n" + + " \"square_logo_url\":\"yyyyyy\",\n" + + " \"appid\":5\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"auth_user_info\":\n" + + " {\n" + + " \"userid\":\"aa\",\n" + + " \"name\":\"xxx\",\n" + + " \"avatar\":\"http://xxx\"\n" + + " }\n" + + "}\n"; + + final WxCpTpConfigStorage configStorage = new WxCpTpDefaultConfigImpl(); + tpService.setWxCpTpConfigStorage(configStorage); + + JsonObject jsonObject = new JsonObject(); + String authCode = ""; + jsonObject.addProperty("auth_code", authCode); + doReturn(returnJson).when(tpService).post(configStorage.getApiUrl(GET_PERMANENT_CODE), jsonObject.toString()); + + final WxCpTpCorp tpCorp = tpService.getPermanentCode(authCode); + assertThat(tpCorp.getPermanentCode()).isEqualTo("xxxx"); + } + + @Test + public void testGet() { + } + + @Test + public void testPost() { + } + + @Test + public void testExecute() { + } + + @Test + public void testExecuteInternal() { + } + + @Test + public void testSetWxCpTpConfigStorage() { + } + + @Test + public void testSetRetrySleepMillis() { + } + + @Test + public void testSetMaxRetryTimes() { + } + + @Test + public void testGetTmpDirFile() { + } + + @Test + public void testSetTmpDirFile() { + } + + @Test + public void testGetRequestHttp() { + } +} From 358850ad6fbbca29bd8a738a7cdf53a4566603d5 Mon Sep 17 00:00:00 2001 From: Ziyear <31235089+Ziyear@users.noreply.github.com> Date: Tue, 20 Aug 2019 17:29:36 +0800 Subject: [PATCH 10/79] =?UTF-8?q?#1164=20=E5=BE=AE=E4=BF=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E6=A8=A1=E5=9D=97=E5=8E=BB=E9=99=A4=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=A4=9A=E4=BD=99=E7=9A=84=E9=94=99=E8=AF=AF=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/service/impl/BaseWxPayServiceImpl.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index d2805c06..0033fad4 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java @@ -142,10 +142,8 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { result.checkResult(this, this.getConfig().getSignType(), false); return result; } catch (WxPayException e) { - log.error(e.getMessage(), e); throw e; } catch (Exception e) { - log.error(e.getMessage(), e); throw new WxPayException("发生异常," + e.getMessage(), e); } } @@ -158,7 +156,6 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { log.debug("微信支付退款异步通知解析后的对象:{}", result); return result; } catch (Exception e) { - log.error(e.getMessage(), e); throw new WxPayException("发生异常," + e.getMessage(), e); } } @@ -172,10 +169,8 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { result.checkResult(this, this.getConfig().getSignType(), false); return result; } catch (WxPayException e) { - log.error(e.getMessage(), e); throw e; } catch (Exception e) { - log.error(e.getMessage(), e); throw new WxPayException("发生异常," + e.getMessage(), e); } @@ -527,13 +522,12 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { throw WxPayException.from(BaseWxPayResult.fromXML(new String(responseBytes, StandardCharsets.UTF_8), WxPayCommonResult.class)); } else { - this.log.error("解压zip文件出错", e); + throw new WxPayException("解压zip文件出错," + e.getMessage(), e); } } } catch (Exception e) { - this.log.error("解析对账单文件时出错", e); + throw new WxPayException("解析对账单文件时出错," + e.getMessage(), e); } - return null; } @@ -582,15 +576,13 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { throw WxPayException.from(BaseWxPayResult.fromXML(new String(responseBytes, StandardCharsets.UTF_8), WxPayCommonResult.class)); } else { - this.log.error("解压zip文件出错", e); - throw new WxPayException("解压zip文件出错"); + throw new WxPayException("解压zip文件出错", e); } } } catch (WxPayException wxPayException) { throw wxPayException; } catch (Exception e) { - this.log.error("解析对账单文件时出错", e); - throw new WxPayException("解压zip文件出错"); + throw new WxPayException("解压zip文件出错",e); } } From e1090372496588529825bb88df2a55722640bfef Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 20 Aug 2019 17:49:22 +0800 Subject: [PATCH 11/79] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/service/impl/BaseWxPayServiceImpl.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index 0033fad4..2f671488 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java @@ -144,7 +144,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { } catch (WxPayException e) { throw e; } catch (Exception e) { - throw new WxPayException("发生异常," + e.getMessage(), e); + throw new WxPayException("发生异常!", e); } } @@ -508,7 +508,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { return WxPayBillResult.fromRawBillResultString(responseContent, billType); } - private String handleGzipBill(String url, String requestStr) { + private String handleGzipBill(String url, String requestStr) throws WxPayException { try { byte[] responseBytes = this.postForBytes(url, requestStr, false); Path tempDirectory = Files.createTempDirectory("bill"); @@ -522,13 +522,12 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { throw WxPayException.from(BaseWxPayResult.fromXML(new String(responseBytes, StandardCharsets.UTF_8), WxPayCommonResult.class)); } else { - throw new WxPayException("解压zip文件出错," + e.getMessage(), e); + throw new WxPayException("解压zip文件出错!", e); } } } catch (Exception e) { - throw new WxPayException("解析对账单文件时出错," + e.getMessage(), e); + throw new WxPayException("解析对账单文件时出错!", e); } - return null; } @Override @@ -582,7 +581,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { } catch (WxPayException wxPayException) { throw wxPayException; } catch (Exception e) { - throw new WxPayException("解压zip文件出错",e); + throw new WxPayException("解压zip文件出错", e); } } From f24495b729a82374481a6b8aed401e40f2b4ad49 Mon Sep 17 00:00:00 2001 From: 94zhaoyueran <523764105@qq.com> Date: Wed, 21 Aug 2019 11:45:23 +0800 Subject: [PATCH 12/79] =?UTF-8?q?:sparkles:=20#1167=20=E5=A2=9E=E5=8A=A0Fi?= =?UTF-8?q?le=E7=B1=BB=E5=9E=8B=E8=BA=AB=E4=BB=BD=E8=AF=81OCR=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mp/api/impl/WxMpOcrServiceImpl.java | 8 ++- .../chanjar/weixin/mp/enums/WxMpApiUrl.java | 4 +- .../OcrDiscernApacheHttpRequestExecutor.java | 57 +++++++++++++++++++ .../ocr/OcrDiscernRequestExecutor.java | 36 ++++++++++++ 4 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java index 4d3c434e..0f52f2af 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java @@ -5,12 +5,14 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpOcrService; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult; +import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.FILEIDCARD; import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.IDCARD; /** @@ -37,7 +39,9 @@ public class WxMpOcrServiceImpl implements WxMpOcrService { } @Override - public WxMpOcrIdCardResult idCard(ImageType imgType, File imgFile) { - return null; + public WxMpOcrIdCardResult idCard(ImageType imgType, File imgFile) throws WxErrorException { + String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), String.format(FILEIDCARD.getUrl(this.wxMpService.getWxMpConfigStorage()), + imgType.getType()), imgFile); + return WxMpOcrIdCardResult.fromJson(result); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java index 63cbe958..503183cf 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java @@ -440,7 +440,9 @@ public interface WxMpApiUrl { /** * 身份证识别. */ - IDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?type=%s&img_url=%s"); + IDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?type=%s&img_url=%s"), + + FILEIDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?type=%s"); private String prefix; private String path; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java new file mode 100644 index 00000000..3547b40f --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java @@ -0,0 +1,57 @@ +package me.chanjar.weixin.mp.util.requestexecuter.ocr; + +import me.chanjar.weixin.common.error.WxError; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.http.RequestHttp; +import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.impl.client.CloseableHttpClient; + +import java.io.File; +import java.io.IOException; + +/** + * @author : zhayueran + * @Date: 2019/6/27 14:06 + * @Description: + */ +public class OcrDiscernApacheHttpRequestExecutor extends OcrDiscernRequestExecutor { + + + public OcrDiscernApacheHttpRequestExecutor(RequestHttp requestHttp) { + super(requestHttp); + } + + @Override + public String execute(String uri, File file) throws WxErrorException, IOException { + HttpPost httpPost = new HttpPost(uri); + if (requestHttp.getRequestHttpProxy() != null) { + RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build(); + httpPost.setConfig(config); + } + if (file != null) { + HttpEntity entity = MultipartEntityBuilder + .create() + .addBinaryBody("file", file) + .setMode(HttpMultipartMode.RFC6532) + .build(); + httpPost.setEntity(entity); + } + try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) { + String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); + WxError error = WxError.fromJson(responseContent); + if (error.getErrorCode() != 0) { + throw new WxErrorException(error); + } + return responseContent; + } finally { + httpPost.releaseConnection(); + } + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java new file mode 100644 index 00000000..c6638217 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java @@ -0,0 +1,36 @@ +package me.chanjar.weixin.mp.util.requestexecuter.ocr; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.http.RequestExecutor; +import me.chanjar.weixin.common.util.http.RequestHttp; +import me.chanjar.weixin.common.util.http.ResponseHandler; + +import java.io.File; +import java.io.IOException; + +/** + * @author : zhayueran + * @Date: 2019/6/27 15:06 + * @Description: + */ +public abstract class OcrDiscernRequestExecutor implements RequestExecutor { + protected RequestHttp requestHttp; + + public OcrDiscernRequestExecutor(RequestHttp requestHttp) { + this.requestHttp = requestHttp; + } + + @Override + public void execute(String uri, File data, ResponseHandler handler) throws WxErrorException, IOException { + handler.handle(this.execute(uri, data)); + } + + public static RequestExecutor create(RequestHttp requestHttp) { + switch (requestHttp.getRequestType()) { + case APACHE_HTTP: + return new OcrDiscernApacheHttpRequestExecutor(requestHttp); + default: + return null; + } + } +} From db638dd8b16a2c99595d86f8ea698a3216fef42d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 21 Aug 2019 14:02:44 +0800 Subject: [PATCH 13/79] =?UTF-8?q?:bug:=20#1087=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=95=BF=E9=93=BE=E6=8E=A5=E8=BD=AC=E7=9F=AD=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=B8=AD=E5=90=AB=E6=9C=89=E7=89=B9=E6=AE=8A?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E5=AF=BC=E8=87=B4=E5=BE=AE=E4=BF=A1access=5F?= =?UTF-8?q?token=E5=A4=B1=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/impl/BaseWxMpServiceImpl.java | 6 ++++++ .../weixin/mp/api/WxMpShortUrlAPITest.java | 15 +++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java index 59a0efeb..42a84540 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java @@ -145,6 +145,12 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH @Override public String shortUrl(String longUrl) throws WxErrorException { + if (longUrl.contains("&access_token=")) { + throw new WxErrorException(WxError.builder().errorCode(-1) + .errorMsg("要转换的网址中存在非法字符{&access_token=},会导致微信接口报错,属于微信bug,请调整地址,否则不建议使用此方法!") + .build()); + } + JsonObject o = new JsonObject(); o.addProperty("action", "long2short"); o.addProperty("long_url", longUrl); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java index ec6e75d7..2117b984 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java @@ -6,21 +6,28 @@ import me.chanjar.weixin.mp.api.test.ApiTestModule; import org.testng.*; import org.testng.annotations.*; +import static org.assertj.core.api.Assertions.assertThat; + /** * 测试短连接 * * @author chanjarster */ -@Test(groups = "shortURLAPI") +@Test @Guice(modules = ApiTestModule.class) public class WxMpShortUrlAPITest { - @Inject protected WxMpService wxService; public void testShortUrl() throws WxErrorException { - String shortUrl = this.wxService.shortUrl("www.baidu.com"); - Assert.assertNotNull(shortUrl); + String shortUrl = this.wxService.shortUrl("http://www.baidu.com/test?access_token=123"); + assertThat(shortUrl).isNotEmpty(); + System.out.println(shortUrl); + } + + @Test(expectedExceptions = WxErrorException.class) + public void testShortUrl_with_exceptional_url() throws WxErrorException { + this.wxService.shortUrl("http://www.baidu.com/test?redirect_count=1&access_token=123"); } } From 33929ce197289343273c24cb6822512dc0b757b4 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 22 Aug 2019 14:30:43 +0800 Subject: [PATCH 14/79] =?UTF-8?q?:bug:=20#1169=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=9B=B4=E6=96=B0=E6=88=90?= =?UTF-8?q?=E5=91=98=E4=BA=8B=E4=BB=B6=E6=B6=88=E6=81=AF=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/xml/IntegerArrayConverter.java | 37 ++++++++++++++ .../common/util/xml/LongArrayConverter.java | 37 ++++++++++++++ .../util/xml/XStreamCDataConverter.java | 5 ++ .../weixin/cp/bean/WxCpXmlMessage.java | 5 +- .../weixin/cp/bean/WxCpXmlMessageTest.java | 50 +++++++++++++++++++ 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java new file mode 100644 index 00000000..3a82b213 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java @@ -0,0 +1,37 @@ +package me.chanjar.weixin.common.util.xml; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; +import com.thoughtworks.xstream.converters.basic.StringConverter; + +/** + * Integer型数组转换器. + * + * @author Binary Wang + * @date 2019-08-22 + */ +public class IntegerArrayConverter extends StringConverter { + @Override + public boolean canConvert(Class type) { + return type == Integer[].class; + } + + @Override + public String toString(Object obj) { + return ""; + } + + @Override + public Object fromString(String str) { + final Iterable iterable = Splitter.on(",").split(str); + final String[] strings = Iterables.toArray(iterable, String.class); + Integer[] result = new Integer[strings.length]; + int index = 0; + for (String string : strings) { + result[index++] = Integer.parseInt(string); + } + + return result; + } +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java new file mode 100644 index 00000000..a383c596 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java @@ -0,0 +1,37 @@ +package me.chanjar.weixin.common.util.xml; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; +import com.thoughtworks.xstream.converters.basic.StringConverter; + +/** + * Long型数组转换器. + * + * @author Binary Wang + * @date 2019-08-22 + */ +public class LongArrayConverter extends StringConverter { + @Override + public boolean canConvert(Class type) { + return type == Long[].class; + } + + @Override + public String toString(Object obj) { + return ""; + } + + @Override + public Object fromString(String str) { + final Iterable iterable = Splitter.on(",").split(str); + final String[] strings = Iterables.toArray(iterable, String.class); + Long[] result = new Long[strings.length]; + int index = 0; + for (String string : strings) { + result[index++] = Long.parseLong(string); + } + + return result; + } +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java index aa948b34..ab1b1688 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java @@ -2,6 +2,11 @@ package me.chanjar.weixin.common.util.xml; import com.thoughtworks.xstream.converters.basic.StringConverter; +/** + * CDATA 内容转换器,加上CDATA标签. + * + * @author Daniel Qian + */ public class XStreamCDataConverter extends StringConverter { @Override diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java index 771e5729..712eed83 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.util.XmlUtils; +import me.chanjar.weixin.common.util.xml.IntegerArrayConverter; +import me.chanjar.weixin.common.util.xml.LongArrayConverter; import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; import me.chanjar.weixin.cp.config.WxCpConfigStorage; import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; @@ -214,7 +216,7 @@ public class WxCpXmlMessage implements Serializable { * 成员部门列表,变更时推送,仅返回该应用有查看权限的部门id. */ @XStreamAlias("Department") - @XStreamConverter(value = XStreamCDataConverter.class) + @XStreamConverter(value = LongArrayConverter.class) private Long[] departments; /** @@ -268,6 +270,7 @@ public class WxCpXmlMessage implements Serializable { * 表示所在部门是否为上级,0-否,1-是,顺序与Department字段的部门逐一对应. */ @XStreamAlias("IsLeaderInDept") + @XStreamConverter(value = IntegerArrayConverter.class) private Integer[] isLeaderInDept; /** diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java index e6efa043..f10b5d4f 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java @@ -2,9 +2,11 @@ package me.chanjar.weixin.cp.bean; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.cp.constant.WxCpConsts; +import me.chanjar.weixin.cp.util.xml.XStreamTransformer; import org.testng.annotations.Test; import static me.chanjar.weixin.cp.constant.WxCpConsts.EventType.TASKCARD_CLICK; +import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -222,4 +224,52 @@ public class WxCpXmlMessageTest { assertEquals(wxMessage.getUserId(), "zhangsan"); assertEquals(wxMessage.getExternalUserId(), "woAJ2GCAAAXtWyujaWJHDDGi0mACH71w"); } + + public void testChangeContact() { + String xml = "\n" + + " \n" + + " \n" + + " 1403610513\n" + + " \n" + + " \n" + + " update_user\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 15913215421\n" + + " 1\n" + + " \n" + + " 1\n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " 0\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 1\n" + + " \n" + + " <![CDATA[企业微信]]>\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
"; + + WxCpXmlMessage wxCpXmlMessage = WxCpXmlMessage.fromXml(xml); + assertThat(wxCpXmlMessage).isNotNull(); + assertThat(wxCpXmlMessage.getDepartments()).isNotEmpty(); + + System.out.println(XStreamTransformer.toXml(WxCpXmlMessage.class, wxCpXmlMessage)); + } } From 0754c7a01c64f33208c6e1e3c3bafe1c7cb8735a Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 22 Aug 2019 16:33:51 +0800 Subject: [PATCH 15/79] =?UTF-8?q?:bug:=20#1171=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=BC=9A=E5=91=98=E5=8D=A1=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=B8=AD=E9=94=99=E8=AF=AF=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/me/chanjar/weixin/mp/bean/card/BonusRule.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BonusRule.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BonusRule.java index ea668ad0..6a5c425a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BonusRule.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BonusRule.java @@ -8,6 +8,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 积分规则. + * * @author yuanqixun * date:2018-08-25 00:33 */ @@ -54,8 +55,8 @@ public class BonusRule implements Serializable { /** * 抵扣条件,满xx元(这里以分为单位)可用. */ - @SerializedName("least_moneyto_use_bonus") - private Integer leastMoneytoUseBonus; + @SerializedName("least_money_to_use_bonus") + private Integer leastMoneyToUseBonus; /** * 抵扣条件,单笔最多使用xx积分. From 0eed5e6b59f5d24415f720810c39e67a9b3a3f2d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 22 Aug 2019 16:44:17 +0800 Subject: [PATCH 16/79] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E5=92=8C?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=8C=96=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/WxMpCardService.java | 5 +++-- .../weixin/mp/api/impl/WxMpCardServiceImpl.java | 2 +- .../mp/bean/card/AbstractCardCreateRequest.java | 17 +++++++++++++++++ .../weixin/mp/bean/card/CardCreateRequest.java | 13 ------------- .../mp/bean/card/CashCardCreateRequest.java | 9 +++++++-- .../mp/bean/card/DiscountCardCreateRequest.java | 2 +- .../mp/bean/card/GeneralCardCreateRequest.java | 2 +- .../mp/bean/card/GiftCardCreateRequest.java | 2 +- .../mp/bean/card/GrouponCardCreateRequest.java | 2 +- ...eMessage.java => WxMpCardCreateRequest.java} | 14 ++++++++++---- .../weixin/mp/bean/card/WxMpCardResult.java | 2 +- .../mp/api/impl/WxMpCardServiceImplTest.java | 10 +++++----- 12 files changed, 48 insertions(+), 32 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/AbstractCardCreateRequest.java delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CardCreateRequest.java rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{WxMpCardCreateMessage.java => WxMpCardCreateRequest.java} (57%) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java index f5131e8f..903fd94d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java @@ -138,7 +138,7 @@ public interface WxMpCardService { * @return result * @throws WxErrorException 异常 */ - WxMpCardCreateResult createCard(WxMpCardCreateMessage cardCreateMessage) throws WxErrorException; + WxMpCardCreateResult createCard(WxMpCardCreateRequest cardCreateMessage) throws WxErrorException; /** * 创建卡券二维码. @@ -183,7 +183,8 @@ public interface WxMpCardService { * @return WxMpCardLandingPageCreateResult * @throws WxErrorException 异常 */ - WxMpCardLandingPageCreateResult createLandingPage(WxMpCardLandingPageCreateRequest createRequest) throws WxErrorException; + WxMpCardLandingPageCreateResult createLandingPage(WxMpCardLandingPageCreateRequest createRequest) + throws WxErrorException; /** * 将用户的卡券设置为失效状态. diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java index ec523f9a..2854ec16 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java @@ -178,7 +178,7 @@ public class WxMpCardServiceImpl implements WxMpCardService { } @Override - public WxMpCardCreateResult createCard(WxMpCardCreateMessage cardCreateMessage) throws WxErrorException { + public WxMpCardCreateResult createCard(WxMpCardCreateRequest cardCreateMessage) throws WxErrorException { String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_CREATE, GSON.toJson(cardCreateMessage)); return WxMpCardCreateResult.fromJson(response); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/AbstractCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/AbstractCardCreateRequest.java new file mode 100644 index 00000000..7655b240 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/AbstractCardCreateRequest.java @@ -0,0 +1,17 @@ +package me.chanjar.weixin.mp.bean.card; + +import lombok.Data; + +import java.io.Serializable; + +/** + * . + * + * @author leeis + * @date 2018/12/29 + */ +@Data +public abstract class AbstractCardCreateRequest implements Serializable { + private static final long serialVersionUID = -260291223712818801L; + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CardCreateRequest.java deleted file mode 100644 index 8cb16bc7..00000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CardCreateRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package me.chanjar.weixin.mp.bean.card; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author leeis - * @Date 2018/12/29 - */ -@Data -public class CardCreateRequest implements Serializable { -} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCardCreateRequest.java index dcefab0e..ab4d54e4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCardCreateRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCardCreateRequest.java @@ -2,17 +2,22 @@ package me.chanjar.weixin.mp.bean.card; import com.google.gson.annotations.SerializedName; import lombok.Data; +import lombok.EqualsAndHashCode; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import java.io.Serializable; /** * . + * * @author leeis - * @Date 2018/12/29 + * @date 2018/12/29 */ @Data -public class CashCardCreateRequest extends CardCreateRequest implements Serializable { +@EqualsAndHashCode(callSuper = false) +public class CashCardCreateRequest extends AbstractCardCreateRequest implements Serializable { + private static final long serialVersionUID = 8251635683908302125L; + @SerializedName("card_type") private String cardType = "CASH"; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCardCreateRequest.java index b527ec12..e125c190 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCardCreateRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCardCreateRequest.java @@ -14,7 +14,7 @@ import java.io.Serializable; */ @Data @EqualsAndHashCode(callSuper = true) -public class DiscountCardCreateRequest extends CardCreateRequest implements Serializable { +public class DiscountCardCreateRequest extends AbstractCardCreateRequest implements Serializable { private static final long serialVersionUID = 1190518086576489692L; @SerializedName("card_type") diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java index f1ac5698..4125011b 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java @@ -14,7 +14,7 @@ import java.io.Serializable; */ @Data @EqualsAndHashCode(callSuper = true) -public class GeneralCardCreateRequest extends CardCreateRequest implements Serializable { +public class GeneralCardCreateRequest extends AbstractCardCreateRequest implements Serializable { private static final long serialVersionUID = 1771355872211267723L; @SerializedName("card_type") diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCardCreateRequest.java index 5271763f..a757b00f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCardCreateRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCardCreateRequest.java @@ -14,7 +14,7 @@ import java.io.Serializable; */ @Data @EqualsAndHashCode(callSuper = true) -public class GiftCardCreateRequest extends CardCreateRequest implements Serializable { +public class GiftCardCreateRequest extends AbstractCardCreateRequest implements Serializable { private static final long serialVersionUID = 1283655452584811858L; @SerializedName("card_type") diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCardCreateRequest.java index aeab1fd3..1f001549 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCardCreateRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCardCreateRequest.java @@ -14,7 +14,7 @@ import java.io.Serializable; */ @Data @EqualsAndHashCode(callSuper = true) -public class GrouponCardCreateRequest extends CardCreateRequest implements Serializable { +public class GrouponCardCreateRequest extends AbstractCardCreateRequest implements Serializable { private static final long serialVersionUID = 7551441058859934512L; @SerializedName("card_type") diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateRequest.java similarity index 57% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateMessage.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateRequest.java index 760002cb..051dad29 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateRequest.java @@ -6,18 +6,24 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import java.io.Serializable; +/** + * . + * + * @author IOMan + */ @Data -public final class WxMpCardCreateMessage implements Serializable { +public final class WxMpCardCreateRequest implements Serializable { + private static final long serialVersionUID = 5951280855309617585L; @SerializedName("card") - private CardCreateRequest cardCreateRequest; + private AbstractCardCreateRequest cardCreateRequest; @Override public String toString() { return WxMpGsonBuilder.create().toJson(this); } - public static WxMpCardCreateMessage fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpCardCreateMessage.class); + public static WxMpCardCreateRequest fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpCardCreateRequest.class); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardResult.java index 9343cb40..b85dd7a8 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardResult.java @@ -6,7 +6,7 @@ import lombok.Data; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** - * 卡券查询Code,核销Code接口返回结果 + * 卡券查询Code,核销Code接口返回结果. * * @author YuJian * @version 15/11/11 diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java index b736f908..9238fd3b 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java @@ -137,7 +137,7 @@ public class WxMpCardServiceImplTest { base.setLocationIdList("1234"); //团购券 - WxMpCardCreateMessage grouponMessage = new WxMpCardCreateMessage(); + WxMpCardCreateRequest grouponMessage = new WxMpCardCreateRequest(); GrouponCardCreateRequest grouponCardCreateRequest = new GrouponCardCreateRequest(); GrouponCard grouponCard = new GrouponCard(); grouponCard.setBaseInfo(base); @@ -149,7 +149,7 @@ public class WxMpCardServiceImplTest { System.out.println(this.wxService.getCardService().createCard(grouponMessage)); //现金券 - WxMpCardCreateMessage cashMessage = new WxMpCardCreateMessage(); + WxMpCardCreateRequest cashMessage = new WxMpCardCreateRequest(); CashCardCreateRequest cashCardCreateRequest = new CashCardCreateRequest(); CashCard cashCard = new CashCard(); cashCard.setBaseInfo(base); @@ -162,7 +162,7 @@ public class WxMpCardServiceImplTest { System.out.println(this.wxService.getCardService().createCard(cashMessage)); //折扣券 - WxMpCardCreateMessage discountMessage = new WxMpCardCreateMessage(); + WxMpCardCreateRequest discountMessage = new WxMpCardCreateRequest(); DiscountCardCreateRequest discountCardCreateRequest = new DiscountCardCreateRequest(); DiscountCard discountCard = new DiscountCard(); discountCard.setBaseInfo(base); @@ -174,7 +174,7 @@ public class WxMpCardServiceImplTest { System.out.println(this.wxService.getCardService().createCard(discountMessage)); //兑换券 - WxMpCardCreateMessage giftMessage = new WxMpCardCreateMessage(); + WxMpCardCreateRequest giftMessage = new WxMpCardCreateRequest(); GiftCardCreateRequest giftCardCreateRequest = new GiftCardCreateRequest(); GiftCard giftCard = new GiftCard(); giftCard.setBaseInfo(base); @@ -185,7 +185,7 @@ public class WxMpCardServiceImplTest { System.out.println(this.wxService.getCardService().createCard(giftMessage)); //普通兑换券 - WxMpCardCreateMessage generalMessage = new WxMpCardCreateMessage(); + WxMpCardCreateRequest generalMessage = new WxMpCardCreateRequest(); GeneralCardCreateRequest generalCardCreateRequest = new GeneralCardCreateRequest(); GeneralCard generalCard = new GeneralCard(); generalCard.setBaseInfo(base); From 3e948ec01bb8e426145635123fa2f38d66a08013 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 22 Aug 2019 17:35:05 +0800 Subject: [PATCH 17/79] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E7=B1=BB=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/{GeneralCard.java => GeneralCoupon.java} | 10 +++++----- ...eRequest.java => GeneralCouponCreateRequest.java} | 6 +++--- .../weixin/mp/api/impl/WxMpCardServiceImplTest.java | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{GeneralCard.java => GeneralCoupon.java} (67%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/{GeneralCardCreateRequest.java => GeneralCouponCreateRequest.java} (78%) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCoupon.java similarity index 67% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCard.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCoupon.java index 2264d8ec..df8194a6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCard.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCoupon.java @@ -10,15 +10,15 @@ import java.io.Serializable; /** * . * @author leeis - * @Date 2018/12/29 + * @date 2018/12/29 */ @Data @EqualsAndHashCode(callSuper = true) -public final class GeneralCard extends Card implements Serializable { +public final class GeneralCoupon extends Card implements Serializable { private static final long serialVersionUID = -1577656733441132585L; /** - * 兑换券专用,填写兑换内容的名称。 + * 兑换券专用,填写兑换内容的名称. */ @SerializedName("default_detail") private String defaultDetail; @@ -28,7 +28,7 @@ public final class GeneralCard extends Card implements Serializable { return WxMpGsonBuilder.create().toJson(this); } - public static GeneralCard fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, GeneralCard.class); + public static GeneralCoupon fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, GeneralCoupon.class); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCouponCreateRequest.java similarity index 78% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCouponCreateRequest.java index 4125011b..b44dc74c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCouponCreateRequest.java @@ -10,18 +10,18 @@ import java.io.Serializable; /** * . * @author leeis - * @Date 2018/12/29 + * @date 2018/12/29 */ @Data @EqualsAndHashCode(callSuper = true) -public class GeneralCardCreateRequest extends AbstractCardCreateRequest implements Serializable { +public class GeneralCouponCreateRequest extends AbstractCardCreateRequest implements Serializable { private static final long serialVersionUID = 1771355872211267723L; @SerializedName("card_type") private String cardType = "GENERAL_COUPON"; @SerializedName("general_coupon") - private GeneralCard generalCoupon; + private GeneralCoupon generalCoupon; @Override public String toString() { diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java index 9238fd3b..948af00c 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java @@ -186,13 +186,13 @@ public class WxMpCardServiceImplTest { //普通兑换券 WxMpCardCreateRequest generalMessage = new WxMpCardCreateRequest(); - GeneralCardCreateRequest generalCardCreateRequest = new GeneralCardCreateRequest(); - GeneralCard generalCard = new GeneralCard(); - generalCard.setBaseInfo(base); - generalCard.setDefaultDetail("音乐木盒"); + GeneralCouponCreateRequest generalCouponCreateRequest = new GeneralCouponCreateRequest(); + GeneralCoupon generalCoupon = new GeneralCoupon(); + generalCoupon.setBaseInfo(base); + generalCoupon.setDefaultDetail("音乐木盒"); - generalCardCreateRequest.setGeneralCoupon(generalCard); - generalMessage.setCardCreateRequest(generalCardCreateRequest); + generalCouponCreateRequest.setGeneralCoupon(generalCoupon); + generalMessage.setCardCreateRequest(generalCouponCreateRequest); System.out.println(this.wxService.getCardService().createCard(generalMessage)); } From 8f1c7420a5978c4ba1925209027bd7f7f041460c Mon Sep 17 00:00:00 2001 From: S Date: Fri, 23 Aug 2019 09:34:35 +0800 Subject: [PATCH 18/79] =?UTF-8?q?:sparkles:=20#1172=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=BC=80=E6=94=BE=E5=B9=B3=E5=8F=B0=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E6=96=B9=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=88=86=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E5=8F=91=E5=B8=83=E5=8A=9F=E8=83=BD=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/open/api/WxOpenMaService.java | 48 +++++++ .../open/api/impl/WxOpenMaServiceImpl.java | 119 +++++++++++++++++- .../result/WxOpenMaGrayReleasePlanResult.java | 54 ++++++++ .../WxOpenMaWeappSupportVersionResult.java | 53 ++++++++ 4 files changed, 272 insertions(+), 2 deletions(-) create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaGrayReleasePlanResult.java create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaWeappSupportVersionResult.java diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java index 8dfd7a85..1a061143 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java @@ -187,6 +187,13 @@ public interface WxOpenMaService extends WxMaService { */ String getWebViewDomain() throws WxErrorException; + /** + * 获取小程序的业务域名 + * + * @return + */ + public WxOpenResult getWebViewDomainInfo() throws WxErrorException; + /** * 设置小程序的业务域名 * @@ -195,6 +202,16 @@ public interface WxOpenMaService extends WxMaService { */ String setWebViewDomain(String action, List domainList) throws WxErrorException; + + /** + * 设置小程序的业务域名 + * + * @param action add添加, delete删除, set覆盖 + * @param domainList + * @return + */ + WxOpenResult setWebViewDomainInfo(String action, List domainList) throws WxErrorException; + /** * 获取小程序的信息 */ @@ -272,6 +289,12 @@ public interface WxOpenMaService extends WxMaService { */ WxOpenResult releaesAudited() throws WxErrorException; + /** + * 10. 修改小程序线上代码的可见状态(仅供第三方代小程序调用) + */ + public WxOpenResult changeVisitstatus(String action) throws WxErrorException; + + /** * 11. 小程序版本回退(仅供第三方代小程序调用) */ @@ -288,9 +311,34 @@ public interface WxOpenMaService extends WxMaService { */ String getSupportVersion() throws WxErrorException; + /** + * 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) + */ + WxOpenMaWeappSupportVersionResult getSupportVersionInfo() throws WxErrorException; + /** * 设置最低基础库版本(仅供第三方代小程序调用) */ String setSupportVersion(String version) throws WxErrorException; + /** + * 设置最低基础库版本(仅供第三方代小程序调用) + */ + WxOpenResult setSupportVersionInfo(String version) throws WxErrorException; + + /** + * 16. 小程序分阶段发布 - 1)分阶段发布接口 + */ + WxOpenResult grayrelease(Integer grayPercentage) throws WxErrorException; + + /** + * 16. 小程序分阶段发布 - 2)取消分阶段发布 + */ + WxOpenResult revertgrayrelease() throws WxErrorException; + + /** + * 16. 小程序分阶段发布 - 3)查询当前分阶段发布详情 + */ + WxOpenMaGrayReleasePlanResult getgrayreleaseplan() throws WxErrorException; + } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java index b1ba0f7f..caf187ee 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java @@ -104,6 +104,16 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ return setWebViewDomain("get", null); } + /** + * 获取小程序的业务域名 + * + * @return + */ + @Override + public WxOpenResult getWebViewDomainInfo() throws WxErrorException { + return setWebViewDomainInfo("get", null); + } + /** * 设置小程序的业务域名 * @@ -123,6 +133,20 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ return response; } + + /** + * 设置小程序的业务域名 + * + * @param action add添加, delete删除, set覆盖 + * @return + */ + @Override + public WxOpenResult setWebViewDomainInfo(String action, List domainList) throws WxErrorException { + String response = this.setWebViewDomain(action, domainList); + return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + } + + /** * 获取小程序的信息,GET请求 *
@@ -139,6 +163,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
     return response;
   }
 
+
   /**
    * 绑定小程序体验者
    *
@@ -302,6 +327,22 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
     return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
   }
 
+
+  /**
+   * 10. 修改小程序线上代码的可见状态(仅供第三方代小程序调用)
+   * @param action 设置可访问状态,发布后默认可访问,close为不可见,open为可见
+   * @return
+   * @throws WxErrorException
+   */
+  @Override
+  public WxOpenResult changeVisitstatus(String action) throws WxErrorException {
+    JsonObject params = new JsonObject();
+    params.addProperty("action", action);
+    String response = post(API_CHANGE_VISITSTATUS, GSON.toJson(params));
+    return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+  }
+
+
   /**
    * 11. 小程序版本回退(仅供第三方代小程序调用)
    *
@@ -314,6 +355,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
     return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
   }
 
+
   /**
    * 15. 小程序审核撤回
    * 

@@ -330,7 +372,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ } /** - * 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) + * 12. 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) * * @return * @throws WxErrorException @@ -342,8 +384,21 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ return response; } + /** - * 设置最低基础库版本(仅供第三方代小程序调用) + * 12. 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用) + * + * @return + * @throws WxErrorException + */ + @Override + public WxOpenMaWeappSupportVersionResult getSupportVersionInfo() throws WxErrorException { + String response = this.getSupportVersion(); + return WxMaGsonBuilder.create().fromJson(response, WxOpenMaWeappSupportVersionResult.class); + } + + /** + * 13. 设置最低基础库版本(仅供第三方代小程序调用) * * @param version * @return @@ -357,6 +412,66 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ return response; } + + + /** + * 13. 设置最低基础库版本(仅供第三方代小程序调用) + * + * @param version + * @return + * @throws WxErrorException + */ + @Override + public WxOpenResult setSupportVersionInfo(String version) throws WxErrorException { + String response = this.setSupportVersion(version); + return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + } + + + /** + * 16. 小程序分阶段发布 - 1)分阶段发布接口 + * + * @param grayPercentage 灰度的百分比,1到100的整数 + * @return + * @throws WxErrorException + */ + @Override + public WxOpenResult grayrelease(Integer grayPercentage) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("gray_percentage", grayPercentage); + String response = post(API_GRAY_RELEASE, GSON.toJson(params)); + return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + } + + + /** + * 16. 小程序分阶段发布 - 2)取消分阶段发布 + * + * @return + * @throws WxErrorException + */ + @Override + + public WxOpenResult revertgrayrelease() throws WxErrorException { + String response = get(API_REVERT_GRAY_RELEASE, null); + return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + } + + + /** + * 16. 小程序分阶段发布 - 3)查询当前分阶段发布详情 + * + * @return + * @throws WxErrorException + */ + @Override + public WxOpenMaGrayReleasePlanResult getgrayreleaseplan() throws WxErrorException { + String response = get(API_GET_GRAY_RELEASE_PLAN, null); + return WxMaGsonBuilder.create().fromJson(response, WxOpenMaGrayReleasePlanResult.class); + } + + + /** * 将字符串对象转化为GsonArray对象 * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaGrayReleasePlanResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaGrayReleasePlanResult.java new file mode 100644 index 00000000..33f9f2b8 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaGrayReleasePlanResult.java @@ -0,0 +1,54 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * 微信开放平台小程序当前分阶段发布详情 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class WxOpenMaGrayReleasePlanResult extends WxOpenResult { + + private static final long serialVersionUID = 8417849861393170728L; + + @SerializedName("gray_release_plan") + private GrayReleasePlanBean grayReleasePlan; + + + @Data + public static class GrayReleasePlanBean { + + /** + * 0:初始状态 1:执行中 2:暂停中 3:执行完毕 4:被删除 + */ + @SerializedName("status") + private Integer status; + + /** + * 创建时间 + */ + @SerializedName("create_timestamp") + private Long createTimestamp; + + + /** + * 灰度百分比 + */ + @SerializedName("gray_percentage") + private Integer grayPercentage; + } + + + @Override + public String toString() { + return WxOpenGsonBuilder.create().toJson(this); + } + + +} diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaWeappSupportVersionResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaWeappSupportVersionResult.java new file mode 100644 index 00000000..a39ef2b4 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaWeappSupportVersionResult.java @@ -0,0 +1,53 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; + +import java.util.List; + +/** + * 查询当前设置的最低基础库版本及各版本用户占比 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class WxOpenMaWeappSupportVersionResult extends WxOpenResult { + + + private static final long serialVersionUID = -2955725249930665377L; + + @SerializedName("now_version") + String nowVersion; + + @SerializedName("uv_info") + UvInfoBean uvInfo; + + + @Data + public static class UvInfoBean { + + @SerializedName("items") + List items; + + } + + @Data + public static class VersionPercentageBean { + + @SerializedName("percentage") + private Integer percentage; + + @SerializedName("version") + private String version; + + } + + @Override + public String toString() { + return WxOpenGsonBuilder.create().toJson(this); + } + + + +} From 3a4f5f94e1e6dad147bd0f1cc118cbc57f0f0ae1 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 23 Aug 2019 09:50:32 +0800 Subject: [PATCH 19/79] :white_check_mark: add test for post method --- .../wx/miniapp/api/impl/WxMaServiceImplTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java index 85fb2f98..bf502733 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java @@ -37,4 +37,16 @@ public class WxMaServiceImplTest { final String unionId = this.wxService.getPaidUnionId("1", null, "3", "4"); assertThat(unionId).isNotEmpty(); } + + @Test + public void testPost() throws WxErrorException { + final String postResult = this.wxService.post("https://api.weixin.qq.com/wxa/setdynamicdata", "{\n" + + " \"data\": \"{\\\"items\\\": [{\\\"from\\\":{\\\"city_name_cn\\\":\\\"广州市\\\"},\\\"to\\\":{\\\"city_name_cn\\\":\\\"北京市\\\"}}], \\\"attribute\\\": {\\\"count\\\": 1, \\\"totalcount\\\": 100, \\\"id\\\": \\\"1\\\", \\\"seq\\\": 0}}\",\n" + + " \"lifespan\": 86400,\n" + + " \"query\": \"{\\\"type\\\":100005}\",\n" + + " \"scene\": 1\n" + + "}"); + + System.out.println(postResult); + } } From 58244ee9ec5479cc9af18d40b41d1ef94570b6cb Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 23 Aug 2019 15:22:02 +0800 Subject: [PATCH 20/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.2.B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-miniapp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- weixin-java-open/pom.xml | 2 +- weixin-java-pay/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index d0bcd5c8..70a02b44 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.5.1.B + 3.5.2.B pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index 9dab3160..f3da2b5a 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java com.github.binarywang - 3.5.1.B + 3.5.2.B ../../ 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index 1ce8a998..296c67c1 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.1.B + 3.5.2.B ../../ diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index c61cb7ca..204987c5 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java com.github.binarywang - 3.5.1.B + 3.5.2.B ../../ 4.0.0 diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 78b48341..36912bcb 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.1.B + 3.5.2.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 573ab6f5..43fb3991 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.1.B + 3.5.2.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 51f0316d..61f884d6 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.1.B + 3.5.2.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 7057d720..3b0692f2 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.1.B + 3.5.2.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 74533f66..679bd7e1 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.1.B + 3.5.2.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 53c5e5c1..4531ee93 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.5.1.B + 3.5.2.B 4.0.0 From b45f20a8566d7469d8bf92183056c383977e39bf Mon Sep 17 00:00:00 2001 From: S Date: Tue, 27 Aug 2019 12:31:16 +0800 Subject: [PATCH 21/79] =?UTF-8?q?:sparkles:=20#1177=20=E5=BC=80=E6=94=BE?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=9F=BA=E7=A1=80=E4=BF=A1=E6=81=AF=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/open/api/WxOpenMaService.java | 58 +++++++++++++++++++ .../open/api/impl/WxOpenMaServiceImpl.java | 57 +++++++++++++++++- .../result/WxOpenMaSearchStatusResult.java | 20 +++++++ .../bean/result/WxOpenMaShowItemResult.java | 34 +++++++++++ 4 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaSearchStatusResult.java create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaShowItemResult.java diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java index 1a061143..784aa245 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java @@ -70,6 +70,35 @@ public interface WxOpenMaService extends WxMaService { */ String API_GET_TESTERLIST = "https://api.weixin.qq.com/wxa/memberauth"; + /** + * 以下接口基础信息设置 + *

+ * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21517799059ZSEMr&token=6f965b5daf30a98a6bbd2a386faea5c934e929bf&lang=zh_CN + *

+ */ + + /** + * 1. 设置小程序隐私设置(是否可被搜索) + */ + String API_CHANGE_WXA_SEARCH_STATUS = "https://api.weixin.qq.com/wxa/changewxasearchstatus"; + + /** + * 2. 查询小程序当前隐私设置(是否可被搜索) + */ + String API_GET_WXA_SEARCH_STATUS = "https://api.weixin.qq.com/wxa/getwxasearchstatus"; + + /** + * 3.1. 获取展示的公众号信息 + */ + String API_GET_SHOW_WXA_ITEM = "https://api.weixin.qq.com/wxa/getshowwxaitem"; + + /** + * 3.2 设置展示的公众号 + */ + String API_UPDATE_SHOW_WXA_ITEM = "https://api.weixin.qq.com/wxa/updateshowwxaitem"; + + + /** * 以下接口为三方平台代小程序实现的代码管理功能 *

@@ -238,6 +267,35 @@ public interface WxOpenMaService extends WxMaService { */ WxOpenMaTesterListResult getTesterList() throws WxErrorException; + + + /** + * 设置小程序隐私设置(是否可被搜索) + * + * @param status 1表示不可搜索,0表示可搜索 + */ + public WxOpenResult changeWxaSearchStatus(Integer status) throws WxErrorException; + + + /** + * 2. 查询小程序当前隐私设置(是否可被搜索) + */ + public WxOpenMaSearchStatusResult getWxaSearchStatus() throws WxErrorException; + + /** + * 3.1 获取展示的公众号信息 + */ + public WxOpenMaShowItemResult getShowWxaItem() throws WxErrorException; + + + /** + * 3.2 设置展示的公众号 + * + * @param flag 0 关闭,1 开启 + * @param mpappid 如果开启,需要传新的公众号appid + */ + public WxOpenResult updateShowwxaitem(Integer flag, String mpappid) throws WxErrorException; + /** * 1、为授权的小程序帐号上传小程序代码 * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java index caf187ee..2696d9d2 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java @@ -137,7 +137,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ /** * 设置小程序的业务域名 * - * @param action add添加, delete删除, set覆盖 + * @param action add添加, delete删除, set覆盖 * @return */ @Override @@ -208,6 +208,58 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ return WxMaGsonBuilder.create().fromJson(response, WxOpenMaTesterListResult.class); } + + /** + * 设置小程序隐私设置(是否可被搜索) + * + * @param status 1表示不可搜索,0表示可搜索 + */ + @Override + public WxOpenResult changeWxaSearchStatus(Integer status) throws WxErrorException { + JsonObject paramJson = new JsonObject(); + paramJson.addProperty("status", status); + String response = post(API_CHANGE_WXA_SEARCH_STATUS, GSON.toJson(paramJson)); + return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + } + + + /** + * 2. 查询小程序当前隐私设置(是否可被搜索) + */ + @Override + public WxOpenMaSearchStatusResult getWxaSearchStatus() throws WxErrorException { + JsonObject paramJson = new JsonObject(); + String response = post(API_GET_WXA_SEARCH_STATUS, GSON.toJson(paramJson)); + return WxMaGsonBuilder.create().fromJson(response, WxOpenMaSearchStatusResult.class); + } + + + /** + * 3.1 获取展示的公众号信息 + */ + @Override + public WxOpenMaShowItemResult getShowWxaItem() throws WxErrorException { + String response = get(API_GET_SHOW_WXA_ITEM, null); + return WxMaGsonBuilder.create().fromJson(response, WxOpenMaShowItemResult.class); + } + + + /** + * 3.2 设置展示的公众号 + * + * @param flag 0 关闭,1 开启 + * @param mpappid 如果开启,需要传新的公众号appid + */ + @Override + public WxOpenResult updateShowwxaitem(Integer flag, String mpappid) throws WxErrorException { + JsonObject paramJson = new JsonObject(); + paramJson.addProperty("wxa_subscribe_biz_flag", flag); + paramJson.addProperty("appid", mpappid); + String response = post(API_UPDATE_SHOW_WXA_ITEM, GSON.toJson(paramJson)); + return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + } + + /** * 1、为授权的小程序帐号上传小程序代码 * @@ -330,6 +382,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ /** * 10. 修改小程序线上代码的可见状态(仅供第三方代小程序调用) + * * @param action 设置可访问状态,发布后默认可访问,close为不可见,open为可见 * @return * @throws WxErrorException @@ -413,7 +466,6 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ } - /** * 13. 设置最低基础库版本(仅供第三方代小程序调用) * @@ -471,7 +523,6 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ } - /** * 将字符串对象转化为GsonArray对象 * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaSearchStatusResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaSearchStatusResult.java new file mode 100644 index 00000000..9c5c08f1 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaSearchStatusResult.java @@ -0,0 +1,20 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxOpenMaSearchStatusResult extends WxOpenResult { + private static final long serialVersionUID = -1843419921284224813L; + + @SerializedName("status") + private Integer status; + + @Override + public String toString() { + return WxOpenGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaShowItemResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaShowItemResult.java new file mode 100644 index 00000000..a0a30f92 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaShowItemResult.java @@ -0,0 +1,34 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxOpenMaShowItemResult extends WxOpenResult { + + private static final long serialVersionUID = -5707576958339934210L; + + @SerializedName("is_open") + private Integer isOpen; + + @SerializedName("can_open") + private Integer canOpen; + + @SerializedName("appid") + private String appid; + + @SerializedName("nickname") + private String nickname; + + @SerializedName("headimg") + private String headimg; + + @Override + public String toString() { + return WxOpenGsonBuilder.create().toJson(this); + } + +} From 2eb0aa574caa9b2852f56c84555a417fa7895ba3 Mon Sep 17 00:00:00 2001 From: S Date: Wed, 28 Aug 2019 16:57:24 +0800 Subject: [PATCH 22/79] =?UTF-8?q?:bug:=20#1181=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=BB=91=E5=AE=9A=E4=BD=93=E9=AA=8C?= =?UTF-8?q?=E8=80=85=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/open/api/WxOpenMaService.java | 2 +- .../open/api/impl/WxOpenMaServiceImpl.java | 4 ++-- .../bean/result/WxOpenMaBindTesterResult.java | 23 +++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaBindTesterResult.java diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java index 784aa245..f3ea5934 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java @@ -253,7 +253,7 @@ public interface WxOpenMaService extends WxMaService { * @return * @throws WxErrorException */ - WxOpenResult bindTester(String wechatid) throws WxErrorException; + WxOpenMaBindTesterResult bindTester(String wechatid) throws WxErrorException; /** * 解除绑定小程序体验者 diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java index 2696d9d2..93c776c0 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java @@ -172,11 +172,11 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ * @throws WxErrorException */ @Override - public WxOpenResult bindTester(String wechatid) throws WxErrorException { + public WxOpenMaBindTesterResult bindTester(String wechatid) throws WxErrorException { JsonObject paramJson = new JsonObject(); paramJson.addProperty("wechatid", wechatid); String response = post(API_BIND_TESTER, GSON.toJson(paramJson)); - return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + return WxMaGsonBuilder.create().fromJson(response, WxOpenMaBindTesterResult.class); } /** diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaBindTesterResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaBindTesterResult.java new file mode 100644 index 00000000..ac060034 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaBindTesterResult.java @@ -0,0 +1,23 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxOpenMaBindTesterResult extends WxOpenResult { + + + private static final long serialVersionUID = -730133894662203011L; + + @SerializedName("userstr") + private String userstr; + + @Override + public String toString() { + return WxOpenGsonBuilder.create().toJson(this); + } + +} From b0ff3f0e93e70961e49e76c32378529722e24bb0 Mon Sep 17 00:00:00 2001 From: Mario Luo Date: Thu, 29 Aug 2019 09:10:04 +0800 Subject: [PATCH 23/79] =?UTF-8?q?:bug:=20#1182=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7spring-boot-starter=20jedis=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=96=B9=E4=BE=BF?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E6=B3=A8=E5=85=A5=E5=AD=90service=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx-java-mp-spring-boot-starter/pom.xml | 1 + .../config/WxMpServiceAutoConfiguration.java | 134 ++++++++++++++---- 2 files changed, 106 insertions(+), 29 deletions(-) diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index 296c67c1..da66b5e7 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -38,6 +38,7 @@ redis.clients jedis + compile org.projectlombok diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java index c39402ac..7d962267 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java @@ -1,13 +1,9 @@ package com.binarywang.spring.starter.wxjava.mp.config; -import me.chanjar.weixin.mp.config.WxMpConfigStorage; -import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.*; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import me.chanjar.weixin.mp.config.WxMpConfigStorage; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -18,38 +14,118 @@ import org.springframework.context.annotation.Configuration; */ @Configuration public class WxMpServiceAutoConfiguration { - @Autowired - private ApplicationContext ctx; @Bean @ConditionalOnMissingBean public WxMpService wxMpService(WxMpConfigStorage configStorage) { WxMpService wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(configStorage); - registerWxMpSubService(wxMpService); return wxMpService; } - @ConditionalOnBean(WxMpService.class) - public Object registerWxMpSubService(WxMpService wxMpService) { - ConfigurableListableBeanFactory factory = (ConfigurableListableBeanFactory) ctx.getAutowireCapableBeanFactory(); - factory.registerSingleton("wxMpKefuService", wxMpService.getKefuService()); - factory.registerSingleton("wxMpMaterialService", wxMpService.getMaterialService()); - factory.registerSingleton("wxMpMenuService", wxMpService.getMenuService()); - factory.registerSingleton("wxMpUserService", wxMpService.getUserService()); - factory.registerSingleton("wxMpUserTagService", wxMpService.getUserTagService()); - factory.registerSingleton("wxMpQrcodeService", wxMpService.getQrcodeService()); - factory.registerSingleton("wxMpCardService", wxMpService.getCardService()); - factory.registerSingleton("wxMpDataCubeService", wxMpService.getDataCubeService()); - factory.registerSingleton("wxMpUserBlacklistService", wxMpService.getBlackListService()); - factory.registerSingleton("wxMpStoreService", wxMpService.getStoreService()); - factory.registerSingleton("wxMpTemplateMsgService", wxMpService.getTemplateMsgService()); - factory.registerSingleton("wxMpSubscribeMsgService", wxMpService.getSubscribeMsgService()); - factory.registerSingleton("wxMpDeviceService", wxMpService.getDeviceService()); - factory.registerSingleton("wxMpShakeService", wxMpService.getShakeService()); - factory.registerSingleton("wxMpMemberCardService", wxMpService.getMemberCardService()); - factory.registerSingleton("wxMpMassMessageService", wxMpService.getMassMessageService()); - return Boolean.TRUE; + @Bean + public WxMpKefuService wxMpKefuService(WxMpService wxMpService) { + return wxMpService.getKefuService(); + } + + @Bean + public WxMpMaterialService wxMpMaterialService(WxMpService wxMpService) { + return wxMpService.getMaterialService(); + } + + @Bean + public WxMpMenuService wxMpMenuService(WxMpService wxMpService) { + return wxMpService.getMenuService(); + } + + @Bean + public WxMpUserService wxMpUserService(WxMpService wxMpService) { + return wxMpService.getUserService(); + } + + @Bean + public WxMpUserTagService wxMpUserTagService(WxMpService wxMpService) { + return wxMpService.getUserTagService(); + } + + @Bean + public WxMpQrcodeService wxMpQrcodeService(WxMpService wxMpService) { + return wxMpService.getQrcodeService(); + } + + @Bean + public WxMpCardService wxMpCardService(WxMpService wxMpService) { + return wxMpService.getCardService(); + } + + @Bean + public WxMpDataCubeService wxMpDataCubeService(WxMpService wxMpService) { + return wxMpService.getDataCubeService(); + } + + @Bean + public WxMpUserBlacklistService wxMpUserBlacklistService(WxMpService wxMpService) { + return wxMpService.getBlackListService(); + } + + @Bean + public WxMpStoreService wxMpStoreService(WxMpService wxMpService) { + return wxMpService.getStoreService(); + } + + @Bean + public WxMpTemplateMsgService wxMpTemplateMsgService(WxMpService wxMpService) { + return wxMpService.getTemplateMsgService(); + } + + @Bean + public WxMpSubscribeMsgService wxMpSubscribeMsgService(WxMpService wxMpService) { + return wxMpService.getSubscribeMsgService(); + } + + @Bean + public WxMpDeviceService wxMpDeviceService(WxMpService wxMpService) { + return wxMpService.getDeviceService(); + } + + @Bean + public WxMpShakeService wxMpShakeService(WxMpService wxMpService) { + return wxMpService.getShakeService(); + } + + @Bean + public WxMpMemberCardService wxMpMemberCardService(WxMpService wxMpService) { + return wxMpService.getMemberCardService(); + } + + @Bean + public WxMpMassMessageService wxMpMassMessageService(WxMpService wxMpService) { + return wxMpService.getMassMessageService(); + } + + @Bean + public WxMpAiOpenService wxMpAiOpenService(WxMpService wxMpService) { + return wxMpService.getAiOpenService(); + } + + @Bean + public WxMpWifiService wxMpWifiService(WxMpService wxMpService) { + return wxMpService.getWifiService(); + } + + @Bean + public WxMpMarketingService wxMpMarketingService(WxMpService wxMpService) { + return wxMpService.getMarketingService(); + } + + @Bean + public WxMpCommentService wxMpCommentService(WxMpService wxMpService) { + return wxMpService.getCommentService(); + } + + @Bean + public WxMpOcrService wxMpOcrService(WxMpService wxMpService) { + return wxMpService.getOcrService(); } } From e463c784374686d0c9cf586e58b3a38fc3cb5ecf Mon Sep 17 00:00:00 2001 From: S Date: Thu, 29 Aug 2019 13:59:46 +0800 Subject: [PATCH 24/79] =?UTF-8?q?:bug:=20#1185=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E5=B0=8F=E7=A8=8B=E5=BA=8F=E9=83=A8?= =?UTF-8?q?=E5=88=86=E8=AF=B7=E6=B1=82=E5=92=8C=E8=BF=94=E5=9B=9E=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/impl/WxOpenComponentServiceImpl.java | 4 ++-- .../open/bean/ma/WxMaOpenCommitExtInfo.java | 17 +++++++++++++++++ .../weixin/open/bean/ma/WxMaOpenTab.java | 8 ++++++++ .../message/WxOpenMaSubmitAuditMessage.java | 15 +++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java index 0db4cb47..84f7e382 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java @@ -416,8 +416,8 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { public List getTemplateList() throws WxErrorException { String responseContent = get(GET_TEMPLATE_LIST_URL, "access_token"); JsonObject response = JSON_PARSER.parse(StringUtils.defaultString(responseContent, "{}")).getAsJsonObject(); - boolean hasDraftList = response.has("template_list"); - if (hasDraftList) { + boolean hasTemplateList = response.has("template_list"); + if (hasTemplateList) { return WxOpenGsonBuilder.create().fromJson(response.getAsJsonArray("template_list"), new TypeToken>() { }.getType()); diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java index 66aebec3..e7a43894 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.open.bean.ma; import com.google.gson.annotations.SerializedName; import lombok.Data; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; import org.apache.commons.lang3.StringUtils; import java.io.Serializable; @@ -14,6 +15,8 @@ import java.util.Map; * 微信小程序三方平台代上传代码提交额外信息对象 *

* 如果代码中已经有配置,则配置的合并规则为:除了pages和tabBar.list直接覆盖原配置,其他都为插入或同级覆盖。 + * extjson 详细说明 + * https://developers.weixin.qq.com/miniprogram/dev/devtools/ext.html#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF%E5%BC%80%E5%8F%91 *

* * @author yqx @@ -31,6 +34,16 @@ public class WxMaOpenCommitExtInfo implements Serializable { */ private String extAppid; + /** + * 配置 ext.json 是否生效 + */ + private Boolean extEnable = Boolean.TRUE; + + /** + * 是否直接提交到待审核列表 + */ + private Boolean directCommit = Boolean.FALSE; + @SerializedName("ext") private Map extMap; @@ -99,4 +112,8 @@ public class WxMaOpenCommitExtInfo implements Serializable { public static WxMaOpenCommitExtInfo INSTANCE() { return new WxMaOpenCommitExtInfo(); } + + public String toJson() { + return WxOpenGsonBuilder.create().toJson(this); + } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java index 68d7cacb..131222e3 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java @@ -18,4 +18,12 @@ public class WxMaOpenTab implements Serializable { private String text; private String iconPath; private String selectedIconPath; + + + public WxMaOpenTab(String pagePath, String text) { + this.pagePath = pagePath; + this.text = text; + } + + } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenMaSubmitAuditMessage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenMaSubmitAuditMessage.java index a8d806b3..51698a9c 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenMaSubmitAuditMessage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenMaSubmitAuditMessage.java @@ -16,6 +16,21 @@ import java.util.List; @Data public class WxOpenMaSubmitAuditMessage implements Serializable { + /** + * 提交审核项的一个列表(至少填写1项,至多填写5项) + */ @SerializedName("item_list") private List itemList; + + /** + * 反馈内容,不超过200字 + */ + @SerializedName("feedback_info") + private String feedbackInfo; + + /** + * 图片media_id列表,中间用“丨”分割,xx丨yy丨zz,不超过5张图片, 其中 media_id 可以通过新增临时素材接口上传而得到 + */ + @SerializedName("feedback_stuff") + private String feedbackStuff; } From 50cfb1f16db9a7f0be39a23a8f41fa4cf374d881 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 29 Aug 2019 15:49:16 +0800 Subject: [PATCH 25/79] =?UTF-8?q?:art:=20#1176=20=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E6=A8=A1=E5=9D=97=E5=AE=8C=E5=96=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=A0=81=E6=9E=9A=E4=B8=BE=E7=B1=BB=EF=BC=8C=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E7=9A=84=E9=94=99=E8=AF=AF=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/common/error/WxMaErrorMsgEnum.java | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java index 3423bb2e..df2a460d 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java @@ -227,7 +227,51 @@ public enum WxMaErrorMsgEnum { * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sec-check/msgSecCheck.html *
*/ - CODE_87014(87014, "内容含有违法违规内容"); + CODE_87014(87014, "内容含有违法违规内容"), + /** + * 系统繁忙,此时请开发者稍候再试. + */ + CODE_MINUS_1(-1, "系统繁忙,此时请开发者稍候再试"), + /** + * code 无效. + */ + CODE_40029(40029, "code 无效"), + /** + * access_token 过期. + */ + CODE_42001(42001, "access_token 过期"), + /** + * post 数据为空. + */ + CODE_44002(44002, "post 数据为空"), + /** + * post 数据中参数缺失. + */ + CODE_47001(47001, "post 数据中参数缺失"), + /** + * 参数 activity_id 错误. + */ + CODE_47501(47501, "参数 activity_id 错误"), + /** + * 参数 target_state 错误. + */ + CODE_47502(47502, "参数 target_state 错误"), + /** + * 参数 version_type 错误. + */ + CODE_47503(47503, "参数 version_type 错误"), + /** + * activity_id 过期. + */ + CODE_47504(47504, "activity_id 过期"), + /** + * 没有绑定开放平台帐号. + */ + CODE_89002(89002, "没有绑定开放平台帐号"), + /** + * 订单无效. + */ + CODE_89300(89300, "订单无效"); private int code; private String msg; @@ -238,7 +282,6 @@ public enum WxMaErrorMsgEnum { } /** - *
    * 通过错误代码查找其中文含义.
    */
   public static String findMsgByCode(int code) {

From ccbbf8c01afe3296c6ac4b8b414a55de2495f507 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Thu, 29 Aug 2019 16:10:49 +0800
Subject: [PATCH 26/79] =?UTF-8?q?:bug:=20#858=20=E4=BF=AE=E5=A4=8D?=
 =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=B7=BB=E5=8A=A0=E5=8D=A1=E5=88=B8=E6=8E=A5?=
 =?UTF-8?q?=E5=8F=A3=E5=90=8E=E6=8E=A8=E9=80=81=E4=BA=8B=E4=BB=B6=E8=A2=AB?=
 =?UTF-8?q?=E8=AF=AF=E5=88=A4=E4=B8=BA=E9=87=8D=E5=A4=8D=E6=B6=88=E6=81=AF?=
 =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/mp/api/WxMpMessageRouter.java      | 24 ++++++++-----------
 1 file changed, 10 insertions(+), 14 deletions(-)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
index 86351e5a..2571ebaa 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
@@ -53,7 +53,6 @@ import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
  * @author Daniel Qian
  */
 public class WxMpMessageRouter {
-
   private static final int DEFAULT_THREAD_POOL_SIZE = 100;
   protected final Logger log = LoggerFactory.getLogger(WxMpMessageRouter.class);
   private final List rules = new ArrayList<>();
@@ -77,9 +76,7 @@ public class WxMpMessageRouter {
   }
 
   /**
-   * 
-   * 使用自定义的 {@link ExecutorService}
-   * 
+ * 使用自定义的 {@link ExecutorService}. */ public WxMpMessageRouter(WxMpService wxMpService, ExecutorService executorService) { this.wxMpService = wxMpService; @@ -90,9 +87,7 @@ public class WxMpMessageRouter { } /** - *
-   * 如果使用默认的 {@link ExecutorService},则系统退出前,应该调用该方法。
-   * 
+ * 如果使用默认的 {@link ExecutorService},则系统退出前,应该调用该方法. */ public void shutDownExecutorService() { this.executorService.shutdown(); @@ -230,23 +225,26 @@ public class WxMpMessageRouter { } public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) { - return this.route(wxMessage, new HashMap()); + return this.route(wxMessage, new HashMap(2)); } - protected boolean isMsgDuplicated(WxMpXmlMessage wxMessage) { + private boolean isMsgDuplicated(WxMpXmlMessage wxMessage) { StringBuilder messageId = new StringBuilder(); if (wxMessage.getMsgId() == null) { messageId.append(wxMessage.getCreateTime()) .append("-").append(wxMessage.getFromUser()) .append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey())) - .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent())) - ; + .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent())); } else { messageId.append(wxMessage.getMsgId()) .append("-").append(wxMessage.getCreateTime()) .append("-").append(wxMessage.getFromUser()); } + if (StringUtils.isNotEmpty(wxMessage.getUserCardCode())) { + messageId.append("-").append(wxMessage.getUserCardCode()); + } + return this.messageDuplicateChecker.isDuplicate(messageId.toString()); } @@ -254,12 +252,10 @@ public class WxMpMessageRouter { /** * 对session的访问结束. */ - protected void sessionEndAccess(WxMpXmlMessage wxMessage) { - + private void sessionEndAccess(WxMpXmlMessage wxMessage) { InternalSession session = ((InternalSessionManager) this.sessionManager).findSession(wxMessage.getFromUser()); if (session != null) { session.endAccess(); } - } } From 86fe8209c7006c850daa39349c0f115c67cb4cd7 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 29 Aug 2019 16:19:24 +0800 Subject: [PATCH 27/79] =?UTF-8?q?:bug:=20#897=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=89=B9=E9=87=8F=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=88=90=E5=91=98=E5=90=8E=E7=9A=84=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E8=A2=AB=E8=AF=AF=E5=88=A4=E4=B8=BA=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E6=B6=88=E6=81=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/cp/message/WxCpMessageRouter.java | 68 +++++++------------ 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java index 631abdff..1eda876c 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java @@ -1,9 +1,6 @@ package me.chanjar.weixin.cp.message; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -18,7 +15,6 @@ import me.chanjar.weixin.common.api.WxMessageDuplicateChecker; import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker; import me.chanjar.weixin.common.session.InternalSession; import me.chanjar.weixin.common.session.InternalSessionManager; -import me.chanjar.weixin.common.session.StandardSessionManager; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.util.LogExceptionHandler; import me.chanjar.weixin.cp.api.WxCpService; @@ -54,9 +50,8 @@ import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; * @author Daniel Qian */ public class WxCpMessageRouter { - private static final int DEFAULT_THREAD_POOL_SIZE = 100; - protected final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class); + private final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class); private final List rules = new ArrayList<>(); private final WxCpService wxCpService; @@ -69,6 +64,9 @@ public class WxCpMessageRouter { private WxErrorExceptionHandler exceptionHandler; + /** + * 构造方法. + */ public WxCpMessageRouter(WxCpService wxCpService) { this.wxCpService = wxCpService; this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); @@ -82,8 +80,6 @@ public class WxCpMessageRouter { * 设置自定义的 {@link ExecutorService} * 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100) *
- * - * @param executorService */ public void setExecutorService(ExecutorService executorService) { this.executorService = executorService; @@ -94,8 +90,6 @@ public class WxCpMessageRouter { * 设置自定义的 {@link me.chanjar.weixin.common.api.WxMessageDuplicateChecker} * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker} *
- * - * @param messageDuplicateChecker */ public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) { this.messageDuplicateChecker = messageDuplicateChecker; @@ -106,8 +100,6 @@ public class WxCpMessageRouter { * 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager} * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager} *
- * - * @param sessionManager */ public void setSessionManager(WxSessionManager sessionManager) { this.sessionManager = sessionManager; @@ -118,8 +110,6 @@ public class WxCpMessageRouter { * 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler} * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler} *
- * - * @param exceptionHandler */ public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) { this.exceptionHandler = exceptionHandler; @@ -130,20 +120,17 @@ public class WxCpMessageRouter { } /** - * 开始一个新的Route规则 + * 开始一个新的Route规则. */ public WxCpMessageRouterRule rule() { return new WxCpMessageRouterRule(this); } /** - * 处理微信消息 - * - * @param wxMessage - * @param context + * 处理微信消息. */ - public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map context) { - if (isDuplicateMessage(wxMessage)) { + private WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map context) { + if (isMsgDuplicated(wxMessage)) { // 如果是重复消息,那么就不做处理 return null; } @@ -207,48 +194,43 @@ public class WxCpMessageRouter { return res; } - /** * 处理微信消息. - * */ public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) { return this.route(wxMessage, new HashMap(2)); } - protected boolean isDuplicateMessage(WxCpXmlMessage wxMessage) { - String messageId; + private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) { + StringBuilder messageId = new StringBuilder(); if (wxMessage.getMsgId() == null) { - messageId = String.valueOf(wxMessage.getCreateTime()) - + "-" + StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId())) - + "-" + wxMessage.getFromUserName() - + "-" + StringUtils.trimToEmpty(wxMessage.getEventKey()) - + "-" + StringUtils.trimToEmpty(wxMessage.getEvent()) - ; + messageId.append(wxMessage.getCreateTime()) + .append("-").append(StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId()))) + .append("-").append(wxMessage.getFromUserName()) + .append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey())) + .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent())); } else { - messageId = new StringBuilder().append(wxMessage.getMsgId()) + messageId.append(wxMessage.getMsgId()) .append("-").append(wxMessage.getCreateTime()) - .append("-").append(wxMessage.getFromUserName()) - .toString(); + .append("-").append(wxMessage.getFromUserName()); + } + + if (StringUtils.isNotEmpty(wxMessage.getUserId())) { + messageId.append("-").append(wxMessage.getUserId()); } - return this.messageDuplicateChecker.isDuplicate(messageId); + return this.messageDuplicateChecker.isDuplicate(messageId.toString()); } /** - * 对session的访问结束 - * - * @param wxMessage + * 对session的访问结束. */ - protected void sessionEndAccess(WxCpXmlMessage wxMessage) { - + private void sessionEndAccess(WxCpXmlMessage wxMessage) { InternalSession session = ((InternalSessionManager) this.sessionManager).findSession(wxMessage.getFromUserName()); if (session != null) { session.endAccess(); } } - - } From 4a113c473d70b40d05575294449316e4243a655b Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 30 Aug 2019 16:48:55 +0800 Subject: [PATCH 28/79] =?UTF-8?q?:sparkles:=20#252=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E5=B7=B2=E7=BE=A4=E5=8F=91=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E8=AF=84=E8=AE=BA=E5=92=8C=E6=9F=A5=E7=9C=8B=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E6=96=87=E7=AB=A0=E7=9A=84=E8=AF=84=E8=AE=BA=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpCommentService.java | 29 +++++- .../mp/api/impl/WxMpCommentServiceImpl.java | 33 ++++++- .../mp/bean/comment/WxMpCommentListVo.java | 89 +++++++++++++++++++ .../chanjar/weixin/mp/enums/WxMpApiUrl.java | 12 ++- .../api/impl/WxMpCommentServiceImplTest.java | 49 ++++++++++ 5 files changed, 207 insertions(+), 5 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java index 2ba7a092..423f61a7 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java @@ -1,9 +1,11 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.bean.comment.WxMpCommentListVo; /** - * 评论数据管理. + * 图文消息留言管理接口. + * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1494572718_WzHIY * * @author Binary Wang * @date 2019-06-16 @@ -12,11 +14,34 @@ public interface WxMpCommentService { /** * 打开已群发文章评论. * https://api.weixin.qq.com/cgi-bin/comment/open?access_token=ACCESS_TOKEN - * 参数 是否必须 类型 说明 * * @param msgDataId 群发返回的msg_data_id * @param index 多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文 * @throws WxErrorException 异常 */ void open(Integer msgDataId, Integer index) throws WxErrorException; + + /** + * 关闭已群发文章评论. + * https://api.weixin.qq.com/cgi-bin/comment/close?access_token=ACCESS_TOKEN + * + * @param msgDataId 群发返回的msg_data_id + * @param index 多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文 + * @throws WxErrorException 异常 + */ + void close(Integer msgDataId, Integer index) throws WxErrorException; + + /** + * 查看指定文章的评论数据. + * https://api.weixin.qq.com/cgi-bin/comment/list?access_token=ACCESS_TOKEN + * + * @param msgDataId 群发返回的msg_data_id + * @param index 多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文 + * @param begin 起始位置 + * @param count 获取数目(>=50会被拒绝) + * @param type type=0 普通评论&精选评论 type=1 普通评论 type=2 精选评论 + * @return 评论列表数据 + * @throws WxErrorException 异常 + */ + WxMpCommentListVo list(Integer msgDataId, Integer index, int begin, int count, int type) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImpl.java index f58280ae..8d97af36 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImpl.java @@ -5,7 +5,9 @@ import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpCommentService; import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.enums.WxMpApiUrl; +import me.chanjar.weixin.mp.bean.comment.WxMpCommentListVo; + +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Comment.*; /** * @author Binary Wang @@ -22,6 +24,33 @@ public class WxMpCommentServiceImpl implements WxMpCommentService { if (index != null) { json.addProperty("index", index); } - this.wxMpService.post(WxMpApiUrl.Comment.OPEN, json.toString()); + + this.wxMpService.post(OPEN, json.toString()); + } + + @Override + public void close(Integer msgDataId, Integer index) throws WxErrorException { + JsonObject json = new JsonObject(); + json.addProperty("msg_data_id", msgDataId); + if (index != null) { + json.addProperty("index", index); + } + + this.wxMpService.post(CLOSE, json.toString()); + } + + @Override + public WxMpCommentListVo list(Integer msgDataId, Integer index, int begin, int count, int type) throws WxErrorException { + JsonObject json = new JsonObject(); + json.addProperty("msg_data_id", msgDataId); + json.addProperty("begin", begin); + json.addProperty("count", count); + json.addProperty("type", type); + + if (index != null) { + json.addProperty("index", index); + } + + return WxMpCommentListVo.fromJson(this.wxMpService.post(LIST, json.toString())); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java new file mode 100644 index 00000000..21105465 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java @@ -0,0 +1,89 @@ +package me.chanjar.weixin.mp.bean.comment; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.common.util.xml.IntegerArrayConverter; +import me.chanjar.weixin.mp.bean.device.WxDeviceQrCodeResult; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * 群发图文评论数据. + * + * @author Binary Wang + * @date 2019-08-30 + */ +@Data +public class WxMpCommentListVo implements Serializable { + private static final long serialVersionUID = 7604754799359751247L; + + /** + * 总数,非comment的size. + */ + private Integer total; + + /** + * 评论列表. + */ + private List comment; + + @Data + public static class Reply implements Serializable { + private static final long serialVersionUID = 9174739515408520429L; + + /** + * 作者回复时间 . + */ + @SerializedName("create_time") + private String createTime; + + /** + * 作者回复内容. + */ + private String content; + } + + @Data + public static class WxMpComment implements Serializable { + private static final long serialVersionUID = 5401188720891942634L; + + /** + * 用户评论id . + */ + @SerializedName("user_comment_id") + private Integer userCommentId; + + /** + * 用户openid. + */ + private String openid; + + /** + * 评论时间. + */ + @SerializedName("create_time") + private String createTime; + + /** + * 评论内容. + */ + private String content; + + /** + * 是否精选评论,0为即非精选,1为true,即精选. + */ + @SerializedName("comment_type") + private Integer commentType; + + /** + * 作者回复. + */ + private Reply reply; + } + + public static WxMpCommentListVo fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpCommentListVo.class); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java index 503183cf..d85c74f4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java @@ -875,7 +875,17 @@ public interface WxMpApiUrl { /** * 打开已群发文章评论. */ - OPEN(API_DEFAULT_HOST_URL, "/cgi-bin/comment/open"); + OPEN(API_DEFAULT_HOST_URL, "/cgi-bin/comment/open"), + + /** + * 关闭已群发文章评论. + */ + CLOSE(API_DEFAULT_HOST_URL, "/cgi-bin/comment/close"), + + /** + * 查看指定文章的评论数据. + */ + LIST(API_DEFAULT_HOST_URL, "/cgi-bin/comment/list"); private String prefix; private String path; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java index 60551c32..efbf6e18 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java @@ -2,11 +2,20 @@ package me.chanjar.weixin.mp.api.impl; import com.google.inject.Inject; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpCommentService; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.test.ApiTestModule; +import me.chanjar.weixin.mp.bean.comment.WxMpCommentListVo; import org.testng.annotations.Guice; import org.testng.annotations.Test; +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Comment.LIST; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + /** * 测试类. * @@ -25,4 +34,44 @@ public class WxMpCommentServiceImplTest { this.wxService.getCommentService().open(1, null); this.wxService.getCommentService().open(1, 0); } + + @Test + public void testClose() throws WxErrorException { + this.wxService.getCommentService().close(1000000001, null); + this.wxService.getCommentService().close(1, 0); + } + + @Test + public void testList() throws WxErrorException { + String expectedResponse = "{\n" + + " \"errcode\": 0,\n" + + " \"errmsg\": \"ok\",\n" + + " \"total\": 1,\n" + + " \"comment\": [\n" + + " {\n" + + " \"user_comment_id\": 1,\n" + + " \"openid\": \"OPENID\",\n" + + " \"create_time\": \"CREATE_TIME\",\n" + + " \"content\": \"CONTENT\",\n" + + " \"comment_type\": 1,\n" + + " \"reply\": {\n" + + " \"content\": \"CONTENT\",\n" + + " \"create_time\": \"CREATE_TIME\"\n" + + " }\n" + + " }\n" + + " ]\n" + + "}"; + + wxService = spy(wxService); + WxMpCommentService commentService = new WxMpCommentServiceImpl(wxService); + doReturn(expectedResponse).when(wxService).post(anyString(), anyString()); + + final WxMpCommentListVo commentListVo = commentService.list(1, 1, 1, 1, 1); + assertThat(commentListVo).isNotNull(); + System.out.println(commentListVo); + assertThat(commentListVo.getTotal()).isEqualTo(1); + assertThat(commentListVo.getComment()).isNotEmpty(); + + assertThat(commentListVo.getComment().get(0).getReply()).isNotNull(); + } } From a19236b120e2108b0d90367afc66d4114f64bf2e Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 30 Aug 2019 18:06:45 +0800 Subject: [PATCH 29/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.3.B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-miniapp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- weixin-java-open/pom.xml | 2 +- weixin-java-pay/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 70a02b44..df5e11fd 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.5.2.B + 3.5.3.B pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index f3da2b5a..b599ee7e 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java com.github.binarywang - 3.5.2.B + 3.5.3.B ../../ 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index da66b5e7..7e20ffa8 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.2.B + 3.5.3.B ../../ diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index 204987c5..f2f2d566 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java com.github.binarywang - 3.5.2.B + 3.5.3.B ../../ 4.0.0 diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 36912bcb..da18e41c 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.2.B + 3.5.3.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 43fb3991..fbb56f29 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.2.B + 3.5.3.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 61f884d6..e3e81f3b 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.2.B + 3.5.3.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 3b0692f2..4dffc6da 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.2.B + 3.5.3.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 679bd7e1..ce439c32 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.2.B + 3.5.3.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 4531ee93..eaad6b0a 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.5.2.B + 3.5.3.B 4.0.0 From a72cdde58414b30a2f1c6fd23888d54e28803dbf Mon Sep 17 00:00:00 2001 From: S Date: Mon, 2 Sep 2019 09:18:41 +0800 Subject: [PATCH 30/79] =?UTF-8?q?:sparkles:=20#1188=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BC=9A=E5=91=98=E5=8D=A1=E5=BC=80=E5=8D=A1?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpMemberCardService.java | 10 ++++++ .../api/impl/WxMpMemberCardServiceImpl.java | 34 +++++++++++-------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java index e551f7d9..579ae346 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java @@ -93,6 +93,16 @@ public interface WxMpMemberCardService { */ ActivatePluginParam getActivatePluginParam(String cardId, String outStr) throws WxErrorException; + /** + * 获取开卡组件链接接口 + * + * @param cardId 会员卡的CardId,微信分配 + * @param outStr 会员卡设置商户的渠道 + * @return 会员卡开卡插件参数结果对象 + * @throws WxErrorException 接口调用失败抛出的异常 + */ + String getActivatePluginUrl(String cardId, String outStr) throws WxErrorException; + /** * 更新会员卡信息. * diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java index 31d9bcf3..5e434d61 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java @@ -248,26 +248,30 @@ public class WxMpMemberCardServiceImpl implements WxMpMemberCardService { @Override public ActivatePluginParam getActivatePluginParam(String cardId, String outStr) throws WxErrorException { + String url = this.getActivatePluginUrl(cardId, outStr); + try { + String decodedUrl = URLDecoder.decode(url, "UTF-8"); + Map resultMap = parseRequestUrl(decodedUrl); + ActivatePluginParam activatePluginParam = new ActivatePluginParam(); + activatePluginParam.setEncryptCardId(resultMap.get("encrypt_card_id")); + activatePluginParam.setOuterStr(resultMap.get("outer_str")); + activatePluginParam.setBiz(resultMap.get("biz") + "=="); + return activatePluginParam; + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return null; + } + + + @Override + public String getActivatePluginUrl(String cardId, String outStr) throws WxErrorException { JsonObject params = new JsonObject(); params.addProperty("card_id", cardId); params.addProperty("outer_str", outStr); String response = this.wxMpService.post(WxMpApiUrl.MemberCard.MEMBER_CARD_ACTIVATE_URL, GSON.toJson(params)); ActivatePluginParamResult result = GSON.fromJson(response, ActivatePluginParamResult.class); - if (0 == result.getErrcode()) { - String url = result.getUrl(); - try { - String decodedUrl = URLDecoder.decode(url, "UTF-8"); - Map resultMap = parseRequestUrl(decodedUrl); - ActivatePluginParam activatePluginParam = new ActivatePluginParam(); - activatePluginParam.setEncryptCardId(resultMap.get("encrypt_card_id")); - activatePluginParam.setOuterStr(resultMap.get("outer_str")); - activatePluginParam.setBiz(resultMap.get("biz") + "=="); - return activatePluginParam; - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - return null; + return result.getUrl(); } @Override From 4c88e8616ae7f2df5afaeb870984d7848e50d1b7 Mon Sep 17 00:00:00 2001 From: S Date: Wed, 4 Sep 2019 09:27:30 +0800 Subject: [PATCH 31/79] =?UTF-8?q?:art:=20=E9=87=8D=E6=9E=84=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=AC=AC=E4=B8=89=E6=96=B9=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=20(#1190?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 增加获取开卡链接接口 * feat: modify openmaopentab --- .../java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java index 131222e3..48e1044d 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java @@ -19,11 +19,16 @@ public class WxMaOpenTab implements Serializable { private String iconPath; private String selectedIconPath; - - public WxMaOpenTab(String pagePath, String text) { + public WxMaOpenTab(@NonNull String pagePath, @NonNull String text) { this.pagePath = pagePath; this.text = text; } + public WxMaOpenTab(@NonNull String pagePath, @NonNull String text, String iconPath, String selectedIconPath) { + this.pagePath = pagePath; + this.text = text; + this.iconPath = iconPath; + this.selectedIconPath = selectedIconPath; + } } From eecd4bec767757837813191f3b6f4c9f023c8ac8 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 5 Sep 2019 09:49:09 +0800 Subject: [PATCH 32/79] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E9=87=8D?= =?UTF-8?q?=E6=9E=84maven=E4=BE=9D=E8=B5=96=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +- spring-boot-starters/pom.xml | 42 +++++++++++++++++++ .../pom.xml | 23 +--------- .../wx-java-mp-spring-boot-starter/pom.xml | 25 +---------- .../wx-java-pay-spring-boot-starter/pom.xml | 23 +--------- 5 files changed, 47 insertions(+), 70 deletions(-) create mode 100644 spring-boot-starters/pom.xml diff --git a/pom.xml b/pom.xml index df5e11fd..cb0ddbe1 100644 --- a/pom.xml +++ b/pom.xml @@ -105,9 +105,7 @@ weixin-java-pay weixin-java-miniapp weixin-java-open - spring-boot-starters/wx-java-pay-spring-boot-starter - spring-boot-starters/wx-java-mp-spring-boot-starter - spring-boot-starters/wx-java-miniapp-spring-boot-starter + spring-boot-starters diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml new file mode 100644 index 00000000..dcc02deb --- /dev/null +++ b/spring-boot-starters/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + com.github.binarywang + wx-java + 3.5.3.B + + pom + wx-java-spring-boot-starters + + + 2.1.4.RELEASE + + + + wx-java-miniapp-spring-boot-starter + wx-java-mp-spring-boot-starter + wx-java-pay-spring-boot-starter + + + + + org.springframework.boot + spring-boot-autoconfigure + ${spring.boot.version} + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + true + + + org.projectlombok + lombok + provided + + + diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index b599ee7e..e881d922 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -3,10 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - wx-java + wx-java-spring-boot-starters com.github.binarywang 3.5.3.B - ../../ 4.0.0 @@ -14,27 +13,7 @@ WxJava - Spring Boot Starter for MiniApp 微信小程序开发的 Spring Boot Starter - - 2.1.4.RELEASE - - - - org.springframework.boot - spring-boot-autoconfigure - ${spring.boot.version} - - - org.springframework.boot - spring-boot-configuration-processor - ${spring.boot.version} - true - - - org.projectlombok - lombok - provided - com.github.binarywang weixin-java-miniapp diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index 7e20ffa8..8ed507a5 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -2,34 +2,18 @@ - 4.0.0 + wx-java-spring-boot-starters com.github.binarywang - wx-java 3.5.3.B - ../../ + 4.0.0 wx-java-mp-spring-boot-starter WxJava - Spring Boot Starter for MP 微信公众号开发的 Spring Boot Starter - - 2.1.4.RELEASE - - - - org.springframework.boot - spring-boot-autoconfigure - ${spring.boot.version} - - - org.springframework.boot - spring-boot-configuration-processor - ${spring.boot.version} - true - com.github.binarywang weixin-java-mp @@ -40,11 +24,6 @@ jedis compile - - org.projectlombok - lombok - provided - diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index f2f2d566..c62d4cbc 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -3,10 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - wx-java + wx-java-spring-boot-starters com.github.binarywang 3.5.3.B - ../../ 4.0.0 @@ -14,27 +13,7 @@ WxJava - Spring Boot Starter for WxPay 微信支付开发的 Spring Boot Starter - - 2.1.4.RELEASE - - - - org.springframework.boot - spring-boot-autoconfigure - ${spring.boot.version} - - - org.springframework.boot - spring-boot-configuration-processor - ${spring.boot.version} - true - - - org.projectlombok - lombok - provided - com.github.binarywang weixin-java-pay From 8ab4af031a14ff2b9f65c667bfc77632c09b8c4c Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 5 Sep 2019 12:31:26 +0800 Subject: [PATCH 33/79] =?UTF-8?q?:art:=20#1189=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=BC=82=E5=B8=B8=E8=BE=93=E5=87=BA=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/chanjar/weixin/common/WxType.java | 10 +- .../weixin/common/error/WxCpErrorMsgEnum.java | 386 +++++++++--------- .../chanjar/weixin/common/error/WxError.java | 49 ++- .../weixin/common/error/WxMpErrorMsgEnum.java | 314 +++++++------- .../BaseMediaDownloadRequestExecutor.java | 5 +- .../util/http/MediaUploadRequestExecutor.java | 5 +- .../common/util/http/RequestExecutor.java | 20 +- .../util/http/SimpleGetRequestExecutor.java | 5 +- .../util/http/SimplePostRequestExecutor.java | 6 +- ...cheHttpClientSimpleGetRequestExecutor.java | 22 +- .../ApacheMediaDownloadRequestExecutor.java | 29 +- .../ApacheMediaUploadRequestExecutor.java | 7 +- .../ApacheSimplePostRequestExecutor.java | 11 +- .../JoddHttpMediaDownloadRequestExecutor.java | 26 +- .../JoddHttpMediaUploadRequestExecutor.java | 13 +- .../JoddHttpSimpleGetRequestExecutor.java | 17 +- .../JoddHttpSimplePostRequestExecutor.java | 14 +- .../OkHttpMediaDownloadRequestExecutor.java | 14 +- .../OkHttpMediaUploadRequestExecutor.java | 21 +- .../OkHttpSimpleGetRequestExecutor.java | 19 +- .../OkHttpSimplePostRequestExecutor.java | 28 +- .../weixin/common/error/WxErrorTest.java | 18 +- .../cp/api/impl/BaseWxCpServiceImpl.java | 6 +- .../cp/api/impl/BaseWxCpTpServiceImpl.java | 3 +- .../cp/api/impl/WxCpAgentServiceImpl.java | 5 +- .../wx/miniapp/api/WxMaTemplateService.java | 26 +- .../api/impl/WxMaAnalysisServiceImpl.java | 6 +- .../miniapp/api/impl/WxMaCodeServiceImpl.java | 8 +- .../api/impl/WxMaJsapiServiceImpl.java | 8 +- .../api/impl/WxMaMediaServiceImpl.java | 8 +- .../miniapp/api/impl/WxMaMsgServiceImpl.java | 11 +- .../api/impl/WxMaPluginServiceImpl.java | 31 +- .../api/impl/WxMaQrcodeServiceImpl.java | 10 +- .../miniapp/api/impl/WxMaRunServiceImpl.java | 6 +- .../api/impl/WxMaSecCheckServiceImpl.java | 10 +- .../wx/miniapp/api/impl/WxMaServiceImpl.java | 4 +- .../api/impl/WxMaSettingServiceImpl.java | 6 +- .../api/impl/WxMaShareServiceImpl.java | 6 +- .../api/impl/WxMaTemplateServiceImpl.java | 87 +--- .../miniapp/api/impl/WxMaUserServiceImpl.java | 7 +- .../util/QrcodeBytesRequestExecutor.java | 30 +- .../miniapp/util/QrcodeRequestExecutor.java | 36 +- .../mp/api/impl/BaseWxMpServiceImpl.java | 10 +- ...terialDeleteApacheHttpRequestExecutor.java | 2 +- ...MaterialDeleteJoddHttpRequestExecutor.java | 2 +- .../MaterialDeleteOkhttpRequestExecutor.java | 6 +- .../MaterialDeleteRequestExecutor.java | 5 +- ...rialNewsInfoApacheHttpRequestExecutor.java | 2 +- ...terialNewsInfoJoddHttpRequestExecutor.java | 2 +- ...MaterialNewsInfoOkhttpRequestExecutor.java | 16 +- .../MaterialNewsInfoRequestExecutor.java | 5 +- ...terialUploadApacheHttpRequestExecutor.java | 2 +- ...MaterialUploadJoddHttpRequestExecutor.java | 2 +- .../MaterialUploadOkhttpRequestExecutor.java | 2 +- .../MaterialUploadRequestExecutor.java | 5 +- ...ialVideoInfoApacheHttpRequestExecutor.java | 2 +- ...erialVideoInfoJoddHttpRequestExecutor.java | 2 +- ...aterialVideoInfoOkhttpRequestExecutor.java | 2 +- .../MaterialVideoInfoRequestExecutor.java | 5 +- ...mageDownloadApacheHttpRequestExecutor.java | 3 +- ...dImageDownloadJoddHttpRequestExecutor.java | 3 +- ...AndImageDownloadOkhttpRequestExecutor.java | 2 +- ...lVoiceAndImageDownloadRequestExecutor.java | 5 +- ...diaImgUploadApacheHttpRequestExecutor.java | 2 +- .../MediaImgUploadHttpRequestExecutor.java | 2 +- .../MediaImgUploadOkhttpRequestExecutor.java | 2 +- .../media/MediaImgUploadRequestExecutor.java | 5 +- .../OcrDiscernApacheHttpRequestExecutor.java | 56 +-- .../ocr/OcrDiscernRequestExecutor.java | 38 +- .../QrCodeApacheHttpRequestExecutor.java | 2 +- .../qrcode/QrCodeJoddHttpRequestExecutor.java | 2 +- .../qrcode/QrCodeOkhttpRequestExecutor.java | 2 +- .../qrcode/QrCodeRequestExecutor.java | 5 +- .../VoiceUploadApacheHttpRequestExecutor.java | 2 +- .../voice/VoiceUploadRequestExecutor.java | 5 +- .../api/impl/WxOpenServiceAbstractImpl.java | 12 +- .../ma/MaQrCodeApacheHttpRequestExecutor.java | 2 +- .../ma/MaQrCodeJoddHttpRequestExecutor.java | 2 +- .../ma/MaQrCodeOkhttpRequestExecutor.java | 2 +- .../ma/MaQrCodeRequestExecutor.java | 5 +- .../wxpay/service/EntPayService.java | 5 +- 81 files changed, 789 insertions(+), 800 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/WxType.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/WxType.java index 3dd75add..42305067 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/WxType.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/WxType.java @@ -10,23 +10,23 @@ package me.chanjar.weixin.common; */ public enum WxType { /** - * 企业微信 + * 企业微信. */ CP, /** - * 微信公众号 + * 微信公众号. */ MP, /** - * 微信小程序 + * 微信小程序. */ MiniApp, /** - * 微信开放平台 + * 微信开放平台. */ Open, /** - * 微信支付 + * 微信支付. */ Pay; } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java index 56af9cef..5529d697 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxCpErrorMsgEnum.java @@ -14,771 +14,771 @@ import lombok.Getter; @Getter public enum WxCpErrorMsgEnum { /** - * 系统繁忙;服务器暂不可用,建议稍候重试。建议重试次数不超过3次。 + * 系统繁忙;服务器暂不可用,建议稍候重试。建议重试次数不超过3次. */ CODE_1(-1, "系统繁忙;服务器暂不可用,建议稍候重试。建议重试次数不超过3次。"), /** - * 请求成功;接口调用成功 + * 请求成功;接口调用成功. */ CODE_0(0, "请求成功;接口调用成功"), /** - * 不合法的secret参数;secret在应用详情/通讯录管理助手可查看 + * 不合法的secret参数;secret在应用详情/通讯录管理助手可查看. */ CODE_40001(40001, "不合法的secret参数;secret在应用详情/通讯录管理助手可查看"), /** - * 无效的UserID + * 无效的UserID. */ CODE_40003(40003, "无效的UserID"), /** - * 不合法的媒体文件类型;不满足系统文件要求。参考:上传的媒体文件限制 + * 不合法的媒体文件类型;不满足系统文件要求。参考:上传的媒体文件限制. */ CODE_40004(40004, "不合法的媒体文件类型;不满足系统文件要求。参考:上传的媒体文件限制"), /** - * 不合法的type参数;合法的type取值,参考:上传临时素材 + * 不合法的type参数;合法的type取值,参考:上传临时素材. */ CODE_40005(40005, "不合法的type参数;合法的type取值,参考:上传临时素材"), /** - * 不合法的文件大小;系统文件要求,参考:上传的媒体文件限制 + * 不合法的文件大小;系统文件要求,参考:上传的媒体文件限制. */ CODE_40006(40006, "不合法的文件大小;系统文件要求,参考:上传的媒体文件限制"), /** - * 不合法的media_id参数 + * 不合法的media_id参数. */ CODE_40007(40007, "不合法的media_id参数"), /** - * 不合法的msgtype参数;合法的msgtype取值,参考:消息类型 + * 不合法的msgtype参数;合法的msgtype取值,参考:消息类型. */ CODE_40008(40008, "不合法的msgtype参数;合法的msgtype取值,参考:消息类型"), /** - * 上传图片大小不是有效值;图片大小的系统限制,参考上传的媒体文件限制 + * 上传图片大小不是有效值;图片大小的系统限制,参考上传的媒体文件限制. */ CODE_40009(40009, "上传图片大小不是有效值;图片大小的系统限制,参考上传的媒体文件限制"), /** - * 上传视频大小不是有效值;视频大小的系统限制,参考上传的媒体文件限制 + * 上传视频大小不是有效值;视频大小的系统限制,参考上传的媒体文件限制. */ CODE_40011(40011, "上传视频大小不是有效值;视频大小的系统限制,参考上传的媒体文件限制"), /** - * 不合法的CorpID;需确认CorpID是否填写正确,在 web管理端-设置 可查看 + * 不合法的CorpID;需确认CorpID是否填写正确,在 web管理端-设置 可查看. */ CODE_40013(40013, "不合法的CorpID;需确认CorpID是否填写正确,在 web管理端-设置 可查看"), /** - * 不合法的access_token + * 不合法的access_token. */ CODE_40014(40014, "不合法的access_token"), /** - * 不合法的按钮个数;菜单按钮1-3个 + * 不合法的按钮个数;菜单按钮1-3个. */ CODE_40016(40016, "不合法的按钮个数;菜单按钮1-3个"), /** - * 不合法的按钮类型;支持的类型,参考:按钮类型 + * 不合法的按钮类型;支持的类型,参考:按钮类型. */ CODE_40017(40017, "不合法的按钮类型;支持的类型,参考:按钮类型"), /** - * 不合法的按钮名字长度;长度应不超过16个字节 + * 不合法的按钮名字长度;长度应不超过16个字节. */ CODE_40018(40018, "不合法的按钮名字长度;长度应不超过16个字节"), /** - * 不合法的按钮KEY长度;长度应不超过128字节 + * 不合法的按钮KEY长度;长度应不超过128字节. */ CODE_40019(40019, "不合法的按钮KEY长度;长度应不超过128字节"), /** - * 不合法的按钮URL长度;长度应不超过1024字节 + * 不合法的按钮URL长度;长度应不超过1024字节. */ CODE_40020(40020, "不合法的按钮URL长度;长度应不超过1024字节"), /** - * 不合法的子菜单级数;只能包含一级菜单和二级菜单 + * 不合法的子菜单级数;只能包含一级菜单和二级菜单. */ CODE_40022(40022, "不合法的子菜单级数;只能包含一级菜单和二级菜单"), /** - * 不合法的子菜单按钮个数;子菜单按钮1-5个 + * 不合法的子菜单按钮个数;子菜单按钮1-5个. */ CODE_40023(40023, "不合法的子菜单按钮个数;子菜单按钮1-5个"), /** - * 不合法的子菜单按钮类型;支持的类型,参考:按钮类型 + * 不合法的子菜单按钮类型;支持的类型,参考:按钮类型. */ CODE_40024(40024, "不合法的子菜单按钮类型;支持的类型,参考:按钮类型"), /** - * 不合法的子菜单按钮名字长度;支持的类型,参考:按钮类型 + * 不合法的子菜单按钮名字长度;支持的类型,参考:按钮类型. */ CODE_40025(40025, "不合法的子菜单按钮名字长度;支持的类型,参考:按钮类型"), /** - * 不合法的子菜单按钮KEY长度;长度应不超过60个字节 + * 不合法的子菜单按钮KEY长度;长度应不超过60个字节. */ CODE_40026(40026, "不合法的子菜单按钮KEY长度;长度应不超过60个字节"), /** - * 不合法的子菜单按钮URL长度;长度应不超过1024字节 + * 不合法的子菜单按钮URL长度;长度应不超过1024字节. */ CODE_40027(40027, "不合法的子菜单按钮URL长度;长度应不超过1024字节"), /** - * 不合法的oauth_code + * 不合法的oauth_code. */ CODE_40029(40029, "不合法的oauth_code"), /** - * 不合法的UserID列表;指定的UserID列表,至少存在一个UserID不在通讯录中 + * 不合法的UserID列表;指定的UserID列表,至少存在一个UserID不在通讯录中. */ CODE_40031(40031, "不合法的UserID列表;指定的UserID列表,至少存在一个UserID不在通讯录中"), /** - * 不合法的UserID列表长度 + * 不合法的UserID列表长度. */ CODE_40032(40032, "不合法的UserID列表长度"), /** - * 不合法的请求字符;不能包含\\uxxxx格式的字符 + * 不合法的请求字符;不能包含\\uxxxx格式的字符. */ CODE_40033(40033, "不合法的请求字符;不能包含\\uxxxx格式的字符"), /** - * 不合法的参数 + * 不合法的参数. */ CODE_40035(40035, "不合法的参数"), /** - * chatid不存在;会话需要先创建后,才可修改会话详情或者发起聊天 + * chatid不存在;会话需要先创建后,才可修改会话详情或者发起聊天. */ CODE_40050(40050, "chatid不存在;会话需要先创建后,才可修改会话详情或者发起聊天"), /** - * 不合法的子菜单url域名 + * 不合法的子菜单url域名. */ CODE_40054(40054, "不合法的子菜单url域名"), /** - * 不合法的菜单url域名 + * 不合法的菜单url域名. */ CODE_40055(40055, "不合法的菜单url域名"), /** - * 不合法的agentid + * 不合法的agentid. */ CODE_40056(40056, "不合法的agentid"), /** - * 不合法的callbackurl或者callbackurl验证失败;可自助到开发调试工具重现 + * 不合法的callbackurl或者callbackurl验证失败;可自助到开发调试工具重现. */ CODE_40057(40057, "不合法的callbackurl或者callbackurl验证失败;可自助到开发调试工具重现"), /** - * 不合法的参数;传递参数不符合系统要求,需要参照具体API接口说明 + * 不合法的参数;传递参数不符合系统要求,需要参照具体API接口说明. */ CODE_40058(40058, "不合法的参数;传递参数不符合系统要求,需要参照具体API接口说明"), /** - * 不合法的上报地理位置标志位;开关标志位只能填 0 或者 1 + * 不合法的上报地理位置标志位;开关标志位只能填 0 或者 1. */ CODE_40059(40059, "不合法的上报地理位置标志位;开关标志位只能填 0 或者 1"), /** - * 参数为空 + * 参数为空. */ CODE_40063(40063, "参数为空"), /** - * 不合法的部门列表;部门列表为空,或者至少存在一个部门ID不存在于通讯录中 + * 不合法的部门列表;部门列表为空,或者至少存在一个部门ID不存在于通讯录中. */ CODE_40066(40066, "不合法的部门列表;部门列表为空,或者至少存在一个部门ID不存在于通讯录中"), /** - * 不合法的标签ID;标签ID未指定,或者指定的标签ID不存在 + * 不合法的标签ID;标签ID未指定,或者指定的标签ID不存在. */ CODE_40068(40068, "不合法的标签ID;标签ID未指定,或者指定的标签ID不存在"), /** - * 指定的标签范围结点全部无效 + * 指定的标签范围结点全部无效. */ CODE_40070(40070, "指定的标签范围结点全部无效"), /** - * 不合法的标签名字;标签名字已经存在 + * 不合法的标签名字;标签名字已经存在. */ CODE_40071(40071, "不合法的标签名字;标签名字已经存在"), /** - * 不合法的标签名字长度;不允许为空,最大长度限制为32个字(汉字或英文字母) + * 不合法的标签名字长度;不允许为空,最大长度限制为32个字(汉字或英文字母). */ CODE_40072(40072, "不合法的标签名字长度;不允许为空,最大长度限制为32个字(汉字或英文字母)"), /** - * 不合法的openid;openid不存在,需确认获取来源 + * 不合法的openid;openid不存在,需确认获取来源. */ CODE_40073(40073, "不合法的openid;openid不存在,需确认获取来源"), /** - * news消息不支持保密消息类型;图文消息支持保密类型需改用mpnews + * news消息不支持保密消息类型;图文消息支持保密类型需改用mpnews. */ CODE_40074(40074, "news消息不支持保密消息类型;图文消息支持保密类型需改用mpnews"), /** - * 不合法的pre_auth_code参数;预授权码不存在,参考:获取预授权码 + * 不合法的pre_auth_code参数;预授权码不存在,参考:获取预授权码. */ CODE_40077(40077, "不合法的pre_auth_code参数;预授权码不存在,参考:获取预授权码"), /** - * 不合法的auth_code参数;需确认获取来源,并且只能消费一次 + * 不合法的auth_code参数;需确认获取来源,并且只能消费一次. */ CODE_40078(40078, "不合法的auth_code参数;需确认获取来源,并且只能消费一次"), /** - * 不合法的suite_secret;套件secret可在第三方管理端套件详情查看 + * 不合法的suite_secret;套件secret可在第三方管理端套件详情查看. */ CODE_40080(40080, "不合法的suite_secret;套件secret可在第三方管理端套件详情查看"), /** - * 不合法的suite_token + * 不合法的suite_token. */ CODE_40082(40082, "不合法的suite_token"), /** - * 不合法的suite_id;suite_id不存在 + * 不合法的suite_id;suite_id不存在. */ CODE_40083(40083, "不合法的suite_id;suite_id不存在"), /** - * 不合法的permanent_code参数 + * 不合法的permanent_code参数. */ CODE_40084(40084, "不合法的permanent_code参数"), /** - * 不合法的的suite_ticket参数;suite_ticket不存在或者已失效 + * 不合法的的suite_ticket参数;suite_ticket不存在或者已失效. */ CODE_40085(40085, "不合法的的suite_ticket参数;suite_ticket不存在或者已失效"), /** - * 不合法的第三方应用appid;至少有一个不存在应用id + * 不合法的第三方应用appid;至少有一个不存在应用id. */ CODE_40086(40086, "不合法的第三方应用appid;至少有一个不存在应用id"), /** - * jobid不存在;请检查 jobid 来源 + * jobid不存在;请检查 jobid 来源. */ CODE_40088(40088, "jobid不存在;请检查 jobid 来源"), /** - * 批量任务的结果已清理;系统仅保存最近5次批量任务的结果。可在通讯录查看实际导入情况 + * 批量任务的结果已清理;系统仅保存最近5次批量任务的结果。可在通讯录查看实际导入情况. */ CODE_40089(40089, "批量任务的结果已清理;系统仅保存最近5次批量任务的结果。可在通讯录查看实际导入情况"), /** - * secret不合法;可能用了别的企业的secret + * secret不合法;可能用了别的企业的secret. */ CODE_40091(40091, "secret不合法;可能用了别的企业的secret"), /** - * 导入文件存在不合法的内容 + * 导入文件存在不合法的内容. */ CODE_40092(40092, "导入文件存在不合法的内容"), /** - * 不合法的jsapi_ticket参数;ticket已失效,或者拼写错误 + * 不合法的jsapi_ticket参数;ticket已失效,或者拼写错误. */ CODE_40093(40093, "不合法的jsapi_ticket参数;ticket已失效,或者拼写错误"), /** - * 不合法的URL;缺少主页URL参数,或者URL不合法(链接需要带上协议头,以 http:// 或者 https:// 开头) + * 不合法的URL;缺少主页URL参数,或者URL不合法(链接需要带上协议头,以 http:// 或者 https:// 开头). */ CODE_40094(40094, "不合法的URL;缺少主页URL参数,或者URL不合法(链接需要带上协议头,以 http:// 或者 https:// 开头)"), /** - * 缺少access_token参数 + * 缺少access_token参数. */ CODE_41001(41001, "缺少access_token参数"), /** - * 缺少corpid参数 + * 缺少corpid参数. */ CODE_41002(41002, "缺少corpid参数"), /** - * 缺少secret参数 + * 缺少secret参数. */ CODE_41004(41004, "缺少secret参数"), /** - * 缺少media_id参数;media_id为调用接口必填参数,请确认是否有传递 + * 缺少media_id参数;media_id为调用接口必填参数,请确认是否有传递. */ CODE_41006(41006, "缺少media_id参数;media_id为调用接口必填参数,请确认是否有传递"), /** - * 缺少auth code参数 + * 缺少auth code参数. */ CODE_41008(41008, "缺少auth code参数"), /** - * 缺少userid参数 + * 缺少userid参数. */ CODE_41009(41009, "缺少userid参数"), /** - * 缺少url参数 + * 缺少url参数. */ CODE_41010(41010, "缺少url参数"), /** - * 缺少agentid参数 + * 缺少agentid参数. */ CODE_41011(41011, "缺少agentid参数"), /** - * 缺少 description 参数;发送文本卡片消息接口,description 是必填字段 + * 缺少 description 参数;发送文本卡片消息接口,description 是必填字段. */ CODE_41033(41033, "缺少 description 参数;发送文本卡片消息接口,description 是必填字段"), /** - * 缺少title参数;发送图文消息,标题是必填参数。请确认参数是否有传递。 + * 缺少title参数;发送图文消息,标题是必填参数。请确认参数是否有传递. */ CODE_41016(41016, "缺少title参数;发送图文消息,标题是必填参数。请确认参数是否有传递。"), /** - * 缺少 department 参数 + * 缺少 department 参数. */ CODE_41019(41019, "缺少 department 参数"), /** - * 缺少tagid参数 + * 缺少tagid参数. */ CODE_41017(41017, "缺少tagid参数"), /** - * 缺少suite_id参数 + * 缺少suite_id参数. */ CODE_41021(41021, "缺少suite_id参数"), /** - * 缺少suite_access_token参数 + * 缺少suite_access_token参数. */ CODE_41022(41022, "缺少suite_access_token参数"), /** - * 缺少suite_ticket参数 + * 缺少suite_ticket参数. */ CODE_41023(41023, "缺少suite_ticket参数"), /** - * 缺少secret参数 + * 缺少secret参数. */ CODE_41024(41024, "缺少secret参数"), /** - * 缺少permanent_code参数 + * 缺少permanent_code参数. */ CODE_41025(41025, "缺少permanent_code参数"), /** - * access_token已过期;access_token有时效性,需要重新获取一次 + * access_token已过期;access_token有时效性,需要重新获取一次. */ CODE_42001(42001, "access_token已过期;access_token有时效性,需要重新获取一次"), /** - * pre_auth_code已过期;pre_auth_code有时效性,需要重新获取一次 + * pre_auth_code已过期;pre_auth_code有时效性,需要重新获取一次. */ CODE_42007(42007, "pre_auth_code已过期;pre_auth_code有时效性,需要重新获取一次"), /** - * suite_access_token已过期;suite_access_token有时效性,需要重新获取一次 + * suite_access_token已过期;suite_access_token有时效性,需要重新获取一次. */ CODE_42009(42009, "suite_access_token已过期;suite_access_token有时效性,需要重新获取一次"), /** - * 指定的userid未绑定微信或未关注微信插件;需要成员使用微信登录企业微信或者关注微信插件才能获取openid + * 指定的userid未绑定微信或未关注微信插件;需要成员使用微信登录企业微信或者关注微信插件才能获取openid. */ CODE_43004(43004, "指定的userid未绑定微信或未关注微信插件;需要成员使用微信登录企业微信或者关注微信插件才能获取openid"), /** - * 多媒体文件为空;上传格式参考:上传临时素材,确认header和body的内容正确。 + * 多媒体文件为空;上传格式参考:上传临时素材,确认header和body的内容正确. */ CODE_44001(44001, "多媒体文件为空;上传格式参考:上传临时素材,确认header和body的内容正确。"), /** - * 文本消息content参数为空;发文本消息content为必填参数,且不能为空 + * 文本消息content参数为空;发文本消息content为必填参数,且不能为空. */ CODE_44004(44004, "文本消息content参数为空;发文本消息content为必填参数,且不能为空"), /** - * 多媒体文件大小超过限制;图片不可超过5M;音频不可超过5M;文件不可超过20M + * 多媒体文件大小超过限制;图片不可超过5M;音频不可超过5M;文件不可超过20M. */ CODE_45001(45001, "多媒体文件大小超过限制;图片不可超过5M;音频不可超过5M;文件不可超过20M"), /** - * 消息内容大小超过限制 + * 消息内容大小超过限制. */ CODE_45002(45002, "消息内容大小超过限制"), /** - * 应用description参数长度不符合系统限制;设置应用若带有description参数,则长度必须为4至120个字符 + * 应用description参数长度不符合系统限制;设置应用若带有description参数,则长度必须为4至120个字符. */ CODE_45004(45004, "应用description参数长度不符合系统限制;设置应用若带有description参数,则长度必须为4至120个字符"), /** - * 语音播放时间超过限制;语音播放时长不能超过60秒 + * 语音播放时间超过限制;语音播放时长不能超过60秒. */ CODE_45007(45007, "语音播放时间超过限制;语音播放时长不能超过60秒"), /** - * 图文消息的文章数量不符合系统限制;图文消息的文章数量不能超过8条 + * 图文消息的文章数量不符合系统限制;图文消息的文章数量不能超过8条. */ CODE_45008(45008, "图文消息的文章数量不符合系统限制;图文消息的文章数量不能超过8条"), /** - * 接口调用超过限制 + * 接口调用超过限制. */ CODE_45009(45009, "接口调用超过限制"), /** - * 应用name参数长度不符合系统限制;设置应用若带有name参数,则不允许为空,且不超过32个字符 + * 应用name参数长度不符合系统限制;设置应用若带有name参数,则不允许为空,且不超过32个字符. */ CODE_45022(45022, "应用name参数长度不符合系统限制;设置应用若带有name参数,则不允许为空,且不超过32个字符"), /** - * 帐号数量超过上限 + * 帐号数量超过上限. */ CODE_45024(45024, "帐号数量超过上限"), /** - * 触发删除用户数的保护;限制参考:全量覆盖成员 + * 触发删除用户数的保护;限制参考:全量覆盖成员. */ CODE_45026(45026, "触发删除用户数的保护;限制参考:全量覆盖成员"), /** - * 图文消息author参数长度超过限制;最长64个字节 + * 图文消息author参数长度超过限制;最长64个字节. */ CODE_45032(45032, "图文消息author参数长度超过限制;最长64个字节"), /** - * 接口并发调用超过限制 + * 接口并发调用超过限制. */ CODE_45033(45033, "接口并发调用超过限制"), /** - * 菜单未设置;菜单需发布后才能获取到数据 + * 菜单未设置;菜单需发布后才能获取到数据. */ CODE_46003(46003, "菜单未设置;菜单需发布后才能获取到数据"), /** - * 指定的用户不存在;需要确认指定的用户存在于通讯录中 + * 指定的用户不存在;需要确认指定的用户存在于通讯录中. */ CODE_46004(46004, "指定的用户不存在;需要确认指定的用户存在于通讯录中"), /** - * API接口无权限调用 + * API接口无权限调用. */ CODE_48002(48002, "API接口无权限调用"), /** - * 不合法的suite_id;确认suite_access_token由指定的suite_id生成 + * 不合法的suite_id;确认suite_access_token由指定的suite_id生成. */ CODE_48003(48003, "不合法的suite_id;确认suite_access_token由指定的suite_id生成"), /** - * 授权关系无效;可能是无授权或授权已被取消 + * 授权关系无效;可能是无授权或授权已被取消. */ CODE_48004(48004, "授权关系无效;可能是无授权或授权已被取消"), /** - * API接口已废弃;接口已不再支持,建议改用新接口或者新方案 + * API接口已废弃;接口已不再支持,建议改用新接口或者新方案. */ CODE_48005(48005, "API接口已废弃;接口已不再支持,建议改用新接口或者新方案"), /** - * redirect_url未登记可信域名 + * redirect_url未登记可信域名. */ CODE_50001(50001, "redirect_url未登记可信域名"), /** - * 成员不在权限范围;请检查应用或管理组的权限范围 + * 成员不在权限范围;请检查应用或管理组的权限范围. */ CODE_50002(50002, "成员不在权限范围;请检查应用或管理组的权限范围"), /** - * 应用已禁用;禁用的应用无法使用API接口。可在”管理端-企业应用”启用应用 + * 应用已禁用;禁用的应用无法使用API接口。可在”管理端-企业应用”启用应用. */ CODE_50003(50003, "应用已禁用;禁用的应用无法使用API接口。可在”管理端-企业应用”启用应用"), /** - * 部门长度不符合限制;部门名称不能为空且长度不能超过32个字 + * 部门长度不符合限制;部门名称不能为空且长度不能超过32个字. */ CODE_60001(60001, "部门长度不符合限制;部门名称不能为空且长度不能超过32个字"), /** - * 部门ID不存在;需要确认部门ID是否有带,并且存在通讯录中 + * 部门ID不存在;需要确认部门ID是否有带,并且存在通讯录中. */ CODE_60003(60003, "部门ID不存在;需要确认部门ID是否有带,并且存在通讯录中"), /** - * 父部门不存在;需要确认父亲部门ID是否有带,并且存在通讯录中 + * 父部门不存在;需要确认父亲部门ID是否有带,并且存在通讯录中. */ CODE_60004(60004, "父部门不存在;需要确认父亲部门ID是否有带,并且存在通讯录中"), /** - * 部门下存在成员;不允许删除有成员的部门 + * 部门下存在成员;不允许删除有成员的部门. */ CODE_60005(60005, "部门下存在成员;不允许删除有成员的部门"), /** - * 部门下存在子部门;不允许删除有子部门的部门 + * 部门下存在子部门;不允许删除有子部门的部门. */ CODE_60006(60006, "部门下存在子部门;不允许删除有子部门的部门"), /** - * 不允许删除根部门 + * 不允许删除根部门. */ CODE_60007(60007, "不允许删除根部门"), /** - * 部门已存在;部门ID或者部门名称已存在 + * 部门已存在;部门ID或者部门名称已存在. */ CODE_60008(60008, "部门已存在;部门ID或者部门名称已存在"), /** - * 部门名称含有非法字符;不能含有 \\:?*“< >| 等字符 + * 部门名称含有非法字符;不能含有 \\:?*“< >| 等字符. */ CODE_60009(60009, "部门名称含有非法字符;不能含有 \\ :?*“< >| 等字符"), /** - * 部门存在循环关系 + * 部门存在循环关系. */ CODE_60010(60010, "部门存在循环关系"), /** - * 指定的成员/部门/标签参数无权限 + * 指定的成员/部门/标签参数无权限. */ CODE_60011(60011, "指定的成员/部门/标签参数无权限"), /** - * 不允许删除默认应用;默认应用的id为0 + * 不允许删除默认应用;默认应用的id为0. */ CODE_60012(60012, "不允许删除默认应用;默认应用的id为0"), /** - * 访问ip不在白名单之中;请确认访问ip是否在服务商白名单IP列表 + * 访问ip不在白名单之中;请确认访问ip是否在服务商白名单IP列表. */ CODE_60020(60020, "访问ip不在白名单之中;请确认访问ip是否在服务商白名单IP列表"), /** - * 不允许修改第三方应用的主页 URL;第三方应用类型,不允许通过接口修改该应用的主页 URL + * 不允许修改第三方应用的主页 URL;第三方应用类型,不允许通过接口修改该应用的主页 URL. */ CODE_60028(60028, "不允许修改第三方应用的主页 URL;第三方应用类型,不允许通过接口修改该应用的主页 URL"), /** - * UserID已存在 + * UserID已存在. */ CODE_60102(60102, "UserID已存在"), /** - * 手机号码不合法;长度不超过32位,字符仅支持数字,加号和减号 + * 手机号码不合法;长度不超过32位,字符仅支持数字,加号和减号. */ CODE_60103(60103, "手机号码不合法;长度不超过32位,字符仅支持数字,加号和减号"), /** - * 手机号码已存在;同一个企业内,成员的手机号不能重复。建议更换手机号,或者更新已有的手机记录。 + * 手机号码已存在;同一个企业内,成员的手机号不能重复。建议更换手机号,或者更新已有的手机记录. */ CODE_60104(60104, "手机号码已存在;同一个企业内,成员的手机号不能重复。建议更换手机号,或者更新已有的手机记录。"), /** - * 邮箱不合法;长度不超过64位,且为有效的email格式 + * 邮箱不合法;长度不超过64位,且为有效的email格式. */ CODE_60105(60105, "邮箱不合法;长度不超过64位,且为有效的email格式"), /** - * 邮箱已存在;同一个企业内,成员的邮箱不能重复。建议更换邮箱,或者更新已有的邮箱记录。 + * 邮箱已存在;同一个企业内,成员的邮箱不能重复。建议更换邮箱,或者更新已有的邮箱记录. */ CODE_60106(60106, "邮箱已存在;同一个企业内,成员的邮箱不能重复。建议更换邮箱,或者更新已有的邮箱记录。"), /** - * 微信号不合法;微信号格式由字母、数字、”-“、”_“组成,长度为 3-20 字节,首字符必须是字母或”-“或”_“ + * 微信号不合法;微信号格式由字母、数字、”-“、”_“组成,长度为 3-20 字节,首字符必须是字母或”-“或”_“. */ CODE_60107(60107, "微信号不合法;微信号格式由字母、数字、”-“、”_“组成,长度为 3-20 字节,首字符必须是字母或”-“或”_“"), /** - * 用户所属部门数量超过限制;用户同时归属部门不超过20个 + * 用户所属部门数量超过限制;用户同时归属部门不超过20个. */ CODE_60110(60110, "用户所属部门数量超过限制;用户同时归属部门不超过20个"), /** - * UserID不存在;UserID参数为空,或者不存在通讯录中 + * UserID不存在;UserID参数为空,或者不存在通讯录中. */ CODE_60111(60111, "UserID不存在;UserID参数为空,或者不存在通讯录中"), /** - * 成员name参数不合法;不能为空,且不能超过64字符 + * 成员name参数不合法;不能为空,且不能超过64字符. */ CODE_60112(60112, "成员name参数不合法;不能为空,且不能超过64字符"), /** - * 无效的部门id;部门不存在通讯录中 + * 无效的部门id;部门不存在通讯录中. */ CODE_60123(60123, "无效的部门id;部门不存在通讯录中"), /** - * 无效的父部门id;父部门不存在通讯录中 + * 无效的父部门id;父部门不存在通讯录中. */ CODE_60124(60124, "无效的父部门id;父部门不存在通讯录中"), /** - * 非法部门名字;不能为空,且不能超过64字节,且不能含有\\:*?”< >|等字符 + * 非法部门名字;不能为空,且不能超过64字节,且不能含有\\:*?”< >|等字符. */ CODE_60125(60125, "非法部门名字;不能为空,且不能超过64字节,且不能含有\\:*?”< >|等字符"), /** - * 缺少department参数 + * 缺少department参数. */ CODE_60127(60127, "缺少department参数"), /** - * 成员手机和邮箱都为空;成员手机和邮箱至少有个非空 + * 成员手机和邮箱都为空;成员手机和邮箱至少有个非空. */ CODE_60129(60129, "成员手机和邮箱都为空;成员手机和邮箱至少有个非空"), /** - * 发票已被其他公众号锁定 + * 发票已被其他公众号锁定. */ CODE_72023(72023, "发票已被其他公众号锁定"), /** - * 发票状态错误;reimburse_status状态错误,参考:更新发票状态 + * 发票状态错误;reimburse_status状态错误,参考:更新发票状态. */ CODE_72024(72024, "发票状态错误;reimburse_status状态错误,参考:更新发票状态"), /** - * 存在发票不属于该用户;只能批量更新该openid的发票,参考:批量更新发票状态 + * 存在发票不属于该用户;只能批量更新该openid的发票,参考:批量更新发票状态. */ CODE_72037(72037, "存在发票不属于该用户;只能批量更新该openid的发票,参考:批量更新发票状态"), /** - * 可信域名不正确,或者无ICP备案 + * 可信域名不正确,或者无ICP备案. */ CODE_80001(80001, "可信域名不正确,或者无ICP备案"), /** - * 部门下的结点数超过限制(3W) + * 部门下的结点数超过限制(3W). */ CODE_81001(81001, "部门下的结点数超过限制(3W)"), /** - * 部门最多15层 + * 部门最多15层. */ CODE_81002(81002, "部门最多15层"), /** - * 无权限操作标签 + * 无权限操作标签. */ CODE_81011(81011, "无权限操作标签"), /** - * UserID、部门ID、标签ID全部非法或无权限 + * UserID、部门ID、标签ID全部非法或无权限. */ CODE_81013(81013, "UserID、部门ID、标签ID全部非法或无权限"), /** - * 标签添加成员,单次添加user或party过多 + * 标签添加成员,单次添加user或party过多. */ CODE_81014(81014, "标签添加成员,单次添加user或party过多"), /** - * 指定的成员/部门/标签全部无效 + * 指定的成员/部门/标签全部无效. */ CODE_82001(82001, "指定的成员/部门/标签全部无效"), /** - * 不合法的PartyID列表长度;发消息,单次不能超过100个部门 + * 不合法的PartyID列表长度;发消息,单次不能超过100个部门. */ CODE_82002(82002, "不合法的PartyID列表长度;发消息,单次不能超过100个部门"), /** - * 不合法的TagID列表长度;发消息,单次不能超过100个标签 + * 不合法的TagID列表长度;发消息,单次不能超过100个标签. */ CODE_82003(82003, "不合法的TagID列表长度;发消息,单次不能超过100个标签"), /** - * 成员票据过期 + * 成员票据过期. */ CODE_84014(84014, "成员票据过期"), /** - * 成员票据无效;确认user_ticket参数来源是否正确。参考接口:根据code获取成员信息 + * 成员票据无效;确认user_ticket参数来源是否正确。参考接口:根据code获取成员信息. */ CODE_84015(84015, "成员票据无效;确认user_ticket参数来源是否正确。参考接口:根据code获取成员信息"), /** - * 缺少templateid参数 + * 缺少templateid参数. */ CODE_84019(84019, "缺少templateid参数"), /** - * templateid不存在;确认参数是否有带,并且已创建 + * templateid不存在;确认参数是否有带,并且已创建. */ CODE_84020(84020, "templateid不存在;确认参数是否有带,并且已创建"), /** - * 缺少register_code参数 + * 缺少register_code参数. */ CODE_84021(84021, "缺少register_code参数"), /** - * 无效的register_code参数 + * 无效的register_code参数. */ CODE_84022(84022, "无效的register_code参数"), /** - * 不允许调用设置通讯录同步完成接口 + * 不允许调用设置通讯录同步完成接口. */ CODE_84023(84023, "不允许调用设置通讯录同步完成接口"), /** - * 无注册信息 + * 无注册信息. */ CODE_84024(84024, "无注册信息"), /** - * 不符合的state参数;必须是[a-zA-Z0-9]的参数值,长度不可超过128个字节 + * 不符合的state参数;必须是[a-zA-Z0-9]的参数值,长度不可超过128个字节. */ CODE_84025(84025, "不符合的state参数;必须是[a-zA-Z0-9]的参数值,长度不可超过128个字节"), /** - * 包含不合法的词语 + * 包含不合法的词语. */ CODE_85002(85002, "包含不合法的词语"), /** - * 每企业每个月设置的可信域名不可超过20个 + * 每企业每个月设置的可信域名不可超过20个. */ CODE_85004(85004, "每企业每个月设置的可信域名不可超过20个"), /** - * 可信域名未通过所有权校验 + * 可信域名未通过所有权校验. */ CODE_85005(85005, "可信域名未通过所有权校验"), /** - * 参数 chatid 不合法 + * 参数 chatid 不合法. */ CODE_86001(86001, "参数 chatid 不合法"), /** - * 参数 chatid 不存在 + * 参数 chatid 不存在. */ CODE_86003(86003, "参数 chatid 不存在"), /** - * 参数 群名不合法 + * 参数 群名不合法. */ CODE_86004(86004, "参数 群名不合法"), /** - * 参数 群主不合法 + * 参数 群主不合法. */ CODE_86005(86005, "参数 群主不合法"), /** - * 群成员数过多或过少 + * 群成员数过多或过少. */ CODE_86006(86006, "群成员数过多或过少"), /** - * 不合法的群成员 + * 不合法的群成员. */ CODE_86007(86007, "不合法的群成员"), /** - * 非法操作非自己创建的群 + * 非法操作非自己创建的群. */ CODE_86008(86008, "非法操作非自己创建的群"), /** - * 存在非法会话成员ID + * 存在非法会话成员ID. */ CODE_86216(86216, "存在非法会话成员ID"), /** - * 会话发送者不在会话成员列表中;会话的发送者,必须是会话的成员列表之一 + * 会话发送者不在会话成员列表中;会话的发送者,必须是会话的成员列表之一. */ CODE_86217(86217, "会话发送者不在会话成员列表中;会话的发送者,必须是会话的成员列表之一"), /** - * 指定的会话参数不合法 + * 指定的会话参数不合法. */ CODE_86220(86220, "指定的会话参数不合法"), /** - * 未认证摇一摇周边 + * 未认证摇一摇周边. */ CODE_90001(90001, "未认证摇一摇周边"), /** - * 缺少摇一摇周边ticket参数 + * 缺少摇一摇周边ticket参数. */ CODE_90002(90002, "缺少摇一摇周边ticket参数"), /** - * 摇一摇周边ticket参数不合法 + * 摇一摇周边ticket参数不合法. */ CODE_90003(90003, "摇一摇周边ticket参数不合法"), /** - * 非法的对外属性类型 + * 非法的对外属性类型. */ CODE_90100(90100, "非法的对外属性类型"), /** - * 对外属性:文本类型长度不合法;文本长度不可超过12个UTF8字符 + * 对外属性:文本类型长度不合法;文本长度不可超过12个UTF8字符. */ CODE_90101(90101, "对外属性:文本类型长度不合法;文本长度不可超过12个UTF8字符"), /** - * 对外属性:网页类型标题长度不合法;标题长度不可超过12个UTF8字符 + * 对外属性:网页类型标题长度不合法;标题长度不可超过12个UTF8字符. */ CODE_90102(90102, "对外属性:网页类型标题长度不合法;标题长度不可超过12个UTF8字符"), /** - * 对外属性:网页url不合法 + * 对外属性:网页url不合法. */ CODE_90103(90103, "对外属性:网页url不合法"), /** - * 对外属性:小程序类型标题长度不合法;标题长度不可超过12个UTF8字符 + * 对外属性:小程序类型标题长度不合法;标题长度不可超过12个UTF8字符. */ CODE_90104(90104, "对外属性:小程序类型标题长度不合法;标题长度不可超过12个UTF8字符"), /** - * 对外属性:小程序类型pagepath不合法 + * 对外属性:小程序类型pagepath不合法. */ CODE_90105(90105, "对外属性:小程序类型pagepath不合法"), /** - * 对外属性:请求参数不合法 + * 对外属性:请求参数不合法. */ CODE_90106(90106, "对外属性:请求参数不合法"), /** - * 获取ticket的类型无效 + * 获取ticket的类型无效. */ CODE_91040(91040, "获取ticket的类型无效"), /** - * 无权限操作指定的应用 + * 无权限操作指定的应用. */ CODE_301002(301002, "无权限操作指定的应用"), /** - * 不允许删除创建者;创建者不允许从通讯录中删除。如果需要删除该成员,需要先在WEB管理端转移创建者身份。 + * 不允许删除创建者;创建者不允许从通讯录中删除。如果需要删除该成员,需要先在WEB管理端转移创建者身份. */ CODE_301005(301005, "不允许删除创建者;创建者不允许从通讯录中删除。如果需要删除该成员,需要先在WEB管理端转移创建者身份。"), /** - * 参数 position 不合法;长度不允许超过128个字符 + * 参数 position 不合法;长度不允许超过128个字符. */ CODE_301012(301012, "参数 position 不合法;长度不允许超过128个字符"), /** - * 参数 telephone 不合法;telephone必须由1-32位的纯数字或’-‘号组成。 + * 参数 telephone 不合法;telephone必须由1-32位的纯数字或’-‘号组成. */ CODE_301013(301013, "参数 telephone 不合法;telephone必须由1-32位的纯数字或’-‘号组成。"), /** - * 参数 english_name 不合法;参数如果有传递,不允许为空字符串,同时不能超过64字节,只能是由字母、数字、点(.)、减号(-)、空格或下划线(_)组成 + * 参数 english_name 不合法;参数如果有传递,不允许为空字符串,同时不能超过64字节,只能是由字母、数字、点(.)、减号(-)、空格或下划线(_)组成. */ CODE_301014(301014, "参数 english_name 不合法;参数如果有传递,不允许为空字符串,同时不能超过64字节,只能是由字母、数字、点(.)、减号(-)、空格或下划线(_)组成"), /** - * 参数 mediaid 不合法;请检查 mediaid 来源,应该通过上传临时素材的图片类型获得mediaid + * 参数 mediaid 不合法;请检查 mediaid 来源,应该通过上传临时素材的图片类型获得mediaid. */ CODE_301015(301015, "参数 mediaid 不合法;请检查 mediaid 来源,应该通过上传临时素材的图片类型获得mediaid"), /** - * 上传语音文件不符合系统要求;语音文件的系统限制,参考上传的媒体文件限制 + * 上传语音文件不符合系统要求;语音文件的系统限制,参考上传的媒体文件限制. */ CODE_301016(301016, "上传语音文件不符合系统要求;语音文件的系统限制,参考上传的媒体文件限制"), /** - * 上传语音文件仅支持AMR格式;语音文件的系统限制,参考上传的媒体文件限制 + * 上传语音文件仅支持AMR格式;语音文件的系统限制,参考上传的媒体文件限制. */ CODE_301017(301017, "上传语音文件仅支持AMR格式;语音文件的系统限制,参考上传的媒体文件限制"), /** - * 参数 userid 无效;至少有一个userid不存在于通讯录中 + * 参数 userid 无效;至少有一个userid不存在于通讯录中. */ CODE_301021(301021, "参数 userid 无效;至少有一个userid不存在于通讯录中"), /** - * 获取打卡数据失败;系统失败,可重试处理 + * 获取打卡数据失败;系统失败,可重试处理. */ CODE_301022(301022, "获取打卡数据失败;系统失败,可重试处理"), /** - * useridlist非法或超过限额;列表数量不能为0且不超过100 + * useridlist非法或超过限额;列表数量不能为0且不超过100. */ CODE_301023(301023, "useridlist非法或超过限额;列表数量不能为0且不超过100"), /** - * 获取打卡记录时间间隔超限;保证开始时间大于0 且结束时间大于 0 且结束时间大于开始时间,且间隔少于93天 + * 获取打卡记录时间间隔超限;保证开始时间大于0 且结束时间大于 0 且结束时间大于开始时间,且间隔少于93天. */ CODE_301024(301024, "获取打卡记录时间间隔超限;保证开始时间大于0 且结束时间大于 0 且结束时间大于开始时间,且间隔少于93天"), /** - * 不允许更新该用户的userid + * 不允许更新该用户的userid. */ CODE_301036(301036, "不允许更新该用户的userid"), /** - * 批量导入任务的文件中userid有重复 + * 批量导入任务的文件中userid有重复. */ CODE_302003(302003, "批量导入任务的文件中userid有重复"), /** - * 组织架构不合法(1不是一棵树,2 多个一样的partyid,3 partyid空,4 partyid name 空,5 同一个父节点下有两个子节点 部门名字一样 可能是以上情况,请一一排查) + * 组织架构不合法(1不是一棵树,2 多个一样的partyid,3 partyid空,4 partyid name 空,5 同一个父节点下有两个子节点 部门名字一样 可能是以上情况,请一一排查). */ CODE_302004(302004, "组织架构不合法(1不是一棵树,2 多个一样的partyid,3 partyid空,4 partyid name 空,5 同一个父节点下有两个子节点 部门名字一样 可能是以上情况,请一一排查)"), /** - * 批量导入系统失败,请重新尝试导入 + * 批量导入系统失败,请重新尝试导入. */ CODE_302005(302005, "批量导入系统失败,请重新尝试导入"), /** - * 批量导入任务的文件中partyid有重复 + * 批量导入任务的文件中partyid有重复. */ CODE_302006(302006, "批量导入任务的文件中partyid有重复"), /** - * 批量导入任务的文件中,同一个部门下有两个子部门名字一样 + * 批量导入任务的文件中,同一个部门下有两个子部门名字一样. */ CODE_302007(302007, "批量导入任务的文件中,同一个部门下有两个子部门名字一样"), /** - * CorpId参数无效;指定的CorpId不存在 + * CorpId参数无效;指定的CorpId不存在. */ CODE_2000002(2000002, "CorpId参数无效;指定的CorpId不存在"); @@ -791,7 +791,7 @@ public enum WxCpErrorMsgEnum { } /** - * 通过错误代码查找其中文含义. + * 通过错误代码查找其中文含义.. */ public static String findMsgByCode(int code) { for (WxCpErrorMsgEnum value : WxCpErrorMsgEnum.values()) { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java index 731592ea..d53e7fb2 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxError.java @@ -1,13 +1,12 @@ package me.chanjar.weixin.common.error; -import java.io.Serializable; - -import org.apache.commons.lang3.StringUtils; - import lombok.Builder; import lombok.Data; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; /** * 微信错误码. @@ -46,29 +45,38 @@ public class WxError implements Serializable { public static WxError fromJson(String json, WxType type) { final WxError wxError = WxGsonBuilder.create().fromJson(json, WxError.class); - if (StringUtils.isNotEmpty(wxError.getErrorMsg())) { - wxError.setErrorMsgEn(wxError.getErrorMsg()); + if (wxError.getErrorCode() == 0 || type == null) { + return wxError; } - if (type == null) { - return wxError; + if (StringUtils.isNotEmpty(wxError.getErrorMsg())) { + wxError.setErrorMsgEn(wxError.getErrorMsg()); } - if (type == WxType.MP) { - final String msg = WxMpErrorMsgEnum.findMsgByCode(wxError.getErrorCode()); - if (msg != null) { - wxError.setErrorMsg(msg); + switch (type) { + case MP: { + final String msg = WxMpErrorMsgEnum.findMsgByCode(wxError.getErrorCode()); + if (msg != null) { + wxError.setErrorMsg(msg); + } + break; } - } else if (type == WxType.CP) { - final String msg = WxCpErrorMsgEnum.findMsgByCode(wxError.getErrorCode()); - if (msg != null) { - wxError.setErrorMsg(msg); + case CP: { + final String msg = WxCpErrorMsgEnum.findMsgByCode(wxError.getErrorCode()); + if (msg != null) { + wxError.setErrorMsg(msg); + } + break; } - } else if (type == WxType.MiniApp) { + case MiniApp: { final String msg = WxMaErrorMsgEnum.findMsgByCode(wxError.getErrorCode()); if (msg != null) { wxError.setErrorMsg(msg); } + break; + } + default: + return wxError; } return wxError; @@ -76,10 +84,11 @@ public class WxError implements Serializable { @Override public String toString() { - if (this.json != null) { - return this.json; + if (this.json == null) { + return "错误代码:" + this.errorCode + ", 错误信息:" + this.errorMsg; } - return "错误: Code=" + this.errorCode + ", Msg=" + this.errorMsg; + + return "错误代码:" + this.errorCode + ", 错误信息:" + this.errorMsg + ",微信原始报文:" + this.json; } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java index 7e478606..782e471e 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java @@ -14,619 +14,623 @@ import lombok.Getter; @Getter public enum WxMpErrorMsgEnum { /** - * 系统繁忙,此时请开发者稍候再试 + * 系统繁忙,此时请开发者稍候再试. */ CODE_1(-1, "系统繁忙,此时请开发者稍候再试"), /** - * 请求成功 + * 请求成功. */ CODE_0(0, "请求成功"), /** - * 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口 + * 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口. */ CODE_40001(40001, "获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口"), /** - * 不合法的凭证类型 + * 不合法的凭证类型. */ CODE_40002(40002, "不合法的凭证类型"), /** - * 不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID + * 不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID. */ CODE_40003(40003, "不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID"), /** - * 不合法的媒体文件类型 + * 不合法的媒体文件类型. */ CODE_40004(40004, "不合法的媒体文件类型"), /** - * 不合法的文件类型 + * 不合法的文件类型. */ CODE_40005(40005, "不合法的文件类型"), /** - * 不合法的文件大小 + * 不合法的文件大小. */ CODE_40006(40006, "不合法的文件大小"), /** - * 不合法的媒体文件 id + * 不合法的媒体文件 id. */ CODE_40007(40007, "不合法的媒体文件 id"), /** - * 不合法的消息类型 + * 不合法的消息类型. */ CODE_40008(40008, "不合法的消息类型"), /** - * 不合法的图片文件大小 + * 不合法的图片文件大小. */ CODE_40009(40009, "不合法的图片文件大小"), /** - * 不合法的语音文件大小 + * 不合法的语音文件大小. */ CODE_40010(40010, "不合法的语音文件大小"), /** - * 不合法的视频文件大小 + * 不合法的视频文件大小. */ CODE_40011(40011, "不合法的视频文件大小"), /** - * 不合法的缩略图文件大小 + * 不合法的缩略图文件大小. */ CODE_40012(40012, "不合法的缩略图文件大小"), /** - * 不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写 + * 不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写. */ CODE_40013(40013, "不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写"), /** - * 不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 + * 不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口. */ CODE_40014(40014, "不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口"), /** - * 不合法的菜单类型 + * 不合法的菜单类型. */ CODE_40015(40015, "不合法的菜单类型"), /** - * 不合法的按钮个数 + * 不合法的按钮个数. */ CODE_40016(40016, "不合法的按钮个数"), /** - * 不合法的按钮个数 + * 不合法的按钮个数. */ CODE_40017(40017, "不合法的按钮个数"), /** - * 不合法的按钮名字长度 + * 不合法的按钮名字长度. */ CODE_40018(40018, "不合法的按钮名字长度"), /** - * 不合法的按钮 KEY 长度 + * 不合法的按钮 KEY 长度. */ CODE_40019(40019, "不合法的按钮 KEY 长度"), /** - * 不合法的按钮 URL 长度 + * 不合法的按钮 URL 长度. */ CODE_40020(40020, "不合法的按钮 URL 长度"), /** - * 不合法的菜单版本号 + * 不合法的菜单版本号. */ CODE_40021(40021, "不合法的菜单版本号"), /** - * 不合法的子菜单级数 + * 不合法的子菜单级数. */ CODE_40022(40022, "不合法的子菜单级数"), /** - * 不合法的子菜单按钮个数 + * 不合法的子菜单按钮个数. */ CODE_40023(40023, "不合法的子菜单按钮个数"), /** - * 不合法的子菜单按钮类型 + * 不合法的子菜单按钮类型. */ CODE_40024(40024, "不合法的子菜单按钮类型"), /** - * 不合法的子菜单按钮名字长度 + * 不合法的子菜单按钮名字长度. */ CODE_40025(40025, "不合法的子菜单按钮名字长度"), /** - * 不合法的子菜单按钮 KEY 长度 + * 不合法的子菜单按钮 KEY 长度. */ CODE_40026(40026, "不合法的子菜单按钮 KEY 长度"), /** - * 不合法的子菜单按钮 URL 长度 + * 不合法的子菜单按钮 URL 长度. */ CODE_40027(40027, "不合法的子菜单按钮 URL 长度"), /** - * 不合法的自定义菜单使用用户 + * 不合法的自定义菜单使用用户. */ CODE_40028(40028, "不合法的自定义菜单使用用户"), /** - * 不合法的 oauth_code + * 不合法的 oauth_code. */ CODE_40029(40029, "不合法的 oauth_code"), /** - * 不合法的 refresh_token + * 不合法的 refresh_token. */ CODE_40030(40030, "不合法的 refresh_token"), /** - * 不合法的 openid 列表 + * 不合法的 openid 列表. */ CODE_40031(40031, "不合法的 openid 列表"), /** - * 不合法的 openid 列表长度 + * 不合法的 openid 列表长度. */ CODE_40032(40032, "不合法的 openid 列表长度"), /** - * 不合法的请求字符,不能包含\\uxxxx 格式的字符 + * 不合法的请求字符,不能包含\\uxxxx 格式的字符. */ CODE_40033(40033, "不合法的请求字符,不能包含\\uxxxx 格式的字符"), /** - * 不合法的参数 + * 不合法的参数. */ CODE_40035(40035, "不合法的参数"), /** - * 不合法的请求格式 + * 不合法的请求格式. */ CODE_40038(40038, "不合法的请求格式"), /** - * 不合法的 URL 长度 + * 不合法的 URL 长度. */ CODE_40039(40039, "不合法的 URL 长度"), /** - * 不合法的分组 id + * 不合法的分组 id. */ CODE_40050(40050, "不合法的分组 id"), /** - * 分组名字不合法 + * 分组名字不合法. */ CODE_40051(40051, "分组名字不合法"), /** - * 删除单篇图文时,指定的 article_idx 不合法 + * 删除单篇图文时,指定的 article_idx 不合法. */ CODE_40060(40060, "删除单篇图文时,指定的 article_idx 不合法"), /** - * 分组名字不合法 + * 分组名字不合法. */ CODE_40117(40117, "分组名字不合法"), /** - * media_id 大小不合法 + * media_id 大小不合法. */ CODE_40118(40118, "media_id 大小不合法"), /** - * button 类型错误 + * button 类型错误. */ CODE_40119(40119, "button 类型错误"), /** - * button 类型错误 + * button 类型错误. */ CODE_40120(40120, "button 类型错误"), /** - * 不合法的 media_id 类型 + * 不合法的 media_id 类型. */ CODE_40121(40121, "不合法的 media_id 类型"), /** - * 微信号不合法 + * 微信号不合法. */ CODE_40132(40132, "微信号不合法"), /** - * 不支持的图片格式 + * 不支持的图片格式. */ CODE_40137(40137, "不支持的图片格式"), /** - * 请勿添加其他公众号的主页链接 + * 请勿添加其他公众号的主页链接. */ CODE_40155(40155, "请勿添加其他公众号的主页链接"), /** - * 缺少 access_token 参数 + * 缺少 access_token 参数. */ CODE_41001(41001, "缺少 access_token 参数"), /** - * 缺少 appid 参数 + * 缺少 appid 参数. */ CODE_41002(41002, "缺少 appid 参数"), /** - * 缺少 refresh_token 参数 + * 缺少 refresh_token 参数. */ CODE_41003(41003, "缺少 refresh_token 参数"), /** - * 缺少 secret 参数 + * 缺少 secret 参数. */ CODE_41004(41004, "缺少 secret 参数"), /** - * 缺少多媒体文件数据 + * 缺少多媒体文件数据. */ CODE_41005(41005, "缺少多媒体文件数据"), /** - * 缺少 media_id 参数 + * 缺少 media_id 参数. */ CODE_41006(41006, "缺少 media_id 参数"), /** - * 缺少子菜单数据 + * 缺少子菜单数据. */ CODE_41007(41007, "缺少子菜单数据"), /** - * 缺少 oauth code + * 缺少 oauth code. */ CODE_41008(41008, "缺少 oauth code"), /** - * 缺少 openid + * 缺少 openid. */ CODE_41009(41009, "缺少 openid"), /** - * access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明 + * access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明. */ CODE_42001(42001, "access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明"), /** - * refresh_token 超时 + * refresh_token 超时. */ CODE_42002(42002, "refresh_token 超时"), /** - * oauth_code 超时 + * oauth_code 超时. */ CODE_42003(42003, "oauth_code 超时"), /** - * 用户修改微信密码, accesstoken 和 refreshtoken 失效,需要重新授权 + * 用户修改微信密码, accesstoken 和 refreshtoken 失效,需要重新授权. */ CODE_42007(42007, "用户修改微信密码, accesstoken 和 refreshtoken 失效,需要重新授权"), /** - * 需要 GET 请求 + * 需要 GET 请求. */ CODE_43001(43001, "需要 GET 请求"), /** - * 需要 POST 请求 + * 需要 POST 请求. */ CODE_43002(43002, "需要 POST 请求"), /** - * 需要 HTTPS 请求 + * 需要 HTTPS 请求. */ CODE_43003(43003, "需要 HTTPS 请求"), /** - * 需要接收者关注 + * 需要接收者关注. */ CODE_43004(43004, "需要接收者关注"), /** - * 需要好友关系 + * 需要好友关系. */ CODE_43005(43005, "需要好友关系"), /** - * 需要将接收者从黑名单中移除 + * 需要将接收者从黑名单中移除. */ CODE_43019(43019, "需要将接收者从黑名单中移除"), /** - * 多媒体文件为空 + * 多媒体文件为空. */ CODE_44001(44001, "多媒体文件为空"), /** - * POST 的数据包为空 + * POST 的数据包为空. */ CODE_44002(44002, "POST 的数据包为空"), /** - * 图文消息内容为空 + * 图文消息内容为空. */ CODE_44003(44003, "图文消息内容为空"), /** - * 文本消息内容为空 + * 文本消息内容为空. */ CODE_44004(44004, "文本消息内容为空"), /** - * 多媒体文件大小超过限制 + * 多媒体文件大小超过限制. */ CODE_45001(45001, "多媒体文件大小超过限制"), /** - * 消息内容超过限制 + * 消息内容超过限制. */ CODE_45002(45002, "消息内容超过限制"), /** - * 标题字段超过限制 + * 标题字段超过限制. */ CODE_45003(45003, "标题字段超过限制"), /** - * 描述字段超过限制 + * 描述字段超过限制. */ CODE_45004(45004, "描述字段超过限制"), /** - * 链接字段超过限制 + * 链接字段超过限制. */ CODE_45005(45005, "链接字段超过限制"), /** - * 图片链接字段超过限制 + * 图片链接字段超过限制. */ CODE_45006(45006, "图片链接字段超过限制"), /** - * 语音播放时间超过限制 + * 语音播放时间超过限制. */ CODE_45007(45007, "语音播放时间超过限制"), /** - * 图文消息超过限制 + * 图文消息超过限制. */ CODE_45008(45008, "图文消息超过限制"), /** - * 接口调用超过限制 + * 接口调用超过限制. */ CODE_45009(45009, "接口调用超过限制"), /** - * 创建菜单个数超过限制 + * 创建菜单个数超过限制. */ CODE_45010(45010, "创建菜单个数超过限制"), /** - * API 调用太频繁,请稍候再试 + * API 调用太频繁,请稍候再试. */ CODE_45011(45011, "API 调用太频繁,请稍候再试"), /** - * 回复时间超过限制 + * 回复时间超过限制. */ CODE_45015(45015, "回复时间超过限制"), /** - * 系统分组,不允许修改 + * 系统分组,不允许修改. */ CODE_45016(45016, "系统分组,不允许修改"), /** - * 分组名字过长 + * 分组名字过长. */ CODE_45017(45017, "分组名字过长"), /** - * 分组数量超过上限 + * 分组数量超过上限. */ CODE_45018(45018, "分组数量超过上限"), /** - * 客服接口下行条数超过上限 + * 客服接口下行条数超过上限. */ CODE_45047(45047, "客服接口下行条数超过上限"), /** - * 不存在媒体数据 + * 非法的tag_id. + */ + CODE_45159(45159, "非法的tag_id"), + /** + * 不存在媒体数据. */ CODE_46001(46001, "不存在媒体数据"), /** - * 不存在的菜单版本 + * 不存在的菜单版本. */ CODE_46002(46002, "不存在的菜单版本"), /** - * 不存在的菜单数据 + * 不存在的菜单数据. */ CODE_46003(46003, "不存在的菜单数据"), /** - * 不存在的用户 + * 不存在的用户. */ CODE_46004(46004, "不存在的用户"), /** - * 解析 JSON/XML 内容错误 + * 解析 JSON/XML 内容错误. */ CODE_47001(47001, "解析 JSON/XML 内容错误"), /** - * api 功能未授权,请确认公众号已获得该接口,可以在公众平台官网 - 开发者中心页中查看接口权限 + * api 功能未授权,请确认公众号已获得该接口,可以在公众平台官网 - 开发者中心页中查看接口权限. */ CODE_48001(48001, "api 功能未授权,请确认公众号已获得该接口,可以在公众平台官网 - 开发者中心页中查看接口权限"), /** - * 粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” ) + * 粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” ). */ CODE_48002(48002, "粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” )"), /** - * api 接口被封禁,请登录 mp.weixin.qq.com 查看详情 + * api 接口被封禁,请登录 mp.weixin.qq.com 查看详情. */ CODE_48004(48004, "api 接口被封禁,请登录 mp.weixin.qq.com 查看详情"), /** - * api 禁止删除被自动回复和自定义菜单引用的素材 + * api 禁止删除被自动回复和自定义菜单引用的素材. */ CODE_48005(48005, "api 禁止删除被自动回复和自定义菜单引用的素材"), /** - * api 禁止清零调用次数,因为清零次数达到上限 + * api 禁止清零调用次数,因为清零次数达到上限. */ CODE_48006(48006, "api 禁止清零调用次数,因为清零次数达到上限"), /** - * 没有该类型消息的发送权限 + * 没有该类型消息的发送权限. */ CODE_48008(48008, "没有该类型消息的发送权限"), /** - * 用户未授权该 api + * 用户未授权该 api. */ CODE_50001(50001, "用户未授权该 api"), /** - * 用户受限,可能是违规后接口被封禁 + * 用户受限,可能是违规后接口被封禁. */ CODE_50002(50002, "用户受限,可能是违规后接口被封禁"), /** - * 用户未关注公众号 + * 用户未关注公众号. */ CODE_50005(50005, "用户未关注公众号"), /** - * 参数错误 (invalid parameter) + * 参数错误 (invalid parameter). */ CODE_61451(61451, "参数错误 (invalid parameter)"), /** - * 无效客服账号 (invalid kf_account) + * 无效客服账号 (invalid kf_account). */ CODE_61452(61452, "无效客服账号 (invalid kf_account)"), /** - * 客服帐号已存在 (kf_account exsited) + * 客服帐号已存在 (kf_account exsited). */ CODE_61453(61453, "客服帐号已存在 (kf_account exsited)"), /** - * 客服帐号名长度超过限制 ( 仅允许 10 个英文字符,不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length) + * 客服帐号名长度超过限制 ( 仅允许 10 个英文字符,不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length). */ CODE_61454(61454, "客服帐号名长度超过限制 ( 仅允许 10 个英文字符,不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length)"), /** - * 客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account) + * 客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account). */ CODE_61455(61455, "客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account)"), /** - * 客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded) + * 客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded). */ CODE_61456(61456, "客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded)"), /** - * 无效头像文件类型 (invalid file type) + * 无效头像文件类型 (invalid file type). */ CODE_61457(61457, "无效头像文件类型 (invalid file type)"), /** - * 系统错误 (system error) + * 系统错误 (system error). */ CODE_61450(61450, "系统错误 (system error)"), /** - * 日期格式错误 + * 日期格式错误. */ CODE_61500(61500, "日期格式错误"), /** - * 不存在此 menuid 对应的个性化菜单 + * 不存在此 menuid 对应的个性化菜单. */ CODE_65301(65301, "不存在此 menuid 对应的个性化菜单"), /** - * 没有相应的用户 + * 没有相应的用户. */ CODE_65302(65302, "没有相应的用户"), /** - * 没有默认菜单,不能创建个性化菜单 + * 没有默认菜单,不能创建个性化菜单. */ CODE_65303(65303, "没有默认菜单,不能创建个性化菜单"), /** - * MatchRule 信息为空 + * MatchRule 信息为空. */ CODE_65304(65304, "MatchRule 信息为空"), /** - * 个性化菜单数量受限 + * 个性化菜单数量受限. */ CODE_65305(65305, "个性化菜单数量受限"), /** - * 不支持个性化菜单的帐号 + * 不支持个性化菜单的帐号. */ CODE_65306(65306, "不支持个性化菜单的帐号"), /** - * 个性化菜单信息为空 + * 个性化菜单信息为空. */ CODE_65307(65307, "个性化菜单信息为空"), /** - * 包含没有响应类型的 button + * 包含没有响应类型的 button. */ CODE_65308(65308, "包含没有响应类型的 button"), /** - * 个性化菜单开关处于关闭状态 + * 个性化菜单开关处于关闭状态. */ CODE_65309(65309, "个性化菜单开关处于关闭状态"), /** - * 填写了省份或城市信息,国家信息不能为空 + * 填写了省份或城市信息,国家信息不能为空. */ CODE_65310(65310, "填写了省份或城市信息,国家信息不能为空"), /** - * 填写了城市信息,省份信息不能为空 + * 填写了城市信息,省份信息不能为空. */ CODE_65311(65311, "填写了城市信息,省份信息不能为空"), /** - * 不合法的国家信息 + * 不合法的国家信息. */ CODE_65312(65312, "不合法的国家信息"), /** - * 不合法的省份信息 + * 不合法的省份信息. */ CODE_65313(65313, "不合法的省份信息"), /** - * 不合法的城市信息 + * 不合法的城市信息. */ CODE_65314(65314, "不合法的城市信息"), /** - * 该公众号的菜单设置了过多的域名外跳(最多跳转到 3 个域名的链接) + * 该公众号的菜单设置了过多的域名外跳(最多跳转到 3 个域名的链接). */ CODE_65316(65316, "该公众号的菜单设置了过多的域名外跳(最多跳转到 3 个域名的链接)"), /** - * 不合法的 URL + * 不合法的 URL. */ CODE_65317(65317, "不合法的 URL"), /** - * POST 数据参数不合法 + * POST 数据参数不合法. */ CODE_9001001(9001001, "POST 数据参数不合法"), /** - * 远端服务不可用 + * 远端服务不可用. */ CODE_9001002(9001002, "远端服务不可用"), /** - * Ticket 不合法 + * Ticket 不合法. */ CODE_9001003(9001003, "Ticket 不合法"), /** - * 获取摇周边用户信息失败 + * 获取摇周边用户信息失败. */ CODE_9001004(9001004, "获取摇周边用户信息失败"), /** - * 获取商户信息失败 + * 获取商户信息失败. */ CODE_9001005(9001005, "获取商户信息失败"), /** - * 获取 OpenID 失败 + * 获取 OpenID 失败. */ CODE_9001006(9001006, "获取 OpenID 失败"), /** - * 上传文件缺失 + * 上传文件缺失. */ CODE_9001007(9001007, "上传文件缺失"), /** - * 上传素材的文件类型不合法 + * 上传素材的文件类型不合法. */ CODE_9001008(9001008, "上传素材的文件类型不合法"), /** - * 上传素材的文件尺寸不合法 + * 上传素材的文件尺寸不合法. */ CODE_9001009(9001009, "上传素材的文件尺寸不合法"), /** - * 上传失败 + * 上传失败. */ CODE_9001010(9001010, "上传失败"), /** - * 帐号不合法 + * 帐号不合法. */ CODE_9001020(9001020, "帐号不合法"), /** - * 已有设备激活率低于 50% ,不能新增设备 + * 已有设备激活率低于 50% ,不能新增设备. */ CODE_9001021(9001021, "已有设备激活率低于 50% ,不能新增设备"), /** - * 设备申请数不合法,必须为大于 0 的数字 + * 设备申请数不合法,必须为大于 0 的数字. */ CODE_9001022(9001022, "设备申请数不合法,必须为大于 0 的数字"), /** - * 已存在审核中的设备 ID 申请 + * 已存在审核中的设备 ID 申请. */ CODE_9001023(9001023, "已存在审核中的设备 ID 申请"), /** - * 一次查询设备 ID 数量不能超过 50 + * 一次查询设备 ID 数量不能超过 50. */ CODE_9001024(9001024, "一次查询设备 ID 数量不能超过 50"), /** - * 设备 ID 不合法 + * 设备 ID 不合法. */ CODE_9001025(9001025, "设备 ID 不合法"), /** - * 页面 ID 不合法 + * 页面 ID 不合法. */ CODE_9001026(9001026, "页面 ID 不合法"), /** - * 页面参数不合法 + * 页面参数不合法. */ CODE_9001027(9001027, "页面参数不合法"), /** - * 一次删除页面 ID 数量不能超过 10 + * 一次删除页面 ID 数量不能超过 10. */ CODE_9001028(9001028, "一次删除页面 ID 数量不能超过 10"), /** - * 页面已应用在设备中,请先解除应用关系再删除 + * 页面已应用在设备中,请先解除应用关系再删除. */ CODE_9001029(9001029, "页面已应用在设备中,请先解除应用关系再删除"), /** - * 一次查询页面 ID 数量不能超过 50 + * 一次查询页面 ID 数量不能超过 50. */ CODE_9001030(9001030, "一次查询页面 ID 数量不能超过 50"), /** - * 时间区间不合法 + * 时间区间不合法. */ CODE_9001031(9001031, "时间区间不合法"), /** - * 保存设备与页面的绑定关系参数错误 + * 保存设备与页面的绑定关系参数错误. */ CODE_9001032(9001032, "保存设备与页面的绑定关系参数错误"), /** - * 门店 ID 不合法 + * 门店 ID 不合法. */ CODE_9001033(9001033, "门店 ID 不合法"), /** - * 设备备注信息过长 + * 设备备注信息过长. */ CODE_9001034(9001034, "设备备注信息过长"), /** - * 设备申请参数不合法 + * 设备申请参数不合法. */ CODE_9001035(9001035, "设备申请参数不合法"), /** - * 查询起始值 begin 不合法 + * 查询起始值 begin 不合法. */ CODE_9001036(9001036, "查询起始值 begin 不合法"); @@ -639,7 +643,7 @@ public enum WxMpErrorMsgEnum { } /** - * 通过错误代码查找其中文含义. + * 通过错误代码查找其中文含义.. */ public static String findMsgByCode(int code) { for (WxMpErrorMsgEnum value : WxMpErrorMsgEnum.values()) { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java index 5e344acf..5c49c0f7 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java @@ -3,6 +3,7 @@ package me.chanjar.weixin.common.util.http; import java.io.File; import java.io.IOException; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.apache.ApacheMediaDownloadRequestExecutor; import me.chanjar.weixin.common.util.http.jodd.JoddHttpMediaDownloadRequestExecutor; @@ -25,8 +26,8 @@ public abstract class BaseMediaDownloadRequestExecutor implements RequestE } @Override - public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException { - handler.handle(this.execute(uri, data)); + public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException { + handler.handle(this.execute(uri, data, wxType)); } public static RequestExecutor create(RequestHttp requestHttp, File tmpDirFile) { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java index 10ef3602..df1444cc 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java @@ -3,6 +3,7 @@ package me.chanjar.weixin.common.util.http; import java.io.File; import java.io.IOException; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.apache.ApacheMediaUploadRequestExecutor; @@ -23,8 +24,8 @@ public abstract class MediaUploadRequestExecutor implements RequestExecuto } @Override - public void execute(String uri, File data, ResponseHandler handler) throws WxErrorException, IOException { - handler.handle(this.execute(uri, data)); + public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException { + handler.handle(this.execute(uri, data, wxType)); } public static RequestExecutor create(RequestHttp requestHttp) { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java index feef02de..3d0b772f 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java @@ -1,9 +1,10 @@ package me.chanjar.weixin.common.util.http; -import java.io.IOException; - +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxErrorException; +import java.io.IOException; + /** * http请求执行器. * @@ -16,23 +17,24 @@ public interface RequestExecutor { /** * 执行http请求. * - * @param uri uri - * @param data 数据 + * @param uri uri + * @param data 数据 + * @param wxType 微信模块类型 * @return 响应结果 * @throws WxErrorException 自定义异常 * @throws IOException io异常 */ - T execute(String uri, E data) throws WxErrorException, IOException; - + T execute(String uri, E data, WxType wxType) throws WxErrorException, IOException; /** * 执行http请求. * - * @param uri uri - * @param data 数据 + * @param uri uri + * @param data 数据 * @param handler http响应处理器 + * @param wxType 微信模块类型 * @throws WxErrorException 自定义异常 * @throws IOException io异常 */ - void execute(String uri, E data, ResponseHandler handler) throws WxErrorException, IOException; + void execute(String uri, E data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException; } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java index 6d8b52a8..05c396e0 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.common.util.http; import java.io.IOException; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientSimpleGetRequestExecutor; import me.chanjar.weixin.common.util.http.jodd.JoddHttpSimpleGetRequestExecutor; @@ -21,8 +22,8 @@ public abstract class SimpleGetRequestExecutor implements RequestExecutor< } @Override - public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException { - handler.handle(this.execute(uri, data)); + public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException { + handler.handle(this.execute(uri, data, wxType)); } public static RequestExecutor create(RequestHttp requestHttp) { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java index 97a368ea..c3a6c43e 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.common.util.http; import java.io.IOException; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.apache.ApacheSimplePostRequestExecutor; import me.chanjar.weixin.common.util.http.jodd.JoddHttpSimplePostRequestExecutor; @@ -21,8 +22,9 @@ public abstract class SimplePostRequestExecutor implements RequestExecutor } @Override - public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException { - handler.handle(this.execute(uri, data)); + public void execute(String uri, String data, ResponseHandler handler, WxType wxType) + throws WxErrorException, IOException { + handler.handle(this.execute(uri, data, wxType)); } public static RequestExecutor create(RequestHttp requestHttp) { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientSimpleGetRequestExecutor.java index 3951758d..cc830013 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientSimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientSimpleGetRequestExecutor.java @@ -1,29 +1,31 @@ package me.chanjar.weixin.common.util.http.apache; -import java.io.IOException; - +import me.chanjar.weixin.common.WxType; +import me.chanjar.weixin.common.error.WxError; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.http.RequestHttp; +import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; -import me.chanjar.weixin.common.error.WxError; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.util.http.RequestHttp; -import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; +import java.io.IOException; /** - * Created by ecoolper on 2017/5/4. + * . + * + * @author ecoolper + * @date 2017/5/4 */ public class ApacheHttpClientSimpleGetRequestExecutor extends SimpleGetRequestExecutor { - public ApacheHttpClientSimpleGetRequestExecutor(RequestHttp requestHttp) { super(requestHttp); } @Override - public String execute(String uri, String queryParam) throws WxErrorException, IOException { + public String execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException { if (queryParam != null) { if (uri.indexOf('?') == -1) { uri += '?'; @@ -38,7 +40,7 @@ public class ApacheHttpClientSimpleGetRequestExecutor extends SimpleGetRequestEx try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpGet)) { String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); - WxError error = WxError.fromJson(responseContent); + WxError error = WxError.fromJson(responseContent, wxType); if (error.getErrorCode() != 0) { throw new WxErrorException(error); } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java index da8f435c..51c37f59 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java @@ -1,9 +1,12 @@ package me.chanjar.weixin.common.util.http.apache; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - +import me.chanjar.weixin.common.WxType; +import me.chanjar.weixin.common.error.WxError; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.fs.FileUtils; +import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; +import me.chanjar.weixin.common.util.http.HttpResponseProxy; +import me.chanjar.weixin.common.util.http.RequestHttp; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.Header; @@ -14,15 +17,15 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.entity.ContentType; import org.apache.http.impl.client.CloseableHttpClient; -import me.chanjar.weixin.common.error.WxError; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.util.fs.FileUtils; -import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; -import me.chanjar.weixin.common.util.http.HttpResponseProxy; -import me.chanjar.weixin.common.util.http.RequestHttp; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; /** - * Created by ecoolper on 2017/5/5. + * . + * + * @author ecoolper + * @date 2017/5/5 */ public class ApacheMediaDownloadRequestExecutor extends BaseMediaDownloadRequestExecutor { public ApacheMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { @@ -30,7 +33,7 @@ public class ApacheMediaDownloadRequestExecutor extends BaseMediaDownloadRequest } @Override - public File execute(String uri, String queryParam) throws WxErrorException, IOException { + public File execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException { if (queryParam != null) { if (uri.indexOf('?') == -1) { uri += '?'; @@ -51,7 +54,7 @@ public class ApacheMediaDownloadRequestExecutor extends BaseMediaDownloadRequest if (contentTypeHeader[0].getValue().startsWith(ContentType.APPLICATION_JSON.getMimeType())) { // application/json; encoding=utf-8 下载媒体文件出错 String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); - throw new WxErrorException(WxError.fromJson(responseContent)); + throw new WxErrorException(WxError.fromJson(responseContent, wxType)); } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java index 6684bb93..3c1b15dc 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java @@ -1,7 +1,8 @@ package me.chanjar.weixin.common.util.http.apache; -import me.chanjar.weixin.common.error.WxError; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; +import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; import me.chanjar.weixin.common.util.http.RequestHttp; @@ -26,7 +27,7 @@ public class ApacheMediaUploadRequestExecutor extends MediaUploadRequestExecutor } @Override - public WxMediaUploadResult execute(String uri, File file) throws WxErrorException, IOException { + public WxMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException { HttpPost httpPost = new HttpPost(uri); if (requestHttp.getRequestHttpProxy() != null) { RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build(); @@ -42,7 +43,7 @@ public class ApacheMediaUploadRequestExecutor extends MediaUploadRequestExecutor } try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) { String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); - WxError error = WxError.fromJson(responseContent); + WxError error = WxError.fromJson(responseContent, wxType); if (error.getErrorCode() != 0) { throw new WxErrorException(error); } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java index 2517dbcd..3405aaab 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.common.util.http.apache; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; @@ -15,16 +16,18 @@ import org.apache.http.impl.client.CloseableHttpClient; import java.io.IOException; /** - * Created by ecoolper on 2017/5/4. + * . + * + * @author ecoolper + * @date 2017/5/4 */ public class ApacheSimplePostRequestExecutor extends SimplePostRequestExecutor { - public ApacheSimplePostRequestExecutor(RequestHttp requestHttp) { super(requestHttp); } @Override - public String execute(String uri, String postEntity) throws WxErrorException, IOException { + public String execute(String uri, String postEntity, WxType wxType) throws WxErrorException, IOException { HttpPost httpPost = new HttpPost(uri); if (requestHttp.getRequestHttpProxy() != null) { RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build(); @@ -47,7 +50,7 @@ public class ApacheSimplePostRequestExecutor extends SimplePostRequestExecutor { - public JoddHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { super(requestHttp, tmpDirFile); } @Override - public File execute(String uri, String queryParam) throws WxErrorException, IOException { + public File execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException { if (queryParam != null) { if (uri.indexOf('?') == -1) { uri += '?'; @@ -50,7 +52,7 @@ public class JoddHttpMediaDownloadRequestExecutor extends BaseMediaDownloadReque String contentType = response.header("Content-Type"); if (contentType != null && contentType.startsWith("application/json")) { // application/json; encoding=utf-8 下载媒体文件出错 - throw new WxErrorException(WxError.fromJson(response.bodyText())); + throw new WxErrorException(WxError.fromJson(response.bodyText(), wxType)); } String fileName = new HttpResponseProxy(response).getFileName(); diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java index 8ef4ddec..3c7122a1 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java @@ -5,9 +5,9 @@ import jodd.http.HttpRequest; import jodd.http.HttpResponse; import jodd.http.ProxyInfo; import jodd.util.StringPool; - -import me.chanjar.weixin.common.error.WxError; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; +import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; import me.chanjar.weixin.common.util.http.RequestHttp; @@ -16,7 +16,10 @@ import java.io.File; import java.io.IOException; /** - * Created by ecoolper on 2017/5/5. + * . + * + * @author ecoolper + * @date 2017/5/5 */ public class JoddHttpMediaUploadRequestExecutor extends MediaUploadRequestExecutor { public JoddHttpMediaUploadRequestExecutor(RequestHttp requestHttp) { @@ -24,7 +27,7 @@ public class JoddHttpMediaUploadRequestExecutor extends MediaUploadRequestExecut } @Override - public WxMediaUploadResult execute(String uri, File file) throws WxErrorException, IOException { + public WxMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException { HttpRequest request = HttpRequest.post(uri); if (requestHttp.getRequestHttpProxy() != null) { requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy()); @@ -35,7 +38,7 @@ public class JoddHttpMediaUploadRequestExecutor extends MediaUploadRequestExecut response.charset(StringPool.UTF_8); String responseContent = response.bodyText(); - WxError error = WxError.fromJson(responseContent); + WxError error = WxError.fromJson(responseContent, wxType); if (error.getErrorCode() != 0) { throw new WxErrorException(error); } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java index bee1d174..c93bd4b1 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java @@ -1,8 +1,11 @@ package me.chanjar.weixin.common.util.http.jodd; -import jodd.http.*; +import jodd.http.HttpConnectionProvider; +import jodd.http.HttpRequest; +import jodd.http.HttpResponse; +import jodd.http.ProxyInfo; import jodd.util.StringPool; - +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; @@ -11,16 +14,18 @@ import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; import java.io.IOException; /** - * Created by ecoolper on 2017/5/4. + * . + * + * @author ecoolper + * @date 2017/5/4 */ public class JoddHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor { - public JoddHttpSimpleGetRequestExecutor(RequestHttp requestHttp) { super(requestHttp); } @Override - public String execute(String uri, String queryParam) throws WxErrorException, IOException { + public String execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException { if (queryParam != null) { if (uri.indexOf('?') == -1) { uri += '?'; @@ -38,7 +43,7 @@ public class JoddHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor { - public JoddHttpSimplePostRequestExecutor(RequestHttp requestHttp) { super(requestHttp); } @Override - public String execute(String uri, String postEntity) throws WxErrorException, IOException { + public String execute(String uri, String postEntity, WxType wxType) throws WxErrorException, IOException { HttpConnectionProvider provider = requestHttp.getRequestHttpClient(); ProxyInfo proxyInfo = requestHttp.getRequestHttpProxy(); @@ -39,8 +42,7 @@ public class JoddHttpSimplePostRequestExecutor extends SimplePostRequestExecutor String responseContent = response.bodyText(); if (responseContent.isEmpty()) { - throw new WxErrorException(WxError.builder().errorCode(9999).errorMsg("无响应内容") - .build()); + throw new WxErrorException(WxError.builder().errorCode(9999).errorMsg("无响应内容").build()); } if (responseContent.startsWith("")) { @@ -48,7 +50,7 @@ public class JoddHttpSimplePostRequestExecutor extends SimplePostRequestExecutor return responseContent; } - WxError error = WxError.fromJson(responseContent); + WxError error = WxError.fromJson(responseContent, wxType); if (error.getErrorCode() != 0) { throw new WxErrorException(error); } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java index 6f0a535f..729f1e18 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java @@ -1,5 +1,7 @@ package me.chanjar.weixin.common.util.http.okhttp; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; @@ -19,18 +21,18 @@ import java.io.File; import java.io.IOException; /** - * Created by ecoolper on 2017/5/5. + *. + * @author ecoolper + * @date 2017/5/5 */ +@Slf4j public class OkHttpMediaDownloadRequestExecutor extends BaseMediaDownloadRequestExecutor { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - public OkHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) { super(requestHttp, tmpDirFile); } @Override - public File execute(String uri, String queryParam) throws WxErrorException, IOException { - logger.debug("OkHttpMediaDownloadRequestExecutor is running"); + public File execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException { if (queryParam != null) { if (uri.indexOf('?') == -1) { uri += '?'; @@ -48,7 +50,7 @@ public class OkHttpMediaDownloadRequestExecutor extends BaseMediaDownloadRequest String contentType = response.header("Content-Type"); if (contentType != null && contentType.startsWith("application/json")) { // application/json; encoding=utf-8 下载媒体文件出错 - throw new WxErrorException(WxError.fromJson(response.body().string())); + throw new WxErrorException(WxError.fromJson(response.body().string(), wxType)); } String fileName = new HttpResponseProxy(response).getFileName(); diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java index 02fffb1b..2fef1f93 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java @@ -1,32 +1,29 @@ package me.chanjar.weixin.common.util.http.okhttp; -import me.chanjar.weixin.common.error.WxError; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; +import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; import me.chanjar.weixin.common.util.http.RequestHttp; import okhttp3.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; /** - * Created by ecoolper on 2017/5/5. + * . + * + * @author ecoolper + * @date 2017/5/5 */ public class OkHttpMediaUploadRequestExecutor extends MediaUploadRequestExecutor { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - public OkHttpMediaUploadRequestExecutor(RequestHttp requestHttp) { super(requestHttp); } @Override - public WxMediaUploadResult execute(String uri, File file) throws WxErrorException, IOException { - logger.debug("OkHttpMediaUploadRequestExecutor is running"); - //得到httpClient - OkHttpClient client = requestHttp.getRequestHttpClient(); + public WxMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException { RequestBody body = new MultipartBody.Builder() .setType(MediaType.parse("multipart/form-data")) @@ -36,9 +33,9 @@ public class OkHttpMediaUploadRequestExecutor extends MediaUploadRequestExecutor .build(); Request request = new Request.Builder().url(uri).post(body).build(); - Response response = client.newCall(request).execute(); + Response response = requestHttp.getRequestHttpClient().newCall(request).execute(); String responseContent = response.body().string(); - WxError error = WxError.fromJson(responseContent); + WxError error = WxError.fromJson(responseContent, wxType); if (error.getErrorCode() != 0) { throw new WxErrorException(error); } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java index 380014d0..dbaa27c5 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java @@ -1,28 +1,29 @@ package me.chanjar.weixin.common.util.http.okhttp; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; -import okhttp3.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; import java.io.IOException; /** - * Created by ecoolper on 2017/5/4. + * . + * + * @author ecoolper + * @date 2017/5/4 */ public class OkHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - public OkHttpSimpleGetRequestExecutor(RequestHttp requestHttp) { super(requestHttp); } @Override - public String execute(String uri, String queryParam) throws WxErrorException, IOException { - logger.debug("OkHttpSimpleGetRequestExecutor is running"); + public String execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException { if (queryParam != null) { if (uri.indexOf('?') == -1) { uri += '?'; @@ -35,7 +36,7 @@ public class OkHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - public OkHttpSimplePostRequestExecutor(RequestHttp requestHttp) { super(requestHttp); } @Override - public String execute(String uri, String postEntity) throws WxErrorException, IOException { - logger.debug("OkHttpSimplePostRequestExecutor running"); - //得到httpClient - OkHttpClient client = requestHttp.getRequestHttpClient(); - - MediaType mediaType = MediaType.parse("text/plain; charset=utf-8"); - RequestBody body = RequestBody.create(mediaType, postEntity); - + public String execute(String uri, String postEntity, WxType wxType) throws WxErrorException, IOException { + RequestBody body = RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), postEntity); Request request = new Request.Builder().url(uri).post(body).build(); - - Response response = client.newCall(request).execute(); + Response response = requestHttp.getRequestHttpClient().newCall(request).execute(); String responseContent = response.body().string(); - WxError error = WxError.fromJson(responseContent); + WxError error = WxError.fromJson(responseContent, wxType); if (error.getErrorCode() != 0) { throw new WxErrorException(error); } + return responseContent; } diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java index bbefd487..79b80e63 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java @@ -1,34 +1,34 @@ package me.chanjar.weixin.common.error; -import org.testng.Assert; +import me.chanjar.weixin.common.WxType; import org.testng.annotations.Test; -import static org.testng.Assert.*; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; @Test public class WxErrorTest { - public void testFromJson() { String json = "{ \"errcode\": 40003, \"errmsg\": \"invalid openid\" }"; - WxError wxError = WxError.fromJson(json); + WxError wxError = WxError.fromJson(json, WxType.MP); assertEquals(40003, wxError.getErrorCode()); - assertEquals(wxError.getErrorMsg(), "invalid openid"); + assertEquals(wxError.getErrorMsgEn(), "invalid openid"); } public void testFromBadJson1() { String json = "{ \"errcode\": 40003, \"errmsg\": \"invalid openid\", \"media_id\": \"12323423dsfafsf232f\" }"; - WxError wxError = WxError.fromJson(json); + WxError wxError = WxError.fromJson(json, WxType.MP); assertEquals(40003, wxError.getErrorCode()); - assertEquals(wxError.getErrorMsg(), "invalid openid"); + assertEquals(wxError.getErrorMsgEn(), "invalid openid"); } public void testFromBadJson2() { String json = "{\"access_token\":\"ACCESS_TOKEN\",\"expires_in\":7200}"; - WxError wxError = WxError.fromJson(json); + WxError wxError = WxError.fromJson(json, WxType.MP); assertEquals(0, wxError.getErrorCode()); - assertEquals(wxError.getErrorMsg(), null); + assertNull(wxError.getErrorMsg()); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java index 326717b1..52ccbf8e 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java @@ -6,6 +6,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; @@ -24,9 +25,6 @@ import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult; import me.chanjar.weixin.cp.bean.WxCpMessage; import me.chanjar.weixin.cp.bean.WxCpMessageSendResult; import me.chanjar.weixin.cp.config.WxCpConfigStorage; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; @@ -260,7 +258,7 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "access_token=" + accessToken; try { - T result = executor.execute(uriWithAccessToken, data); + T result = executor.execute(uriWithAccessToken, data, WxType.CP); log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uriWithAccessToken, dataForLog, result); return result; } catch (WxErrorException e) { diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java index dbf4dabf..fe8e3c08 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java @@ -18,7 +18,6 @@ import me.chanjar.weixin.cp.api.WxCpTpService; import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult; import me.chanjar.weixin.cp.bean.WxCpTpCorp; import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import java.io.File; import java.io.IOException; @@ -183,7 +182,7 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "suite_access_token=" + suiteAccessToken; try { - T result = executor.execute(uriWithAccessToken, data); + T result = executor.execute(uriWithAccessToken, data, WxType.CP); log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uriWithAccessToken, dataForLog, result); return result; } catch (WxErrorException e) { diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java index fd2beb4a..94aa977b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.api.WxCpAgentService; @@ -46,7 +47,7 @@ public class WxCpAgentServiceImpl implements WxCpAgentService { String responseContent = this.mainService.post(url, agentInfo.toJson()); JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); if (jsonObject.get("errcode").getAsInt() != 0) { - throw new WxErrorException(WxError.fromJson(responseContent)); + throw new WxErrorException(WxError.fromJson(responseContent, WxType.CP)); } } @@ -56,7 +57,7 @@ public class WxCpAgentServiceImpl implements WxCpAgentService { String responseContent = this.mainService.get(url, null); JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); if (jsonObject.get("errcode").getAsInt() != 0) { - throw new WxErrorException(WxError.fromJson(responseContent)); + throw new WxErrorException(WxError.fromJson(responseContent, WxType.CP)); } return WxCpGsonBuilder.create().fromJson(jsonObject.get("agentlist").toString(), new TypeToken>() { diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java index 1dbf0526..dbdfc451 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java @@ -9,20 +9,29 @@ import me.chanjar.weixin.common.error.WxErrorException; import java.util.List; public interface WxMaTemplateService { - - //获取小程序模板库标题列表 + /** + * 获取小程序模板库标题列表 + */ String TEMPLATE_LIBRARY_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list"; - //获取模板库某个模板标题下关键词库 + /** + * 获取模板库某个模板标题下关键词库 + */ String TEMPLATE_LIBRARY_KEYWORD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get"; - //组合模板并添加至帐号下的个人模板库 + /** + * 组合模板并添加至帐号下的个人模板库 + */ String TEMPLATE_ADD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/add"; - //获取帐号下已存在的模板列表 + /** + * 获取帐号下已存在的模板列表 + */ String TEMPLATE_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/list"; - //删除帐号下的某个模板 + /** + * 删除帐号下的某个模板 + */ String TEMPLATE_DEL_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/del"; /** @@ -32,6 +41,7 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list?access_token=ACCESS_TOKEN * + * * @param offset * @param count * @return @@ -45,6 +55,7 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get?access_token=ACCESS_TOKEN * + * * @param id * @return */ @@ -57,6 +68,7 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=ACCESS_TOKEN * + * * @param id * @param keywordIdList * @return @@ -70,6 +82,7 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN * + * * @param offset * @param count * @return @@ -83,6 +96,7 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN * + * * @param templateId */ boolean delTemplate(String templateId) throws WxErrorException; diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java index dc7fe424..6eeffad2 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java @@ -12,6 +12,7 @@ import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; +import lombok.AllArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; import org.apache.commons.lang3.time.DateFormatUtils; @@ -23,14 +24,11 @@ import java.util.List; * @author Charming * @since 2018-04-28 */ +@AllArgsConstructor public class WxMaAnalysisServiceImpl implements WxMaAnalysisService { private static final JsonParser JSON_PARSER = new JsonParser(); private WxMaService wxMaService; - public WxMaAnalysisServiceImpl(WxMaService wxMaService) { - this.wxMaService = wxMaService; - } - @Override public List getDailySummaryTrend(Date beginDate, Date endDate) throws WxErrorException { return getAnalysisResultAsList(GET_DAILY_SUMMARY_TREND_URL, beginDate, endDate, diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java index a460f4a3..2afdce50 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java @@ -8,6 +8,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import cn.binarywang.wx.miniapp.api.WxMaCodeService; @@ -31,14 +32,11 @@ import me.chanjar.weixin.common.util.json.GsonHelper; * @author Charming * @since 2018-04-26 20:00 */ +@AllArgsConstructor public class WxMaCodeServiceImpl implements WxMaCodeService { private static final JsonParser JSON_PARSER = new JsonParser(); private WxMaService wxMaService; - public WxMaCodeServiceImpl(WxMaService wxMaService) { - this.wxMaService = wxMaService; - } - @Override public void commit(WxMaCodeCommitRequest commitRequest) throws WxErrorException { this.wxMaService.post(COMMIT_URL, commitRequest.toJson()); @@ -50,7 +48,7 @@ public class WxMaCodeServiceImpl implements WxMaCodeService { Path qrCodeFilePath = null; try { RequestExecutor executor = BaseMediaDownloadRequestExecutor - .create(this.wxMaService.getRequestHttp(), Files.createTempDirectory("weixin-java-tools-ma-" + appId).toFile()); + .create(this.wxMaService.getRequestHttp(), Files.createTempDirectory("wxjava-ma-" + appId).toFile()); final StringBuilder url = new StringBuilder(GET_QRCODE_URL); if (StringUtils.isNotBlank(path)) { diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java index 770e58ae..83dbc929 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java @@ -5,6 +5,7 @@ import cn.binarywang.wx.miniapp.api.WxMaService; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import lombok.AllArgsConstructor; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.RandomUtils; @@ -19,19 +20,18 @@ import java.util.concurrent.locks.Lock; * * @author Binary Wang */ +@AllArgsConstructor public class WxMaJsapiServiceImpl implements WxMaJsapiService { private static final JsonParser JSON_PARSER = new JsonParser(); private WxMaService wxMaService; - public WxMaJsapiServiceImpl(WxMaService wxMaService) { - this.wxMaService = wxMaService; - } - + @Override public String getCardApiTicket() throws WxErrorException { return getCardApiTicket(false); } + @Override public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { Lock lock = this.wxMaService.getWxMaConfig().getCardApiTicketLock(); try { diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMediaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMediaServiceImpl.java index 695f9578..06a453ca 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMediaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMediaServiceImpl.java @@ -2,8 +2,9 @@ package cn.binarywang.wx.miniapp.api.impl; import cn.binarywang.wx.miniapp.api.WxMaMediaService; import cn.binarywang.wx.miniapp.api.WxMaService; -import me.chanjar.weixin.common.error.WxError; +import lombok.AllArgsConstructor; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; +import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.fs.FileUtils; import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; @@ -19,13 +20,10 @@ import java.util.UUID; /** * @author Binary Wang */ +@AllArgsConstructor public class WxMaMediaServiceImpl implements WxMaMediaService { private WxMaService wxMaService; - public WxMaMediaServiceImpl(WxMaService wxMaService) { - this.wxMaService = wxMaService; - } - @Override public WxMediaUploadResult uploadMedia(String mediaType, String fileType, InputStream inputStream) throws WxErrorException { try { diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java index e0403a51..c4cb456e 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java @@ -8,20 +8,19 @@ import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; import cn.binarywang.wx.miniapp.constant.WxMaConstants; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import lombok.AllArgsConstructor; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; /** * @author Binary Wang */ +@AllArgsConstructor public class WxMaMsgServiceImpl implements WxMaMsgService { private static final JsonParser JSON_PARSER = new JsonParser(); private WxMaService wxMaService; - public WxMaMsgServiceImpl(WxMaService wxMaService) { - this.wxMaService = wxMaService; - } - @Override public boolean sendKefuMsg(WxMaKefuMessage message) throws WxErrorException { String responseContent = this.wxMaService.post(KEFU_MESSAGE_SEND_URL, message.toJson()); @@ -33,7 +32,7 @@ public class WxMaMsgServiceImpl implements WxMaMsgService { String responseContent = this.wxMaService.post(TEMPLATE_MSG_SEND_URL, templateMessage.toJson()); JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { - throw new WxErrorException(WxError.fromJson(responseContent)); + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } } @@ -42,7 +41,7 @@ public class WxMaMsgServiceImpl implements WxMaMsgService { String responseContent = this.wxMaService.post(UNIFORM_MSG_SEND_URL, uniformMessage.toJson()); JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { - throw new WxErrorException(WxError.fromJson(responseContent)); + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java index 052a0caa..134ed66d 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java @@ -4,33 +4,28 @@ import cn.binarywang.wx.miniapp.api.WxMaPluginService; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaPluginListResult; import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.common.collect.ImmutableMap; +import lombok.AllArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; -import java.util.HashMap; import java.util.Map; +@AllArgsConstructor public class WxMaPluginServiceImpl implements WxMaPluginService { - private WxMaService wxMaService; - public WxMaPluginServiceImpl(WxMaService wxMaService) { - this.wxMaService = wxMaService; - } - @Override public void applyPlugin(String pluginAppId, String reason) throws WxErrorException { - Map params = new HashMap<>(); - params.put("action", "apply"); - params.put("plugin_appid", pluginAppId); - params.put("reason", reason); + Map params = ImmutableMap.of("action", "apply", + "plugin_appid", pluginAppId, + "reason", reason); this.wxMaService.post(PLUGIN_URL, WxMaGsonBuilder.create().toJson(params)); } @Override public WxMaPluginListResult getPluginList() throws WxErrorException { - Map params = new HashMap<>(); - params.put("action", "list"); + Map params = ImmutableMap.of("action", "list"); String responseContent = this.wxMaService.post(PLUGIN_URL, WxMaGsonBuilder.create().toJson(params)); return WxMaPluginListResult.fromJson(responseContent); @@ -38,19 +33,15 @@ public class WxMaPluginServiceImpl implements WxMaPluginService { @Override public void unbindPlugin(String pluginAppId) throws WxErrorException { - Map params = new HashMap<>(); - params.put("action", "unbind"); - params.put("plugin_appid", pluginAppId); - + Map params = ImmutableMap.of("action", "unbind", "plugin_appid", pluginAppId); this.wxMaService.post(PLUGIN_URL, WxMaGsonBuilder.create().toJson(params)); } @Override public void updatePlugin(String pluginAppId, String userVersion) throws WxErrorException { - Map params = new HashMap<>(); - params.put("action", "update"); - params.put("plugin_appid", pluginAppId); - params.put("user_version", userVersion); + Map params = ImmutableMap.of("action", "update", + "plugin_appid", pluginAppId, + "user_version", userVersion); this.wxMaService.post(PLUGIN_URL, WxMaGsonBuilder.create().toJson(params)); } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaQrcodeServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaQrcodeServiceImpl.java index 8e7d6b17..905aff4a 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaQrcodeServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaQrcodeServiceImpl.java @@ -1,7 +1,5 @@ package cn.binarywang.wx.miniapp.api.impl; -import java.io.File; - import cn.binarywang.wx.miniapp.api.WxMaQrcodeService; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; @@ -10,18 +8,18 @@ import cn.binarywang.wx.miniapp.bean.WxaCode; import cn.binarywang.wx.miniapp.bean.WxaCodeUnlimit; import cn.binarywang.wx.miniapp.util.QrcodeBytesRequestExecutor; import cn.binarywang.wx.miniapp.util.QrcodeRequestExecutor; +import lombok.AllArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; +import java.io.File; + /** * @author Binary Wang */ +@AllArgsConstructor public class WxMaQrcodeServiceImpl implements WxMaQrcodeService { private WxMaService wxMaService; - public WxMaQrcodeServiceImpl(WxMaService wxMaService) { - this.wxMaService = wxMaService; - } - @Override public byte[] createQrcodeBytes(String path, int width) throws WxErrorException { final QrcodeBytesRequestExecutor executor = new QrcodeBytesRequestExecutor(this.wxMaService.getRequestHttp()); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaRunServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaRunServiceImpl.java index 9ddad0d3..5b9cd073 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaRunServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaRunServiceImpl.java @@ -6,6 +6,7 @@ import cn.binarywang.wx.miniapp.api.WxMaRunService; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaRunStepInfo; import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils; +import lombok.AllArgsConstructor; /** *
@@ -15,13 +16,10 @@ import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
  *
  * @author Binary Wang
  */
+@AllArgsConstructor
 public class WxMaRunServiceImpl implements WxMaRunService {
   private WxMaService service;
 
-  public WxMaRunServiceImpl(WxMaService service) {
-    this.service = service;
-  }
-
   @Override
   public List getRunStepInfo(String sessionKey, String encryptedData, String ivStr) {
     return WxMaRunStepInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
index 1dab0a82..a0d585cc 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
@@ -1,14 +1,15 @@
 package cn.binarywang.wx.miniapp.api.impl;
 
-import java.io.File;
-
 import cn.binarywang.wx.miniapp.api.WxMaSecCheckService;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
 
+import java.io.File;
+
 /**
  * 
  *
@@ -17,13 +18,10 @@ import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
  *
  * @author Binary Wang
  */
+@AllArgsConstructor
 public class WxMaSecCheckServiceImpl implements WxMaSecCheckService {
   private WxMaService service;
 
-  public WxMaSecCheckServiceImpl(WxMaService service) {
-    this.service = service;
-  }
-
   @Override
   public boolean checkImage(File file) throws WxErrorException {
     //这里只是借用MediaUploadRequestExecutor,并不使用其返回值WxMediaUploadResult
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
index 797dc6b9..44ba6258 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
@@ -119,7 +119,7 @@ public class WxMaServiceImpl implements WxMaService, RequestHttpCharming
  * @since 2018-04-27 15:46
  */
+@AllArgsConstructor
 public class WxMaSettingServiceImpl implements WxMaSettingService {
   private WxMaService wxMaService;
 
-  public WxMaSettingServiceImpl(WxMaService wxMaService) {
-    this.wxMaService = wxMaService;
-  }
-
   @Override
   public WxMaDomainAction modifyDomain(WxMaDomainAction domainAction) throws WxErrorException {
     String responseContent = this.wxMaService.post(MODIFY_DOMAIN_URL, domainAction.toJson());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImpl.java
index 173bfde3..a9d1f474 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImpl.java
@@ -4,17 +4,15 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.api.WxMaShareService;
 import cn.binarywang.wx.miniapp.bean.WxMaShareInfo;
 import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
+import lombok.AllArgsConstructor;
 
 /**
  * @author zhfish
  */
+@AllArgsConstructor
 public class WxMaShareServiceImpl implements WxMaShareService {
   private WxMaService service;
 
-  public WxMaShareServiceImpl(WxMaService service) {
-    this.service = service;
-  }
-
   @Override
   public WxMaShareInfo getShareInfo(String sessionKey, String encryptedData, String ivStr) {
     return WxMaShareInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java
index 3ecb484d..9f5fbf0f 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java
@@ -1,101 +1,58 @@
 package cn.binarywang.wx.miniapp.api.impl;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.api.WxMaTemplateService;
 import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult;
 import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult;
 import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult;
 import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult;
-import me.chanjar.weixin.common.error.WxError;
+import com.google.common.collect.ImmutableMap;
+import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
-public class WxMaTemplateServiceImpl implements WxMaTemplateService {
+import java.util.List;
+import java.util.Map;
 
+/**
+ * @author Binary
+ */
+@AllArgsConstructor
+public class WxMaTemplateServiceImpl implements WxMaTemplateService {
   private WxMaService wxMaService;
 
-  public WxMaTemplateServiceImpl(WxMaService wxMaService) {
-    this.wxMaService = wxMaService;
-  }
-
   @Override
   public WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException {
-
-    Map params = new HashMap<>();
-    params.put("offset", offset);
-    params.put("count", count);
-
+    Map params = ImmutableMap.of("offset", offset, "count", count);
     String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_LIST_URL, WxGsonBuilder.create().toJson(params));
-    WxError wxError = WxError.fromJson(responseText);
-    if (wxError.getErrorCode() == 0) {
-      return WxMaTemplateLibraryListResult.fromJson(responseText);
-    } else {
-      throw new WxErrorException(wxError);
-    }
+    return WxMaTemplateLibraryListResult.fromJson(responseText);
   }
 
   @Override
   public WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException {
-
-    Map params = new HashMap<>();
-    params.put("id", id);
-
-    String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_KEYWORD_URL, WxGsonBuilder.create().toJson(params));
-    WxError wxError = WxError.fromJson(responseText);
-    if (wxError.getErrorCode() == 0) {
-      return WxMaTemplateLibraryGetResult.fromJson(responseText);
-    } else {
-      throw new WxErrorException(wxError);
-    }
+    String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_KEYWORD_URL,
+      WxGsonBuilder.create().toJson(ImmutableMap.of("id", id)));
+    return WxMaTemplateLibraryGetResult.fromJson(responseText);
   }
 
   @Override
   public WxMaTemplateAddResult addTemplate(String id, List keywordIdList) throws WxErrorException {
-
-    Map params = new HashMap<>();
-    params.put("id", id);
-    params.put("keyword_id_list", keywordIdList.toArray());
-
-    String responseText = this.wxMaService.post(TEMPLATE_ADD_URL, WxGsonBuilder.create().toJson(params));
-    WxError wxError = WxError.fromJson(responseText);
-    if (wxError.getErrorCode() == 0) {
-      return WxMaTemplateAddResult.fromJson(responseText);
-    } else {
-      throw new WxErrorException(wxError);
-    }
+    String responseText = this.wxMaService.post(TEMPLATE_ADD_URL,
+      WxGsonBuilder.create().toJson(ImmutableMap.of("id", id, "keyword_id_list", keywordIdList.toArray())));
+    return WxMaTemplateAddResult.fromJson(responseText);
   }
 
   @Override
   public WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException {
-
-    Map params = new HashMap<>();
-    params.put("offset", offset);
-    params.put("count", count);
-
+    Map params = ImmutableMap.of("offset", offset, "count", count);
     String responseText = this.wxMaService.post(TEMPLATE_LIST_URL, WxGsonBuilder.create().toJson(params));
-    WxError wxError = WxError.fromJson(responseText);
-    if (wxError.getErrorCode() == 0) {
-      return WxMaTemplateListResult.fromJson(responseText);
-    } else {
-      throw new WxErrorException(wxError);
-    }
+    return WxMaTemplateListResult.fromJson(responseText);
   }
 
   @Override
   public boolean delTemplate(String templateId) throws WxErrorException {
-    Map params = new HashMap<>();
-    params.put("template_id", templateId);
-
-    String responseText = this.wxMaService.post(TEMPLATE_DEL_URL, WxGsonBuilder.create().toJson(params));
-    WxError wxError = WxError.fromJson(responseText);
-    if (wxError.getErrorCode() == 0) {
-      return true;
-    } else {
-      throw new WxErrorException(wxError);
-    }
+    Map params = ImmutableMap.of("template_id", templateId);
+    this.wxMaService.post(TEMPLATE_DEL_URL, WxGsonBuilder.create().toJson(params));
+    return true;
   }
 }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java
index 3c29f855..ea9df1bf 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java
@@ -10,7 +10,6 @@ import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import lombok.AllArgsConstructor;
-import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.SignUtils;
 import org.apache.commons.codec.digest.DigestUtils;
@@ -49,11 +48,7 @@ public class WxMaUserServiceImpl implements WxMaUserService {
     String params = param.toString();
     String signature = SignUtils.createHmacSha256Sign(params, sessionKey);
     String url = String.format(SET_USER_STORAGE, config.getAppid(), signature, openid, "hmac_sha256");
-    String result = this.service.post(url, params);
-    WxError error = WxError.fromJson(result);
-    if (error.getErrorCode() != 0) {
-      throw new WxErrorException(error);
-    }
+    this.service.post(url, params);
   }
 
   @Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
index 5421aea3..aa329396 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
@@ -1,8 +1,14 @@
 package cn.binarywang.wx.miniapp.util;
 
-import java.io.IOException;
-import java.io.InputStream;
-
+import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
+import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.common.util.http.ResponseHandler;
+import me.chanjar.weixin.common.util.http.apache.InputStreamResponseHandler;
+import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler;
 import org.apache.commons.io.IOUtils;
 import org.apache.http.Header;
 import org.apache.http.HttpHost;
@@ -13,14 +19,8 @@ import org.apache.http.entity.ContentType;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 
-import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
-import me.chanjar.weixin.common.error.WxError;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.util.http.RequestExecutor;
-import me.chanjar.weixin.common.util.http.RequestHttp;
-import me.chanjar.weixin.common.util.http.ResponseHandler;
-import me.chanjar.weixin.common.util.http.apache.InputStreamResponseHandler;
-import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler;
+import java.io.IOException;
+import java.io.InputStream;
 
 /**
  * @author Binary Wang
@@ -33,12 +33,12 @@ public class QrcodeBytesRequestExecutor implements RequestExecutor handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, AbstractWxMaQrcodeWrapper data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   @Override
-  public byte[] execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper) throws WxErrorException, IOException {
+  public byte[] execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper, WxType wxType) throws WxErrorException, IOException {
     HttpPost httpPost = new HttpPost(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       httpPost.setConfig(
@@ -55,7 +55,7 @@ public class QrcodeBytesRequestExecutor implements RequestExecutorBinary Wang
@@ -35,12 +35,12 @@ public class QrcodeRequestExecutor implements RequestExecutor handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, AbstractWxMaQrcodeWrapper data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   @Override
-  public File execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper) throws WxErrorException, IOException {
+  public File execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper, WxType wxType) throws WxErrorException, IOException {
     HttpPost httpPost = new HttpPost(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       httpPost.setConfig(
@@ -57,7 +57,7 @@ public class QrcodeRequestExecutor implements RequestExecutor implements WxMpService, RequestH
   private WxMpOAuth2AccessToken getOAuth2AccessToken(String url) throws WxErrorException {
     try {
       RequestExecutor executor = SimpleGetRequestExecutor.create(this);
-      String responseText = executor.execute(url, null);
+      String responseText = executor.execute(url, null, WxType.MP);
       return WxMpOAuth2AccessToken.fromJson(responseText);
     } catch (IOException e) {
       throw new RuntimeException(e);
@@ -210,7 +211,7 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
 
     try {
       RequestExecutor executor = SimpleGetRequestExecutor.create(this);
-      String responseText = executor.execute(url, null);
+      String responseText = executor.execute(url, null, WxType.MP);
       return WxMpUser.fromJson(responseText);
     } catch (IOException e) {
       throw new RuntimeException(e);
@@ -222,7 +223,7 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
     String url = String.format(OAUTH2_VALIDATE_TOKEN_URL.getUrl(this.getWxMpConfigStorage()), token.getAccessToken(), token.getOpenId());
 
     try {
-      SimpleGetRequestExecutor.create(this).execute(url, null);
+      SimpleGetRequestExecutor.create(this).execute(url, null, WxType.MP);
     } catch (IOException e) {
       throw new RuntimeException(e);
     } catch (WxErrorException e) {
@@ -333,11 +334,10 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
     }
 
     String accessToken = getAccessToken(false);
-
     String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "access_token=" + accessToken;
 
     try {
-      T result = executor.execute(uriWithAccessToken, data);
+      T result = executor.execute(uriWithAccessToken, data, WxType.MP);
       log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uriWithAccessToken, dataForLog, result);
       return result;
     } catch (WxErrorException e) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java
index b6409325..8274d400 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java
@@ -26,7 +26,7 @@ public class MaterialDeleteApacheHttpRequestExecutor extends MaterialDeleteReque
   }
 
   @Override
-  public Boolean execute(String uri, String materialId) throws WxErrorException, IOException {
+  public Boolean execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     HttpPost httpPost = new HttpPost(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java
index f1ffdd6b..df6ecfb5 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java
@@ -22,7 +22,7 @@ public class MaterialDeleteJoddHttpRequestExecutor extends MaterialDeleteRequest
   }
 
   @Override
-  public Boolean execute(String uri, String materialId) throws WxErrorException, IOException {
+  public Boolean execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     HttpRequest request = HttpRequest.post(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java
index 2e4a37ec..2f435ab4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java
@@ -28,12 +28,12 @@ public class MaterialDeleteOkhttpRequestExecutor extends MaterialDeleteRequestEx
   }
 
   @Override
-  public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   @Override
-  public Boolean execute(String uri, String materialId) throws WxErrorException, IOException {
+  public Boolean execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     logger.debug("MaterialDeleteOkhttpRequestExecutor is running");
     //得到httpClient
     OkHttpClient client = requestHttp.getRequestHttpClient();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java
index b1fd2ca9..7a2deb6c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.material;
 
 import java.io.IOException;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -15,8 +16,8 @@ public abstract class MaterialDeleteRequestExecutor implements RequestExec
   }
 
   @Override
-  public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java
index aa717c0a..239dc232 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java
@@ -35,7 +35,7 @@ public class MaterialNewsInfoApacheHttpRequestExecutor
   }
 
   @Override
-  public WxMpMaterialNews execute(String uri, String materialId) throws WxErrorException, IOException {
+  public WxMpMaterialNews execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     HttpPost httpPost = new HttpPost(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java
index d91e2afc..6f30d022 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java
@@ -29,7 +29,7 @@ public class MaterialNewsInfoJoddHttpRequestExecutor extends MaterialNewsInfoReq
   }
 
   @Override
-  public WxMpMaterialNews execute(String uri, String materialId) throws WxErrorException, IOException {
+  public WxMpMaterialNews execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     if (requestHttp.getRequestHttpProxy() != null) {
       requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
     }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java
index 5883a058..d8b07737 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java
@@ -1,6 +1,7 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
 import com.google.common.collect.ImmutableMap;
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -10,24 +11,23 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 import okhttp3.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 
 /**
- * Created by ecoolper on 2017/5/5.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/5
  */
+@Slf4j
 public class MaterialNewsInfoOkhttpRequestExecutor extends MaterialNewsInfoRequestExecutor {
-  private final Logger logger = LoggerFactory.getLogger(this.getClass());
   public MaterialNewsInfoOkhttpRequestExecutor(RequestHttp requestHttp) {
     super(requestHttp);
   }
 
   @Override
-  public WxMpMaterialNews execute(String uri, String materialId) throws WxErrorException, IOException {
-
-    //得到httpClient
+  public WxMpMaterialNews execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     OkHttpClient client = requestHttp.getRequestHttpClient();
 
     RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),
@@ -36,7 +36,7 @@ public class MaterialNewsInfoOkhttpRequestExecutor extends MaterialNewsInfoReque
 
     Response response = client.newCall(request).execute();
     String responseContent = response.body().string();
-    this.logger.debug("响应原始数据:{}", responseContent);
+    log.debug("响应原始数据:{}", responseContent);
 
     WxError error = WxError.fromJson(responseContent, WxType.MP);
     if (error.getErrorCode() != 0) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java
index a636ed26..3dfa2af6 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.material;
 
 import java.io.IOException;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -16,8 +17,8 @@ public abstract class MaterialNewsInfoRequestExecutor implements RequestEx
   }
 
   @Override
-  public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java
index d2e1029f..c63301a4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java
@@ -33,7 +33,7 @@ public class MaterialUploadApacheHttpRequestExecutor extends MaterialUploadReque
   }
 
   @Override
-  public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material) throws WxErrorException, IOException {
+  public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material, WxType wxType) throws WxErrorException, IOException {
     HttpPost httpPost = new HttpPost(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       RequestConfig response = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java
index a09788a8..dc838146 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java
@@ -28,7 +28,7 @@ public class MaterialUploadJoddHttpRequestExecutor extends MaterialUploadRequest
   }
 
   @Override
-  public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material) throws WxErrorException, IOException {
+  public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material, WxType wxType) throws WxErrorException, IOException {
     HttpRequest request = HttpRequest.post(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java
index 879df496..5a651427 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java
@@ -28,7 +28,7 @@ public class MaterialUploadOkhttpRequestExecutor extends MaterialUploadRequestEx
   }
 
   @Override
-  public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material) throws WxErrorException, IOException {
+  public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material, WxType wxType) throws WxErrorException, IOException {
     logger.debug("MaterialUploadOkhttpRequestExecutor is running");
     if (material == null) {
       throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("非法请求,material参数为空").build());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java
index 4e518669..92c6effa 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.material;
 
 import java.io.IOException;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -20,8 +21,8 @@ public abstract class MaterialUploadRequestExecutor implements RequestExec
   }
 
   @Override
-  public void execute(String uri, WxMpMaterial data, ResponseHandler handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, WxMpMaterial data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java
index 65af9cf7..13f33bde 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java
@@ -27,7 +27,7 @@ public class MaterialVideoInfoApacheHttpRequestExecutor extends MaterialVideoInf
   }
 
   @Override
-  public WxMpMaterialVideoInfoResult execute(String uri, String materialId) throws WxErrorException, IOException {
+  public WxMpMaterialVideoInfoResult execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     HttpPost httpPost = new HttpPost(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java
index 852bea5d..08a07f34 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java
@@ -23,7 +23,7 @@ public class MaterialVideoInfoJoddHttpRequestExecutor extends MaterialVideoInfoR
   }
 
   @Override
-  public WxMpMaterialVideoInfoResult execute(String uri, String materialId) throws WxErrorException, IOException {
+  public WxMpMaterialVideoInfoResult execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     HttpRequest request = HttpRequest.post(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java
index 118c9673..edcc5277 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java
@@ -23,7 +23,7 @@ public class MaterialVideoInfoOkhttpRequestExecutor extends MaterialVideoInfoReq
   }
 
   @Override
-  public WxMpMaterialVideoInfoResult execute(String uri, String materialId) throws WxErrorException, IOException {
+  public WxMpMaterialVideoInfoResult execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     logger.debug("MaterialVideoInfoOkhttpRequestExecutor is running");
     //得到httpClient
     OkHttpClient client = requestHttp.getRequestHttpClient();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java
index ee057592..bf4c41cd 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java
@@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.material;
 
 import java.io.IOException;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -17,8 +18,8 @@ public abstract class MaterialVideoInfoRequestExecutor implements RequestE
   }
 
   @Override
-  public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java
index cb295d06..cecfdec8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java
@@ -1,5 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.material;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -30,7 +31,7 @@ public class MaterialVoiceAndImageDownloadApacheHttpRequestExecutor extends Mate
   }
 
   @Override
-  public InputStream execute(String uri, String materialId) throws WxErrorException, IOException {
+  public InputStream execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     HttpPost httpPost = new HttpPost(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java
index 391befbb..2a86b369 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java
@@ -6,6 +6,7 @@ import jodd.http.HttpResponse;
 import jodd.http.ProxyInfo;
 import jodd.util.StringPool;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -27,7 +28,7 @@ public class MaterialVoiceAndImageDownloadJoddHttpRequestExecutor extends Materi
   }
 
   @Override
-  public InputStream execute(String uri, String materialId) throws WxErrorException, IOException {
+  public InputStream execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     HttpRequest request = HttpRequest.post(uri);
     if (requestHttp.getRequestHttpProxy() != null) {
       requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java
index 8952d173..5c0ddb6a 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java
@@ -24,7 +24,7 @@ public class MaterialVoiceAndImageDownloadOkhttpRequestExecutor extends Material
   }
 
   @Override
-  public InputStream execute(String uri, String materialId) throws WxErrorException, IOException {
+  public InputStream execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
     logger.debug("MaterialVoiceAndImageDownloadOkhttpRequestExecutor is running");
     OkHttpClient client = requestHttp.getRequestHttpClient();
     RequestBody requestBody = new FormBody.Builder().add("media_id", materialId).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java
index c00ac148..4a27602d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java
@@ -4,6 +4,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -19,8 +20,8 @@ public abstract class MaterialVoiceAndImageDownloadRequestExecutor impleme
   }
 
   @Override
-  public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   public static RequestExecutor create(RequestHttp requestHttp, File tmpDirFile) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java
index dc6d9792..4176bad1 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java
@@ -30,7 +30,7 @@ public class MediaImgUploadApacheHttpRequestExecutor extends MediaImgUploadReque
   }
 
   @Override
-  public WxMediaImgUploadResult execute(String uri, File data) throws WxErrorException, IOException {
+  public WxMediaImgUploadResult execute(String uri, File data, WxType wxType) throws WxErrorException, IOException {
     if (data == null) {
       throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("文件对象为空").build());
     }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java
index c7ff37ba..6fad6d46 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java
@@ -26,7 +26,7 @@ public class MediaImgUploadHttpRequestExecutor extends MediaImgUploadRequestExec
   }
 
   @Override
-  public WxMediaImgUploadResult execute(String uri, File data) throws WxErrorException, IOException {
+  public WxMediaImgUploadResult execute(String uri, File data, WxType wxType) throws WxErrorException, IOException {
     if (data == null) {
       throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("文件对象为空").build());
     }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java
index c787126e..78bb14f3 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java
@@ -26,7 +26,7 @@ public class MediaImgUploadOkhttpRequestExecutor extends MediaImgUploadRequestEx
   }
 
   @Override
-  public WxMediaImgUploadResult execute(String uri, File file) throws WxErrorException, IOException {
+  public WxMediaImgUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
     logger.debug("MediaImgUploadOkhttpRequestExecutor is running");
     //得到httpClient
     OkHttpClient client = requestHttp.getRequestHttpClient();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java
index 18678f87..bbb2871e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java
@@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.media;
 import java.io.File;
 import java.io.IOException;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -20,8 +21,8 @@ public abstract class MediaImgUploadRequestExecutor implements RequestExec
   }
 
   @Override
-  public void execute(String uri, File data, ResponseHandler handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
index 3547b40f..033126d5 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
@@ -1,5 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.ocr;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -17,41 +18,40 @@ import java.io.File;
 import java.io.IOException;
 
 /**
+ * .
+ *
  * @author : zhayueran
- * @Date: 2019/6/27 14:06
- * @Description:
+ * @date 2019/6/27 14:06
  */
 public class OcrDiscernApacheHttpRequestExecutor extends OcrDiscernRequestExecutor {
-
-
   public OcrDiscernApacheHttpRequestExecutor(RequestHttp requestHttp) {
     super(requestHttp);
   }
 
   @Override
-    public String execute(String uri, File file) throws WxErrorException, IOException {
-        HttpPost httpPost = new HttpPost(uri);
-        if (requestHttp.getRequestHttpProxy() != null) {
-            RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
-            httpPost.setConfig(config);
-        }
-        if (file != null) {
-            HttpEntity entity = MultipartEntityBuilder
-                    .create()
-                    .addBinaryBody("file", file)
-                    .setMode(HttpMultipartMode.RFC6532)
-                    .build();
-            httpPost.setEntity(entity);
-        }
-        try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
-            String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
-            WxError error = WxError.fromJson(responseContent);
-            if (error.getErrorCode() != 0) {
-                throw new WxErrorException(error);
-            }
-            return responseContent;
-        } finally {
-            httpPost.releaseConnection();
-        }
+  public String execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+    HttpPost httpPost = new HttpPost(uri);
+    if (requestHttp.getRequestHttpProxy() != null) {
+      RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
+      httpPost.setConfig(config);
+    }
+    if (file != null) {
+      HttpEntity entity = MultipartEntityBuilder
+        .create()
+        .addBinaryBody("file", file)
+        .setMode(HttpMultipartMode.RFC6532)
+        .build();
+      httpPost.setEntity(entity);
     }
+    try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
+      String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
+      WxError error = WxError.fromJson(responseContent, wxType);
+      if (error.getErrorCode() != 0) {
+        throw new WxErrorException(error);
+      }
+      return responseContent;
+    } finally {
+      httpPost.releaseConnection();
+    }
+  }
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java
index c6638217..536097e4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java
@@ -1,5 +1,6 @@
 package me.chanjar.weixin.mp.util.requestexecuter.ocr;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -9,28 +10,29 @@ import java.io.File;
 import java.io.IOException;
 
 /**
- * @author : zhayueran
- * @Date: 2019/6/27 15:06
- * @Description:
+ * .
+ *
+ * @author   zhayueran
+ * @date  2019/6/27 15:06
  */
 public abstract class OcrDiscernRequestExecutor implements RequestExecutor {
-    protected RequestHttp requestHttp;
+  protected RequestHttp requestHttp;
 
-    public OcrDiscernRequestExecutor(RequestHttp requestHttp) {
-        this.requestHttp = requestHttp;
-    }
+  public OcrDiscernRequestExecutor(RequestHttp requestHttp) {
+    this.requestHttp = requestHttp;
+  }
 
-    @Override
-    public void execute(String uri, File data, ResponseHandler handler) throws WxErrorException, IOException {
-        handler.handle(this.execute(uri, data));
-    }
+  @Override
+  public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
+  }
 
-    public static RequestExecutor create(RequestHttp requestHttp) {
-        switch (requestHttp.getRequestType()) {
-            case APACHE_HTTP:
-                return new OcrDiscernApacheHttpRequestExecutor(requestHttp);
-            default:
-                return null;
-        }
+  public static RequestExecutor create(RequestHttp requestHttp) {
+    switch (requestHttp.getRequestType()) {
+      case APACHE_HTTP:
+        return new OcrDiscernApacheHttpRequestExecutor(requestHttp);
+      default:
+        return null;
     }
+  }
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java
index 6280be7a..8244761e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java
@@ -31,7 +31,7 @@ public class QrCodeApacheHttpRequestExecutor extends QrCodeRequestExecutor implements RequestExecutor handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, WxMpQrCodeTicket data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   public static RequestExecutor create(RequestHttp requestHttp) throws WxErrorException {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java
index c23b3a32..c507d5fd 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java
@@ -31,7 +31,7 @@ public class VoiceUploadApacheHttpRequestExecutor extends VoiceUploadRequestExec
   }
 
   @Override
-  public Boolean execute(String uri, File data) throws WxErrorException, IOException {
+  public Boolean execute(String uri, File data, WxType wxType) throws WxErrorException, IOException {
     if (data == null) {
       throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("文件对象为空").build());
     }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java
index 32bab9f6..a2be94cd 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java
@@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.voice;
 import java.io.File;
 import java.io.IOException;
 
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -23,8 +24,8 @@ public abstract class VoiceUploadRequestExecutor implements RequestExecuto
   }
 
   @Override
-  public void execute(String uri, File data, ResponseHandler handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java
index 65dfef6e..b7084c9e 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java
@@ -1,10 +1,6 @@
 package me.chanjar.weixin.open.api.impl;
 
-import java.io.IOException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.http.RequestExecutor;
@@ -12,6 +8,10 @@ import me.chanjar.weixin.common.util.http.RequestHttp;
 import me.chanjar.weixin.open.api.WxOpenComponentService;
 import me.chanjar.weixin.open.api.WxOpenConfigStorage;
 import me.chanjar.weixin.open.api.WxOpenService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
 
 /**
  * @author 007
@@ -44,7 +44,7 @@ public abstract class WxOpenServiceAbstractImpl implements WxOpenService,
 
   protected synchronized  T execute(RequestExecutor executor, String uri, E data) throws WxErrorException {
     try {
-      T result = executor.execute(uri, data);
+      T result = executor.execute(uri, data, WxType.Open);
       this.log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uri, data, result);
       return result;
     } catch (WxErrorException e) {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeApacheHttpRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeApacheHttpRequestExecutor.java
index 14bed802..b3936458 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeApacheHttpRequestExecutor.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeApacheHttpRequestExecutor.java
@@ -33,7 +33,7 @@ public class MaQrCodeApacheHttpRequestExecutor extends MaQrCodeRequestExecutor implements RequestExecutor handler) throws WxErrorException, IOException {
-    handler.handle(this.execute(uri, data));
+  public void execute(String uri, WxMaQrcodeParam data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+    handler.handle(this.execute(uri, data, wxType));
   }
 
   public static RequestExecutor create(RequestHttp requestHttp) throws WxErrorException {
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java
index d0be5c4b..df9330fc 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EntPayService.java
@@ -50,7 +50,7 @@ public interface EntPayService {
    * 接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo
    * 
* - * @param partnerTradeNo 商户订单号 + * @param request 请求对象 * @return the ent pay query result * @throws WxPayException the wx pay exception */ @@ -105,6 +105,7 @@ public interface EntPayService { * @throws WxPayException the wx pay exception */ EntPayBankQueryResult queryPayBank(String partnerTradeNo) throws WxPayException; + /** * 企业付款到银行卡查询. *
@@ -113,7 +114,7 @@ public interface EntPayService {
    * 接口链接:https://api.mch.weixin.qq.com/mmpaysptrans/query_bank
    * 
* - * @param partnerTradeNo 商户订单号 + * @param request 请求对象 * @return the ent pay bank query result * @throws WxPayException the wx pay exception */ From d638b20bf5c328e123feeca808bbec409a0e04c9 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 5 Sep 2019 13:59:03 +0800 Subject: [PATCH 34/79] =?UTF-8?q?:art:=20=E6=89=B9=E9=87=8F=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/open/api/WxOpenFastMaService.java | 97 ++++--- .../weixin/open/api/WxOpenMaService.java | 2 - .../api/impl/WxOpenComponentServiceImpl.java | 26 +- .../api/impl/WxOpenFastMaServiceImpl.java | 245 +++++------------- .../api/impl/WxOpenInMemoryConfigStorage.java | 14 +- .../api/impl/WxOpenInRedisConfigStorage.java | 2 +- .../weixin/open/bean/ma/WxOpenMaCategory.java | 4 +- .../open/bean/message/WxOpenXmlMessage.java | 36 +-- .../WxFastMaAccountBasicInfoResult.java | 44 ++-- .../result/WxFastMaBeenSetCategoryResult.java | 24 +- .../result/WxFastMaCanSetCategoryResult.java | 34 +-- .../result/WxFastMaCheckNickameResult.java | 6 +- .../WxFastMaQueryNicknameStatusResult.java | 12 +- .../bean/result/WxFastMaSetNickameResult.java | 6 +- .../result/WxOpenAuthorizerListResult.java | 2 +- .../result/WxOpenMaCategoryListResult.java | 4 +- .../bean/result/WxOpenMaDomainResult.java | 4 +- .../result/WxOpenMaGrayReleasePlanResult.java | 3 - .../bean/result/WxOpenMaPageListResult.java | 4 +- .../bean/result/WxOpenMaQueryAuditResult.java | 1 + .../WxFastMaAccountBasicInfoGsonAdapter.java | 26 +- ...WxOpenAuthorizerListResultGsonAdapter.java | 23 +- .../open/util/json/WxOpenGsonBuilder.java | 4 +- .../WxFastMaAccountBasicInfoResultTest.java | 12 +- .../WxFastMaBeenSetCategoryResultTest.java | 8 +- .../WxFastMaCanSetCategoryResultTest.java | 4 +- 26 files changed, 281 insertions(+), 366 deletions(-) diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java index c6fd7671..2c7c374c 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java @@ -18,39 +18,38 @@ import java.util.List; * @date 2019/01/23 */ public interface WxOpenFastMaService extends WxMaService { - /** - * 1 获取帐号基本信息 + * 1 获取帐号基本信息. */ String OPEN_GET_ACCOUNT_BASIC_INFO = "https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo"; /** - * 2 小程序名称设置及改名 + * 2 小程序名称设置及改名. */ String OPEN_SET_NICKNAME = "https://api.weixin.qq.com/wxa/setnickname"; /** - * 3 小程序改名审核状态查询 + * 3 小程序改名审核状态查询. */ String OPEN_API_WXA_QUERYNICKNAME = "https://api.weixin.qq.com/wxa/api_wxa_querynickname"; /** - * 4 微信认证名称检测 + * 4 微信认证名称检测. */ String OPEN_CHECK_WX_VERIFY_NICKNAME = "https://api.weixin.qq.com/cgi-bin/wxverify/checkwxverifynickname"; /** - * 5 修改头像 + * 5 修改头像. */ String OPEN_MODIFY_HEADIMAGE = "https://api.weixin.qq.com/cgi-bin/account/modifyheadimage"; /** - * 6修改功能介绍 + * 6修改功能介绍. */ String OPEN_MODIFY_SIGNATURE = "https://api.weixin.qq.com/cgi-bin/account/modifysignature"; /** - * 7 换绑小程序管理员接口 + * 7 换绑小程序管理员接口. */ String OPEN_COMPONENT_REBIND_ADMIN = "https://api.weixin.qq.com/cgi-bin/account/componentrebindadmin"; @@ -79,37 +78,43 @@ public interface WxOpenFastMaService extends WxMaService { /** * 1.获取小程序的信息 * - * @return - * @throws WxErrorException + * @return . + * @throws WxErrorException . */ WxFastMaAccountBasicInfoResult getAccountBasicInfo() throws WxErrorException; /** * 2.小程序名称设置及改名 - *
+   * 
    *      若接口未返回audit_id,说明名称已直接设置成功,无需审核;若返回audit_id则名称正在审核中。
    *  
- * @param nickname 昵称 - * @param idCard 身份证照片–临时素材mediaid(个人号必填) - * @param license 组织机构代码证或营业执照–临时素材mediaid(组织号必填) + * + * @param nickname 昵称 + * @param idCard 身份证照片–临时素材mediaid(个人号必填) + * @param license 组织机构代码证或营业执照–临时素材mediaid(组织号必填) * @param namingOtherStuff1 其他证明材料---临时素材 mediaid * @param namingOtherStuff2 其他证明材料---临时素材 mediaid - * @throws WxErrorException + * @return . + * @throws WxErrorException . */ - WxFastMaSetNickameResult setNickname(String nickname, String idCard, String license, String namingOtherStuff1, String namingOtherStuff2) throws WxErrorException; + WxFastMaSetNickameResult setNickname(String nickname, String idCard, String license, String namingOtherStuff1, + String namingOtherStuff2) throws WxErrorException; /** * 3 小程序改名审核状态查询 + * * @param auditId 审核单id - * @return - * @throws WxErrorException + * @return . + * @throws WxErrorException . */ WxFastMaQueryNicknameStatusResult querySetNicknameStatus(String auditId) throws WxErrorException; /** * 4. 微信认证名称检测 + * * @param nickname 名称 - * @throws WxErrorException + * @return . + * @throws WxErrorException . */ WxFastMaCheckNickameResult checkWxVerifyNickname(String nickname) throws WxErrorException; @@ -119,29 +124,34 @@ public interface WxOpenFastMaService extends WxMaService { * 图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M * 注:实际头像始终为正方形 *
+ * * @param headImgMediaId 头像素材media_id - * @param x1 裁剪框左上角x坐标(取值范围:[0, 1]) - * @param y1 裁剪框左上角y坐标(取值范围:[0, 1]) - * @param x2 裁剪框右下角x坐标(取值范围:[0, 1]) - * @param y2 裁剪框右下角y坐标(取值范围:[0, 1]) - * @throws WxErrorException + * @param x1 裁剪框左上角x坐标(取值范围:[0, 1]) + * @param y1 裁剪框左上角y坐标(取值范围:[0, 1]) + * @param x2 裁剪框右下角x坐标(取值范围:[0, 1]) + * @param y2 裁剪框右下角y坐标(取值范围:[0, 1]) + * @return . + * @throws WxErrorException . */ WxOpenResult modifyHeadImage(String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException; /** * 6.修改功能介绍 + * * @param signature 简介:4-120字 - * @throws WxErrorException + * @return . + * @throws WxErrorException . */ WxOpenResult modifySignature(String signature) throws WxErrorException; /** * 7.3 管理员换绑 - * @param taskid 换绑管理员任务序列号(公众平台最终点击提交回跳到第三方平台时携带) - * @return - * @throws WxErrorException + * + * @param taskId 换绑管理员任务序列号(公众平台最终点击提交回跳到第三方平台时携带) + * @return . + * @throws WxErrorException . */ - WxOpenResult componentRebindAdmin(String taskid) throws WxErrorException; + WxOpenResult componentRebindAdmin(String taskId) throws WxErrorException; /** * 8.1 获取账号可以设置的所有类目 @@ -150,38 +160,45 @@ public interface WxOpenFastMaService extends WxMaService { * 目前没有完整的类目信息数据 * 为保证兼容性,放弃将response转换为实体 *
- * @return + * + * @return . + * @throws WxErrorException . */ String getAllCategories() throws WxErrorException; /** - *8.2添加类目 - * @return - * @throws WxErrorException + * 8.2添加类目 + * + * @param categoryList 类目列表 + * @return . + * @throws WxErrorException . */ WxOpenResult addCategory(List categoryList) throws WxErrorException; /** * 8.3删除类目 - * @param first 一级类目ID + * + * @param first 一级类目ID * @param second 二级类目ID - * @return - * @throws WxErrorException + * @return . + * @throws WxErrorException . */ WxOpenResult deleteCategory(int first, int second) throws WxErrorException; /** * 8.4获取账号已经设置的所有类目 - * @return - * @throws WxErrorException + * + * @return . + * @throws WxErrorException . */ WxFastMaBeenSetCategoryResult getCategory() throws WxErrorException; /** * 8.5修改类目 + * * @param category 实体 - * @return - * @throws WxErrorException + * @return . + * @throws WxErrorException . */ WxOpenResult modifyCategory(WxFastMaCategory category) throws WxErrorException; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java index f3ea5934..6e0af839 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java @@ -98,7 +98,6 @@ public interface WxOpenMaService extends WxMaService { String API_UPDATE_SHOW_WXA_ITEM = "https://api.weixin.qq.com/wxa/updateshowwxaitem"; - /** * 以下接口为三方平台代小程序实现的代码管理功能 *

@@ -268,7 +267,6 @@ public interface WxOpenMaService extends WxMaService { WxOpenMaTesterListResult getTesterList() throws WxErrorException; - /** * 设置小程序隐私设置(是否可被搜索) * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java index 84f7e382..bad174b6 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java @@ -265,8 +265,8 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { return "success"; } //快速创建小程序 - if (StringUtils.equalsIgnoreCase(wxMessage.getInfoType(), "notify_third_fasteregister") && wxMessage.getStatus () == 0) { - WxOpenQueryAuthResult queryAuth = wxOpenService.getWxOpenComponentService().getQueryAuth(wxMessage.getAuthCode ()); + if (StringUtils.equalsIgnoreCase(wxMessage.getInfoType(), "notify_third_fasteregister") && wxMessage.getStatus() == 0) { + WxOpenQueryAuthResult queryAuth = wxOpenService.getWxOpenComponentService().getQueryAuth(wxMessage.getAuthCode()); if (queryAuth == null || queryAuth.getAuthorizationInfo() == null || queryAuth.getAuthorizationInfo().getAuthorizerAppid() == null) { throw new NullPointerException("getQueryAuth"); } @@ -318,11 +318,11 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { jsonObject.addProperty("count", len); String responseContent = post(url, jsonObject.toString()); WxOpenAuthorizerListResult ret = WxOpenGsonBuilder.create().fromJson(responseContent, WxOpenAuthorizerListResult.class); - if(ret != null && ret.getList() != null){ - for(Map data : ret.getList()){ + if (ret != null && ret.getList() != null) { + for (Map data : ret.getList()) { String authorizerAppid = data.get("authorizer_appid"); String refreshToken = data.get("refresh_token"); - if(authorizerAppid != null && refreshToken != null){ + if (authorizerAppid != null && refreshToken != null) { this.getWxOpenConfigStorage().setAuthorizerRefreshToken(authorizerAppid, refreshToken); } } @@ -451,25 +451,25 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { } @Override - public WxOpenResult fastRegisterWeapp(String name, String code, String codeType, String legalPersonaWechat, String legalPersonaName, String componentPhone) throws WxErrorException{ + public WxOpenResult fastRegisterWeapp(String name, String code, String codeType, String legalPersonaWechat, String legalPersonaName, String componentPhone) throws WxErrorException { JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("name",name); + jsonObject.addProperty("name", name); jsonObject.addProperty("code", code); jsonObject.addProperty("code_type", codeType); jsonObject.addProperty("legal_persona_wechat", legalPersonaWechat); jsonObject.addProperty("legal_persona_name", legalPersonaName); jsonObject.addProperty("component_phone", componentPhone); - String response = post(FAST_REGISTER_WEAPP_URL, jsonObject.toString (), "component_access_token"); - return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class); + String response = post(FAST_REGISTER_WEAPP_URL, jsonObject.toString(), "component_access_token"); + return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class); } @Override - public WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWechat, String legalPersonaName) throws WxErrorException{ + public WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWechat, String legalPersonaName) throws WxErrorException { JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("name",name); + jsonObject.addProperty("name", name); jsonObject.addProperty("legal_persona_wechat", legalPersonaWechat); jsonObject.addProperty("legal_persona_name", legalPersonaName); - String response = post(FAST_REGISTER_WEAPP_SEARCH_URL, jsonObject.toString (), "component_access_token"); - return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class); + String response = post(FAST_REGISTER_WEAPP_SEARCH_URL, jsonObject.toString(), "component_access_token"); + return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class); } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java index e72fb02b..20981e86 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java @@ -18,237 +18,134 @@ import java.util.List; import java.util.Map; /** + * . + * * @author Hipple - * @description * @since 2019/1/23 15:27 */ public class WxOpenFastMaServiceImpl extends WxMaServiceImpl implements WxOpenFastMaService { - - protected final Logger log = LoggerFactory.getLogger (this.getClass ()); - private WxOpenComponentService wxOpenComponentService; private WxMaConfig wxMaConfig; private String appId; - public WxOpenFastMaServiceImpl (WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) { + public WxOpenFastMaServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) { this.wxOpenComponentService = wxOpenComponentService; this.appId = appId; this.wxMaConfig = wxMaConfig; - initHttp (); + initHttp(); } @Override - public WxMaConfig getWxMaConfig () { + public WxMaConfig getWxMaConfig() { return wxMaConfig; } @Override - public String getAccessToken (boolean forceRefresh) throws WxErrorException { - return wxOpenComponentService.getAuthorizerAccessToken (appId, forceRefresh); + public String getAccessToken(boolean forceRefresh) throws WxErrorException { + return wxOpenComponentService.getAuthorizerAccessToken(appId, forceRefresh); } - /** - * 1.获取小程序的信息,GET请求 - *

-   *     注意:这里不能直接用小程序的access_token
-   * 
- * - * @return - * @throws WxErrorException - */ @Override - public WxFastMaAccountBasicInfoResult getAccountBasicInfo () throws WxErrorException { - String response = get (OPEN_GET_ACCOUNT_BASIC_INFO, ""); - return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaAccountBasicInfoResult.class); + public WxFastMaAccountBasicInfoResult getAccountBasicInfo() throws WxErrorException { + String response = get(OPEN_GET_ACCOUNT_BASIC_INFO, ""); + return WxOpenGsonBuilder.create().fromJson(response, WxFastMaAccountBasicInfoResult.class); } - /** - * 2.小程序名称设置及改名 - * - * @param nickname 昵称 - * @param idCard 身份证照片–临时素材mediaid(个人号必填) - * @param license 组织机构代码证或营业执照–临时素材mediaid(组织号必填) - * @param namingOtherStuff1 其他证明材料---临时素材 mediaid - * @param namingOtherStuff2 其他证明材料---临时素材 mediaid - * @throws WxErrorException - */ @Override - public WxFastMaSetNickameResult setNickname (String nickname, String idCard, String license, String namingOtherStuff1, String namingOtherStuff2) throws WxErrorException { - JsonObject params = new JsonObject (); - params.addProperty ("nick_name", nickname); - params.addProperty ("id_card", idCard); - params.addProperty ("license", license); - params.addProperty ("naming_other_stuff_1", namingOtherStuff1); - params.addProperty ("naming_other_stuff_2", namingOtherStuff2); - String response = post (OPEN_SET_NICKNAME, GSON.toJson (params)); - return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaSetNickameResult.class); + public WxFastMaSetNickameResult setNickname(String nickname, String idCard, String license, String namingOtherStuff1, String namingOtherStuff2) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("nick_name", nickname); + params.addProperty("id_card", idCard); + params.addProperty("license", license); + params.addProperty("naming_other_stuff_1", namingOtherStuff1); + params.addProperty("naming_other_stuff_2", namingOtherStuff2); + String response = post(OPEN_SET_NICKNAME, GSON.toJson(params)); + return WxOpenGsonBuilder.create().fromJson(response, WxFastMaSetNickameResult.class); } - /** - * 3 小程序改名审核状态查询 - * - * @param auditId 审核单id - * @return - * @throws WxErrorException - */ @Override - public WxFastMaQueryNicknameStatusResult querySetNicknameStatus (String auditId) throws WxErrorException { - JsonObject params = new JsonObject (); - params.addProperty ("audit_id", auditId); - String response = post (OPEN_API_WXA_QUERYNICKNAME, GSON.toJson (params)); - return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaQueryNicknameStatusResult.class); + public WxFastMaQueryNicknameStatusResult querySetNicknameStatus(String auditId) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("audit_id", auditId); + String response = post(OPEN_API_WXA_QUERYNICKNAME, GSON.toJson(params)); + return WxOpenGsonBuilder.create().fromJson(response, WxFastMaQueryNicknameStatusResult.class); } - /** - * 4. 微信认证名称检测 - *
-   *      命中关键字策略时返回命中关键字的说明描述
-   *  
- * - * @param nickname 名称 - * @throws WxErrorException - */ @Override - public WxFastMaCheckNickameResult checkWxVerifyNickname (String nickname) throws WxErrorException { - JsonObject params = new JsonObject (); - params.addProperty ("nick_name", nickname); - String response = post (OPEN_CHECK_WX_VERIFY_NICKNAME, GSON.toJson (params)); - return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaCheckNickameResult.class); + public WxFastMaCheckNickameResult checkWxVerifyNickname(String nickname) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("nick_name", nickname); + String response = post(OPEN_CHECK_WX_VERIFY_NICKNAME, GSON.toJson(params)); + return WxOpenGsonBuilder.create().fromJson(response, WxFastMaCheckNickameResult.class); } - /** - * 5.修改头像 - *
-   *     图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M
-   *      注:实际头像始终为正方形
-   * 
- * - * @param headImgMediaId 头像素材media_id - * @param x1 裁剪框左上角x坐标(取值范围:[0, 1]) - * @param y1 裁剪框左上角y坐标(取值范围:[0, 1]) - * @param x2 裁剪框右下角x坐标(取值范围:[0, 1]) - * @param y2 裁剪框右下角y坐标(取值范围:[0, 1]) - * @throws WxErrorException - */ @Override - public WxOpenResult modifyHeadImage (String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException { - JsonObject params = new JsonObject (); - params.addProperty ("head_img_media_id", headImgMediaId); - params.addProperty ("x1", x1); - params.addProperty ("y1", y1); - params.addProperty ("x2", x2); - params.addProperty ("y2", y2); - String response = post (OPEN_MODIFY_HEADIMAGE, GSON.toJson (params)); - return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class); + public WxOpenResult modifyHeadImage(String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("head_img_media_id", headImgMediaId); + params.addProperty("x1", x1); + params.addProperty("y1", y1); + params.addProperty("x2", x2); + params.addProperty("y2", y2); + String response = post(OPEN_MODIFY_HEADIMAGE, GSON.toJson(params)); + return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 6.修改功能介绍 - * - * @param signature 简介:4-120字 - * @throws WxErrorException - */ @Override - public WxOpenResult modifySignature (String signature) throws WxErrorException { - JsonObject params = new JsonObject (); - params.addProperty ("signature", signature); - String response = post (OPEN_MODIFY_SIGNATURE, GSON.toJson (params)); - return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class); + public WxOpenResult modifySignature(String signature) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("signature", signature); + String response = post(OPEN_MODIFY_SIGNATURE, GSON.toJson(params)); + return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 7.3 管理员换绑 - * - * @param taskid 换绑管理员任务序列号(公众平台最终点击提交回跳到第三方平台时携带) - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult componentRebindAdmin (String taskid) throws WxErrorException { - JsonObject params = new JsonObject (); - params.addProperty ("taskid", taskid); - String response = post (OPEN_COMPONENT_REBIND_ADMIN, GSON.toJson (params)); - return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class); + public WxOpenResult componentRebindAdmin(String taskid) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("taskid", taskid); + String response = post(OPEN_COMPONENT_REBIND_ADMIN, GSON.toJson(params)); + return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 8.1 获取账号可以设置的所有类目 - * - * @return - */ @Override - public String getAllCategories () throws WxErrorException { - return get (OPEN_GET_ALL_CATEGORIES, ""); + public String getAllCategories() throws WxErrorException { + return get(OPEN_GET_ALL_CATEGORIES, ""); } - /** - * 8.2添加类目 - * - * @param categoryList - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult addCategory (List categoryList) throws WxErrorException { - Map map = new HashMap<> (); - map.put ("categories", categoryList); - String response = post (OPEN_ADD_CATEGORY, WxOpenGsonBuilder.create ().toJson (map)); - return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class); + public WxOpenResult addCategory(List categoryList) throws WxErrorException { + Map map = new HashMap<>(); + map.put("categories", categoryList); + String response = post(OPEN_ADD_CATEGORY, WxOpenGsonBuilder.create().toJson(map)); + return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 8.3删除类目 - * - * @param first 一级类目ID - * @param second 二级类目ID - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult deleteCategory (int first, int second) throws WxErrorException { - JsonObject params = new JsonObject (); - params.addProperty ("first", first); - params.addProperty ("second", second); - String response = post (OPEN_DELETE_CATEGORY, GSON.toJson (params)); - return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class); + public WxOpenResult deleteCategory(int first, int second) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("first", first); + params.addProperty("second", second); + String response = post(OPEN_DELETE_CATEGORY, GSON.toJson(params)); + return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 8.4获取账号已经设置的所有类目 - * - * @return - * @throws WxErrorException - */ @Override - public WxFastMaBeenSetCategoryResult getCategory () throws WxErrorException { - String response = get (OPEN_GET_CATEGORY, ""); - return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaBeenSetCategoryResult.class); + public WxFastMaBeenSetCategoryResult getCategory() throws WxErrorException { + String response = get(OPEN_GET_CATEGORY, ""); + return WxOpenGsonBuilder.create().fromJson(response, WxFastMaBeenSetCategoryResult.class); } - /** - * 8.5修改类目 - * - * @param category 实体 - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult modifyCategory (WxFastMaCategory category) throws WxErrorException { - String response = post (OPEN_MODIFY_CATEGORY, GSON.toJson (category)); - return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class); + public WxOpenResult modifyCategory(WxFastMaCategory category) throws WxErrorException { + String response = post(OPEN_MODIFY_CATEGORY, GSON.toJson(category)); + return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class); } - /** - * 将字符串对象转化为GsonArray对象 - * - * @param strList - * @return - */ - private JsonArray toJsonArray (List strList) { - JsonArray jsonArray = new JsonArray (); - if (strList != null && ! strList.isEmpty ()) { + private JsonArray toJsonArray(List strList) { + JsonArray jsonArray = new JsonArray(); + if (strList != null && !strList.isEmpty()) { for (String str : strList) { - jsonArray.add (str); + jsonArray.add(str); } } return jsonArray; diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java index 80882b0c..c9811470 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInMemoryConfigStorage.java @@ -1,23 +1,23 @@ package me.chanjar.weixin.open.api.impl; -import java.io.File; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - import cn.binarywang.wx.miniapp.config.WxMaConfig; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; -import me.chanjar.weixin.mp.config.WxMpConfigStorage; import me.chanjar.weixin.mp.bean.WxMpHostConfig; +import me.chanjar.weixin.mp.config.WxMpConfigStorage; import me.chanjar.weixin.mp.enums.TicketType; import me.chanjar.weixin.open.api.WxOpenConfigStorage; import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken; import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken; import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; +import java.io.File; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + /** * 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化 * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java index 1ddfc0ff..8962b38c 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java @@ -84,7 +84,7 @@ public class WxOpenInRedisConfigStorage extends WxOpenInMemoryConfigStorage { } @Override - public void expireComponentAccessToken(){ + public void expireComponentAccessToken() { try (Jedis jedis = this.jedisPool.getResource()) { jedis.expire(this.componentAccessTokenKey, 0); } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaCategory.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaCategory.java index 9c5fc4cc..f5f68df1 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaCategory.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaCategory.java @@ -1,11 +1,11 @@ package me.chanjar.weixin.open.bean.ma; -import java.io.Serializable; - import com.google.gson.annotations.SerializedName; import lombok.Data; import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; +import java.io.Serializable; + /** * 微信小程序分类目录. * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java index 0473cc3c..bef7d16d 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java @@ -58,48 +58,48 @@ public class WxOpenXmlMessage implements Serializable { // 以下为快速创建小程序接口推送的的信息 - @XStreamAlias ("appid") + @XStreamAlias("appid") private String registAppId; - @XStreamAlias ("status") + @XStreamAlias("status") private int status; - @XStreamAlias ("auth_code") + @XStreamAlias("auth_code") private String authCode; - @XStreamAlias ("msg") - @XStreamConverter (value = XStreamCDataConverter.class) + @XStreamAlias("msg") + @XStreamConverter(value = XStreamCDataConverter.class) private String msg; - @XStreamAlias ("info") + @XStreamAlias("info") private Info info = new Info(); - @XStreamAlias ("info") + @XStreamAlias("info") @Data public static class Info implements Serializable { private static final long serialVersionUID = 7706235740094081194L; - @XStreamAlias ("name") - @XStreamConverter (value = XStreamCDataConverter.class) + @XStreamAlias("name") + @XStreamConverter(value = XStreamCDataConverter.class) private String name; - @XStreamAlias ("code") - @XStreamConverter (value = XStreamCDataConverter.class) + @XStreamAlias("code") + @XStreamConverter(value = XStreamCDataConverter.class) private String code; - @XStreamAlias ("code_type") + @XStreamAlias("code_type") private int codeType; - @XStreamAlias ("legal_persona_wechat") - @XStreamConverter (value = XStreamCDataConverter.class) + @XStreamAlias("legal_persona_wechat") + @XStreamConverter(value = XStreamCDataConverter.class) private String legalPersonaWechat; - @XStreamAlias ("legal_persona_name") - @XStreamConverter (value = XStreamCDataConverter.class) + @XStreamAlias("legal_persona_name") + @XStreamConverter(value = XStreamCDataConverter.class) private String legalPersonaName; - @XStreamAlias ("component_phone") - @XStreamConverter (value = XStreamCDataConverter.class) + @XStreamAlias("component_phone") + @XStreamConverter(value = XStreamCDataConverter.class) private String componentPhone; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java index b8bf8d83..9654559a 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java @@ -10,55 +10,55 @@ import lombok.EqualsAndHashCode; * @since 2019/1/23 14:39 */ @Data -@EqualsAndHashCode (callSuper = true) -public class WxFastMaAccountBasicInfoResult extends WxOpenResult{ - private static final long serialVersionUID = - 8713680081353954208L; +@EqualsAndHashCode(callSuper = true) +public class WxFastMaAccountBasicInfoResult extends WxOpenResult { + private static final long serialVersionUID = -8713680081353954208L; /** * 小程序ID */ - @SerializedName ("appid") + @SerializedName("appid") private String appId; /** * 帐号类型(1:订阅号,2:服务号,3:小程序) */ - @SerializedName ("account_type") + @SerializedName("account_type") private Integer accountType; /** * 主体类型(1:企业) */ - @SerializedName ("principal_type") + @SerializedName("principal_type") private Integer principalType; /** * 主体名称 */ - @SerializedName ("principal_name") + @SerializedName("principal_name") private String principalName; /** * 实名验证状态(1:实名验证成功,2:实名验证中,3:实名验证失败)调用接口1.1创建帐号时,realname_status会初始化为2对于注册方式为微信认证的帐号,资质认证成功时,realname_status会更新为1 注意!!!当realname_status不为1时,帐号只允许调用本文档内的以下API:(即无权限调用其他API) 微信认证相关接口(参考2.x) 帐号设置相关接口(参考3.x) */ - @SerializedName ("realname_status") + @SerializedName("realname_status") private Integer realnameStatus; /** * 微信认证信息 */ - @SerializedName ("wx_verify_info") + @SerializedName("wx_verify_info") private WxVerifyInfo wxVerifyInfo; /** * 功能介绍信息 */ - @SerializedName ("signature_info") + @SerializedName("signature_info") private SignatureInfo signatureInfo; /** * 头像信息 */ - @SerializedName ("head_image_info") + @SerializedName("head_image_info") private HeadImageInfo headImageInfo; @Data @@ -66,29 +66,29 @@ public class WxFastMaAccountBasicInfoResult extends WxOpenResult{ /** * 是否资质认证(true:是,false:否)若是,拥有微信认证相关的权限 */ - @SerializedName ("qualification_verify") + @SerializedName("qualification_verify") private Boolean qualificationVerify; /** * 是否名称认证(true:是,false:否)对于公众号(订阅号、服务号),是名称认证,微信客户端才会有微信认证打勾的标识。 */ - @SerializedName ("naming_verify") + @SerializedName("naming_verify") private Boolean namingVerify; /** * 是否需要年审(true:是,false:否)(qualification_verify = true时才有该字段) */ - @SerializedName ("annual_review") + @SerializedName("annual_review") private Boolean annualReview; /** * 年审开始时间,时间戳(qualification_verify = true时才有该字段) */ - @SerializedName ("annual_review_begin_time") + @SerializedName("annual_review_begin_time") private String annualReviewBeginTime; /** * 年审截止时间,时间戳(qualification_verify = true时才有该字段) */ - @SerializedName ("annual_review_end_time") + @SerializedName("annual_review_end_time") private String annualReviewEndTime; } @@ -98,17 +98,17 @@ public class WxFastMaAccountBasicInfoResult extends WxOpenResult{ /** * 功能介绍 */ - @SerializedName ("signature") + @SerializedName("signature") private String signature; /** * 头像已使用修改次数(本月) */ - @SerializedName ("modify_used_count") + @SerializedName("modify_used_count") private Integer modifyUsedCount; /** * 头像修改次数总额度(本月) */ - @SerializedName ("modify_quota") + @SerializedName("modify_quota") private Integer modifyQuota; } @@ -118,18 +118,18 @@ public class WxFastMaAccountBasicInfoResult extends WxOpenResult{ /** * 头像url */ - @SerializedName ("head_image_url") + @SerializedName("head_image_url") private String headImageUrl; /** * 头像已使用修改次数(本月) */ - @SerializedName ("modify_used_count") + @SerializedName("modify_used_count") private Integer modifyUsedCount; /** * 头像修改次数总额度(本月) */ - @SerializedName ("modify_quota") + @SerializedName("modify_quota") private Integer modifyQuota; } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java index 11d6693c..db334eb3 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java @@ -12,29 +12,29 @@ import java.util.List; * @since 2019/1/26 18:27 */ @Data -@EqualsAndHashCode (callSuper = true) +@EqualsAndHashCode(callSuper = true) public class WxFastMaBeenSetCategoryResult extends WxOpenResult { - private static final long serialVersionUID = - 7662344448437700644L; + private static final long serialVersionUID = -7662344448437700644L; /** * 一个更改周期内可以设置类目的次数 */ - @SerializedName ("limit") + @SerializedName("limit") private int limit; /** * 本更改周期内还可以设置类目的次数 */ - @SerializedName ("quota") + @SerializedName("quota") private int quota; /** * 最多可以设置的类目数量 */ - @SerializedName ("category_limit") + @SerializedName("category_limit") private int categoryLimit; /** * 类目 */ - @SerializedName ("categories") + @SerializedName("categories") private List categories; @Data @@ -42,32 +42,32 @@ public class WxFastMaBeenSetCategoryResult extends WxOpenResult { /** * 一级类目ID */ - @SerializedName ("first") + @SerializedName("first") private int first; /** * 一级类目名称 */ - @SerializedName ("first_name") + @SerializedName("first_name") private String firstName; /** * 二级类目ID */ - @SerializedName ("second") + @SerializedName("second") private int second; /** * 二级类目名称 */ - @SerializedName ("second_name") + @SerializedName("second_name") private String secondName; /** * 审核状态(1审核中 2审核不通过 3审核通过) */ - @SerializedName ("audit_status") + @SerializedName("audit_status") private int auditStatus; /** * 审核不通过原因 */ - @SerializedName ("audit_reason") + @SerializedName("audit_reason") private String auditReason; } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java index 59d1f456..b3d0dd9d 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java @@ -2,25 +2,29 @@ package me.chanjar.weixin.open.bean.result; import com.google.gson.annotations.SerializedName; import lombok.Data; +import lombok.EqualsAndHashCode; import java.util.List; /** + * 获取账号所有可以设置的类目. + * * @author Hipple - * @description 获取账号所有可以设置的类目 * @since 2019/1/26 18:43 */ @Data +@EqualsAndHashCode(callSuper = false) public class WxFastMaCanSetCategoryResult extends WxOpenResult { - private static final long serialVersionUID = - 2469386233538980102L; - @SerializedName ("errcode") - private int errcodeX; - @SerializedName ("categories_list") + private static final long serialVersionUID = -2469386233538980102L; + @SerializedName("errcode") + private int errCode; + @SerializedName("categories_list") private CategoriesListBean categoriesList; @Data public static class CategoriesListBean { private List categories; + @Data public static class CategoriesBean { private int id; @@ -28,29 +32,29 @@ public class WxFastMaCanSetCategoryResult extends WxOpenResult { private String name; private int level; private int father; - @SerializedName ("sensitive_type") + @SerializedName("sensitive_type") private int sensitiveType; - @SerializedName ("available_for_plugin") + @SerializedName("available_for_plugin") private boolean availableForPlugin; - @SerializedName ("is_hidden") + @SerializedName("is_hidden") private boolean isHidden; private String type; - @SerializedName ("need_report") + @SerializedName("need_report") private int needReport; - @SerializedName ("can_use_cityserivce") - private int canUseCityserivce; + @SerializedName("can_use_cityserivce") + private int canUseCityService; private List children; - @SerializedName ("type_list") + @SerializedName("type_list") private List typeList; - @SerializedName ("available_api_list") + @SerializedName("available_api_list") private List availableApiList; private List apis; @Data public static class QualifyBean { private String remark; - @SerializedName ("exter_list") - private List exterList; + @SerializedName("exter_list") + private List externalList; } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java index 943645e3..650f2b08 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java @@ -10,20 +10,20 @@ import lombok.EqualsAndHashCode; * @since 2019/1/26 17:39 */ @Data -@EqualsAndHashCode (callSuper = true) +@EqualsAndHashCode(callSuper = true) public class WxFastMaCheckNickameResult extends WxOpenResult { private static final long serialVersionUID = 8022192589710319473L; /** * 审核编号. */ - @SerializedName ("hit_condition") + @SerializedName("hit_condition") boolean hitCondition; /** * 材料说明 */ - @SerializedName ("wording") + @SerializedName("wording") String wording; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java index 6594c483..d6e85064 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; * @description 查询改名状态实体类 * @since 2019/1/26 17:52 */ -@EqualsAndHashCode (callSuper = true) +@EqualsAndHashCode(callSuper = true) @Data public class WxFastMaQueryNicknameStatusResult extends WxOpenResult { @@ -18,26 +18,26 @@ public class WxFastMaQueryNicknameStatusResult extends WxOpenResult { /** * 审核昵称 */ - @SerializedName ("nickname") + @SerializedName("nickname") private String nickname; /** * 审核状态,1:审核中,2:审核失败,3:审核成功 */ - @SerializedName ("audit_stat") + @SerializedName("audit_stat") private int auditStat; /** * 失败原因 */ - @SerializedName ("fail_reason") + @SerializedName("fail_reason") private String failReason; /** * 审核提交时间 */ - @SerializedName ("create_time") + @SerializedName("create_time") private String createTime; /** * 审核提交时间 */ - @SerializedName ("audit_time") + @SerializedName("audit_time") private String auditTime; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java index 7a2cab23..2716dfa5 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java @@ -10,20 +10,20 @@ import lombok.EqualsAndHashCode; * @since 2019/1/26 17:39 */ @Data -@EqualsAndHashCode (callSuper = true) +@EqualsAndHashCode(callSuper = true) public class WxFastMaSetNickameResult extends WxOpenResult { private static final long serialVersionUID = 8022192589710319473L; /** * 审核编号. */ - @SerializedName ("audit_id") + @SerializedName("audit_id") Long auditId; /** * 材料说明 */ - @SerializedName ("wording") + @SerializedName("wording") String wording; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenAuthorizerListResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenAuthorizerListResult.java index afe9ea94..19f3ebde 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenAuthorizerListResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenAuthorizerListResult.java @@ -11,5 +11,5 @@ import java.util.Map; @Data public class WxOpenAuthorizerListResult { private int totalCount; - private List> list; + private List> list; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaCategoryListResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaCategoryListResult.java index b5919e02..262f79b4 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaCategoryListResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaCategoryListResult.java @@ -1,13 +1,13 @@ package me.chanjar.weixin.open.bean.result; -import java.util.List; - import com.google.gson.annotations.SerializedName; import lombok.Data; import lombok.EqualsAndHashCode; import me.chanjar.weixin.open.bean.ma.WxOpenMaCategory; import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; +import java.util.List; + /** * 微信开放平台小程序分类目录列表返回 * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaDomainResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaDomainResult.java index 2d782ee5..feccc786 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaDomainResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaDomainResult.java @@ -1,11 +1,11 @@ package me.chanjar.weixin.open.bean.result; -import java.util.List; - import com.google.gson.annotations.SerializedName; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.List; + /** * 微信开放平台小程序域名设置返回对象. * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaGrayReleasePlanResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaGrayReleasePlanResult.java index 33f9f2b8..71216ab7 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaGrayReleasePlanResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaGrayReleasePlanResult.java @@ -5,9 +5,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; -import java.io.Serializable; -import java.util.List; - /** * 微信开放平台小程序当前分阶段发布详情 */ diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaPageListResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaPageListResult.java index 1e854138..9f7ee95f 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaPageListResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaPageListResult.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.open.bean.result; -import java.util.List; - import com.google.gson.annotations.SerializedName; import lombok.Data; import lombok.EqualsAndHashCode; import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; +import java.util.List; + /** * 微信开放平台小程序第三方提交代码的页面配置列表. * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaQueryAuditResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaQueryAuditResult.java index 8f0739f9..3f01aa74 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaQueryAuditResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaQueryAuditResult.java @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode; /** * . + * * @author yqx * @date 2018/10/3 */ diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java index a21d334e..1fa20e63 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java @@ -14,30 +14,30 @@ import java.lang.reflect.Type; */ public class WxFastMaAccountBasicInfoGsonAdapter implements JsonDeserializer { @Override - public WxFastMaAccountBasicInfoResult deserialize (JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - WxFastMaAccountBasicInfoResult accountBasicInfo = new WxFastMaAccountBasicInfoResult (); + public WxFastMaAccountBasicInfoResult deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + WxFastMaAccountBasicInfoResult accountBasicInfo = new WxFastMaAccountBasicInfoResult(); JsonObject jsonObject = jsonElement.getAsJsonObject(); - accountBasicInfo.setAppId (GsonHelper.getString(jsonObject, "appid")); - accountBasicInfo.setAccountType (GsonHelper.getInteger (jsonObject, "account_type")); - accountBasicInfo.setPrincipalType (GsonHelper.getInteger (jsonObject, "principal_type")); - accountBasicInfo.setPrincipalName (GsonHelper.getString(jsonObject, "principal_name")); - accountBasicInfo.setRealnameStatus (GsonHelper.getInteger (jsonObject, "realname_status")); + accountBasicInfo.setAppId(GsonHelper.getString(jsonObject, "appid")); + accountBasicInfo.setAccountType(GsonHelper.getInteger(jsonObject, "account_type")); + accountBasicInfo.setPrincipalType(GsonHelper.getInteger(jsonObject, "principal_type")); + accountBasicInfo.setPrincipalName(GsonHelper.getString(jsonObject, "principal_name")); + accountBasicInfo.setRealnameStatus(GsonHelper.getInteger(jsonObject, "realname_status")); WxFastMaAccountBasicInfoResult.WxVerifyInfo verifyInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("wx_verify_info"), - new TypeToken () { + new TypeToken() { }.getType()); - accountBasicInfo.setWxVerifyInfo (verifyInfo); + accountBasicInfo.setWxVerifyInfo(verifyInfo); WxFastMaAccountBasicInfoResult.SignatureInfo signatureInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("signature_info"), - new TypeToken () { + new TypeToken() { }.getType()); - accountBasicInfo.setSignatureInfo (signatureInfo); + accountBasicInfo.setSignatureInfo(signatureInfo); WxFastMaAccountBasicInfoResult.HeadImageInfo headImageInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("head_image_info"), - new TypeToken () { + new TypeToken() { }.getType()); - accountBasicInfo.setHeadImageInfo (headImageInfo); + accountBasicInfo.setHeadImageInfo(headImageInfo); return accountBasicInfo; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenAuthorizerListResultGsonAdapter.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenAuthorizerListResultGsonAdapter.java index 38faf2ff..68e6d92e 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenAuthorizerListResultGsonAdapter.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenAuthorizerListResultGsonAdapter.java @@ -11,28 +11,29 @@ import java.util.*; * @author robgao * @Email 315789501@qq.com */ -public class WxOpenAuthorizerListResultGsonAdapter implements JsonDeserializer { +public class WxOpenAuthorizerListResultGsonAdapter implements JsonDeserializer { + + private static final String AUTHORIZER_APPID = "authorizer_appid"; + private static final String REFRESH_TOKEN = "refresh_token"; + private static final String AUTH_TIME = "auth_time"; - private static final String AUTHORIZER_APPID="authorizer_appid"; - private static final String REFRESH_TOKEN="refresh_token"; - private static final String AUTH_TIME="auth_time"; @Override public WxOpenAuthorizerListResult deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { JsonObject jsonObject = jsonElement.getAsJsonObject(); - WxOpenAuthorizerListResult wxOpenAuthorizerListResult= new WxOpenAuthorizerListResult(); + WxOpenAuthorizerListResult wxOpenAuthorizerListResult = new WxOpenAuthorizerListResult(); wxOpenAuthorizerListResult.setTotalCount(GsonHelper.getInteger(jsonObject, "total_count").intValue()); - List> list = new ArrayList<>(); + List> list = new ArrayList<>(); Iterator jsonElementIterator = jsonObject.getAsJsonArray("list").iterator(); - while(jsonElementIterator.hasNext()){ + while (jsonElementIterator.hasNext()) { JsonObject authorizer = jsonElementIterator.next().getAsJsonObject(); - Map authorizerMap = new HashMap<>(10); + Map authorizerMap = new HashMap<>(10); - authorizerMap.put(AUTHORIZER_APPID, GsonHelper.getString(authorizer,AUTHORIZER_APPID)); - authorizerMap.put(REFRESH_TOKEN, GsonHelper.getString(authorizer,REFRESH_TOKEN)); - authorizerMap.put(AUTH_TIME, GsonHelper.getString(authorizer,AUTH_TIME)); + authorizerMap.put(AUTHORIZER_APPID, GsonHelper.getString(authorizer, AUTHORIZER_APPID)); + authorizerMap.put(REFRESH_TOKEN, GsonHelper.getString(authorizer, REFRESH_TOKEN)); + authorizerMap.put(AUTH_TIME, GsonHelper.getString(authorizer, AUTH_TIME)); list.add(authorizerMap); } wxOpenAuthorizerListResult.setList(list); diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java index f28178f6..325383eb 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java @@ -24,8 +24,8 @@ public class WxOpenGsonBuilder { INSTANCE.registerTypeAdapter(WxOpenQueryAuthResult.class, new WxOpenQueryAuthResultGsonAdapter()); INSTANCE.registerTypeAdapter(WxOpenAuthorizerInfoResult.class, new WxOpenAuthorizerInfoResultGsonAdapter()); INSTANCE.registerTypeAdapter(WxOpenAuthorizerOptionResult.class, new WxOpenAuthorizerOptionResultGsonAdapter()); - INSTANCE.registerTypeAdapter(WxFastMaAccountBasicInfoResult.class, new WxFastMaAccountBasicInfoGsonAdapter ()); - INSTANCE.registerTypeAdapter(WxOpenAuthorizerListResult.class, new WxOpenAuthorizerListResultGsonAdapter ()); + INSTANCE.registerTypeAdapter(WxFastMaAccountBasicInfoResult.class, new WxFastMaAccountBasicInfoGsonAdapter()); + INSTANCE.registerTypeAdapter(WxOpenAuthorizerListResult.class, new WxOpenAuthorizerListResultGsonAdapter()); } diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResultTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResultTest.java index 5232881c..851620f9 100644 --- a/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResultTest.java +++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResultTest.java @@ -37,14 +37,14 @@ public class WxFastMaAccountBasicInfoResultTest { " }\n" + "}"; - WxFastMaAccountBasicInfoResult res = WxOpenGsonBuilder.create ().fromJson (json, WxFastMaAccountBasicInfoResult.class); + WxFastMaAccountBasicInfoResult res = WxOpenGsonBuilder.create().fromJson(json, WxFastMaAccountBasicInfoResult.class); assertNotNull(res); - assertNotNull(res.getAppId ()); - assertNotNull(res.getSignatureInfo ().getModifyQuota ()); - assertNotNull(res.getHeadImageInfo ().getHeadImageUrl ()); - assertNotNull(res.getWxVerifyInfo ().getNamingVerify ()); - assertTrue(res.getWxVerifyInfo ().getNamingVerify ()); + assertNotNull(res.getAppId()); + assertNotNull(res.getSignatureInfo().getModifyQuota()); + assertNotNull(res.getHeadImageInfo().getHeadImageUrl()); + assertNotNull(res.getWxVerifyInfo().getNamingVerify()); + assertTrue(res.getWxVerifyInfo().getNamingVerify()); System.out.println(res); } diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResultTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResultTest.java index 3cd95254..9189000c 100644 --- a/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResultTest.java +++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResultTest.java @@ -28,12 +28,12 @@ public class WxFastMaBeenSetCategoryResultTest { " \"category_limit\": 20\n" + "}"; - WxFastMaBeenSetCategoryResult res = WxOpenGsonBuilder.create ().fromJson (json, WxFastMaBeenSetCategoryResult.class); + WxFastMaBeenSetCategoryResult res = WxOpenGsonBuilder.create().fromJson(json, WxFastMaBeenSetCategoryResult.class); assertNotNull(res); - assertTrue(res.getCategories ().size ()> 0); - assertNotNull(res.getCategories ().get (0)); - assertNotNull(res.getCategories ().get (0).getFirstName ()); + assertTrue(res.getCategories().size() > 0); + assertNotNull(res.getCategories().get(0)); + assertNotNull(res.getCategories().get(0).getFirstName()); System.out.println(res); } diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResultTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResultTest.java index 7e7d220a..11ae6496 100644 --- a/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResultTest.java +++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResultTest.java @@ -69,10 +69,10 @@ public class WxFastMaCanSetCategoryResultTest { " ]\n" + " }\n" + "}"; - WxFastMaCanSetCategoryResult res = WxOpenGsonBuilder.create ().fromJson (json, WxFastMaCanSetCategoryResult.class); + WxFastMaCanSetCategoryResult res = WxOpenGsonBuilder.create().fromJson(json, WxFastMaCanSetCategoryResult.class); assertNotNull(res); - assertNotNull(res.getCategoriesList ()); + assertNotNull(res.getCategoriesList()); System.out.println(res); } From 00a54a11196ec4763c9ac409c7e3f93181ca1a69 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 5 Sep 2019 14:18:47 +0800 Subject: [PATCH 35/79] =?UTF-8?q?:art:=20=E9=87=8D=E6=9E=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=8C=85=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/open/api/WxOpenFastMaService.java | 2 +- .../open/api/impl/WxOpenFastMaServiceImpl.java | 4 +--- .../open/api/impl/WxOpenMaServiceImpl.java | 2 +- .../bean/{fastma => ma}/WxFastMaCategory.java | 16 +++++++++------- .../MaQrCodeApacheHttpRequestExecutor.java | 2 +- .../MaQrCodeJoddHttpRequestExecutor.java | 2 +- .../MaQrCodeOkhttpRequestExecutor.java | 4 +--- .../ma => executor}/MaQrCodeRequestExecutor.java | 2 +- 8 files changed, 16 insertions(+), 18 deletions(-) rename weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/{fastma => ma}/WxFastMaCategory.java (54%) rename weixin-java-open/src/main/java/me/chanjar/weixin/open/{util/requestexecuter/ma => executor}/MaQrCodeApacheHttpRequestExecutor.java (98%) rename weixin-java-open/src/main/java/me/chanjar/weixin/open/{util/requestexecuter/ma => executor}/MaQrCodeJoddHttpRequestExecutor.java (97%) rename weixin-java-open/src/main/java/me/chanjar/weixin/open/{util/requestexecuter/ma => executor}/MaQrCodeOkhttpRequestExecutor.java (93%) rename weixin-java-open/src/main/java/me/chanjar/weixin/open/{util/requestexecuter/ma => executor}/MaQrCodeRequestExecutor.java (96%) diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java index 2c7c374c..8710689c 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java @@ -2,7 +2,7 @@ package me.chanjar.weixin.open.api; import cn.binarywang.wx.miniapp.api.WxMaService; import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.open.bean.fastma.WxFastMaCategory; +import me.chanjar.weixin.open.bean.ma.WxFastMaCategory; import me.chanjar.weixin.open.bean.result.*; import java.util.List; diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java index 20981e86..01a808ed 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java @@ -7,11 +7,9 @@ import com.google.gson.JsonObject; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.open.api.WxOpenComponentService; import me.chanjar.weixin.open.api.WxOpenFastMaService; -import me.chanjar.weixin.open.bean.fastma.WxFastMaCategory; +import me.chanjar.weixin.open.bean.ma.WxFastMaCategory; import me.chanjar.weixin.open.bean.result.*; import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.List; diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java index 93c776c0..6ee261fc 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java @@ -13,7 +13,7 @@ import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo; import me.chanjar.weixin.open.bean.ma.WxMaQrcodeParam; import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage; import me.chanjar.weixin.open.bean.result.*; -import me.chanjar.weixin.open.util.requestexecuter.ma.MaQrCodeRequestExecutor; +import me.chanjar.weixin.open.executor.MaQrCodeRequestExecutor; import java.io.File; import java.util.List; diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxFastMaCategory.java similarity index 54% rename from weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java rename to weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxFastMaCategory.java index 1c0cbeb3..3c0d2bab 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxFastMaCategory.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.open.bean.fastma; +package me.chanjar.weixin.open.bean.ma; import lombok.Data; @@ -6,30 +6,32 @@ import java.io.Serializable; import java.util.List; /** + * 修改更新类目所需实体. + * * @author Hipple - * @description 修改更新类目所需实体 * @since 2019/1/25 10:49 */ @Data public class WxFastMaCategory implements Serializable { + private static final long serialVersionUID = 1595589596066509155L; /** - * 一级类目ID + * 一级类目ID. */ private int first; /** - * 二级类目ID + * 二级类目ID. */ private int second; /** - * 资质信息 + * 资质信息. */ - private List certicates; + private List certicates; @Data - public static class certicaty { + public static class Certificate { private String key; private String value; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeApacheHttpRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeApacheHttpRequestExecutor.java similarity index 98% rename from weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeApacheHttpRequestExecutor.java rename to weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeApacheHttpRequestExecutor.java index b3936458..86417686 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeApacheHttpRequestExecutor.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeApacheHttpRequestExecutor.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.open.util.requestexecuter.ma; +package me.chanjar.weixin.open.executor; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeJoddHttpRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeJoddHttpRequestExecutor.java similarity index 97% rename from weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeJoddHttpRequestExecutor.java rename to weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeJoddHttpRequestExecutor.java index dcdffd1b..f376dd45 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeJoddHttpRequestExecutor.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeJoddHttpRequestExecutor.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.open.util.requestexecuter.ma; +package me.chanjar.weixin.open.executor; import jodd.http.HttpConnectionProvider; import jodd.http.HttpRequest; diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeOkhttpRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java similarity index 93% rename from weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeOkhttpRequestExecutor.java rename to weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java index 76627901..b7e56718 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeOkhttpRequestExecutor.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.open.util.requestexecuter.ma; +package me.chanjar.weixin.open.executor; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; @@ -25,8 +25,6 @@ import java.util.UUID; * @date 2018-09-13 */ public class MaQrCodeOkhttpRequestExecutor extends MaQrCodeRequestExecutor { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - public MaQrCodeOkhttpRequestExecutor(RequestHttp requestHttp) { super(requestHttp); } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeRequestExecutor.java similarity index 96% rename from weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeRequestExecutor.java rename to weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeRequestExecutor.java index 807f7ae1..5f13a46e 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/requestexecuter/ma/MaQrCodeRequestExecutor.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeRequestExecutor.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.open.util.requestexecuter.ma; +package me.chanjar.weixin.open.executor; import java.io.File; import java.io.IOException; From c2107faf574022140355e4c4ab007ddd3d9012ca Mon Sep 17 00:00:00 2001 From: chenyixin8854 <418920855@qq.com> Date: Fri, 6 Sep 2019 10:07:44 +0800 Subject: [PATCH 36/79] =?UTF-8?q?:sparkles:=20#1194=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E5=8D=A1=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E6=96=B0=E5=A2=9E=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/bean/card/BaseInfo.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseInfo.java index c968b599..c60cb447 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseInfo.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseInfo.java @@ -191,6 +191,53 @@ public class BaseInfo implements Serializable { @SerializedName("need_push_on_view") private boolean needPushOnView; + + /** + * 微信小程序开放功能 小程序&卡券打通部分新增8个字段 https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=1490190158&version=1&lang=zh_CN&platform=2 + * @return + */ + + /** + * 自定义使用入口跳转小程序的user_name,格式为原始id+@app + */ + @SerializedName("custom_app_brand_user_name") + private String customAppBrandUserName; + /** + * 自定义使用入口小程序页面地址 + */ + @SerializedName("custom_app_brand_pass") + private String customAppBrandPass; + /** + * 小程序的user_name + */ + @SerializedName("center_app_brand_user_name") + private String centerAppBrandUserName; + /** + * 自定义居中使用入口小程序页面地址 + */ + @SerializedName("center_app_brand_pass") + private String centerAppBrandPass; + /** + * 小程序的user_name + */ + @SerializedName("promotion_app_brand_user_name") + private String promotionAppBrandUserName; + /** + * 自定义营销入口小程序页面地址 + */ + @SerializedName("promotion_app_brand_pass") + private String promotionAppBrandPass; + /** + * 小程序的user_name, + */ + @SerializedName("activate_app_brand_user_name") + private String activateAppBrandUserName; + /** + * 激活小程序页面地址 + */ + @SerializedName("activate_app_brand_pass") + private String activateAppBrandPass; + @Override public String toString() { return WxMpGsonBuilder.create().toJson(this); From de191a9c2f929351bff22e7009740184b98ebb81 Mon Sep 17 00:00:00 2001 From: chenyixin8854 <418920855@qq.com> Date: Sat, 7 Sep 2019 22:18:06 +0800 Subject: [PATCH 37/79] =?UTF-8?q?:sparkles:=20#1195=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=8D=A1=E5=88=B8=E8=B7=B3=E8=BD=AC=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=BC=BA=E5=B0=91=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/bean/card/CustomCell1.java | 15 ++++++++++++ .../weixin/mp/bean/card/CustomField.java | 16 +++++++++++++ .../weixin/mp/bean/card/MemberCard.java | 24 +++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CustomCell1.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CustomCell1.java index 8789eca4..c598d244 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CustomCell1.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CustomCell1.java @@ -33,6 +33,21 @@ public class CustomCell1 implements Serializable { @SerializedName("url") private String url; + /** + * 参考https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1499332673_Unm7V卡券内跳转小程序参数说明:会员卡自定义入口,包含以下两个字段 + */ + /** + * 自定义入口小程序user_name,格式为原始id+@app. + */ + @SerializedName("app_brand_user_name") + private String appBrandUserName; + /** + * 自定义入口小程序的页面路径. + */ + @SerializedName("app_brand_pass") + private String appBrandPass; + + @Override public String toString() { return WxMpGsonBuilder.create().toJson(this); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CustomField.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CustomField.java index df9c2e6f..a6b56b02 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CustomField.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CustomField.java @@ -33,6 +33,22 @@ public class CustomField implements Serializable { @SerializedName("url") private String url; + /** + * 参考https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1499332673_Unm7V卡券内跳转小程序参数说明:会员卡顶部的信息类目字段,包含以下两个字段 + */ + /** + * 自定义信息类目小程序user_name,格式为原始id+@app + */ + @SerializedName("app_brand_user_name") + private String appBrandUserName; + /** + * 自定义信息类目小程序的页面路径 + */ + @SerializedName("app_brand_pass") + private String appBrandPass; + + + public String getNameType() { return nameType; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCard.java index a6caf1bb..bbe42aca 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCard.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCard.java @@ -157,6 +157,30 @@ public final class MemberCard implements Serializable { @SerializedName("wx_activate_after_submit_url") private String wxActivateAfterSubmitUrl; + /** + * 参照https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1499332673_Unm7V卡券内跳转小程序 + */ + /** + * 积分信息类目对应的小程序 user_name,格式为原始id+@app + */ + @SerializedName("bonus_app_brand_user_name") + private String bonusAppBrandUserName; + /** + *积分入口小程序的页面路径 + */ + @SerializedName("bonus_app_brand_pass") + private String bonusAppBrandPass; + /** + *余额信息类目对应的小程序 user_name,格式为原始id+@app + */ + @SerializedName("balance_app_brand_user_name") + private String balanceAppBrandUserName; + /** + *余额入口小程序的页面路径 + */ + @SerializedName("balance_app_brand_pass") + private String balanceAppBrandPass; + @Override public String toString() { return WxMpGsonBuilder.create().toJson(this); From 34aea1916db6a1e8294e2271a4478a31d22f1458 Mon Sep 17 00:00:00 2001 From: chenyixin8854 <418920855@qq.com> Date: Mon, 9 Sep 2019 13:37:06 +0800 Subject: [PATCH 38/79] =?UTF-8?q?#1196=20=E5=A2=9E=E5=8A=A0=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=8D=A1=E5=88=B8=E7=B1=BB=E5=9E=8B=E7=9A=84=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/bean/card/BaseInfo.java | 10 -------- .../chanjar/weixin/mp/enums/WxCardType.java | 25 +++++++++++++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseInfo.java index c60cb447..2c3bf3b8 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseInfo.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseInfo.java @@ -227,16 +227,6 @@ public class BaseInfo implements Serializable { */ @SerializedName("promotion_app_brand_pass") private String promotionAppBrandPass; - /** - * 小程序的user_name, - */ - @SerializedName("activate_app_brand_user_name") - private String activateAppBrandUserName; - /** - * 激活小程序页面地址 - */ - @SerializedName("activate_app_brand_pass") - private String activateAppBrandPass; @Override public String toString() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java new file mode 100644 index 00000000..79b14708 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java @@ -0,0 +1,25 @@ +package me.chanjar.weixin.mp.enums; + +/** + * @description: 微信卡券类型 + * @author: chenyixin + * @create: 2019-09-07 23:33 + **/ +public enum WxCardType { + MEMBER_CARD("MEMBER_CARD"), + GROUPON("GROUPON"), + CASH("CASH"), + DISCOUNT("DISCOUNT"), + GIFT("GIFT"), + GENERAL_COUPON("GENERAL_COUPON"); + + private String code; + + WxCardType(String code) { + this.code = code; + } + + public String getCode() { + return code; + } +} From fdaefcb9ea170cc087d38be87e0863d9e7806d78 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 9 Sep 2019 13:38:53 +0800 Subject: [PATCH 39/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.4.B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- spring-boot-starters/pom.xml | 4 +++- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-miniapp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- weixin-java-open/pom.xml | 2 +- weixin-java-pay/pom.xml | 2 +- 11 files changed, 13 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index cb0ddbe1..519b7531 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.5.3.B + 3.5.4.B pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index dcc02deb..5cd4d284 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,10 +6,12 @@ com.github.binarywang wx-java - 3.5.3.B + 3.5.4.B pom wx-java-spring-boot-starters + WxJava - Spring Boot Starters + WxJava 各个模块的 Spring Boot Starter 2.1.4.RELEASE diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index e881d922..6a59de0d 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.3.B + 3.5.4.B 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index 8ed507a5..02005900 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.3.B + 3.5.4.B 4.0.0 diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index c62d4cbc..c613ffc5 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.3.B + 3.5.4.B 4.0.0 diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index da18e41c..f3ef67df 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.3.B + 3.5.4.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index fbb56f29..84cc1e44 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.3.B + 3.5.4.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index e3e81f3b..5e904ea5 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.3.B + 3.5.4.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 4dffc6da..f13b6a8a 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.3.B + 3.5.4.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index ce439c32..b780124a 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.3.B + 3.5.4.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index eaad6b0a..312b2a86 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.5.3.B + 3.5.4.B 4.0.0 From 6958142c4760ad767bd71826bb2dcd2e871df271 Mon Sep 17 00:00:00 2001 From: S Date: Thu, 12 Sep 2019 09:31:26 +0800 Subject: [PATCH 40/79] =?UTF-8?q?:sparkles:=20#1199=20=E5=BC=80=E6=94=BE?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=AC=AC=E4=B8=89=E6=96=B9=E5=B9=B3=E5=8F=B0=E4=BB=A3?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=AE=9E=E7=8E=B0=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=88=E5=8C=85=E6=8B=AC=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=9C=8D=E5=8A=A1=E5=95=86=E7=9A=84=E5=BD=93=E6=9C=88?= =?UTF-8?q?=E6=8F=90=E5=AE=A1=E9=99=90=E9=A2=9D=E5=92=8C=E5=8A=A0=E6=80=A5?= =?UTF-8?q?=E6=AC=A1=E6=95=B0=EF=BC=8C=E5=8A=A0=E6=80=A5=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :art: 统一异常输出 * :sparkles: 增加代小程序实现业务接口 --- .../weixin/common/error/WxMaErrorMsgEnum.java | 175 +++++++++++++++++- .../util/http/SimplePostRequestExecutor.java | 2 +- .../weixin/open/api/WxOpenMaService.java | 24 +++ .../open/api/impl/WxOpenMaServiceImpl.java | 29 ++- .../bean/result/WxOpenMaQueryQuotaResult.java | 36 ++++ 5 files changed, 262 insertions(+), 4 deletions(-) create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaQueryQuotaResult.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java index df2a460d..9650ce41 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java @@ -271,7 +271,180 @@ public enum WxMaErrorMsgEnum { /** * 订单无效. */ - CODE_89300(89300, "订单无效"); + CODE_89300(89300, "订单无效"), + + /** + * 代小程序实现业务的错误码,部分和小程序业务一致 + * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/Intro.html + */ + CODE_85060(85060, "无效的taskid"), + + CODE_85027(85027, "身份证绑定管理员名额达到上限"), + + CODE_85061(85061, "手机号绑定管理员名额达到上限"), + + CODE_85026(85026, "微信号绑定管理员名额达到上限"), + + CODE_85063(85063, "身份证黑名单"), + + CODE_85062(85062, "手机号黑名单"), + + CODE_85016(85016, "域名数量超过限制"), + + CODE_85017(85017, "没有新增域名,请确认小程序已经添加了域名或该域名是否没有在第三方平台添加"), + + CODE_85018(85018, "域名没有在第三方平台设置"), + + CODE_89019(89019, "业务域名无更改,无需重复设置"), + + CODE_89020(89020, "尚未设置小程序业务域名,请先在第三方平台中设置小程序业务域名后在调用本接口"), + + CODE_89021(89021, "请求保存的域名不是第三方平台中已设置的小程序业务域名或子域名"), + + CODE_89029(89029, "业务域名数量超过限制"), + + CODE_89231(89231, "个人小程序不支持调用 setwebviewdomain 接口"), + + CODE_91001(91001, "不是公众号快速创建的小程序"), + + CODE_91002(91002, "小程序发布后不可改名"), + + CODE_91003(91003, "改名状态不合法"), + + CODE_91004(91004, "昵称不合法"), + + CODE_91005(91005, "昵称 15 天主体保护"), + + CODE_91006(91006, "昵称命中微信号"), + + CODE_91007(91007, "昵称已被占用"), + + CODE_91008(91008, "昵称命中 7 天侵权保护期"), + + CODE_91009(91009, "需要提交材料"), + + CODE_91010(91010, "其他错误"), + + CODE_91011(91011, "查不到昵称修改审核单信息"), + + CODE_91012(91012, "其他错误"), + + CODE_91013(91013, "占用名字过多"), + + CODE_91014(91014, "+号规则 同一类型关联名主体不一致"), + + CODE_91015(91015, "原始名不同类型主体不一致"), + + CODE_91016(91016, "名称占用者 ≥2"), + + CODE_91017(91017, "+号规则 不同类型关联名主体不一致"), + + CODE_40097(40097, "参数错误"), + + CODE_41006(41006, "media_id 不能为空"), + + CODE_46001(46001, "media_id 不存在"), + + CODE_40009(40009, "图片尺寸太大"), + + CODE_53202(53202, "本月头像修改次数已用完"), + + CODE_53200(53200, "本月功能介绍修改次数已用完"), + + CODE_53201(53201, "功能介绍内容命中黑名单关键字"), + + CODE_85083(85083, "搜索标记位被封禁,无法修改"), + + CODE_85084(85084, "非法的 status 值,只能填 0 或者 1"), + + CODE_85013(85013, "无效的自定义配置"), + + CODE_85014(85014, "无效的模版编号"), + + CODE_85043(85043, "模版错误"), + + CODE_85044(85044, "代码包超过大小限制"), + + CODE_85045(85045, "ext_json 有不存在的路径"), + + CODE_85046(85046, "tabBar 中缺少 path"), + + CODE_85047(85047, "pages 字段为空"), + + CODE_85048(85048, "ext_json 解析失败"), + + CODE_80082(80082, "没有权限使用该插件"), + + CODE_80067(80067, "找不到使用的插件"), + + CODE_80066(80066, "非法的插件版本"), + + CODE_86000(86000, "不是由第三方代小程序进行调用"), + + CODE_86001(86001, "不存在第三方的已经提交的代码"), + + CODE_85006(85006, "标签格式错误"), + + CODE_85007(85007, "页面路径错误"), + + CODE_85008(85008, "类目填写错误"), + + CODE_85009(85009, "已经有正在审核的版本"), + + CODE_85010(85010, "item_list 有项目为空"), + + CODE_85011(85011, "标题填写错误"), + + CODE_85023(85023, "审核列表填写的项目数不在 1-5 以内"), + + CODE_85077(85077, "小程序类目信息失效(类目中含有官方下架的类目,请重新选择类目)"), + + CODE_86002(86002, "小程序还未设置昵称、头像、简介。请先设置完后再重新提交"), + + CODE_85085(85085, "近 7 天提交审核的小程序数量过多,请耐心等待审核完毕后再次提交"), + + CODE_85086(85086, "提交代码审核之前需提前上传代码"), + + CODE_85087(85087, "小程序已使用 api navigateToMiniProgram,请声明跳转 appid 列表后再次提交"), + + CODE_85012(85012, "无效的审核 id"), + + CODE_87013(87013, "撤回次数达到上限(每天一次,每个月 10 次)"), + + CODE_85019(85019, "没有审核版本"), + + CODE_85020(85020, "审核状态未满足发布"), + + CODE_87011(87011, "现网已经在灰度发布,不能进行版本回退"), + + CODE_87012(87012, "该版本不能回退,可能的原因:1:无上一个线上版用于回退 2:此版本为已回退版本,不能回退 3:此版本为回退功能上线之前的版本,不能回退"), + + CODE_85079(85079, "小程序没有线上版本,不能进行灰度"), + + CODE_85080(85080, "小程序提交的审核未审核通过"), + + CODE_85081(85081, "无效的发布比例"), + + CODE_85082(85082, "当前的发布比例需要比之前设置的高"), + + CODE_85021(85021, "状态不可变"), + + CODE_85022(85022, "action 非法"), + + CODE_89401(89401, "系统不稳定,请稍后再试,如多次失败请通过社区反馈"), + + CODE_89402(89402, "该审核单不在待审核队列,请检查是否已提交审核或已审完"), + + CODE_89403(89403, "本单属于平台不支持加急种类,请等待正常审核流程"), + + CODE_89404(89404, "本单已加速成功,请勿重复提交"), + + CODE_89405(89405, "本月加急额度不足,请提升提审质量以获取更多额度"), + + CODE_85064(85064, "找不到模版/草稿"), + + CODE_85065(85065, "模版库已满"), + ; private int code; private String msg; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java index c3a6c43e..692387f9 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java @@ -36,7 +36,7 @@ public abstract class SimplePostRequestExecutor implements RequestExecutor case OK_HTTP: return new OkHttpSimplePostRequestExecutor(requestHttp); default: - return null; + throw new IllegalArgumentException("非法请求参数"); } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java index 6e0af839..8bec5b2c 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java @@ -196,6 +196,17 @@ public interface WxOpenMaService extends WxMaService { String API_GET_GRAY_RELEASE_PLAN = "https://api.weixin.qq.com/wxa/getgrayreleaseplan"; + /** + * 查询服务商的当月提审限额和加急次数(Quota) + */ + String API_QUERY_QUOTA = "https://api.weixin.qq.com/wxa/queryquota"; + + /** + * 加急审核申请 + */ + String API_SPEED_AUDIT = "https://api.weixin.qq.com/wxa/speedupaudit"; + + /** * 获得小程序的域名配置信息 */ @@ -397,4 +408,17 @@ public interface WxOpenMaService extends WxMaService { */ WxOpenMaGrayReleasePlanResult getgrayreleaseplan() throws WxErrorException; + + /** + * 查询服务商的当月提审限额和加急次数(Quota) + * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/code/query_quota.html + */ + WxOpenMaQueryQuotaResult queryQuota() throws WxErrorException; + + /** + * 加急审核申请 + * 有加急次数的第三方可以通过该接口,对已经提审的小程序进行加急操作,加急后的小程序预计2-12小时内审完。 + */ + Boolean speedAudit(Long auditid) throws WxErrorException; + } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java index 6ee261fc..0d1554b5 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java @@ -228,8 +228,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ */ @Override public WxOpenMaSearchStatusResult getWxaSearchStatus() throws WxErrorException { - JsonObject paramJson = new JsonObject(); - String response = post(API_GET_WXA_SEARCH_STATUS, GSON.toJson(paramJson)); + String response = get(API_GET_WXA_SEARCH_STATUS, null); return WxMaGsonBuilder.create().fromJson(response, WxOpenMaSearchStatusResult.class); } @@ -523,6 +522,32 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ } + /** + * 查询服务商的当月提审限额和加急次数(Quota) + * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/code/query_quota.html + */ + @Override + public WxOpenMaQueryQuotaResult queryQuota() throws WxErrorException { + String response = get(API_QUERY_QUOTA, null); + return WxMaGsonBuilder.create().fromJson(response, WxOpenMaQueryQuotaResult.class); + } + + + + /** + * 加急审核申请 + * 有加急次数的第三方可以通过该接口,对已经提审的小程序进行加急操作,加急后的小程序预计2-12小时内审完。 + */ + @Override + public Boolean speedAudit(Long auditid) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("auditid", auditid); + String response = post(API_SPEED_AUDIT, GSON.toJson(params)); + WxOpenResult result = WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + return result.isSuccess(); + } + + /** * 将字符串对象转化为GsonArray对象 * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaQueryQuotaResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaQueryQuotaResult.java new file mode 100644 index 00000000..3b029062 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaQueryQuotaResult.java @@ -0,0 +1,36 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; + +/** + * 微信开放平台小程序当前分阶段发布详情 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class WxOpenMaQueryQuotaResult extends WxOpenResult { + + private static final long serialVersionUID = 5915265985261653007L; + + @SerializedName("rest") + private Integer rest; + + @SerializedName("limit") + private Integer limit; + + @SerializedName("speedup_rest") + private Integer speedupRest; + + @SerializedName("speedup_limit") + private Integer speedupLimit; + + + @Override + public String toString() { + return WxOpenGsonBuilder.create().toJson(this); + } + + +} From 39779cb0732092dce414d7ffa5942df2952a0e5b Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 18 Sep 2019 15:04:37 +0800 Subject: [PATCH 41/79] =?UTF-8?q?:bug:=20#1207=20=E4=BF=AE=E5=A4=8DWxCpXml?= =?UTF-8?q?OutMessage=E7=B1=BB=E7=9A=84=E5=85=B6=E4=B8=AD=E4=B8=80?= =?UTF-8?q?=E4=B8=AAroute=E6=96=B9=E6=B3=95=E7=9A=84=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java index 1eda876c..947ac28b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java @@ -129,7 +129,7 @@ public class WxCpMessageRouter { /** * 处理微信消息. */ - private WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map context) { + public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map context) { if (isMsgDuplicated(wxMessage)) { // 如果是重复消息,那么就不做处理 return null; From f86957fae708ec00450068186485749f10ddb334 Mon Sep 17 00:00:00 2001 From: Ziyear <31235089+Ziyear@users.noreply.github.com> Date: Wed, 18 Sep 2019 17:42:42 +0800 Subject: [PATCH 42/79] =?UTF-8?q?:bug:=20#1211=20=E4=BF=AE=E5=A4=8DWxPayAp?= =?UTF-8?q?iData=E7=B1=BB=E9=87=8CtoString=E6=96=B9=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit toString中有个分支的逗号换成· --- .../java/com/github/binarywang/wxpay/bean/WxPayApiData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/WxPayApiData.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/WxPayApiData.java index f8277d15..1cf4c3c3 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/WxPayApiData.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/WxPayApiData.java @@ -53,7 +53,7 @@ public class WxPayApiData { public String toString() { if (this.exceptionMsg != null) { return String.format("\n【请求地址】:%s\n【请求数据】:%s\n【异常信息】:%s", - this, url, this.requestData, this.exceptionMsg); + this.url, this.requestData, this.exceptionMsg); } return String.format("\n【请求地址】:%s\n【请求数据】:%s\n【响应数据】:%s", From 2d0cb1a2a2cf13d1087b46b9af6a02a97753cd8b Mon Sep 17 00:00:00 2001 From: S Date: Thu, 19 Sep 2019 17:24:06 +0800 Subject: [PATCH 43/79] =?UTF-8?q?:sparkles:=20#1212=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BC=80=E6=94=BE=E5=B9=B3=E5=8F=B0=E8=B4=A6=E5=8F=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../open/api/WxOpenComponentService.java | 39 ++++++++++++++++++ .../api/impl/WxOpenComponentServiceImpl.java | 40 +++++++++++++++++-- .../weixin/open/bean/WxOpenGetResult.java | 27 +++++++++++++ .../weixin/open/bean/result/WxOpenResult.java | 12 ++++-- 4 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenGetResult.java diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java index a2742bc2..f0da385c 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java @@ -1,13 +1,16 @@ package me.chanjar.weixin.open.api; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import com.google.gson.JsonObject; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; import me.chanjar.weixin.open.bean.WxOpenCreateResult; +import me.chanjar.weixin.open.bean.WxOpenGetResult; import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate; import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; import me.chanjar.weixin.open.bean.result.*; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; import java.util.List; @@ -47,6 +50,12 @@ public interface WxOpenComponentService { String CREATE_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/create"; + String BIND_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/bind"; + + String UNBIND_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/unbind"; + + String GET_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/get"; + /** * 快速创建小程序接口. */ @@ -212,6 +221,36 @@ public interface WxOpenComponentService { */ WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException; + + /** + * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/bind.html + * 将公众号/小程序绑定到开放平台帐号下 + * + * @param appId 公众号/小程序的appId + * @param openAppid 开放平台帐号 appid,由创建开发平台帐号接口返回 + */ + Boolean bindOpenAccount(String appId, String openAppid) throws WxErrorException; + + + /** + * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/unbind.html + * 将公众号/小程序从开放平台帐号下解绑 + * + * @param appId 公众号/小程序的appId + * @param openAppid 开放平台帐号 appid,由创建开发平台帐号接口返回 + */ + Boolean unbindOpenAccount(String appId, String openAppid) throws WxErrorException; + + + /** + * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/get.html + * 获取公众号/小程序所绑定的开放平台帐号 + * + * @param appId 公众号/小程序的appId + * @return 开放平台帐号 appid,由创建开发平台帐号接口返回 + */ + WxOpenGetResult getOpenAccount(String appId) throws WxErrorException; + /** * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN * 第三方平台快速创建小程序. diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java index bad174b6..510ee305 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java @@ -12,10 +12,7 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; import me.chanjar.weixin.open.api.*; -import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken; -import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken; -import me.chanjar.weixin.open.bean.WxOpenCreateResult; -import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate; +import me.chanjar.weixin.open.bean.*; import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo; import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; import me.chanjar.weixin.open.bean.result.*; @@ -450,6 +447,41 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { return WxOpenCreateResult.fromJson(json); } + + @Override + public Boolean bindOpenAccount(String appId, String openAppid) throws WxErrorException { + JsonObject param = new JsonObject(); + param.addProperty("appid", appId); + param.addProperty("open_appid", openAppid); + + String json = post(BIND_OPEN_URL, param.toString(), "access_token"); + + return WxOpenResult.fromJson(json).isSuccess(); + } + + + @Override + public Boolean unbindOpenAccount(String appId, String openAppid) throws WxErrorException { + JsonObject param = new JsonObject(); + param.addProperty("appid", appId); + param.addProperty("open_appid", openAppid); + + String json = post(UNBIND_OPEN_URL, param.toString(), "access_token"); + + return WxOpenResult.fromJson(json).isSuccess(); + } + + + @Override + public WxOpenGetResult getOpenAccount(String appId) throws WxErrorException { + JsonObject param = new JsonObject(); + param.addProperty("appid", appId); + + String json = post(GET_OPEN_URL, param.toString(), "access_token"); + return WxOpenGetResult.fromJson(json); + } + + @Override public WxOpenResult fastRegisterWeapp(String name, String code, String codeType, String legalPersonaWechat, String legalPersonaName, String componentPhone) throws WxErrorException { JsonObject jsonObject = new JsonObject(); diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenGetResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenGetResult.java new file mode 100644 index 00000000..3fb380ed --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenGetResult.java @@ -0,0 +1,27 @@ +package me.chanjar.weixin.open.bean; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import me.chanjar.weixin.open.bean.result.WxOpenResult; + +import java.io.Serializable; + +/** + * 文档地址:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/get.html + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxOpenGetResult extends WxOpenResult implements Serializable { + + private static final long serialVersionUID = -1196242565823312696L; + + @SerializedName("open_appid") + private String openAppid; + + public static WxOpenGetResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxOpenGetResult.class); + } + +} diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenResult.java index 6b1d10ba..90433d94 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenResult.java @@ -1,11 +1,11 @@ package me.chanjar.weixin.open.bean.result; -import java.io.Serializable; - -import org.apache.commons.lang3.StringUtils; - import lombok.Data; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; /** * 基础的微信开放平台请求结果. @@ -26,6 +26,10 @@ public class WxOpenResult implements Serializable { return StringUtils.equalsIgnoreCase(errcode, "0"); } + public static WxOpenResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxOpenResult.class); + } + @Override public String toString() { return WxOpenGsonBuilder.create().toJson(this); From 3512930237e5d418fa4a46283322ce95b0aa0ac5 Mon Sep 17 00:00:00 2001 From: S Date: Fri, 20 Sep 2019 11:18:50 +0800 Subject: [PATCH 44/79] =?UTF-8?q?:sparkles:=20#1213=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=BE=AE=E4=BF=A1=E5=8D=A1=E5=88=B8=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/common/error/WxMpErrorMsgEnum.java | 12 +- .../weixin/mp/api/WxMpCardService.java | 76 ++++++++++++ .../weixin/mp/api/WxMpMassMessageService.java | 34 ++++++ .../mp/api/impl/WxMpCardServiceImpl.java | 114 +++++++++++++++++- .../api/impl/WxMpMassMessageServiceImpl.java | 27 +++++ .../card/WxMpCardCodeCheckcodeResult.java | 38 ++++++ .../card/WxMpCardCodeDepositCountResult.java | 34 ++++++ .../bean/card/WxMpCardCodeDepositResult.java | 46 +++++++ .../card/WxMpCardMpnewsGethtmlResult.java | 33 +++++ .../mp/bean/result/WxMpMassGetResult.java | 34 ++++++ .../bean/result/WxMpMassSpeedGetResult.java | 38 ++++++ .../weixin/mp/bean/result/WxMpResult.java | 33 +++++ .../chanjar/weixin/mp/enums/WxMpApiUrl.java | 63 +++++++++- 13 files changed, 576 insertions(+), 6 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeCheckcodeResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeDepositCountResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeDepositResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassGetResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSpeedGetResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpResult.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java index 782e471e..c75f7596 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java @@ -632,7 +632,17 @@ public enum WxMpErrorMsgEnum { /** * 查询起始值 begin 不合法. */ - CODE_9001036(9001036, "查询起始值 begin 不合法"); + CODE_9001036(9001036, "查询起始值 begin 不合法"), + + /** + * 设置的 speed 参数不在0到4的范围内 + */ + CODE_45083(45083, "设置的 speed 参数不在0到4的范围内"), + + /** + * 没有设置 speed 参数 + */ + CODE_45084(45084, "没有设置 speed 参数"); private int code; private String msg; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java index 903fd94d..2202f556 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java @@ -4,6 +4,8 @@ import me.chanjar.weixin.common.bean.WxCardApiSignature; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.bean.card.*; +import java.util.List; + /** * 卡券相关接口. * @@ -207,4 +209,78 @@ public interface WxMpCardService { */ WxMpCardDeleteResult deleteCard(String cardId) throws WxErrorException; + + /** + * 导入自定义code(仅对自定义code商户) + * + * @param cardId 卡券id + * @param codeList 需导入微信卡券后台的自定义code,上限为100个。 + */ + WxMpCardCodeDepositResult cardCodeDeposit(String cardId, List codeList) throws WxErrorException; + + /** + * 查询导入code数目接口 + * + * @param cardId 卡券id + */ + WxMpCardCodeDepositCountResult cardCodeDepositCount(String cardId) throws WxErrorException; + + + /** + * 核查code接口 + * + * @param cardId 卡券id + * @param codeList 已经微信卡券后台的自定义code,上限为100个 + */ + WxMpCardCodeCheckcodeResult cardCodeCheckcode(String cardId, List codeList) throws WxErrorException; + + /** + * 图文消息群发卡券获取内嵌html + * + * @param cardId 卡券id + */ + WxMpCardMpnewsGethtmlResult cardMpnewsGethtml(String cardId) throws WxErrorException; + + + /** + * 修改库存接口 + * https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Managing_Coupons_Vouchers_and_Cards.html#5 + * + * @param cardId 卡券ID + * @param changeValue 库存变更值,负值为减少库存 + */ + void cardModifyStock(String cardId, Integer changeValue) throws WxErrorException; + + + /** + * 更改Code接口 + * https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Managing_Coupons_Vouchers_and_Cards.html#6 + * + * @param cardId 卡券ID + * @param oldCode 需变更的Code码 + * @param newCode 变更后的有效Code码 + */ + void cardCodeUpdate(String cardId, String oldCode, String newCode) throws WxErrorException; + + /** + * 设置买单接口 + * https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Create_a_Coupon_Voucher_or_Card.html#12 + * + * @param cardId 卡券ID + * @param isOpen 是否开启买单功能,填true/false + */ + void cardPaycellSet(String cardId, Boolean isOpen) throws WxErrorException; + + /** + * 设置自助核销 + * https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Create_a_Coupon_Voucher_or_Card.html#14 + * + * @param cardId 卡券ID + * @param isOpen 是否开启自助核销功能 + * @param needVerifyCod 用户核销时是否需要输入验证码, 填true/false, 默认为false + * @param needRemarkAmount 用户核销时是否需要备注核销金额, 填true/false, 默认为false + */ + void cardSelfConsumeCellSet(String cardId, Boolean isOpen, + Boolean needVerifyCod, Boolean needRemarkAmount) throws WxErrorException; + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMassMessageService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMassMessageService.java index c986e53e..df5d03e0 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMassMessageService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMassMessageService.java @@ -2,7 +2,9 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.bean.*; +import me.chanjar.weixin.mp.bean.result.WxMpMassGetResult; import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; +import me.chanjar.weixin.mp.bean.result.WxMpMassSpeedGetResult; import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; /** @@ -92,4 +94,36 @@ public interface WxMpMassMessageService { */ void delete(Long msgId, Integer articleIndex) throws WxErrorException; + + /** + * 获取群发速度 + * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#9 + */ + WxMpMassSpeedGetResult messageMassSpeedGet() throws WxErrorException; + + + /** + * 设置群发速度 + * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#9 + * + * @param speed 群发速度的级别,是一个0到4的整数,数字越大表示群发速度越慢。 + * speed realspeed + * 0 80w/分钟 + * 1 60w/分钟 + * 2 45w/分钟 + * 3 30w/分钟 + * 4 10w/分钟 + */ + void messageMassSpeedSet(Integer speed) throws WxErrorException; + + + /** + * 查询群发消息发送状态【订阅号与服务号认证后均可用】 + * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#%E6%9F%A5%E8%AF%A2%E7%BE%A4%E5%8F%91%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E7%8A%B6%E6%80%81%E3%80%90%E8%AE%A2%E9%98%85%E5%8F%B7%E4%B8%8E%E6%9C%8D%E5%8A%A1%E5%8F%B7%E8%AE%A4%E8%AF%81%E5%90%8E%E5%9D%87%E5%8F%AF%E7%94%A8%E3%80%91 + * + * @param msgId 群发消息后返回的消息id + * @return 消息发送后的状态,SEND_SUCCESS表示发送成功,SENDING表示发送中,SEND_FAIL表示发送失败,DELETE表示已删除 + */ + WxMpMassGetResult messageMassGet(Long msgId) throws WxErrorException; + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java index 2854ec16..ddcab47a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java @@ -9,9 +9,11 @@ import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.RandomUtils; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.mp.api.WxMpCardService; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.card.*; +import me.chanjar.weixin.mp.bean.result.WxMpResult; import me.chanjar.weixin.mp.enums.TicketType; import me.chanjar.weixin.mp.enums.WxMpApiUrl; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; @@ -19,6 +21,7 @@ import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import java.util.Arrays; +import java.util.List; import java.util.concurrent.locks.Lock; /** @@ -241,12 +244,117 @@ public class WxMpCardServiceImpl implements WxMpCardService { @Override public WxMpCardDeleteResult deleteCard(String cardId) throws WxErrorException { - if (StringUtils.isEmpty(cardId)) { - throw new WxErrorException(WxError.builder().errorCode(41012).errorMsg("cardId不能为空").build()); - } + checkCardId(cardId); JsonObject param = new JsonObject(); param.addProperty("card_id", cardId); String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_DELETE, param.toString()); return WxMpCardDeleteResult.fromJson(response); } + + + @Override + public WxMpCardCodeDepositResult cardCodeDeposit(String cardId, List codeList) throws WxErrorException { + checkCardId(cardId); + if (codeList.size() == 0 || codeList.size() > 100) { + throw new WxErrorException(WxError.builder().errorCode(40109).errorMsg("code数量为0或者code数量超过100个").build()); + } + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + param.add("code", + WxGsonBuilder.create().toJsonTree(codeList, new TypeToken>() { + }.getType()).getAsJsonArray()); + String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_DEPOSIT, param.toString()); + return WxMpCardCodeDepositResult.fromJson(response); + } + + + @Override + public WxMpCardCodeDepositCountResult cardCodeDepositCount(String cardId) throws WxErrorException { + checkCardId(cardId); + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_DEPOSIT_COUNT, param.toString()); + return WxMpCardCodeDepositCountResult.fromJson(response); + } + + + @Override + public WxMpCardCodeCheckcodeResult cardCodeCheckcode(String cardId, List codeList) throws WxErrorException { + checkCardId(cardId); + if (codeList.size() == 0 || codeList.size() > 100) { + throw new WxErrorException(WxError.builder().errorCode(40109).errorMsg("code数量为0或者code数量超过100个").build()); + } + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + param.add("code", + WxGsonBuilder.create().toJsonTree(codeList, new TypeToken>() { + }.getType()).getAsJsonArray()); + String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_CHECKCODE, param.toString()); + return WxMpCardCodeCheckcodeResult.fromJson(response); + } + + + @Override + public WxMpCardMpnewsGethtmlResult cardMpnewsGethtml(String cardId) throws WxErrorException { + checkCardId(cardId); + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + String response = this.wxMpService.post(WxMpApiUrl.Card.CARD_MPNEWS_GETHTML, param.toString()); + return WxMpCardMpnewsGethtmlResult.fromJson(response); + } + + + @Override + public void cardModifyStock(String cardId, Integer changeValue) throws WxErrorException { + checkCardId(cardId); + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + if (changeValue > 0) { + param.addProperty("increase_stock_value", changeValue); + } else { + param.addProperty("reduce_stock_value", Math.abs(changeValue)); + } + this.wxMpService.post(WxMpApiUrl.Card.CARD_MODIFY_STOCK, param.toString()); + } + + + @Override + public void cardCodeUpdate(String cardId, String oldCode, String newCode) throws WxErrorException { + checkCardId(cardId); + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + param.addProperty("code", oldCode); + param.addProperty("new_code", newCode); + this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_UPDATE, param.toString()); + } + + + @Override + public void cardPaycellSet(String cardId, Boolean isOpen) throws WxErrorException { + checkCardId(cardId); + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + param.addProperty("is_open", isOpen); + this.wxMpService.post(WxMpApiUrl.Card.CARD_PAYCELL_SET, param.toString()); + } + + + @Override + public void cardSelfConsumeCellSet(String cardId, Boolean isOpen, + Boolean needVerifyCod, Boolean needRemarkAmount) throws WxErrorException { + checkCardId(cardId); + JsonObject param = new JsonObject(); + param.addProperty("card_id", cardId); + param.addProperty("is_open", isOpen); + param.addProperty("need_verify_cod", needVerifyCod); + param.addProperty("need_remark_amount", needRemarkAmount); + this.wxMpService.post(WxMpApiUrl.Card.CARD_SELF_CONSUME_CELL_SET, param.toString()); + } + + + private void checkCardId(String cardId) throws WxErrorException { + if (StringUtils.isEmpty(cardId)) { + throw new WxErrorException(WxError.builder().errorCode(41012).errorMsg("cardId不能为空").build()); + } + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java index caca3cd0..dcae606d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java @@ -7,7 +7,9 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpMassMessageService; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.*; +import me.chanjar.weixin.mp.bean.result.WxMpMassGetResult; import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; +import me.chanjar.weixin.mp.bean.result.WxMpMassSpeedGetResult; import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; import me.chanjar.weixin.mp.enums.WxMpApiUrl; @@ -64,4 +66,29 @@ public class WxMpMassMessageServiceImpl implements WxMpMassMessageService { this.wxMpService.post(MassMessage.MESSAGE_MASS_DELETE_URL, jsonObject.toString()); } + + @Override + public WxMpMassSpeedGetResult messageMassSpeedGet() throws WxErrorException { + JsonObject jsonObject = new JsonObject(); + String response = this.wxMpService.post(MassMessage.MESSAGE_MASS_SPEED_GET_URL, jsonObject.toString()); + return WxMpMassSpeedGetResult.fromJson(response); + } + + + @Override + public void messageMassSpeedSet(Integer speed) throws WxErrorException { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("speed", speed); + this.wxMpService.post(MassMessage.MESSAGE_MASS_SPEED_SET_URL, jsonObject.toString()); + } + + + @Override + public WxMpMassGetResult messageMassGet(Long msgId) throws WxErrorException { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("msg_id", msgId); + String response = this.wxMpService.post(MassMessage.MESSAGE_MASS_GET_URL, jsonObject.toString()); + return WxMpMassGetResult.fromJson(response); + } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeCheckcodeResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeCheckcodeResult.java new file mode 100644 index 00000000..84768c09 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeCheckcodeResult.java @@ -0,0 +1,38 @@ +package me.chanjar.weixin.mp.bean.card; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.mp.bean.result.WxMpResult; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; +import java.util.List; + + +@Data +public class WxMpCardCodeCheckcodeResult extends WxMpResult implements Serializable { + + private static final long serialVersionUID = -5128692403997016750L; + + /** + * 已经成功存入的code数目 + */ + @SerializedName("exist_code") + private List existCode; + + @SerializedName("not_exist_code") + private List notExistCode; + + + public static WxMpCardCodeCheckcodeResult fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpCardCodeCheckcodeResult.class); + } + + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + +} + diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeDepositCountResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeDepositCountResult.java new file mode 100644 index 00000000..a7a114bf --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeDepositCountResult.java @@ -0,0 +1,34 @@ +package me.chanjar.weixin.mp.bean.card; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.mp.bean.result.WxMpResult; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; + + +@Data +public class WxMpCardCodeDepositCountResult extends WxMpResult implements Serializable { + + private static final long serialVersionUID = -6707587956061215868L; + + /** + * 已经成功存入的code数目 + */ + @SerializedName("count") + private Integer count; + + + public static WxMpCardCodeDepositCountResult fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpCardCodeDepositCountResult.class); + } + + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + +} + diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeDepositResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeDepositResult.java new file mode 100644 index 00000000..aeb1246b --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCodeDepositResult.java @@ -0,0 +1,46 @@ +package me.chanjar.weixin.mp.bean.card; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.mp.bean.result.WxMpResult; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; + + +@Data +public class WxMpCardCodeDepositResult extends WxMpResult implements Serializable { + + private static final long serialVersionUID = 2955588617765355420L; + + /** + * 成功个数 + */ + @SerializedName("succ_code") + private Integer succCode; + + /** + * 重复导入的code会自动被过滤 + */ + @SerializedName("duplicate_code") + private Integer duplicateCode; + + /** + * 失败个数 + */ + @SerializedName("fail_code") + private Integer failCode; + + + public static WxMpCardCodeDepositResult fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpCardCodeDepositResult.class); + } + + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + +} + diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java new file mode 100644 index 00000000..d5595066 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java @@ -0,0 +1,33 @@ +package me.chanjar.weixin.mp.bean.card; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.mp.bean.result.WxMpResult; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; +import java.util.List; + + +@Data +public class WxMpCardMpnewsGethtmlResult extends WxMpResult implements Serializable { + + private static final long serialVersionUID = 6435268886823478711L; + + /** + * 返回一段html代码,可以直接嵌入到图文消息的正文里。即可以把这段代码嵌入到 上传图文消息素材接口 中的content字段里 + */ + @SerializedName("content") + private String content; + + public static WxMpCardMpnewsGethtmlResult fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpCardMpnewsGethtmlResult.class); + } + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + +} + diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassGetResult.java new file mode 100644 index 00000000..c1f43feb --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassGetResult.java @@ -0,0 +1,34 @@ +package me.chanjar.weixin.mp.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; + +/** + *
+ * 查询群发消息发送状态【订阅号与服务号认证后均可用】
+ * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#%E6%9F%A5%E8%AF%A2%E7%BE%A4%E5%8F%91%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E7%8A%B6%E6%80%81%E3%80%90%E8%AE%A2%E9%98%85%E5%8F%B7%E4%B8%8E%E6%9C%8D%E5%8A%A1%E5%8F%B7%E8%AE%A4%E8%AF%81%E5%90%8E%E5%9D%87%E5%8F%AF%E7%94%A8%E3%80%91
+ */
+@Data
+public class WxMpMassGetResult extends WxMpResult implements Serializable {
+
+  private static final long serialVersionUID = -2909694117357278557L;
+
+  @SerializedName("msg_id")
+  private Long msgId;
+
+  @SerializedName("msg_status")
+  private String msgstatus;
+
+  public static WxMpMassGetResult fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, WxMpMassGetResult.class);
+  }
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSpeedGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSpeedGetResult.java
new file mode 100644
index 00000000..ef53b5be
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSpeedGetResult.java
@@ -0,0 +1,38 @@
+package me.chanjar.weixin.mp.bean.result;
+
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 
+ * 获取群发速度
+ * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#9
+ * speed	realspeed
+ * 0	80w/分钟
+ * 1	60w/分钟
+ * 2	45w/分钟
+ * 3	30w/分钟
+ * 4	10w/分钟
+ * 
+ */ +@Data +public class WxMpMassSpeedGetResult implements Serializable { + + private static final long serialVersionUID = -6478157575168068334L; + + private Integer speed; + + private Integer realspeed; + + public static WxMpMassSpeedGetResult fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpMassSpeedGetResult.class); + } + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpResult.java new file mode 100644 index 00000000..9be4b7e8 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpResult.java @@ -0,0 +1,33 @@ +package me.chanjar.weixin.mp.bean.result; + +import lombok.Data; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; + +/** + * 基础的微信公众号平台请求结果. + */ +@Data +public class WxMpResult implements Serializable { + private static final long serialVersionUID = 2101652152604850904L; + protected String errcode; + protected String errmsg; + + /** + * 请求是否成功. + */ + public boolean isSuccess() { + return StringUtils.equalsIgnoreCase(errcode, "0"); + } + + public static WxMpResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxMpResult.class); + } + + @Override + public String toString() { + return WxGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java index d85c74f4..5a10dea4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java @@ -506,7 +506,48 @@ public interface WxMpApiUrl { /** * 卡券删除. */ - CARD_DELETE(API_DEFAULT_HOST_URL, "/card/delete"); + CARD_DELETE(API_DEFAULT_HOST_URL, "/card/delete"), + + /** + * 导入code接口. + */ + CARD_CODE_DEPOSIT(API_DEFAULT_HOST_URL, "/card/code/deposit"), + + /** + * 查询导入code数目接口 + */ + CARD_CODE_DEPOSIT_COUNT(API_DEFAULT_HOST_URL, "/card/code/getdepositcount"), + + /** + * 核查code接口 + */ + CARD_CODE_CHECKCODE(API_DEFAULT_HOST_URL, "/card/code/checkcode"), + + /** + * 图文消息群发卡券 + */ + CARD_MPNEWS_GETHTML(API_DEFAULT_HOST_URL, "/card/mpnews/gethtml"), + + /** + * 修改库存接口 + */ + CARD_MODIFY_STOCK(API_DEFAULT_HOST_URL, "/card/modifystock"), + + /** + * 更改Code接口 + */ + CARD_CODE_UPDATE(API_DEFAULT_HOST_URL, "/card/code/update"), + + /** + * 设置买单接口 + */ + CARD_PAYCELL_SET(API_DEFAULT_HOST_URL, "/card/paycell/set"), + + /** + * 设置自助核销接口 + */ + CARD_SELF_CONSUME_CELL_SET(API_DEFAULT_HOST_URL, "/card/selfconsumecell/set"), + ; private String prefix; private String path; @@ -694,7 +735,25 @@ public interface WxMpApiUrl { /** * 删除群发接口. */ - MESSAGE_MASS_DELETE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/delete"); + MESSAGE_MASS_DELETE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/delete"), + + + /** + * 获取群发速度. + */ + MESSAGE_MASS_SPEED_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/speed/get"), + + + /** + * 设置群发速度. + */ + MESSAGE_MASS_SPEED_SET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/speed/set"), + + + /** + * 查询群发消息发送状态【订阅号与服务号认证后均可用】 + */ + MESSAGE_MASS_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/get"); private String prefix; private String path; From 5ead473356e19eeec371acb2fb3bfc3c0542e865 Mon Sep 17 00:00:00 2001 From: S Date: Sat, 21 Sep 2019 22:05:56 +0800 Subject: [PATCH 45/79] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8import?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/impl/WxMaUserServiceImplTest.java | 16 +++++++--------- .../weixin/mp/api/impl/WxMpCardServiceImpl.java | 1 - 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java index 2c478e8f..fe3fa167 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java @@ -1,20 +1,18 @@ package cn.binarywang.wx.miniapp.api.impl; -import cn.binarywang.wx.miniapp.test.TestConfig; -import com.google.common.collect.ImmutableMap; -import jdk.nashorn.internal.ir.annotations.Immutable; -import me.chanjar.weixin.common.error.WxErrorException; -import org.testng.annotations.*; - import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; import cn.binarywang.wx.miniapp.test.ApiTestModule; +import cn.binarywang.wx.miniapp.test.TestConfig; +import com.google.common.collect.ImmutableMap; import com.google.inject.Inject; +import me.chanjar.weixin.common.error.WxErrorException; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; -import javax.management.ImmutableDescriptor; - -import static org.testng.Assert.*; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; /** * 测试用户相关的接口 diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java index ddcab47a..5cdc605b 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java @@ -13,7 +13,6 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.mp.api.WxMpCardService; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.card.*; -import me.chanjar.weixin.mp.bean.result.WxMpResult; import me.chanjar.weixin.mp.enums.TicketType; import me.chanjar.weixin.mp.enums.WxMpApiUrl; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; From ff62dc5af1591cb527bc63f23088af349bbb97f9 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 21 Sep 2019 23:02:42 +0800 Subject: [PATCH 46/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.5.B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- spring-boot-starters/pom.xml | 2 +- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-miniapp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- weixin-java-open/pom.xml | 2 +- weixin-java-pay/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 519b7531..1a3b3e58 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.5.4.B + 3.5.5.B pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 5cd4d284..34c6d1f5 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.4.B + 3.5.5.B pom wx-java-spring-boot-starters diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index 6a59de0d..59c63947 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.4.B + 3.5.5.B 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index 02005900..cb21543b 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.4.B + 3.5.5.B 4.0.0 diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index c613ffc5..6382a3c8 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.4.B + 3.5.5.B 4.0.0 diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index f3ef67df..cabc80a6 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.4.B + 3.5.5.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 84cc1e44..96029425 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.4.B + 3.5.5.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index 5e904ea5..c622ec60 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.4.B + 3.5.5.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index f13b6a8a..d22b43d6 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.4.B + 3.5.5.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index b780124a..faf6db8d 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.4.B + 3.5.5.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 312b2a86..005bbfee 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.5.4.B + 3.5.5.B 4.0.0 From df1aa5c9dcf79f48f363db38b96008dd6b7b5795 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 21 Sep 2019 23:17:15 +0800 Subject: [PATCH 47/79] =?UTF-8?q?:art:=20=E8=A7=84=E8=8C=83=E9=83=A8?= =?UTF-8?q?=E5=88=86javadoc=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cp/bean/WxCpApprovalDataResult.java | 15 ++- .../weixin/cp/bean/WxCpCheckinData.java | 7 +- .../weixin/cp/bean/WxCpCheckinOption.java | 28 ++--- .../weixin/cp/bean/WxCpDialRecord.java | 8 +- .../cp/util/crypto/WxCpTpCryptUtil.java | 82 +++++-------- .../wx/miniapp/api/WxMaTemplateService.java | 27 +---- .../me/chanjar/weixin/mp/api/WxMpService.java | 113 +++++++++++++++++- .../mp/bean/card/BaseWxMpCardResult.java | 8 +- .../chanjar/weixin/mp/enums/WxCardType.java | 33 ++--- .../WxFastMaAccountBasicInfoResult.java | 3 +- .../result/WxFastMaBeenSetCategoryResult.java | 3 +- .../result/WxFastMaCheckNickameResult.java | 3 +- .../WxFastMaQueryNicknameStatusResult.java | 3 +- .../bean/result/WxFastMaSetNickameResult.java | 3 +- .../WxFastMaAccountBasicInfoGsonAdapter.java | 27 +++-- 15 files changed, 215 insertions(+), 148 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpApprovalDataResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpApprovalDataResult.java index 3e1299e9..383c5265 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpApprovalDataResult.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpApprovalDataResult.java @@ -7,10 +7,10 @@ import java.io.Serializable; import java.util.Map; /** + * 企业微信 OA 审批数据. + * * @author Element - * @Package me.chanjar.weixin.cp.bean * @date 2019-04-06 14:36 - * @Description: 企业微信 OA 审批数据 */ @Data public class WxCpApprovalDataResult implements Serializable { @@ -27,17 +27,16 @@ public class WxCpApprovalDataResult implements Serializable { private Integer total; @SerializedName("next_spnum") - private Long nextSpnum; + private Long nextSpNum; private WxCpApprovalData[] data; @Data - public static class WxCpApprovalData implements Serializable{ - + public static class WxCpApprovalData implements Serializable { private static final long serialVersionUID = -3051785319608491640L; - - private String spname; + @SerializedName("spname") + private String spName; @SerializedName("apply_name") private String applyName; @@ -64,6 +63,6 @@ public class WxCpApprovalDataResult implements Serializable { private String applyUserId; @SerializedName("comm") - private Map comm; + private Map comm; } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinData.java index 369c771f..d2fbf0f9 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinData.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinData.java @@ -7,14 +7,13 @@ import java.io.Serializable; import java.util.List; /** + * 企业微信打卡数据. + * * @author Element - * @Package me.chanjar.weixin.cp.bean * @date 2019-04-06 11:01 - * @Description: 企业微信打卡数据 */ @Data public class WxCpCheckinData implements Serializable { - private static final long serialVersionUID = 1915820330847799605L; @SerializedName("userid") @@ -42,7 +41,7 @@ public class WxCpCheckinData implements Serializable { private String wifiName; @SerializedName("wifimac") - private String wifiMAC; + private String wifiMac; private String notes; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinOption.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinOption.java index 9cc3c389..c554e3d7 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinOption.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinOption.java @@ -7,10 +7,10 @@ import java.io.Serializable; import java.util.List; /** + * 企业微信打卡规则. + * * @author Element - * @Package me.chanjar.weixin.cp.bean * @date 2019-04-06 13:22 - * @Description: 企业微信打卡规则 */ @Data public class WxCpCheckinOption implements Serializable { @@ -21,10 +21,8 @@ public class WxCpCheckinOption implements Serializable { private Group group; - @Data public static class CheckinDate implements Serializable { - private static final long serialVersionUID = -5601722383347110974L; private List workdays; @@ -36,15 +34,14 @@ public class WxCpCheckinOption implements Serializable { private Long flexTime; @SerializedName("noneed_offwork") - private Boolean noneedOffwork; + private Boolean noNeedOffwork; @SerializedName("limit_aheadtime") - private Long limitAheadtime; + private Long limitAheadTime; } @Data public static class CheckinTime implements Serializable { - private static final long serialVersionUID = -8579954143265336276L; @SerializedName("work_sec") @@ -90,16 +87,16 @@ public class WxCpCheckinOption implements Serializable { private Boolean needPhoto; @SerializedName("note_can_use_local_pic") - private Boolean note_can_use_local_pic; + private Boolean noteCanUseLocalPic; @SerializedName("allow_checkin_offworkday") - private Boolean allow_checkin_offworkday; + private Boolean allowCheckinOffWorkday; @SerializedName("allow_apply_offworkday") - private Boolean allow_apply_offworkday; + private Boolean allowApplyOffWorkday; @SerializedName("wifimac_infos") - private List wifiMACInfos; + private List wifiMacInfos; @SerializedName("loc_infos") private List locInfos; @@ -107,8 +104,7 @@ public class WxCpCheckinOption implements Serializable { } @Data - public static class WifiMACInfo implements Serializable{ - + public static class WifiMacInfo implements Serializable { private static final long serialVersionUID = -4657809185716627368L; @SerializedName("wifiname") @@ -119,8 +115,7 @@ public class WxCpCheckinOption implements Serializable { } @Data - public static class LocInfo implements Serializable{ - + public static class LocInfo implements Serializable { private static final long serialVersionUID = -618965280668099608L; private Long lat; @@ -136,8 +131,7 @@ public class WxCpCheckinOption implements Serializable { } @Data - public static class SpeDay implements Serializable{ - + public static class SpeDay implements Serializable { private static final long serialVersionUID = -3538818921359212748L; private Long timestamp; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDialRecord.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDialRecord.java index d8e40c79..4f93b3de 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDialRecord.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDialRecord.java @@ -7,10 +7,10 @@ import java.io.Serializable; import java.util.List; /** + * 公费电话拨打记录. + * * @author Element - * @Package me.chanjar.weixin.cp.bean * @date 2019-04-06 15:38 - * @Description: 公费电话拨打记录 */ @Data public class WxCpDialRecord implements Serializable { @@ -39,7 +39,7 @@ public class WxCpDialRecord implements Serializable { * 主叫信息 */ @Data - public static class Caller implements Serializable{ + public static class Caller implements Serializable { private static final long serialVersionUID = 4792200404338145607L; @@ -53,7 +53,7 @@ public class WxCpDialRecord implements Serializable { * 被叫信息 */ @Data - public static class Callee implements Serializable{ + public static class Callee implements Serializable { private static final long serialVersionUID = 2390963671336179550L; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java index 453d1700..e45ef2ec 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java @@ -1,52 +1,30 @@ -/** - * 对公众平台发送给公众账号的消息加解密示例代码. - * - * @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 - *

- * 针对org.apache.commons.codec.binary.Base64, - * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) - * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi - */ - -// ------------------------------------------------------------------------ - -/** - * 针对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.cp.util.crypto; - -import org.apache.commons.codec.binary.Base64; - -import me.chanjar.weixin.common.util.crypto.WxCryptUtil; -import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; - -public class WxCpTpCryptUtil extends WxCryptUtil { - - /** - * 构造函数 - * - * @param wxCpConfigStorage - */ - public WxCpTpCryptUtil(WxCpTpConfigStorage wxCpTpConfigStorage) { - /* - * @param token 公众平台上,开发者设置的token - * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey - * @param appidOrCorpid 公众平台corpId - */ - String encodingAesKey = wxCpTpConfigStorage.getAesKey(); - String token = wxCpTpConfigStorage.getToken(); - String corpId = wxCpTpConfigStorage.getCorpId(); - - this.token = token; - this.appidOrCorpid = corpId; - this.aesKey = Base64.decodeBase64(encodingAesKey + "="); - } - - -} +package me.chanjar.weixin.cp.util.crypto; + +import me.chanjar.weixin.common.util.crypto.WxCryptUtil; +import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; +import org.apache.commons.codec.binary.Base64; + +/** + * @author someone + */ +public class WxCpTpCryptUtil extends WxCryptUtil { + /** + * 构造函数. + */ + public WxCpTpCryptUtil(WxCpTpConfigStorage wxCpTpConfigStorage) { + /* + * @param token 公众平台上,开发者设置的token + * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey + * @param appidOrCorpid 公众平台corpId + */ + String encodingAesKey = wxCpTpConfigStorage.getAesKey(); + String token = wxCpTpConfigStorage.getToken(); + String corpId = wxCpTpConfigStorage.getCorpId(); + + this.token = token; + this.appidOrCorpid = corpId; + this.aesKey = Base64.decodeBase64(encodingAesKey + "="); + } + + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java index dbdfc451..3973774f 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java @@ -10,27 +10,27 @@ import java.util.List; public interface WxMaTemplateService { /** - * 获取小程序模板库标题列表 + * 获取小程序模板库标题列表. */ String TEMPLATE_LIBRARY_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list"; /** - * 获取模板库某个模板标题下关键词库 + * 获取模板库某个模板标题下关键词库. */ String TEMPLATE_LIBRARY_KEYWORD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get"; /** - * 组合模板并添加至帐号下的个人模板库 + * 组合模板并添加至帐号下的个人模板库. */ String TEMPLATE_ADD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/add"; /** - * 获取帐号下已存在的模板列表 + * 获取帐号下已存在的模板列表. */ String TEMPLATE_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/list"; /** - * 删除帐号下的某个模板 + * 删除帐号下的某个模板. */ String TEMPLATE_DEL_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/del"; @@ -41,10 +41,6 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list?access_token=ACCESS_TOKEN *

- * - * @param offset - * @param count - * @return */ WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException; @@ -55,9 +51,6 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get?access_token=ACCESS_TOKEN * - * - * @param id - * @return */ WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException; @@ -68,10 +61,6 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=ACCESS_TOKEN * - * - * @param id - * @param keywordIdList - * @return */ WxMaTemplateAddResult addTemplate(String id, List keywordIdList) throws WxErrorException; @@ -82,10 +71,6 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN * - * - * @param offset - * @param count - * @return */ WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException; @@ -96,8 +81,6 @@ public interface WxMaTemplateService { * 详情请见: 获取小程序模板库标题列表 * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN * - * - * @param templateId */ boolean delTemplate(String templateId) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index e8b91a82..069175de 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -179,7 +179,6 @@ public interface WxMpService { */ String[] getCallbackIP() throws WxErrorException; - /** *
    *  网络检测
@@ -189,7 +188,7 @@ public interface WxMpService {
    *
    * @param action   执行的检测动作
    * @param operator 指定平台从某个运营商进行检测
-   * @throws WxErrorException
+   * @throws WxErrorException .
    */
   WxNetCheckResult netCheck(String action, String operator) throws WxErrorException;
 
@@ -305,6 +304,8 @@ public interface WxMpService {
    * 设置当微信系统响应系统繁忙时,最大重试次数.
    * 默认:5次
    * 
+ * + * @param maxRetryTimes 最大重试次数 */ void setMaxRetryTimes(int maxRetryTimes); @@ -317,18 +318,21 @@ public interface WxMpService { /** * 设置 {@link WxMpConfigStorage} 的实现. 兼容老版本 + * + * @param wxConfigProvider . */ void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider); /** - * {@link Map} 加入新的 {@link WxMpConfigStorage},适用于动态添加新的微信公众号配置 + * Map里 加入新的 {@link WxMpConfigStorage},适用于动态添加新的微信公众号配置. * + * @param mpId 公众号id * @param configStorage 新的微信配置 */ void addConfigStorage(String mpId, WxMpConfigStorage configStorage); /** - * 从{@link Map} 移除 {@link String mpId} 所对应的 {@link WxMpConfigStorage},适用于动态移除微信公众号配置 + * 从 Map中 移除 {@link String mpId} 所对应的 {@link WxMpConfigStorage},适用于动态移除微信公众号配置. * * @param mpId 对应公众号的标识 */ @@ -351,7 +355,7 @@ public interface WxMpService { void setMultiConfigStorages(Map configStorages, String defaultMpId); /** - * 进行相应的公众号切换 + * 进行相应的公众号切换. * * @param mpId 公众号标识 * @return 切换是否成功 @@ -359,7 +363,7 @@ public interface WxMpService { boolean switchover(String mpId); /** - * 进行相应的公众号切换 + * 进行相应的公众号切换. * * @param mpId 公众号标识 * @return 切换成功,则返回当前对象,方便链式调用,否则抛出异常 @@ -484,6 +488,8 @@ public interface WxMpService { void initHttp(); /** + * 获取RequestHttp对象. + * * @return RequestHttp对象 */ RequestHttp getRequestHttp(); @@ -516,40 +522,130 @@ public interface WxMpService { */ WxMpOcrService getOcrService(); + /** + * . + * + * @param kefuService . + */ void setKefuService(WxMpKefuService kefuService); + /** + * . + * + * @param materialService . + */ void setMaterialService(WxMpMaterialService materialService); + /** + * . + * + * @param menuService . + */ void setMenuService(WxMpMenuService menuService); + /** + * . + * + * @param userService . + */ void setUserService(WxMpUserService userService); + /** + * . + * + * @param tagService . + */ void setTagService(WxMpUserTagService tagService); + /** + * . + * + * @param qrCodeService . + */ void setQrCodeService(WxMpQrcodeService qrCodeService); + /** + * . + * + * @param cardService . + */ void setCardService(WxMpCardService cardService); + /** + * . + * + * @param storeService . + */ void setStoreService(WxMpStoreService storeService); + /** + * . + * + * @param dataCubeService . + */ void setDataCubeService(WxMpDataCubeService dataCubeService); + /** + * . + * + * @param blackListService . + */ void setBlackListService(WxMpUserBlacklistService blackListService); + /** + * . + * + * @param templateMsgService . + */ void setTemplateMsgService(WxMpTemplateMsgService templateMsgService); + /** + * . + * + * @param deviceService . + */ void setDeviceService(WxMpDeviceService deviceService); + /** + * . + * + * @param shakeService . + */ void setShakeService(WxMpShakeService shakeService); + /** + * . + * + * @param memberCardService . + */ void setMemberCardService(WxMpMemberCardService memberCardService); + /** + * . + * + * @param massMessageService . + */ void setMassMessageService(WxMpMassMessageService massMessageService); + /** + * . + * + * @param aiOpenService . + */ void setAiOpenService(WxMpAiOpenService aiOpenService); + /** + * . + * + * @param marketingService . + */ void setMarketingService(WxMpMarketingService marketingService); + /** + * . + * + * @param ocrService . + */ void setOcrService(WxMpOcrService ocrService); /** @@ -559,5 +655,10 @@ public interface WxMpService { */ WxMpCommentService getCommentService(); + /** + * . + * + * @param commentService . + */ void setCommentService(WxMpCommentService commentService); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseWxMpCardResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseWxMpCardResult.java index 3988ee0c..72c7420f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseWxMpCardResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/BaseWxMpCardResult.java @@ -3,11 +3,13 @@ package me.chanjar.weixin.mp.bean.card; import java.io.Serializable; /** - * @description 卡券返回结果基础类 - * @author: fanxl - * @date: 2019/1/22 0022 10:08 + * 卡券返回结果基础类. + * + * @author fanxl + * @date 2019/1/22 0022 10:08 */ public class BaseWxMpCardResult implements Serializable { + private static final long serialVersionUID = -3502867243738689870L; /** * 错误码 diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java index 79b14708..46cc43f8 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java @@ -1,25 +1,26 @@ package me.chanjar.weixin.mp.enums; /** - * @description: 微信卡券类型 - * @author: chenyixin - * @create: 2019-09-07 23:33 + * 微信卡券类型. + * + * @author chenyixin + * @date 2019-09-07 23:33 **/ public enum WxCardType { - MEMBER_CARD("MEMBER_CARD"), - GROUPON("GROUPON"), - CASH("CASH"), - DISCOUNT("DISCOUNT"), - GIFT("GIFT"), - GENERAL_COUPON("GENERAL_COUPON"); + MEMBER_CARD("MEMBER_CARD"), + GROUPON("GROUPON"), + CASH("CASH"), + DISCOUNT("DISCOUNT"), + GIFT("GIFT"), + GENERAL_COUPON("GENERAL_COUPON"); - private String code; + private String code; - WxCardType(String code) { - this.code = code; - } + WxCardType(String code) { + this.code = code; + } - public String getCode() { - return code; - } + public String getCode() { + return code; + } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java index 9654559a..11382889 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java @@ -5,8 +5,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** + * 快速创建的小程序的账号基本信息. + * * @author Hipple - * @description 快速创建的小程序的账号基本信息 * @since 2019/1/23 14:39 */ @Data diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java index db334eb3..825285a1 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java @@ -7,8 +7,9 @@ import lombok.EqualsAndHashCode; import java.util.List; /** + * 获取小程序已经设置的类目结果类. + * * @author Hipple - * @description 获取小程序已经设置的类目结果类 * @since 2019/1/26 18:27 */ @Data diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java index 650f2b08..eed76934 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java @@ -5,8 +5,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** + * 微信认证名称检测结果类. + * * @author Hipple - * @description 微信认证名称检测结果类 * @since 2019/1/26 17:39 */ @Data diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java index d6e85064..fa8fd1d5 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java @@ -5,8 +5,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** + * 查询改名状态实体类. + * * @author Hipple - * @description 查询改名状态实体类 * @since 2019/1/26 17:52 */ @EqualsAndHashCode(callSuper = true) diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java index 2716dfa5..3beee9b2 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java @@ -5,8 +5,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** + * 设置小程序名称结果类. + * * @author Hipple - * @description 设置小程序名称结果类 * @since 2019/1/26 17:39 */ @Data diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java index 1fa20e63..c774d8f0 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java @@ -8,13 +8,15 @@ import me.chanjar.weixin.open.bean.result.WxFastMaAccountBasicInfoResult; import java.lang.reflect.Type; /** + * . + * * @author Hipple - * @description * @since 2019/1/23 15:02 */ public class WxFastMaAccountBasicInfoGsonAdapter implements JsonDeserializer { @Override - public WxFastMaAccountBasicInfoResult deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + public WxFastMaAccountBasicInfoResult deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) + throws JsonParseException { WxFastMaAccountBasicInfoResult accountBasicInfo = new WxFastMaAccountBasicInfoResult(); JsonObject jsonObject = jsonElement.getAsJsonObject(); @@ -24,19 +26,22 @@ public class WxFastMaAccountBasicInfoGsonAdapter implements JsonDeserializer() { - }.getType()); + WxFastMaAccountBasicInfoResult.WxVerifyInfo verifyInfo = WxOpenGsonBuilder.create() + .fromJson(jsonObject.get("wx_verify_info"), + new TypeToken() { + }.getType()); accountBasicInfo.setWxVerifyInfo(verifyInfo); - WxFastMaAccountBasicInfoResult.SignatureInfo signatureInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("signature_info"), - new TypeToken() { - }.getType()); + WxFastMaAccountBasicInfoResult.SignatureInfo signatureInfo = WxOpenGsonBuilder.create() + .fromJson(jsonObject.get("signature_info"), + new TypeToken() { + }.getType()); accountBasicInfo.setSignatureInfo(signatureInfo); - WxFastMaAccountBasicInfoResult.HeadImageInfo headImageInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("head_image_info"), - new TypeToken() { - }.getType()); + WxFastMaAccountBasicInfoResult.HeadImageInfo headImageInfo = WxOpenGsonBuilder.create() + .fromJson(jsonObject.get("head_image_info"), + new TypeToken() { + }.getType()); accountBasicInfo.setHeadImageInfo(headImageInfo); return accountBasicInfo; From 779f1d08a92b351c91d7cb5825a524b609b911ce Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 22 Sep 2019 23:26:09 +0800 Subject: [PATCH 48/79] =?UTF-8?q?:bug:=20#1220=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E6=B0=B8=E4=B9=85=E7=B4=A0=E6=9D=90?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E9=83=A8=E5=88=86okhttp=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=9C=89=E9=97=AE=E9=A2=98=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MaterialDeleteOkhttpRequestExecutor.java | 36 +++++++++---------- ...MaterialNewsInfoOkhttpRequestExecutor.java | 4 +-- .../MaterialUploadOkhttpRequestExecutor.java | 2 -- ...aterialVideoInfoOkhttpRequestExecutor.java | 9 ++--- ...AndImageDownloadOkhttpRequestExecutor.java | 7 +++- .../api/impl/WxMpMaterialServiceImplTest.java | 21 +++++++---- 6 files changed, 45 insertions(+), 34 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java index 2f435ab4..15064413 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java @@ -1,24 +1,24 @@ package me.chanjar.weixin.mp.util.requestexecuter.material; -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import com.google.common.collect.ImmutableMap; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.ResponseHandler; import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo; -import okhttp3.FormBody; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import okhttp3.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; /** - * Created by ecoolper on 2017/5/5. + * . + * + * @author ecoolper + * @date 2017/5/5 */ public class MaterialDeleteOkhttpRequestExecutor extends MaterialDeleteRequestExecutor { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -28,25 +28,25 @@ public class MaterialDeleteOkhttpRequestExecutor extends MaterialDeleteRequestEx } @Override - public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException { + public void execute(String uri, String data, ResponseHandler handler, WxType wxType) + throws WxErrorException, IOException { handler.handle(this.execute(uri, data, wxType)); } @Override public Boolean execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException { logger.debug("MaterialDeleteOkhttpRequestExecutor is running"); - //得到httpClient - OkHttpClient client = requestHttp.getRequestHttpClient(); - RequestBody requestBody = new FormBody.Builder().add("media_id", materialId).build(); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), + WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId))); Request request = new Request.Builder().url(uri).post(requestBody).build(); - Response response = client.newCall(request).execute(); + Response response = requestHttp.getRequestHttpClient().newCall(request).execute(); String responseContent = response.body().string(); WxError error = WxError.fromJson(responseContent, WxType.MP); if (error.getErrorCode() != 0) { throw new WxErrorException(error); - } else { - return true; } + + return true; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java index d8b07737..9a0b2c68 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java @@ -28,13 +28,11 @@ public class MaterialNewsInfoOkhttpRequestExecutor extends MaterialNewsInfoReque @Override public WxMpMaterialNews execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException { - OkHttpClient client = requestHttp.getRequestHttpClient(); - RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId))); Request request = new Request.Builder().url(uri).post(requestBody).build(); - Response response = client.newCall(request).execute(); + Response response = requestHttp.getRequestHttpClient().newCall(request).execute(); String responseContent = response.body().string(); log.debug("响应原始数据:{}", responseContent); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java index 5a651427..9f034def 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java @@ -38,8 +38,6 @@ public class MaterialUploadOkhttpRequestExecutor extends MaterialUploadRequestEx throw new FileNotFoundException(); } - //得到httpClient - OkHttpClient client = requestHttp.getRequestHttpClient(); MultipartBody.Builder bodyBuilder = new MultipartBody.Builder() diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java index edcc5277..b626fe93 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java @@ -1,10 +1,12 @@ package me.chanjar.weixin.mp.util.requestexecuter.material; +import com.google.common.collect.ImmutableMap; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.mp.bean.material.WxMpMaterialVideoInfoResult; import okhttp3.*; import org.slf4j.Logger; @@ -25,12 +27,11 @@ public class MaterialVideoInfoOkhttpRequestExecutor extends MaterialVideoInfoReq @Override public WxMpMaterialVideoInfoResult execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException { logger.debug("MaterialVideoInfoOkhttpRequestExecutor is running"); - //得到httpClient - OkHttpClient client = requestHttp.getRequestHttpClient(); - RequestBody requestBody = new FormBody.Builder().add("media_id", materialId).build(); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), + WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId))); Request request = new Request.Builder().url(uri).post(requestBody).build(); - Response response = client.newCall(request).execute(); + Response response = requestHttp.getRequestHttpClient().newCall(request).execute(); String responseContent = response.body().string(); WxError error = WxError.fromJson(responseContent, WxType.MP); if (error.getErrorCode() != 0) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java index 5c0ddb6a..39869b6c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java @@ -1,10 +1,12 @@ package me.chanjar.weixin.mp.util.requestexecuter.material; +import com.google.common.collect.ImmutableMap; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; import okhttp3.*; import okio.BufferedSink; import okio.Okio; @@ -27,7 +29,9 @@ public class MaterialVoiceAndImageDownloadOkhttpRequestExecutor extends Material public InputStream execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException { logger.debug("MaterialVoiceAndImageDownloadOkhttpRequestExecutor is running"); OkHttpClient client = requestHttp.getRequestHttpClient(); - RequestBody requestBody = new FormBody.Builder().add("media_id", materialId).build(); + + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), + WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId))); Request request = new Request.Builder().url(uri).get().post(requestBody).build(); Response response = client.newCall(request).execute(); String contentTypeHeader = response.header("Content-Type"); @@ -35,6 +39,7 @@ public class MaterialVoiceAndImageDownloadOkhttpRequestExecutor extends Material String responseContent = response.body().string(); throw new WxErrorException(WxError.fromJson(responseContent, WxType.MP)); } + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); BufferedSink sink = Okio.buffer(Okio.sink(outputStream))) { sink.writeAll(response.body().source()); return new ByteArrayInputStream(outputStream.toByteArray()); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java index afca1a2a..024697cb 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java @@ -9,16 +9,16 @@ import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.test.ApiTestModule; import me.chanjar.weixin.mp.api.test.TestConstants; import me.chanjar.weixin.mp.bean.material.*; -import org.testng.annotations.*; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.*; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; +import static org.testng.Assert.*; /** * 素材管理相关接口的测试 @@ -27,7 +27,7 @@ import static org.testng.Assert.assertTrue; * @author codepiano * @author Binary Wang */ -@Test(groups = "materialAPI") +@Test @Guice(modules = ApiTestModule.class) public class WxMpMaterialServiceImplTest { @Inject @@ -175,7 +175,7 @@ public class WxMpMaterialServiceImplTest { } } - @Test(dependsOnMethods = {"testAddNews","testUploadMaterial"}) + @Test(dependsOnMethods = {"testAddNews", "testUploadMaterial"}) public void testGetNewsInfo() throws WxErrorException { WxMpMaterialNews wxMpMaterialNewsSingle = this.wxService .getMaterialService().materialNewsInfo(this.singleNewsMediaId); @@ -243,6 +243,15 @@ public class WxMpMaterialServiceImplTest { @Test(dependsOnMethods = {"testMaterialFileList"}, dataProvider = "allTestMaterial") public void testDeleteMaterial(String mediaId) throws WxErrorException { + this.delete(mediaId); + } + + @Test + public void testDeleteMaterialDirectly() throws WxErrorException { + this.delete("abc"); + } + + public void delete(String mediaId) throws WxErrorException { boolean result = this.wxService.getMaterialService().materialDelete(mediaId); assertTrue(result); } From 8e97b778f3cbca2c65649d8841df511c759bce60 Mon Sep 17 00:00:00 2001 From: Boris Date: Fri, 27 Sep 2019 11:56:03 +0800 Subject: [PATCH 49/79] =?UTF-8?q?:sparkles:=20#1217=20=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E5=A2=9E=E5=8A=A0=E6=A0=A1=E9=AA=8C=E5=9B=BE=E7=89=87?= =?UTF-8?q?/=E9=9F=B3=E9=A2=91=E6=98=AF=E5=90=A6=E5=90=AB=E6=9C=89?= =?UTF-8?q?=E8=BF=9D=E6=B3=95=E8=BF=9D=E8=A7=84=E5=86=85=E5=AE=B9=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 添加 微信内容异步检测接口 * 消息route 增加 title 参数 --- .../wx/miniapp/api/WxMaSecCheckService.java | 25 ++++++++++++++++++- .../api/impl/WxMaSecCheckServiceImpl.java | 25 +++++++++++++------ .../bean/WxMaMediaAsyncCheckResult.java | 25 +++++++++++++++++++ .../wx/miniapp/constant/WxMaConstants.java | 16 ++++++++++++ .../message/WxMaMessageRouterRule.java | 19 ++++++++++++++ .../api/impl/WxMaSecCheckServiceImplTest.java | 3 ++- 6 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java index 842d0662..4c821e07 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java @@ -1,5 +1,6 @@ package cn.binarywang.wx.miniapp.api; +import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult; import java.io.File; import me.chanjar.weixin.common.error.WxErrorException; @@ -18,6 +19,8 @@ public interface WxMaSecCheckService { String MSG_SEC_CHECK_URL = "https://api.weixin.qq.com/wxa/msg_sec_check"; + String MEDIA_CHECK_ASYNC_URL = "https://api.weixin.qq.com/wxa/media_check_async"; + /** *
    * 校验一张图片是否含有违法违规内容.
@@ -39,5 +42,25 @@ public interface WxMaSecCheckService {
    * 详情请见: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sec-check/msgSecCheck.html
    * 
*/ - boolean checkMessage(String msgString); + boolean checkMessage(String msgString) throws WxErrorException; + + + /** + *
+   * 异步校验图片/音频是否含有违法违规内容。
+   * 应用场景举例:
+   * 语音风险识别:社交类用户发表的语音内容检测;
+   * 图片智能鉴黄:涉及拍照的工具类应用(如美拍,识图类应用)用户拍照上传检测;电商类商品上架图片检测;媒体类用户文章里的图片检测等;
+   * 敏感人脸识别:用户头像;媒体类用户文章里的图片检测;社交类用户上传的图片检测等。
+   * 频率限制:
+   * 单个 appId 调用上限为 2000 次/分钟,200,000 次/天;文件大小限制:单个文件大小不超过10M
+   * 详情请见:
+   * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.mediaCheckAsync.html
+   * 
+ * @param mediaUrl 要检测的多媒体url + * @param mediaType 媒体类型,{@link cn.binarywang.wx.miniapp.constant.WxMaConstants.SecCheckMediaType} + * @return + */ + WxMaMediaAsyncCheckResult mediaCheckAsync(String mediaUrl,int mediaType) throws WxErrorException; + } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java index a0d585cc..c69ca5eb 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java @@ -2,14 +2,14 @@ package cn.binarywang.wx.miniapp.api.impl; import cn.binarywang.wx.miniapp.api.WxMaSecCheckService; import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult; import com.google.gson.JsonObject; +import java.io.File; import lombok.AllArgsConstructor; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; -import java.io.File; - /** *
  *
@@ -20,6 +20,7 @@ import java.io.File;
  */
 @AllArgsConstructor
 public class WxMaSecCheckServiceImpl implements WxMaSecCheckService {
+
   private WxMaService service;
 
   @Override
@@ -31,16 +32,24 @@ public class WxMaSecCheckServiceImpl implements WxMaSecCheckService {
   }
 
   @Override
-  public boolean checkMessage(String msgString) {
+  public boolean checkMessage(String msgString) throws WxErrorException {
     JsonObject jsonObject = new JsonObject();
     jsonObject.addProperty("content", msgString);
-    try {
-      this.service.post(MSG_SEC_CHECK_URL, jsonObject.toString());
-    } catch (WxErrorException e) {
-      return false;
-    }
+
+    this.service.post(MSG_SEC_CHECK_URL, jsonObject.toString());
 
     return true;
   }
 
+  @Override
+  public WxMaMediaAsyncCheckResult mediaCheckAsync(String mediaUrl, int mediaType)
+    throws WxErrorException {
+    JsonObject jsonObject = new JsonObject();
+    jsonObject.addProperty("media_url", mediaUrl);
+    jsonObject.addProperty("media_type", mediaType);
+
+    return WxMaMediaAsyncCheckResult
+      .fromJson(this.service.post(MEDIA_CHECK_ASYNC_URL, jsonObject.toString()));
+  }
+
 }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java
new file mode 100644
index 00000000..807f8076
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java
@@ -0,0 +1,25 @@
+package cn.binarywang.wx.miniapp.bean;
+
+import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import java.io.Serializable;
+
+public class WxMaMediaAsyncCheckResult implements Serializable {
+
+  private static final long serialVersionUID = 3928132365399916183L;
+
+  /**
+   * 任务id,用于匹配异步推送结果
+   */
+  @SerializedName("trace_id")
+  private String traceId;
+
+
+  public static WxMaMediaAsyncCheckResult fromJson(String json) {
+    return WxMaGsonBuilder.create().fromJson(json, WxMaMediaAsyncCheckResult.class);
+  }
+
+  public String toJson() {
+    return WxMaGsonBuilder.create().toJson(this);
+  }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
index 1ea3595e..efd2b229 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
@@ -69,4 +69,20 @@ public class WxMaConstants {
      */
     public static final int ERR_40014 = 40014;
   }
+
+  /**
+   * 内容安全检测的媒体类型
+   */
+  public static final class SecCheckMediaType {
+
+    /**
+     * 音频
+     */
+    public static final int VOICE = 1;
+
+    /**
+     * 图片
+     */
+    public static final int IMAGE = 2;
+  }
 }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java
index 5ea3fb8a..41f3e995 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java
@@ -32,6 +32,8 @@ public class WxMaMessageRouterRule {
 
   private String rContent;
 
+  private String title;
+
   private WxMaMessageMatcher matcher;
 
   private boolean reEnter = false;
@@ -60,6 +62,16 @@ public class WxMaMessageRouterRule {
     return this;
   }
 
+  /**
+   * 标题,发送小程序页卡时有效
+   * @param title
+   * @return
+   */
+  public WxMaMessageRouterRule title(String title){
+    this.title = title;
+    return this;
+  }
+
   /**
    * 如果event等于某值.
    */
@@ -100,6 +112,8 @@ public class WxMaMessageRouterRule {
     return this;
   }
 
+
+
   /**
    * 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候.
    */
@@ -164,6 +178,8 @@ public class WxMaMessageRouterRule {
     return end();
   }
 
+
+
   /**
    * 将微信自定义的事件修正为不区分大小写.
    * 比如框架定义的事件常量为click,但微信传递过来的却是CLICK
@@ -183,6 +199,9 @@ public class WxMaMessageRouterRule {
           .matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim()))
         &&
         (this.matcher == null || this.matcher.match(wxMessage))
+        &&
+        (this.title == null || this.title
+          .equals(wxMessage.getTitle() == null ? null : wxMessage.getTitle().trim()))
       ;
   }
 
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
index df9ccaa8..19bca1ca 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
@@ -38,12 +38,13 @@ public class WxMaSecCheckServiceImplTest {
     return new Object[][]{
       {"特3456书yuuo莞6543李zxcz蒜7782法fgnv级", false},
       {"完2347全dfji试3726测asad感3847知qwez到", false},
+      {"提现&下载&棋牌游戏&网页", false},
       {"hello world!", true}
     };
   }
 
   @Test(dataProvider = "secData")
-  public void testCheckMessage(String msg, boolean result) {
+  public void testCheckMessage(String msg, boolean result) throws WxErrorException {
     assertThat(this.wxService.getSecCheckService()
       .checkMessage(msg))
       .isEqualTo(result);

From 73286d40f692159d10e20b5f02fafb9e30cef1b9 Mon Sep 17 00:00:00 2001
From: Mario Luo 
Date: Sat, 12 Oct 2019 11:45:47 +0800
Subject: [PATCH 50/79] =?UTF-8?q?:sparkles:=20#1083=20=E5=A2=9E=E5=8A=A0?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=BC=80=E6=94=BE=E5=B9=B3=E5=8F=B0=E6=A8=A1?=
 =?UTF-8?q?=E5=9D=97=E7=9A=84spring-boot-starter?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spring-boot-starters/pom.xml                  |  1 +
 .../README.md                                 | 34 +++++++
 .../wx-java-open-spring-boot-starter/pom.xml  | 73 +++++++++++++++
 .../open/config/WxOpenAutoConfiguration.java  | 17 ++++
 .../WxOpenServiceAutoConfiguration.java       | 39 ++++++++
 .../WxOpenStorageAutoConfiguration.java       | 93 +++++++++++++++++++
 .../open/properties/RedisProperties.java      | 45 +++++++++
 .../open/properties/WxOpenProperties.java     | 68 ++++++++++++++
 .../main/resources/META-INF/spring.factories  |  1 +
 9 files changed, 371 insertions(+)
 create mode 100644 spring-boot-starters/wx-java-open-spring-boot-starter/README.md
 create mode 100644 spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
 create mode 100644 spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenAutoConfiguration.java
 create mode 100644 spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java
 create mode 100644 spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java
 create mode 100644 spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java
 create mode 100644 spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java
 create mode 100644 spring-boot-starters/wx-java-open-spring-boot-starter/src/main/resources/META-INF/spring.factories

diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 34c6d1f5..96699ab2 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -21,6 +21,7 @@
     wx-java-miniapp-spring-boot-starter
     wx-java-mp-spring-boot-starter
     wx-java-pay-spring-boot-starter
+    wx-java-open-spring-boot-starter
   
 
   
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/README.md b/spring-boot-starters/wx-java-open-spring-boot-starter/README.md
new file mode 100644
index 00000000..fd00f035
--- /dev/null
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/README.md
@@ -0,0 +1,34 @@
+# wx-java-open-spring-boot-starter
+## 快速开始
+1. 引入依赖
+    ```xml
+    
+        com.github.binarywang
+        wx-java-open-spring-boot-starter
+        ${version}
+    
+    ```
+2. 添加配置(application.properties)
+    ```
+    # 开放平台配置(必填)
+    wx.open.appId = @appId
+	  wx.open.secret = @secret
+	  wx.open.token = @token
+	  wx.open.aesKey = @aesKey
+	  # 存储配置redis(可选), 优先使用(wx.open.config-storage.redis)配置的redis, 支持自定注入的JedisPool
+	  wx.open.config-storage.type = redis             # 可选值, memory(默认), redis
+	  wx.open.config-storage.redis.host = 127.0.0.1
+	  wx.open.config-storage.redis.port = 6379
+    ```
+3. 支持自动注入的类型: `WxOpenService, WxOpenMessageRouter, WxOpenComponentService`
+
+4. 覆盖自动配置: 自定义注入的bean会覆盖自动注入的
+  - WxOpenConfigStorage
+  - WxOpenService
+
+
+
+
+
+
+
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
new file mode 100644
index 00000000..d88d66d4
--- /dev/null
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -0,0 +1,73 @@
+
+
+    4.0.0
+    
+        com.github.binarywang
+        wx-java
+        3.5.2.B
+        ../../
+    
+
+    wx-java-open-spring-boot-starter
+    WxJava - Spring Boot Starter for OEPN
+    微信开放平台开发的 Spring Boot Starter
+
+    
+        2.1.4.RELEASE
+    
+
+    
+        
+            org.springframework.boot
+            spring-boot-autoconfigure
+            ${spring.boot.version}
+        
+        
+            org.springframework.boot
+            spring-boot-configuration-processor
+            ${spring.boot.version}
+            true
+        
+        
+            com.github.binarywang
+            weixin-java-open
+            ${project.version}
+        
+        
+            redis.clients
+            jedis
+            compile
+        
+        
+            org.projectlombok
+            lombok
+            provided
+        
+    
+
+    
+        
+            
+                org.springframework.boot
+                spring-boot-maven-plugin
+                ${spring.boot.version}
+            
+            
+                org.apache.maven.plugins
+                maven-source-plugin
+                2.2.1
+                
+                    
+                        attach-sources
+                        
+                            jar-no-fork
+                        
+                    
+                
+            
+        
+    
+
+
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenAutoConfiguration.java
new file mode 100644
index 00000000..0f7ecf3e
--- /dev/null
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenAutoConfiguration.java
@@ -0,0 +1,17 @@
+package com.binarywang.spring.starter.wxjava.open.config;
+
+import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+/**
+ * .
+ *
+ * @author someone
+ */
+@Configuration
+@EnableConfigurationProperties(WxOpenProperties.class)
+@Import({WxOpenStorageAutoConfiguration.class, WxOpenServiceAutoConfiguration.class})
+public class WxOpenAutoConfiguration {
+}
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java
new file mode 100644
index 00000000..b58bbccd
--- /dev/null
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java
@@ -0,0 +1,39 @@
+package com.binarywang.spring.starter.wxjava.open.config;
+
+import me.chanjar.weixin.open.api.WxOpenComponentService;
+import me.chanjar.weixin.open.api.WxOpenConfigStorage;
+import me.chanjar.weixin.open.api.WxOpenService;
+import me.chanjar.weixin.open.api.impl.WxOpenMessageRouter;
+import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 微信开放平台相关服务自动注册.
+ *
+ * @author someone
+ */
+@Configuration
+public class WxOpenServiceAutoConfiguration {
+
+    @Bean
+    @ConditionalOnMissingBean
+    public WxOpenService wxOpenService(WxOpenConfigStorage configStorage) {
+        WxOpenService wxOpenService = new WxOpenServiceImpl();
+        wxOpenService.setWxOpenConfigStorage(configStorage);
+        return wxOpenService;
+    }
+
+    @Bean
+    public WxOpenMessageRouter wxOpenMessageRouter(WxOpenService wxOpenService) {
+        return new WxOpenMessageRouter(wxOpenService);
+    }
+
+    @Bean
+    public WxOpenComponentService wxOpenComponentService(WxOpenService wxOpenService) {
+        return wxOpenService.getWxOpenComponentService();
+    }
+
+
+}
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java
new file mode 100644
index 00000000..d34de5e6
--- /dev/null
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java
@@ -0,0 +1,93 @@
+package com.binarywang.spring.starter.wxjava.open.config;
+
+import com.binarywang.spring.starter.wxjava.open.properties.RedisProperties;
+import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties;
+import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.open.api.WxOpenConfigStorage;
+import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage;
+import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+/**
+ * 微信公众号存储策略自动配置.
+ *
+ * @author someone
+ */
+@Configuration
+@RequiredArgsConstructor
+public class WxOpenStorageAutoConfiguration {
+    private final WxOpenProperties properties;
+
+    @Autowired(required = false)
+    private JedisPool jedisPool;
+
+    @Value("${wx.open.config-storage.redis.host:}")
+    private String redisHost;
+
+    @Bean
+    @ConditionalOnMissingBean(WxOpenConfigStorage.class)
+    public WxOpenConfigStorage wxOpenConfigStorage() {
+        WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
+        WxOpenProperties.StorageType type = storage.getType();
+
+        if (type == WxOpenProperties.StorageType.redis) {
+            return getWxOpenInRedisConfigStorage();
+        }
+        return getWxOpenInMemoryConfigStorage();
+    }
+
+    private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() {
+        WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage();
+        setWxOpenInfo(config);
+        return config;
+    }
+
+    private WxOpenInRedisConfigStorage getWxOpenInRedisConfigStorage() {
+        JedisPool poolToUse = jedisPool;
+        if (jedisPool == null || StringUtils.isNotEmpty(redisHost)) {
+            poolToUse = getJedisPool();
+        }
+        WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(poolToUse);
+        setWxOpenInfo(config);
+        return config;
+    }
+
+    private void setWxOpenInfo(WxOpenConfigStorage config) {
+        config.setComponentAppId(properties.getAppId());
+        config.setComponentAppSecret(properties.getSecret());
+        config.setComponentToken(properties.getToken());
+        config.setComponentAesKey(properties.getAesKey());
+    }
+
+    private JedisPool getJedisPool() {
+        WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
+        RedisProperties redis = storage.getRedis();
+
+        JedisPoolConfig config = new JedisPoolConfig();
+        if (redis.getMaxActive() != null) {
+            config.setMaxTotal(redis.getMaxActive());
+        }
+        if (redis.getMaxIdle() != null) {
+            config.setMaxIdle(redis.getMaxIdle());
+        }
+        if (redis.getMaxWaitMillis() != null) {
+            config.setMaxWaitMillis(redis.getMaxWaitMillis());
+        }
+        if (redis.getMinIdle() != null) {
+            config.setMinIdle(redis.getMinIdle());
+        }
+        config.setTestOnBorrow(true);
+        config.setTestWhileIdle(true);
+
+        JedisPool pool = new JedisPool(config, redis.getHost(), redis.getPort(),
+                redis.getTimeout(), redis.getPassword(), redis.getDatabase());
+        return pool;
+    }
+}
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java
new file mode 100644
index 00000000..c72c9edb
--- /dev/null
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java
@@ -0,0 +1,45 @@
+package com.binarywang.spring.starter.wxjava.open.properties;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Redis配置.
+ *
+ * @author someone
+ */
+@Data
+public class RedisProperties implements Serializable {
+    private static final long serialVersionUID = -5924815351660074401L;
+
+    /**
+     * 主机地址.
+     */
+    private String host = "127.0.0.1";
+
+    /**
+     * 端口号.
+     */
+    private int port = 6379;
+
+    /**
+     * 密码.
+     */
+    private String password;
+
+    /**
+     * 超时.
+     */
+    private int timeout = 2000;
+
+    /**
+     * 数据库.
+     */
+    private int database = 0;
+
+    private Integer maxActive;
+    private Integer maxIdle;
+    private Integer maxWaitMillis;
+    private Integer minIdle;
+}
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java
new file mode 100644
index 00000000..d2fe088f
--- /dev/null
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java
@@ -0,0 +1,68 @@
+package com.binarywang.spring.starter.wxjava.open.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.io.Serializable;
+
+import static com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties.PREFIX;
+import static com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties.StorageType.memory;
+
+
+/**
+ * 微信接入相关配置属性.
+ *
+ * @author someone
+ */
+@Data
+@ConfigurationProperties(PREFIX)
+public class WxOpenProperties {
+    public static final String PREFIX = "wx.open";
+
+    /**
+     * 设置微信开放平台的appid.
+     */
+    private String appId;
+
+    /**
+     * 设置微信开放平台的app secret.
+     */
+    private String secret;
+
+    /**
+     * 设置微信开放平台的token.
+     */
+    private String token;
+
+    /**
+     * 设置微信开放平台的EncodingAESKey.
+     */
+    private String aesKey;
+
+    /**
+     * 存储策略, memory, redis.
+     */
+    private ConfigStorage configStorage = new ConfigStorage();
+
+
+    @Data
+    public static class ConfigStorage implements Serializable {
+        private static final long serialVersionUID = 4815731027000065434L;
+
+        private StorageType type = memory;
+
+        private RedisProperties redis = new RedisProperties();
+
+    }
+
+    public enum StorageType {
+        /**
+         * 内存.
+         */
+        memory,
+        /**
+         * redis.
+         */
+        redis
+    }
+}
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/resources/META-INF/spring.factories b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/resources/META-INF/spring.factories
new file mode 100644
index 00000000..d46458f9
--- /dev/null
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/resources/META-INF/spring.factories
@@ -0,0 +1 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.binarywang.spring.starter.wxjava.open.config.WxOpenAutoConfiguration

From faaf7fe5c4240c0586064c9063d5251e4903889c Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 12 Oct 2019 16:50:19 +0800
Subject: [PATCH 51/79] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=B5=8B=E8=AF=95?=
 =?UTF-8?q?=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/mp/api/WxMpMiscAPITest.java        | 29 ----------------
 .../weixin/mp/api/WxMpShortUrlAPITest.java    | 33 -------------------
 .../mp/api/impl/BaseWxMpServiceImplTest.java  | 21 ++++++++++++
 3 files changed, 21 insertions(+), 62 deletions(-)
 delete mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
 delete mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java

diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
deleted file mode 100644
index d8ed016b..00000000
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package me.chanjar.weixin.mp.api;
-
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.test.ApiTestModule;
-import org.testng.*;
-import org.testng.annotations.*;
-
-import java.util.Arrays;
-
-/**
- * @author chanjarster
- */
-@Test(groups = "miscAPI")
-@Guice(modules = ApiTestModule.class)
-public class WxMpMiscAPITest {
-
-  @Inject
-  protected WxMpService wxService;
-
-  @Test
-  public void testGetCallbackIP() throws WxErrorException {
-    String[] ipArray = this.wxService.getCallbackIP();
-    System.out.println(Arrays.toString(ipArray));
-    Assert.assertNotNull(ipArray);
-    Assert.assertNotEquals(ipArray.length, 0);
-  }
-
-}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
deleted file mode 100644
index 2117b984..00000000
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package me.chanjar.weixin.mp.api;
-
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.test.ApiTestModule;
-import org.testng.*;
-import org.testng.annotations.*;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-/**
- * 测试短连接
- *
- * @author chanjarster
- */
-@Test
-@Guice(modules = ApiTestModule.class)
-public class WxMpShortUrlAPITest {
-  @Inject
-  protected WxMpService wxService;
-
-  public void testShortUrl() throws WxErrorException {
-    String shortUrl = this.wxService.shortUrl("http://www.baidu.com/test?access_token=123");
-    assertThat(shortUrl).isNotEmpty();
-    System.out.println(shortUrl);
-  }
-
-  @Test(expectedExceptions = WxErrorException.class)
-  public void testShortUrl_with_exceptional_url() throws WxErrorException {
-    this.wxService.shortUrl("http://www.baidu.com/test?redirect_count=1&access_token=123");
-  }
-
-}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
index 7f3e6ab3..18b719d9 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
@@ -11,6 +11,8 @@ import org.testng.Assert;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
+import java.util.Arrays;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -93,4 +95,23 @@ public class BaseWxMpServiceImplTest {
     Assert.assertEquals(result.getPingInfos().get(1), pingInfo);
 
   }
+
+  @Test
+  public void testGetCallbackIP() throws WxErrorException {
+    String[] ipArray = this.wxService.getCallbackIP();
+    System.out.println(Arrays.toString(ipArray));
+    Assert.assertNotNull(ipArray);
+    Assert.assertNotEquals(ipArray.length, 0);
+  }
+
+  public void testShortUrl() throws WxErrorException {
+    String shortUrl = this.wxService.shortUrl("http://www.baidu.com/test?access_token=123");
+    assertThat(shortUrl).isNotEmpty();
+    System.out.println(shortUrl);
+  }
+
+  @Test(expectedExceptions = WxErrorException.class)
+  public void testShortUrl_with_exceptional_url() throws WxErrorException {
+    this.wxService.shortUrl("http://www.baidu.com/test?redirect_count=1&access_token=123");
+  }
 }

From 2899978dfa2ce6035b989a874df1e01056cfaf28 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 13 Oct 2019 14:33:20 +0800
Subject: [PATCH 52/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.6.B?=
 =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml                                       |  2 +-
 spring-boot-starters/pom.xml                  |  2 +-
 .../pom.xml                                   |  2 +-
 .../wx-java-mp-spring-boot-starter/pom.xml    |  2 +-
 .../wx-java-open-spring-boot-starter/pom.xml  | 36 +++++--------------
 .../wx-java-pay-spring-boot-starter/pom.xml   |  2 +-
 weixin-java-common/pom.xml                    |  2 +-
 weixin-java-cp/pom.xml                        |  2 +-
 weixin-java-miniapp/pom.xml                   |  2 +-
 weixin-java-mp/pom.xml                        |  2 +-
 weixin-java-open/pom.xml                      |  2 +-
 weixin-java-pay/pom.xml                       |  2 +-
 12 files changed, 19 insertions(+), 39 deletions(-)

diff --git a/pom.xml b/pom.xml
index 1a3b3e58..406de16e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
   4.0.0
   com.github.binarywang
   wx-java
-  3.5.5.B
+  3.5.6.B
   pom
   WxJava - Weixin/Wechat Java SDK
   微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 96699ab2..9834950f 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.5.B
+    3.5.6.B
   
   pom
   wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 59c63947..b6a2345f 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.5.5.B
+    3.5.6.B
   
   4.0.0
 
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index cb21543b..f8e3f8f2 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.5.5.B
+    3.5.6.B
   
   4.0.0
 
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index d88d66d4..1508ed92 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -2,34 +2,19 @@
 
-    4.0.0
-    
-        com.github.binarywang
-        wx-java
-        3.5.2.B
-        ../../
-    
+  
+    wx-java-spring-boot-starters
+    com.github.binarywang
+    3.5.6.B
+  
+  4.0.0
 
     wx-java-open-spring-boot-starter
-    WxJava - Spring Boot Starter for OEPN
+    WxJava - Spring Boot Starter for WxOpen
     微信开放平台开发的 Spring Boot Starter
 
-    
-        2.1.4.RELEASE
-    
-
     
-        
-            org.springframework.boot
-            spring-boot-autoconfigure
-            ${spring.boot.version}
-        
-        
-            org.springframework.boot
-            spring-boot-configuration-processor
-            ${spring.boot.version}
-            true
-        
+
         
             com.github.binarywang
             weixin-java-open
@@ -40,11 +25,6 @@
             jedis
             compile
         
-        
-            org.projectlombok
-            lombok
-            provided
-        
     
 
     
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 6382a3c8..edd90417 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.5.5.B
+    3.5.6.B
   
   4.0.0
 
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index cabc80a6..d6954f4e 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.5.B
+    3.5.6.B
   
 
   weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 96029425..b221da69 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.5.B
+    3.5.6.B
   
 
   weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index c622ec60..b806ccc1 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.5.B
+    3.5.6.B
   
 
   weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index d22b43d6..471417a1 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.5.B
+    3.5.6.B
   
 
   weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index faf6db8d..bf7a32e3 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.5.B
+    3.5.6.B
   
 
   weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index 005bbfee..2854cbbe 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.5.B
+    3.5.6.B
   
   4.0.0
 

From e33601ce7850298014256b04e713cf0486250e04 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Mon, 14 Oct 2019 16:49:34 +0800
Subject: [PATCH 53/79] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E6=96=B0?=
 =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=9A=84=E4=B8=8D=E8=A7=84=E8=8C=83=E4=BB=A3?=
 =?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wx-java-open-spring-boot-starter/pom.xml  |  75 ++++++------
 .../WxOpenServiceAutoConfiguration.java       |  30 ++---
 .../WxOpenStorageAutoConfiguration.java       | 110 +++++++++---------
 .../open/properties/RedisProperties.java      |  62 +++++-----
 .../open/properties/WxOpenProperties.java     |  74 ++++++------
 5 files changed, 175 insertions(+), 176 deletions(-)

diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index 1508ed92..990af158 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -9,45 +9,44 @@
   
   4.0.0
 
-    wx-java-open-spring-boot-starter
-    WxJava - Spring Boot Starter for WxOpen
-    微信开放平台开发的 Spring Boot Starter
+  wx-java-open-spring-boot-starter
+  WxJava - Spring Boot Starter for WxOpen
+  微信开放平台开发的 Spring Boot Starter
 
-    
+  
+    
+      com.github.binarywang
+      weixin-java-open
+      ${project.version}
+    
+    
+      redis.clients
+      jedis
+      compile
+    
+  
 
-        
-            com.github.binarywang
-            weixin-java-open
-            ${project.version}
-        
-        
-            redis.clients
-            jedis
-            compile
-        
-    
-
-    
-        
-            
-                org.springframework.boot
-                spring-boot-maven-plugin
-                ${spring.boot.version}
-            
-            
-                org.apache.maven.plugins
-                maven-source-plugin
-                2.2.1
-                
-                    
-                        attach-sources
-                        
-                            jar-no-fork
-                        
-                    
-                
-            
-        
-    
+  
+    
+      
+        org.springframework.boot
+        spring-boot-maven-plugin
+        ${spring.boot.version}
+      
+      
+        org.apache.maven.plugins
+        maven-source-plugin
+        2.2.1
+        
+          
+            attach-sources
+            
+              jar-no-fork
+            
+          
+        
+      
+    
+  
 
 
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java
index b58bbccd..a2114868 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenServiceAutoConfiguration.java
@@ -17,23 +17,23 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 public class WxOpenServiceAutoConfiguration {
 
-    @Bean
-    @ConditionalOnMissingBean
-    public WxOpenService wxOpenService(WxOpenConfigStorage configStorage) {
-        WxOpenService wxOpenService = new WxOpenServiceImpl();
-        wxOpenService.setWxOpenConfigStorage(configStorage);
-        return wxOpenService;
-    }
+  @Bean
+  @ConditionalOnMissingBean
+  public WxOpenService wxOpenService(WxOpenConfigStorage configStorage) {
+    WxOpenService wxOpenService = new WxOpenServiceImpl();
+    wxOpenService.setWxOpenConfigStorage(configStorage);
+    return wxOpenService;
+  }
 
-    @Bean
-    public WxOpenMessageRouter wxOpenMessageRouter(WxOpenService wxOpenService) {
-        return new WxOpenMessageRouter(wxOpenService);
-    }
+  @Bean
+  public WxOpenMessageRouter wxOpenMessageRouter(WxOpenService wxOpenService) {
+    return new WxOpenMessageRouter(wxOpenService);
+  }
 
-    @Bean
-    public WxOpenComponentService wxOpenComponentService(WxOpenService wxOpenService) {
-        return wxOpenService.getWxOpenComponentService();
-    }
+  @Bean
+  public WxOpenComponentService wxOpenComponentService(WxOpenService wxOpenService) {
+    return wxOpenService.getWxOpenComponentService();
+  }
 
 
 }
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java
index d34de5e6..5b575519 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java
@@ -23,71 +23,71 @@ import redis.clients.jedis.JedisPoolConfig;
 @Configuration
 @RequiredArgsConstructor
 public class WxOpenStorageAutoConfiguration {
-    private final WxOpenProperties properties;
+  private final WxOpenProperties properties;
 
-    @Autowired(required = false)
-    private JedisPool jedisPool;
+  @Autowired(required = false)
+  private JedisPool jedisPool;
 
-    @Value("${wx.open.config-storage.redis.host:}")
-    private String redisHost;
+  @Value("${wx.open.config-storage.redis.host:}")
+  private String redisHost;
 
-    @Bean
-    @ConditionalOnMissingBean(WxOpenConfigStorage.class)
-    public WxOpenConfigStorage wxOpenConfigStorage() {
-        WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
-        WxOpenProperties.StorageType type = storage.getType();
+  @Bean
+  @ConditionalOnMissingBean(WxOpenConfigStorage.class)
+  public WxOpenConfigStorage wxOpenConfigStorage() {
+    WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
+    WxOpenProperties.StorageType type = storage.getType();
 
-        if (type == WxOpenProperties.StorageType.redis) {
-            return getWxOpenInRedisConfigStorage();
-        }
-        return getWxOpenInMemoryConfigStorage();
+    if (type == WxOpenProperties.StorageType.redis) {
+      return getWxOpenInRedisConfigStorage();
     }
+    return getWxOpenInMemoryConfigStorage();
+  }
 
-    private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() {
-        WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage();
-        setWxOpenInfo(config);
-        return config;
-    }
-
-    private WxOpenInRedisConfigStorage getWxOpenInRedisConfigStorage() {
-        JedisPool poolToUse = jedisPool;
-        if (jedisPool == null || StringUtils.isNotEmpty(redisHost)) {
-            poolToUse = getJedisPool();
-        }
-        WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(poolToUse);
-        setWxOpenInfo(config);
-        return config;
-    }
+  private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() {
+    WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage();
+    setWxOpenInfo(config);
+    return config;
+  }
 
-    private void setWxOpenInfo(WxOpenConfigStorage config) {
-        config.setComponentAppId(properties.getAppId());
-        config.setComponentAppSecret(properties.getSecret());
-        config.setComponentToken(properties.getToken());
-        config.setComponentAesKey(properties.getAesKey());
+  private WxOpenInRedisConfigStorage getWxOpenInRedisConfigStorage() {
+    JedisPool poolToUse = jedisPool;
+    if (jedisPool == null || StringUtils.isNotEmpty(redisHost)) {
+      poolToUse = getJedisPool();
     }
+    WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(poolToUse);
+    setWxOpenInfo(config);
+    return config;
+  }
 
-    private JedisPool getJedisPool() {
-        WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
-        RedisProperties redis = storage.getRedis();
+  private void setWxOpenInfo(WxOpenConfigStorage config) {
+    config.setComponentAppId(properties.getAppId());
+    config.setComponentAppSecret(properties.getSecret());
+    config.setComponentToken(properties.getToken());
+    config.setComponentAesKey(properties.getAesKey());
+  }
 
-        JedisPoolConfig config = new JedisPoolConfig();
-        if (redis.getMaxActive() != null) {
-            config.setMaxTotal(redis.getMaxActive());
-        }
-        if (redis.getMaxIdle() != null) {
-            config.setMaxIdle(redis.getMaxIdle());
-        }
-        if (redis.getMaxWaitMillis() != null) {
-            config.setMaxWaitMillis(redis.getMaxWaitMillis());
-        }
-        if (redis.getMinIdle() != null) {
-            config.setMinIdle(redis.getMinIdle());
-        }
-        config.setTestOnBorrow(true);
-        config.setTestWhileIdle(true);
+  private JedisPool getJedisPool() {
+    WxOpenProperties.ConfigStorage storage = properties.getConfigStorage();
+    RedisProperties redis = storage.getRedis();
 
-        JedisPool pool = new JedisPool(config, redis.getHost(), redis.getPort(),
-                redis.getTimeout(), redis.getPassword(), redis.getDatabase());
-        return pool;
+    JedisPoolConfig config = new JedisPoolConfig();
+    if (redis.getMaxActive() != null) {
+      config.setMaxTotal(redis.getMaxActive());
+    }
+    if (redis.getMaxIdle() != null) {
+      config.setMaxIdle(redis.getMaxIdle());
     }
+    if (redis.getMaxWaitMillis() != null) {
+      config.setMaxWaitMillis(redis.getMaxWaitMillis());
+    }
+    if (redis.getMinIdle() != null) {
+      config.setMinIdle(redis.getMinIdle());
+    }
+    config.setTestOnBorrow(true);
+    config.setTestWhileIdle(true);
+
+    JedisPool pool = new JedisPool(config, redis.getHost(), redis.getPort(),
+      redis.getTimeout(), redis.getPassword(), redis.getDatabase());
+    return pool;
+  }
 }
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java
index c72c9edb..565afa07 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java
@@ -11,35 +11,35 @@ import java.io.Serializable;
  */
 @Data
 public class RedisProperties implements Serializable {
-    private static final long serialVersionUID = -5924815351660074401L;
-
-    /**
-     * 主机地址.
-     */
-    private String host = "127.0.0.1";
-
-    /**
-     * 端口号.
-     */
-    private int port = 6379;
-
-    /**
-     * 密码.
-     */
-    private String password;
-
-    /**
-     * 超时.
-     */
-    private int timeout = 2000;
-
-    /**
-     * 数据库.
-     */
-    private int database = 0;
-
-    private Integer maxActive;
-    private Integer maxIdle;
-    private Integer maxWaitMillis;
-    private Integer minIdle;
+  private static final long serialVersionUID = -5924815351660074401L;
+
+  /**
+   * 主机地址.
+   */
+  private String host = "127.0.0.1";
+
+  /**
+   * 端口号.
+   */
+  private int port = 6379;
+
+  /**
+   * 密码.
+   */
+  private String password;
+
+  /**
+   * 超时.
+   */
+  private int timeout = 2000;
+
+  /**
+   * 数据库.
+   */
+  private int database = 0;
+
+  private Integer maxActive;
+  private Integer maxIdle;
+  private Integer maxWaitMillis;
+  private Integer minIdle;
 }
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java
index d2fe088f..64cc3d06 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java
@@ -17,52 +17,52 @@ import static com.binarywang.spring.starter.wxjava.open.properties.WxOpenPropert
 @Data
 @ConfigurationProperties(PREFIX)
 public class WxOpenProperties {
-    public static final String PREFIX = "wx.open";
+  public static final String PREFIX = "wx.open";
 
-    /**
-     * 设置微信开放平台的appid.
-     */
-    private String appId;
+  /**
+   * 设置微信开放平台的appid.
+   */
+  private String appId;
 
-    /**
-     * 设置微信开放平台的app secret.
-     */
-    private String secret;
+  /**
+   * 设置微信开放平台的app secret.
+   */
+  private String secret;
 
-    /**
-     * 设置微信开放平台的token.
-     */
-    private String token;
+  /**
+   * 设置微信开放平台的token.
+   */
+  private String token;
 
-    /**
-     * 设置微信开放平台的EncodingAESKey.
-     */
-    private String aesKey;
+  /**
+   * 设置微信开放平台的EncodingAESKey.
+   */
+  private String aesKey;
 
-    /**
-     * 存储策略, memory, redis.
-     */
-    private ConfigStorage configStorage = new ConfigStorage();
+  /**
+   * 存储策略, memory, redis.
+   */
+  private ConfigStorage configStorage = new ConfigStorage();
 
 
-    @Data
-    public static class ConfigStorage implements Serializable {
-        private static final long serialVersionUID = 4815731027000065434L;
+  @Data
+  public static class ConfigStorage implements Serializable {
+    private static final long serialVersionUID = 4815731027000065434L;
 
-        private StorageType type = memory;
+    private StorageType type = memory;
 
-        private RedisProperties redis = new RedisProperties();
+    private RedisProperties redis = new RedisProperties();
 
-    }
+  }
 
-    public enum StorageType {
-        /**
-         * 内存.
-         */
-        memory,
-        /**
-         * redis.
-         */
-        redis
-    }
+  public enum StorageType {
+    /**
+     * 内存.
+     */
+    memory,
+    /**
+     * redis.
+     */
+    redis
+  }
 }

From 902ba61e73f974f88d2fbd14b310b1b4f771b31e Mon Sep 17 00:00:00 2001
From: S 
Date: Wed, 16 Oct 2019 11:12:23 +0800
Subject: [PATCH 54/79] =?UTF-8?q?:sparkles:=20#1239=20=E5=A2=9E=E5=8A=A0?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=AE=A2=E9=98=85?=
 =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/common/error/WxMaErrorMsgEnum.java |  8 ++
 .../wx/miniapp/api/WxMaMsgService.java        | 11 +++
 .../miniapp/api/impl/WxMaMsgServiceImpl.java  | 15 ++++
 .../wx/miniapp/bean/WxMaSubscribeData.java    | 30 ++++++++
 .../wx/miniapp/bean/WxMaSubscribeMessage.java | 77 +++++++++++++++++++
 .../wx/miniapp/util/json/WxMaGsonBuilder.java |  2 +
 .../json/WxMaSubscribeMessageGsonAdapter.java | 40 ++++++++++
 .../api/impl/WxMaMsgServiceImplTest.java      | 20 ++++-
 8 files changed, 199 insertions(+), 4 deletions(-)
 create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeData.java
 create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java
 create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaSubscribeMessageGsonAdapter.java

diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java
index 9650ce41..f1ced3fd 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMaErrorMsgEnum.java
@@ -444,6 +444,14 @@ public enum WxMaErrorMsgEnum {
   CODE_85064(85064, "找不到模版/草稿"),
 
   CODE_85065(85065, "模版库已满"),
+
+  /**
+   * 小程序订阅消息错误码
+   * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
+   */
+  CODE_43101(43101, "用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系"),
+
+  CODE_47003(47003, "模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错"),
   ;
 
   private int code;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java
index f0dbccd8..3dec5140 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java
@@ -1,6 +1,7 @@
 package cn.binarywang.wx.miniapp.api;
 
 import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
+import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
 import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
 import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -15,6 +16,7 @@ import me.chanjar.weixin.common.error.WxErrorException;
 public interface WxMaMsgService {
   String KEFU_MESSAGE_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
   String TEMPLATE_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send";
+  String SUBSCRIBE_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send";
   String UNIFORM_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send";
 
   /**
@@ -36,6 +38,15 @@ public interface WxMaMsgService {
   void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException;
 
 
+  /**
+   * 
+   * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
+   * 
+ * 发送订阅消息 + */ + void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException; + + /** *
    * 下发小程序和公众号统一的服务消息
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
index c4cb456e..26ebd74b 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
@@ -3,6 +3,7 @@ package cn.binarywang.wx.miniapp.api.impl;
 import cn.binarywang.wx.miniapp.api.WxMaMsgService;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
+import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
 import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
 import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
@@ -27,6 +28,11 @@ public class WxMaMsgServiceImpl implements WxMaMsgService {
     return responseContent != null;
   }
 
+  /**
+   * 
+   * 小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能
+   * 
+ */ @Override public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException { String responseContent = this.wxMaService.post(TEMPLATE_MSG_SEND_URL, templateMessage.toJson()); @@ -36,6 +42,15 @@ public class WxMaMsgServiceImpl implements WxMaMsgService { } } + @Override + public void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException { + String responseContent = this.wxMaService.post(SUBSCRIBE_MSG_SEND_URL, subscribeMessage.toJson()); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + } + @Override public void sendUniformMsg(WxMaUniformMessage uniformMessage) throws WxErrorException { String responseContent = this.wxMaService.post(UNIFORM_MSG_SEND_URL, uniformMessage.toJson()); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeData.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeData.java new file mode 100644 index 00000000..048e6dae --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeData.java @@ -0,0 +1,30 @@ +package cn.binarywang.wx.miniapp.bean; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *
+ * 参考文档 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
+ * 
+ */ +@Data +@NoArgsConstructor +public class WxMaSubscribeData { + private String name; + private String value; + private String color; + + public WxMaSubscribeData(String name, String value) { + this.name = name; + this.value = value; + } + + public WxMaSubscribeData(String name, String value, String color) { + this.name = name; + this.value = value; + this.color = color; + } + + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java new file mode 100644 index 00000000..a43fd5b4 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java @@ -0,0 +1,77 @@ +package cn.binarywang.wx.miniapp.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.*; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 订阅消息. + * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class WxMaSubscribeMessage implements Serializable { + + private static final long serialVersionUID = 6846729898251286686L; + + /** + * 接收者(用户)的 openid. + *
+   * 参数:touser
+   * 是否必填: 是
+   * 描述: 接收者(用户)的 openid
+   * 
+ */ + private String toUser; + + /** + * 所需下发的模板消息的id. + *
+   * 参数:template_id
+   * 是否必填: 是
+   * 描述: 所需下发的模板消息的id
+   * 
+ */ + private String templateId; + + /** + * 点击模板卡片后的跳转页面,仅限本小程序内的页面. + *
+   * 参数:page
+   * 是否必填: 否
+   * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
+   * 
+ */ + private String page; + + /** + * 模板内容,不填则下发空模板. + *
+   * 参数:data
+   * 是否必填: 是
+   * 描述: 模板内容,不填则下发空模板
+   * 
+ */ + private List data; + + + public WxMaSubscribeMessage addData(WxMaSubscribeData datum) { + if (this.data == null) { + this.data = new ArrayList<>(); + } + this.data.add(datum); + + return this; + } + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java index f01eb33d..5fab9de7 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java @@ -1,5 +1,6 @@ package cn.binarywang.wx.miniapp.util.json; +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; import cn.binarywang.wx.miniapp.bean.analysis.WxMaRetainInfo; @@ -19,6 +20,7 @@ public class WxMaGsonBuilder { static { INSTANCE.disableHtmlEscaping(); INSTANCE.registerTypeAdapter(WxMaTemplateMessage.class, new WxMaTemplateMessageGsonAdapter()); + INSTANCE.registerTypeAdapter(WxMaSubscribeMessage.class, new WxMaSubscribeMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMaUniformMessage.class, new WxMaUniformMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMaCodeCommitRequest.class, new WxMaCodeCommitRequestGsonAdapter()); INSTANCE.registerTypeAdapter(WxMaCodeVersionDistribution.class, new WxMaCodeVersionDistributionGsonAdapter()); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaSubscribeMessageGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaSubscribeMessageGsonAdapter.java new file mode 100644 index 00000000..d15226a9 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaSubscribeMessageGsonAdapter.java @@ -0,0 +1,40 @@ +package cn.binarywang.wx.miniapp.util.json; + +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeData; +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; +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; + +public class WxMaSubscribeMessageGsonAdapter implements JsonSerializer { + + @Override + public JsonElement serialize(WxMaSubscribeMessage message, Type typeOfSrc, JsonSerializationContext context) { + JsonObject messageJson = new JsonObject(); + messageJson.addProperty("touser", message.getToUser()); + messageJson.addProperty("template_id", message.getTemplateId()); + if (message.getPage() != null) { + messageJson.addProperty("page", message.getPage()); + } + + + JsonObject data = new JsonObject(); + messageJson.add("data", data); + + if (message.getData() == null) { + return messageJson; + } + + for (WxMaSubscribeData datum : message.getData()) { + JsonObject dataJson = new JsonObject(); + dataJson.addProperty("value", datum.getValue()); + data.add(datum.getName(), dataJson); + } + + return messageJson; + } + +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java index 298a9c93..f5f62cc5 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java @@ -3,13 +3,10 @@ package cn.binarywang.wx.miniapp.api.impl; import java.text.SimpleDateFormat; import java.util.Date; +import cn.binarywang.wx.miniapp.bean.*; import org.testng.annotations.*; import cn.binarywang.wx.miniapp.api.WxMaService; -import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; -import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; import cn.binarywang.wx.miniapp.test.ApiTestModule; import cn.binarywang.wx.miniapp.test.TestConfig; import com.google.common.collect.Lists; @@ -59,6 +56,21 @@ public class WxMaMsgServiceImplTest { this.wxService.getMsgService().sendTemplateMsg(templateMessage); } + + @Test + public void testSendSubscribeMsg() throws WxErrorException { + TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); + + WxMaSubscribeMessage message = new WxMaSubscribeMessage(); + message.setTemplateId(config.getTemplateId()); + message.setToUser(config.getOpenid()); + message.addData(new WxMaSubscribeData("thing1", "苹果到货啦")); + message.addData(new WxMaSubscribeData("amount3", "¥5")); + message.addData(new WxMaSubscribeData("thing5", "记得领取哦")); + this.wxService.getMsgService().sendSubscribeMsg(message); + } + + @Test public void testSendUniformMsg() throws WxErrorException { TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); From 829ca6f9e2c96755bf8ddd0828a592bc4e71b14f Mon Sep 17 00:00:00 2001 From: TheoNie Date: Wed, 16 Oct 2019 16:51:03 +0800 Subject: [PATCH 55/79] =?UTF-8?q?:sparkles:=20#1235=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=9B=BE=E5=83=8F=E5=A4=84=E7=90=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 图像处理二维码识别接口 * 图像处理图像高清化接口 * 公众号图像处理智能裁剪接口 --- .../weixin/mp/api/WxMpImgProcService.java | 121 ++++++++++ .../me/chanjar/weixin/mp/api/WxMpService.java | 13 ++ .../mp/api/impl/BaseWxMpServiceImpl.java | 11 + .../mp/api/impl/WxMpImgProcServiceImpl.java | 104 +++++++++ .../bean/imgproc/WxMpImgProcAiCropResult.java | 60 +++++ .../bean/imgproc/WxMpImgProcQrCodeResult.java | 93 ++++++++ .../WxMpImgProcSuperResolutionResult.java | 28 +++ .../chanjar/weixin/mp/enums/WxMpApiUrl.java | 45 ++++ .../api/impl/WxMpImgProcServiceImplTest.java | 213 ++++++++++++++++++ 9 files changed, 688 insertions(+) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcAiCropResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcQrCodeResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcSuperResolutionResult.java create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java new file mode 100644 index 00000000..63cea28e --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java @@ -0,0 +1,121 @@ +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult; +import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult; +import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult; + +import java.io.File; + +/** + * 多项图像处理能力相关的API. + * https://developers.weixin.qq.com/doc/offiaccount/Intelligent_Interface/Img_Proc.html + * + * @author Theo Nie + */ +public interface WxMpImgProcService { + + /** + * 二维码/条码识别接口 + * 说明: + * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 + * 2.文件大小限制:小于2M + * 3.支持条码、二维码、DataMatrix和PDF417的识别。 + * 4.二维码、DataMatrix会返回位置坐标,条码和PDF417暂不返回位置坐标。 + * + * @param imgUrl 图片url地址 + * @return WxMpImgProcQrCodeResult + * @throws WxErrorException . + */ + WxMpImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException; + + /** + * 二维码/条码识别接口 + * 说明: + * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 + * 2.文件大小限制:小于2M + * 3.支持条码、二维码、DataMatrix和PDF417的识别。 + * 4.二维码、DataMatrix会返回位置坐标,条码和PDF417暂不返回位置坐标。 + * + * @param imgFile 图片文件对象 + * @return WxMpImgProcQrCodeResult + * @throws WxErrorException . + */ + WxMpImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException; + + /** + * 图片高清化接口 + * 说明: + * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 + * 2.文件大小限制:小于2M + * 3.目前支持将图片超分辨率高清化2倍,即生成图片分辨率为原图2倍大小 + * 返回的media_id有效期为3天,期间可以通过“获取临时素材”接口获取图片二进制 + * + * @param imgUrl 图片url地址 + * @return WxMpImgProcSuperResolutionResult + * @throws WxErrorException . + */ + WxMpImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException; + + /** + * 图片高清化接口 + * 说明: + * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 + * 2.文件大小限制:小于2M + * 3.目前支持将图片超分辨率高清化2倍,即生成图片分辨率为原图2倍大小 + * 返回的media_id有效期为3天,期间可以通过“获取临时素材”接口获取图片二进制 + * + * @param imgFile 图片文件对象 + * @return WxMpImgProcSuperResolutionResult + * @throws WxErrorException . + */ + WxMpImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException; + + /** + * 图片智能裁剪接口 + * 说明: + * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 + * 2.文件大小限制:小于2M + * 3.该接口默认使用最佳宽高比 + * @param imgUrl 图片url地址 + * @return WxMpImgProcAiCropResult + * @throws WxErrorException . + */ + WxMpImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException; + + /** + * 图片智能裁剪接口 + * 说明: + * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 + * 2.文件大小限制:小于2M + * @param imgUrl 图片url地址 + * @param ratios 宽高比,最多支持5个,请以英文逗号分隔 + * @return WxMpImgProcAiCropResult + * @throws WxErrorException . + */ + WxMpImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException; + + /** + * 图片智能裁剪接口 + * 说明: + * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 + * 2.文件大小限制:小于2M + * 3.该接口默认使用最佳宽高比 + * @param imgFile 图片文件对象 + * @return WxMpImgProcAiCropResult + * @throws WxErrorException . + */ + WxMpImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException; + + /** + * 图片智能裁剪接口 + * 说明: + * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 + * 2.文件大小限制:小于2M + * @param imgFile 图片文件对象 + * @param ratios 宽高比,最多支持5个,请以英文逗号分隔 + * @return WxMpImgProcAiCropResult + * @throws WxErrorException . + */ + WxMpImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException; +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 069175de..2d95b4f4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -522,6 +522,12 @@ public interface WxMpService { */ WxMpOcrService getOcrService(); + /** + * 返回图像处理接口的实现类对象,以方便调用其各个接口. + * @return WxMpImgProcService + */ + WxMpImgProcService getImgProcService(); + /** * . * @@ -648,6 +654,13 @@ public interface WxMpService { */ void setOcrService(WxMpOcrService ocrService); + /** + * . + * + * @param imgProcService . + */ + void setImgProcService(WxMpImgProcService imgProcService); + /** * 返回评论数据管理接口方法的实现类对象,以方便调用其各个接口. * diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java index c4499305..e57099e9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java @@ -67,6 +67,7 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH private WxMpMarketingService marketingService = new WxMpMarketingServiceImpl(this); private WxMpCommentService commentService = new WxMpCommentServiceImpl(this); private WxMpOcrService ocrService = new WxMpOcrServiceImpl(this); + private WxMpImgProcService imgProcService = new WxMpImgProcServiceImpl(this); private Map configStorageMap; @@ -647,4 +648,14 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH public void setCommentService(WxMpCommentService commentService) { this.commentService = commentService; } + + @Override + public WxMpImgProcService getImgProcService() { + return this.imgProcService; + } + + @Override + public void setImgProcService(WxMpImgProcService imgProcService) { + this.imgProcService = imgProcService; + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java new file mode 100644 index 00000000..8f59a8f1 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImpl.java @@ -0,0 +1,104 @@ +package me.chanjar.weixin.mp.api.impl; + +import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpImgProcService; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult; +import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult; +import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult; +import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.AI_CROP; +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.FILE_AI_CROP; +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.FILE_QRCODE; +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.FILE_SUPER_RESOLUTION; +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.QRCODE; +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.SUPER_RESOLUTION; + +/** + * 图像处理接口实现. + * @author Theo Nie + */ +@RequiredArgsConstructor +public class WxMpImgProcServiceImpl implements WxMpImgProcService { + private final WxMpService wxMpService; + + @Override + public WxMpImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException { + try { + imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + //ignore + } + + final String result = this.wxMpService.get(String.format(QRCODE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl), null); + return WxMpImgProcQrCodeResult.fromJson(result); + } + + @Override + public WxMpImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException { + String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_QRCODE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile); + return WxMpImgProcQrCodeResult.fromJson(result); + } + + @Override + public WxMpImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException { + try { + imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + //ignore + } + + final String result = this.wxMpService.get(String.format(SUPER_RESOLUTION.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl), null); + return WxMpImgProcSuperResolutionResult.fromJson(result); + } + + @Override + public WxMpImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException { + String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_SUPER_RESOLUTION.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile); + return WxMpImgProcSuperResolutionResult.fromJson(result); + } + + @Override + public WxMpImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException { + return this.aiCrop(imgUrl, ""); + } + + @Override + public WxMpImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException { + try { + imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + //ignore + } + + if (StringUtils.isEmpty(ratios)) { + ratios = ""; + } + + final String result = this.wxMpService.get(String.format(AI_CROP.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl, ratios), null); + return WxMpImgProcAiCropResult.fromJson(result); + } + + @Override + public WxMpImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException { + return this.aiCrop(imgFile, ""); + } + + @Override + public WxMpImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException { + if (StringUtils.isEmpty(ratios)) { + ratios = ""; + } + + String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), String.format(FILE_AI_CROP.getUrl(this.wxMpService.getWxMpConfigStorage()), ratios), imgFile); + return WxMpImgProcAiCropResult.fromJson(result); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcAiCropResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcAiCropResult.java new file mode 100644 index 00000000..ef25670d --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcAiCropResult.java @@ -0,0 +1,60 @@ +package me.chanjar.weixin.mp.bean.imgproc; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * @author Theo Nie + */ +@Data +public class WxMpImgProcAiCropResult implements Serializable { + private static final long serialVersionUID = -6470673963772979463L; + + @SerializedName("img_size") + private ImgSize imgSize; + @SerializedName("results") + private List results; + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + + public static WxMpImgProcAiCropResult fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpImgProcAiCropResult.class); + } + + @Data + public static class ImgSize { + @SerializedName("w") + private int w; + @SerializedName("h") + private int h; + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + } + + @Data + public static class Results { + @SerializedName("crop_left") + private int cropLeft; + @SerializedName("crop_top") + private int cropTop; + @SerializedName("crop_right") + private int cropRight; + @SerializedName("crop_bottom") + private int cropBottom; + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcQrCodeResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcQrCodeResult.java new file mode 100644 index 00000000..a897e7f6 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcQrCodeResult.java @@ -0,0 +1,93 @@ +package me.chanjar.weixin.mp.bean.imgproc; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * 二维码/条码识别返回结果 + * @author Theo Nie + */ +@Data +public class WxMpImgProcQrCodeResult implements Serializable { + + private static final long serialVersionUID = -1194154790100866123L; + @SerializedName("img_size") + private ImgSize imgSize; + @SerializedName("code_results") + private List codeResults; + + @Data + public static class ImgSize implements Serializable{ + private static final long serialVersionUID = -8847603245514017839L; + @SerializedName("w") + private int w; + @SerializedName("h") + private int h; + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + } + + @Data + public static class CodeResults implements Serializable{ + private static final long serialVersionUID = -6138135951229076759L; + @SerializedName("type_name") + private String typeName; + @SerializedName("data") + private String data; + @SerializedName("pos") + private Pos pos; + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + + @Data + public static class Pos implements Serializable{ + private static final long serialVersionUID = 7754894061212819602L; + @SerializedName("left_top") + private Coordinate leftTop; + @SerializedName("right_top") + private Coordinate rightTop; + @SerializedName("right_bottom") + private Coordinate rightBottom; + @SerializedName("left_bottom") + private Coordinate leftBottom; + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + + @Data + public static class Coordinate implements Serializable{ + private static final long serialVersionUID = 8930443668927359677L; + @SerializedName("x") + private int x; + @SerializedName("y") + private int y; + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + } + } + } + + public static WxMpImgProcQrCodeResult fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpImgProcQrCodeResult.class); + } + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcSuperResolutionResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcSuperResolutionResult.java new file mode 100644 index 00000000..b9d78f4f --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/imgproc/WxMpImgProcSuperResolutionResult.java @@ -0,0 +1,28 @@ +package me.chanjar.weixin.mp.bean.imgproc; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; + +/** + * 图片高清化返回结果 + * @author Theo Nie + */ +@Data +public class WxMpImgProcSuperResolutionResult implements Serializable { + + private static final long serialVersionUID = 8007440280170407021L; + @SerializedName("media_id") + private String mediaId; + + @Override + public String toString() { + return WxMpGsonBuilder.create().toJson(this); + } + + public static WxMpImgProcSuperResolutionResult fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpImgProcSuperResolutionResult.class); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java index 5a10dea4..df62324d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java @@ -954,4 +954,49 @@ public interface WxMpApiUrl { return buildUrl(config.getHostConfig(), prefix, path); } } + + @AllArgsConstructor + enum ImgProc implements WxMpApiUrl { + /** + * 二维码/条码识别 + */ + QRCODE(API_DEFAULT_HOST_URL, "/cv/img/qrcode?img_url=%s"), + + /** + * 二维码/条码识别(文件) + */ + FILE_QRCODE(API_DEFAULT_HOST_URL, "/cv/img/qrcode"), + + /** + * 图片高清化 + */ + SUPER_RESOLUTION(API_DEFAULT_HOST_URL, "/cv/img/superresolution?img_url=%s"), + + /** + * 图片高清化(文件) + */ + FILE_SUPER_RESOLUTION(API_DEFAULT_HOST_URL, "/cv/img/superresolution"), + + /** + * 图片智能裁剪 + */ + AI_CROP(API_DEFAULT_HOST_URL, "/cv/img/aicrop?img_url=%s&ratios=%s"), + + /** + * 图片智能裁剪(文件) + */ + FILE_AI_CROP(API_DEFAULT_HOST_URL, "/cv/img/aicrop?ratios=%s"); + + private String prefix; + private String path; + + @Override + public String getUrl(WxMpConfigStorage config) { + if (null == config) { + return buildUrl(null, prefix, path); + } + return buildUrl(config.getHostConfig(), prefix, path); + } + } + } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java new file mode 100644 index 00000000..37f6ab72 --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java @@ -0,0 +1,213 @@ +package me.chanjar.weixin.mp.api.impl; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.fs.FileUtils; +import me.chanjar.weixin.mp.api.WxMpImgProcService; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.test.ApiTestModule; +import me.chanjar.weixin.mp.api.test.TestConstants; +import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult; +import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult; +import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import javax.inject.Inject; + +import java.io.File; +import java.io.InputStream; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +@Test +@Guice(modules = ApiTestModule.class) +public class WxMpImgProcServiceImplTest { + @Inject + private WxMpService mpService; + + @Test + public void testQrCode() throws WxErrorException { + final WxMpImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testQrCode2() throws Exception { + InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxMpImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode(tempFile); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testSuperResolution() throws WxErrorException { + final WxMpImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testSuperResolution2() throws Exception { + InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxMpImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution(tempFile); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testAiCrop() throws WxErrorException { + final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testAiCrop2() throws WxErrorException { + final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png", "1,2.35"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testAiCrop3() throws Exception { + InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testAiCrop4() throws Exception { + InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); + File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); + final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile, "1,2.35,3.5"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + public static class mockTest { + private WxMpService wxService = mock(WxMpService.class); + + @Test + public void testQrCode() throws Exception { + String returnJson = "{\n" + + " \"errcode\": 0, \n" + + " \"errmsg\": \"ok\", \n" + + " \"code_results\": [\n" + + " {\n" + + " \"type_name\": \"QR_CODE\", \n" + + " \"data\": \"https://www.qq.com\", \n" + + " \"pos\": {\n" + + " \"left_top\": {\n" + + " \"x\": 585, \n" + + " \"y\": 378\n" + + " }, \n" + + " \"right_top\": {\n" + + " \"x\": 828, \n" + + " \"y\": 378\n" + + " }, \n" + + " \"right_bottom\": {\n" + + " \"x\": 828, \n" + + " \"y\": 618\n" + + " }, \n" + + " \"left_bottom\": {\n" + + " \"x\": 585, \n" + + " \"y\": 618\n" + + " }\n" + + " }\n" + + " }, \n" + + " {\n" + + " \"type_name\": \"QR_CODE\", \n" + + " \"data\": \"https://mp.weixin.qq.com\", \n" + + " \"pos\": {\n" + + " \"left_top\": {\n" + + " \"x\": 185, \n" + + " \"y\": 142\n" + + " }, \n" + + " \"right_top\": {\n" + + " \"x\": 396, \n" + + " \"y\": 142\n" + + " }, \n" + + " \"right_bottom\": {\n" + + " \"x\": 396, \n" + + " \"y\": 353\n" + + " }, \n" + + " \"left_bottom\": {\n" + + " \"x\": 185, \n" + + " \"y\": 353\n" + + " }\n" + + " }\n" + + " }, \n" + + " {\n" + + " \"type_name\": \"EAN_13\", \n" + + " \"data\": \"5906789678957\"\n" + + " }, \n" + + " {\n" + + " \"type_name\": \"CODE_128\", \n" + + " \"data\": \"50090500019191\"\n" + + " }\n" + + " ], \n" + + " \"img_size\": {\n" + + " \"w\": 1000, \n" + + " \"h\": 900\n" + + " }\n" + + "}"; + when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService); + final WxMpImgProcQrCodeResult result = wxMpImgProcService.qrCode("abc"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testSuperResolution() throws Exception { + String returnJson = "{\n" + + " \"errcode\": 0, \n" + + " \"errmsg\": \"ok\", \n" + + " \"media_id\": \"6WXsIXkG7lXuDLspD9xfm5dsvHzb0EFl0li6ySxi92ap8Vl3zZoD9DpOyNudeJGB\"\n" + + "}"; + when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService); + final WxMpImgProcSuperResolutionResult result = wxMpImgProcService.superResolution("abc"); + assertThat(result).isNotNull(); + System.out.println(result); + } + + @Test + public void testAiCrop() throws Exception { + String returnJson = "{\n" + + " \"errcode\": 0, \n" + + " \"errmsg\": \"ok\", \n" + + " \"results\": [ //智能裁剪结果\n" + + " {\n" + + " \"crop_left\": 112, \n" + + " \"crop_top\": 0, \n" + + " \"crop_right\": 839, \n" + + " \"crop_bottom\": 727\n" + + " }, \n" + + " {\n" + + " \"crop_left\": 0, \n" + + " \"crop_top\": 205, \n" + + " \"crop_right\": 965, \n" + + " \"crop_bottom\": 615\n" + + " }\n" + + " ], \n" + + " \"img_size\": { //图片大小\n" + + " \"w\": 966, \n" + + " \"h\": 728\n" + + " }\n" + + "}"; + when(wxService.get(anyString(), anyString())).thenReturn(returnJson); + final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService); + final WxMpImgProcAiCropResult result = wxMpImgProcService.aiCrop("abc"); + assertThat(result).isNotNull(); + System.out.println(result); + } + } +} From 8fb05730a2bcc9f8a150a02ce748d45e3240b164 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 16 Oct 2019 17:13:38 +0800 Subject: [PATCH 56/79] =?UTF-8?q?:memo:=20=E9=83=A8=E5=88=86java=E7=B1=BB?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=A2=9E=E5=8A=A0javadoc=EF=BC=8C=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E5=BC=80=E5=8F=91=E8=80=85=E9=9A=8F=E6=97=B6=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/cp/bean/WxCpAppChatMessage.java | 35 ++++++++++++++++++- .../chanjar/weixin/cp/bean/WxCpMessage.java | 1 - .../weixin/cp/bean/article/MpnewsArticle.java | 22 ++++++++++++ .../weixin/cp/bean/article/NewArticle.java | 17 +++++++-- 4 files changed, 70 insertions(+), 5 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAppChatMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAppChatMessage.java index 0af13a84..9aa2a2fc 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAppChatMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAppChatMessage.java @@ -6,9 +6,9 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import me.chanjar.weixin.cp.constant.WxCpConsts.AppChatMsgType; import me.chanjar.weixin.cp.bean.article.MpnewsArticle; import me.chanjar.weixin.cp.bean.article.NewArticle; +import me.chanjar.weixin.cp.constant.WxCpConsts.AppChatMsgType; import java.io.Serializable; import java.util.List; @@ -28,16 +28,49 @@ import java.util.List; public class WxCpAppChatMessage implements Serializable { private static final long serialVersionUID = -5469013416372240229L; + /** + * 消息类型 + */ private String msgType; + /** + * 消息内容 + */ private String content; + /** + * 群聊id + */ private String chatId; + /** + * 图片媒体文件id,可以调用上传临时素材接口获取 + */ private String mediaId; + /** + * 视频消息的标题,不超过128个字节,超过会自动截断 + */ private String title; + /** + * 视频消息的描述,不超过512个字节,超过会自动截断 + */ private String description; + /** + * 表示是否是保密消息 + */ private Boolean safe; + /** + * 点击后跳转的链接。 + */ private String url; + /** + * 按钮文字。 默认为“详情”, 不超过4个文字,超过自动截断。 + */ private String btnTxt; + /** + * 图文消息,一个图文消息支持1到8条图文 + */ private List articles; + /** + * Mpnews图文消息,一个图文消息支持1到8条图文 + */ private List mpnewsArticles; /** diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java index b07e3d54..b39c2229 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java @@ -8,7 +8,6 @@ import me.chanjar.weixin.cp.bean.article.MpnewsArticle; import me.chanjar.weixin.cp.bean.article.NewArticle; import me.chanjar.weixin.cp.bean.messagebuilder.*; import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton; -import me.chanjar.weixin.cp.constant.WxCpConsts; import org.apache.commons.lang3.StringUtils; import java.io.Serializable; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java index af622fef..595d12c5 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java @@ -17,12 +17,34 @@ import java.io.Serializable; public class MpnewsArticle implements Serializable { private static final long serialVersionUID = 6985871812170756481L; + /** + * 标题,不超过128个字节,超过会自动截断 + */ private String title; + /** + * 图文消息缩略图的media_id, 可以通过素材管理接口获得。此处thumb_media_id即上传接口返回的media_id + */ private String thumbMediaId; + /** + * 图文消息的作者,不超过64个字节 + */ private String author; + /** + * 图文消息点击“阅读原文”之后的页面链接 + */ private String contentSourceUrl; + /** + * 图文消息的内容,支持html标签,不超过666 K个字节 + */ private String content; + /** + * 图文消息的描述,不超过512个字节,超过会自动截断 + */ private String digest; + /** + * 可能已经废弃了,官方文档里已经看不到了 + */ + @Deprecated private String showCoverPic; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java index d5e74c44..5eede5fa 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.cp.bean.article; -import java.io.Serializable; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serializable; + /** *
  *  Created by BinaryWang on 2017/3/27.
@@ -20,10 +20,21 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 public class NewArticle implements Serializable {
   private static final long serialVersionUID = 4087852055781140659L;
-
+  /**
+   * 标题,不超过128个字节,超过会自动截断
+   */
   private String title;
+  /**
+   * 描述,不超过512个字节,超过会自动截断
+   */
   private String description;
+  /**
+   * 点击后跳转的链接。
+   */
   private String url;
+  /**
+   * 图文消息的图片链接,支持JPG、PNG格式,较好的效果为大图1068*455,小图150*150。
+   */
   private String picUrl;
 
 }

From 67128b02db3cc1e051ca6bd21c1cb188ee828188 Mon Sep 17 00:00:00 2001
From: Gawegor 
Date: Thu, 17 Oct 2019 09:39:38 +0800
Subject: [PATCH 57/79] =?UTF-8?q?:bug:=20=20#1241=20=E4=BF=AE=E6=AD=A3?=
 =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=AF=B9=E8=B4=A6=E5=8D=95=E6=8E=A5=E5=8F=A3?=
 =?UTF-8?q?=E4=B8=AD=E9=94=99=E8=AF=AF=E4=BB=A3=E7=A0=81=E2=80=9CNO=20Bill?=
 =?UTF-8?q?=20Exist=E2=80=9D=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=8E=E5=AE=9E?=
 =?UTF-8?q?=E9=99=85=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/github/binarywang/wxpay/constant/WxPayErrorCode.java   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayErrorCode.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayErrorCode.java
index 0cb7568f..e2cafda9 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayErrorCode.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayErrorCode.java
@@ -459,9 +459,10 @@ public class WxPayErrorCode {
      * 描述:账单不存在.
      * 原因:当前商户号没有已成交的订单,不生成对账单
      * 解决方案:请检查当前商户号在指定日期内是否有成功的交易。
+     * 错误:微信官方文档这个错误的字符串显示是'NO Bill Exist'('o'是大写),实际返回是'No Bill Exist'('o'是小写)
      * 
*/ - public static final String NO_Bill_Exist = "NO Bill Exist"; + public static final String NO_Bill_Exist = "No Bill Exist"; /** *

From 48586de7d966a8fd77aa1749b93d70cee4252b39 Mon Sep 17 00:00:00 2001
From: TheoNie 
Date: Fri, 18 Oct 2019 17:22:17 +0800
Subject: [PATCH 58/79] =?UTF-8?q?:sparkles:=09#1242=20=E5=85=AC=E4=BC=97?=
 =?UTF-8?q?=E5=8F=B7OCR=E6=8E=A5=E5=8F=A3=E8=A1=A5=E5=85=85=E5=AE=8C?=
 =?UTF-8?q?=E5=96=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* 公众号ocr银行卡识别接口

* 公众号ocr行驶证识别接口

* 公众号ocr驾驶证识别接口

* 公众号营业执照Ocr识别接口

* 公众号通用印刷体OCR识别接口

* 去掉身份证Ocr接口中已经废弃的type参数
---
 .../chanjar/weixin/mp/api/WxMpOcrService.java | 121 +++++-
 .../mp/api/impl/WxMpOcrServiceImpl.java       | 119 +++++-
 .../mp/bean/ocr/WxMpOcrBankCardResult.java    |  28 ++
 .../mp/bean/ocr/WxMpOcrBizLicenseResult.java  | 107 ++++++
 .../weixin/mp/bean/ocr/WxMpOcrCommResult.java |  45 +++
 .../bean/ocr/WxMpOcrDrivingLicenseResult.java |  80 ++++
 .../mp/bean/ocr/WxMpOcrDrivingResult.java     | 132 +++++++
 .../weixin/mp/bean/ocr/WxMpOcrImgSize.java    |  25 ++
 .../weixin/mp/bean/ocr/WxMpOcrPos.java        |  43 +++
 .../chanjar/weixin/mp/enums/WxMpApiUrl.java   |  53 ++-
 .../mp/api/impl/WxMpOcrServiceImplTest.java   | 350 +++++++++++++++++-
 11 files changed, 1071 insertions(+), 32 deletions(-)
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java
index 1748b553..f7986d24 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java
@@ -1,8 +1,11 @@
 package me.chanjar.weixin.mp.api;
 
-import lombok.AllArgsConstructor;
-import lombok.Getter;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult;
 import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult;
 
 import java.io.File;
@@ -15,36 +18,114 @@ import java.io.File;
  * @date 2019-06-22
  */
 public interface WxMpOcrService {
-  @AllArgsConstructor
-  @Getter
-  enum ImageType {
-    /**
-     * 拍照模型,带背景的图片.
-     */
-    PHOTO("photo"),
-    /**
-     * 扫描模式,不带背景的图片.
-     */
-    SCAN("scan");
-
-    private String type;
-  }
 
   /**
    * 身份证OCR识别接口.
    *
-   * @param imgType 图片类型
    * @param imgUrl  图片url地址
+   * @return WxMpOcrIdCardResult
    * @throws WxErrorException .
    */
-  WxMpOcrIdCardResult idCard(ImageType imgType, String imgUrl) throws WxErrorException;
+  WxMpOcrIdCardResult idCard(String imgUrl) throws WxErrorException;
 
   /**
    * 身份证OCR识别接口.
    *
-   * @param imgType 图片类型
    * @param imgFile 图片文件对象
+   * @return WxMpOcrIdCardResult
    * @throws WxErrorException .
    */
-  WxMpOcrIdCardResult idCard(ImageType imgType, File imgFile) throws WxErrorException;
+  WxMpOcrIdCardResult idCard(File imgFile) throws WxErrorException;
+
+  /**
+   * 银行卡OCR识别接口
+   * 文件大小限制:小于2M
+   * @param imgUrl 图片url地址
+   * @return WxMpOcrBankCardResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrBankCardResult bankCard(String imgUrl) throws WxErrorException;
+
+  /**
+   * 银行卡OCR识别接口
+   * 文件大小限制:小于2M
+   * @param imgFile 图片文件对象
+   * @return WxMpOcrBankCardResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrBankCardResult bankCard(File imgFile) throws WxErrorException;
+
+  /**
+   * 行驶证OCR识别接口
+   * 文件大小限制:小于2M
+   * @param imgUrl 图片url地址
+   * @return WxMpOcrDrivingResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrDrivingResult driving(String imgUrl) throws WxErrorException;
+
+  /**
+   * 行驶证OCR识别接口
+   * 文件大小限制:小于2M
+   * @param imgFile 图片文件对象
+   * @return WxMpOcrDrivingResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrDrivingResult driving(File imgFile) throws WxErrorException;
+
+  /**
+   * 驾驶证OCR识别接口
+   * 文件大小限制:小于2M
+   * @param imgUrl 图片url地址
+   * @return WxMpOcrDrivingLicenseResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException;
+
+  /**
+   * 驾驶证OCR识别接口
+   * 文件大小限制:小于2M
+   * @param imgFile 图片文件对象
+   * @return WxMpOcrDrivingLicenseResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException;
+
+  /**
+   * 营业执照OCR识别接口
+   * 文件大小限制:小于2M
+   * @param imgUrl 图片url地址
+   * @return WxMpOcrBizLicenseResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException;
+
+  /**
+   * 营业执照OCR识别接口
+   * 文件大小限制:小于2M
+   * @param imgFile 图片文件对象
+   * @return WxMpOcrBizLicenseResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException;
+
+  /**
+   * 通用印刷体OCR识别接口
+   * 文件大小限制:小于2M
+   * 适用于屏幕截图、印刷体照片等场景
+   * @param imgUrl 图片url地址
+   * @return WxMpOcrCommResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrCommResult comm(String imgUrl) throws WxErrorException;
+
+  /**
+   * 通用印刷体OCR识别接口
+   * 文件大小限制:小于2M
+   * 适用于屏幕截图、印刷体照片等场景
+   * @param imgFile 图片文件对象
+   * @return WxMpOcrCommResult
+   * @throws WxErrorException .
+   */
+  WxMpOcrCommResult comm(File imgFile) throws WxErrorException;
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java
index 0f52f2af..118a02c9 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java
@@ -4,6 +4,11 @@ import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpOcrService;
 import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult;
 import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult;
 import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor;
 
@@ -12,7 +17,17 @@ import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.BANK_CARD;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.BIZ_LICENSE;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.COMM;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.DRIVING;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.DRIVING_LICENSE;
 import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.FILEIDCARD;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.FILE_BANK_CARD;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.FILE_BIZ_LICENSE;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.FILE_COMM;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.FILE_DRIVING;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.FILE_DRIVING_LICENSE;
 import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.IDCARD;
 
 /**
@@ -26,7 +41,7 @@ public class WxMpOcrServiceImpl implements WxMpOcrService {
   private final WxMpService wxMpService;
 
   @Override
-  public WxMpOcrIdCardResult idCard(ImageType imgType, String imgUrl) throws WxErrorException {
+  public WxMpOcrIdCardResult idCard(String imgUrl) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
@@ -34,14 +49,108 @@ public class WxMpOcrServiceImpl implements WxMpOcrService {
     }
 
     final String result = this.wxMpService.get(String.format(IDCARD.getUrl(this.wxMpService.getWxMpConfigStorage()),
-      imgType.getType(), imgUrl), null);
+      imgUrl), null);
     return WxMpOcrIdCardResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrIdCardResult idCard(ImageType imgType, File imgFile) throws WxErrorException {
-    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), String.format(FILEIDCARD.getUrl(this.wxMpService.getWxMpConfigStorage()),
-      imgType.getType()), imgFile);
+  public WxMpOcrIdCardResult idCard(File imgFile) throws WxErrorException {
+    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILEIDCARD.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
     return WxMpOcrIdCardResult.fromJson(result);
   }
+
+  @Override
+  public WxMpOcrBankCardResult bankCard(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.wxMpService.get(String.format(BANK_CARD.getUrl(this.wxMpService.getWxMpConfigStorage()),
+      imgUrl), null);
+    return WxMpOcrBankCardResult.fromJson(result);
+  }
+
+  @Override
+  public WxMpOcrBankCardResult bankCard(File imgFile) throws WxErrorException {
+    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_BANK_CARD.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
+    return WxMpOcrBankCardResult.fromJson(result);
+  }
+
+  @Override
+  public WxMpOcrDrivingResult driving(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.wxMpService.get(String.format(DRIVING.getUrl(this.wxMpService.getWxMpConfigStorage()),
+      imgUrl), null);
+    return WxMpOcrDrivingResult.fromJson(result);
+  }
+
+  @Override
+  public WxMpOcrDrivingResult driving(File imgFile) throws WxErrorException {
+    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_DRIVING.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
+    return WxMpOcrDrivingResult.fromJson(result);
+  }
+
+  @Override
+  public WxMpOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.wxMpService.get(String.format(DRIVING_LICENSE.getUrl(this.wxMpService.getWxMpConfigStorage()),
+      imgUrl), null);
+    return WxMpOcrDrivingLicenseResult.fromJson(result);
+  }
+
+  @Override
+  public WxMpOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException {
+    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_DRIVING_LICENSE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
+    return WxMpOcrDrivingLicenseResult.fromJson(result);
+  }
+
+  @Override
+  public WxMpOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.wxMpService.get(String.format(BIZ_LICENSE.getUrl(this.wxMpService.getWxMpConfigStorage()),
+      imgUrl), null);
+    return WxMpOcrBizLicenseResult.fromJson(result);
+  }
+
+  @Override
+  public WxMpOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException {
+    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_BIZ_LICENSE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
+    return WxMpOcrBizLicenseResult.fromJson(result);
+  }
+
+  @Override
+  public WxMpOcrCommResult comm(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.wxMpService.get(String.format(COMM.getUrl(this.wxMpService.getWxMpConfigStorage()),
+      imgUrl), null);
+    return WxMpOcrCommResult.fromJson(result);
+  }
+
+  @Override
+  public WxMpOcrCommResult comm(File imgFile) throws WxErrorException {
+    String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_COMM.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile);
+    return WxMpOcrCommResult.fromJson(result);
+  }
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java
new file mode 100644
index 00000000..9b76a315
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java
@@ -0,0 +1,28 @@
+package me.chanjar.weixin.mp.bean.ocr;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 银行卡OCR识别结果
+ * @author Theo Nie
+ */
+@Data
+public class WxMpOcrBankCardResult implements Serializable {
+
+  private static final long serialVersionUID = 554136620394204143L;
+  @SerializedName("number")
+  private String number;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  public static WxMpOcrBankCardResult fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrBankCardResult.class);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java
new file mode 100644
index 00000000..aa97fc83
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java
@@ -0,0 +1,107 @@
+package me.chanjar.weixin.mp.bean.ocr;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * @author Theo Nie
+ */
+@Data
+public class WxMpOcrBizLicenseResult implements Serializable {
+  private static final long serialVersionUID = -5007671093920178291L;
+
+  /**
+   * 注册号
+   */
+  @SerializedName("reg_num")
+  private String regNum;
+  /**
+   * 编号
+   */
+  @SerializedName("serial")
+  private String serial;
+  /**
+   * 法定代表人姓名
+   */
+  @SerializedName("legal_representative")
+  private String legalRepresentative;
+  /**
+   * 企业名称
+   */
+  @SerializedName("enterprise_name")
+  private String enterpriseName;
+  /**
+   * 组成形式
+   */
+  @SerializedName("type_of_organization")
+  private String typeOfOrganization;
+  /**
+   * 经营场所/企业住所
+   */
+  @SerializedName("address")
+  private String address;
+  /**
+   * 公司类型
+   */
+  @SerializedName("type_of_enterprise")
+  private String typeOfEnterprise;
+  /**
+   * 经营范围
+   */
+  @SerializedName("business_scope")
+  private String businessScope;
+  /**
+   * 注册资本
+   */
+  @SerializedName("registered_capital")
+  private String registeredCapital;
+  /**
+   * 实收资本
+   */
+  @SerializedName("paid_in_capital")
+  private String paidInCapital;
+  /**
+   * 营业期限
+   */
+  @SerializedName("valid_period")
+  private String validPeriod;
+  /**
+   * 注册日期/成立日期
+   */
+  @SerializedName("registered_date")
+  private String registeredDate;
+  /**
+   * 营业执照位置
+   */
+  @SerializedName("cert_position")
+  private CertPosition certPosition;
+  /**
+   * 图片大小
+   */
+  @SerializedName("img_size")
+  private WxMpOcrImgSize imgSize;
+
+  public static WxMpOcrBizLicenseResult fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrBizLicenseResult.class);
+  }
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  @Data
+  public static class CertPosition implements Serializable {
+    private static final long serialVersionUID = 290286813344131863L;
+    @SerializedName("pos")
+    private WxMpOcrPos pos;
+
+    @Override
+    public String toString() {
+      return WxMpGsonBuilder.create().toJson(this);
+    }
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java
new file mode 100644
index 00000000..cc391bdf
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java
@@ -0,0 +1,45 @@
+package me.chanjar.weixin.mp.bean.ocr;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author Theo Nie
+ */
+@Data
+public class WxMpOcrCommResult implements Serializable {
+  private static final long serialVersionUID = 455833771627756440L;
+
+  @SerializedName("img_size")
+  private WxMpOcrImgSize imgSize;
+  @SerializedName("items")
+  private List items;
+
+  public static WxMpOcrCommResult fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrCommResult.class);
+  }
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  @Data
+  public static class Items implements Serializable {
+
+    private static final long serialVersionUID = 3066181677009102791L;
+    @SerializedName("text")
+    private String text;
+    @SerializedName("pos")
+    private WxMpOcrPos pos;
+
+    @Override
+    public String toString() {
+      return WxMpGsonBuilder.create().toJson(this);
+    }
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java
new file mode 100644
index 00000000..3ef8fee9
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java
@@ -0,0 +1,80 @@
+package me.chanjar.weixin.mp.bean.ocr;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * @author Theo Nie
+ */
+@Data
+public class WxMpOcrDrivingLicenseResult implements Serializable {
+  private static final long serialVersionUID = -6984670645802585738L;
+
+  /**
+   * 证号
+   */
+  @SerializedName("id_num")
+  private String idNum;
+  /**
+   * 姓名
+   */
+  @SerializedName("name")
+  private String name;
+  /**
+   * 性别
+   */
+  @SerializedName("sex")
+  private String sex;
+  /**
+   * 国籍
+   */
+  @SerializedName("nationality")
+  private String nationality;
+  /**
+   * 住址
+   */
+  @SerializedName("address")
+  private String address;
+  /**
+   * 出生日期
+   */
+  @SerializedName("birth_date")
+  private String birthDate;
+  /**
+   * 初次领证日期
+   */
+  @SerializedName("issue_date")
+  private String issueDate;
+  /**
+   * 准驾车型
+   */
+  @SerializedName("car_class")
+  private String carClass;
+  /**
+   * 有效期限起始日
+   */
+  @SerializedName("valid_from")
+  private String validFrom;
+  /**
+   * 有效期限终止日
+   */
+  @SerializedName("valid_to")
+  private String validTo;
+  /**
+   * 印章文字
+   */
+  @SerializedName("official_seal")
+  private String officialSeal;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  public static WxMpOcrDrivingLicenseResult fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrDrivingLicenseResult.class);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java
new file mode 100644
index 00000000..3e557693
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java
@@ -0,0 +1,132 @@
+package me.chanjar.weixin.mp.bean.ocr;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * @author Theo Nie
+ */
+@Data
+public class WxMpOcrDrivingResult implements Serializable {
+
+  private static final long serialVersionUID = -7477484374200211303L;
+  /**
+   * 车牌号码
+   */
+  @SerializedName("plate_num")
+  private String plateNum;
+  /**
+   * 车辆类型
+   */
+  @SerializedName("vehicle_type")
+  private String vehicleType;
+  /**
+   * 所有人
+   */
+  @SerializedName("owner")
+  private String owner;
+  /**
+   * 住址
+   */
+  @SerializedName("addr")
+  private String addr;
+  /**
+   * 使用性质
+   */
+  @SerializedName("use_character")
+  private String useCharacter;
+  /**
+   * 品牌型号
+   */
+  @SerializedName("model")
+  private String model;
+  /**
+   * 车辆识别代码
+   */
+  @SerializedName("vin")
+  private String vin;
+  /**
+   * 发动机号码
+   */
+  @SerializedName("engine_num")
+  private String engineNum;
+  /**
+   * 注册日期
+   */
+  @SerializedName("register_date")
+  private String registerDate;
+  /**
+   * 发证日期
+   */
+  @SerializedName("issue_date")
+  private String issueDate;
+  /**
+   * 车牌号码
+   */
+  @SerializedName("plate_num_b")
+  private String plateNumB;
+  /**
+   * 号牌
+   */
+  @SerializedName("record")
+  private String record;
+  /**
+   * 核定载人数
+   */
+  @SerializedName("passengers_num")
+  private String passengersNum;
+  /**
+   * 总质量
+   */
+  @SerializedName("total_quality")
+  private String totalQuality;
+  /**
+   * 整备质量
+   */
+  @SerializedName("prepare_quality")
+  private String prepareQuality;
+  /**
+   * 外廓尺寸
+   */
+  @SerializedName("overall_size")
+  private String overallSize;
+  /**
+   * 卡片正面位置(检测到卡片正面才会返回)
+   */
+  @SerializedName("card_position_front")
+  private CardPosition cardPositionFront;
+  /**
+   * 卡片反面位置(检测到卡片反面才会返回)
+   */
+  @SerializedName("card_position_back")
+  private CardPosition cardPositionBack;
+  /**
+   * 图片大小
+   */
+  @SerializedName("img_size")
+  private WxMpOcrImgSize imgSize;
+
+  @Data
+  public static class CardPosition implements Serializable {
+    private static final long serialVersionUID = 2884515165228160517L;
+    @SerializedName("pos")
+    private WxMpOcrPos pos;
+
+    @Override
+    public String toString() {
+      return WxMpGsonBuilder.create().toJson(this);
+    }
+  }
+
+  public static WxMpOcrDrivingResult fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrDrivingResult.class);
+  }
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java
new file mode 100644
index 00000000..f30a1539
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java
@@ -0,0 +1,25 @@
+package me.chanjar.weixin.mp.bean.ocr;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * @author Theo Nie
+ */
+@Data
+public class WxMpOcrImgSize implements Serializable {
+  private static final long serialVersionUID = 5234409123551074168L;
+
+  @SerializedName("w")
+  private int w;
+  @SerializedName("h")
+  private int h;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java
new file mode 100644
index 00000000..0a4fe586
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java
@@ -0,0 +1,43 @@
+package me.chanjar.weixin.mp.bean.ocr;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * @author Theo Nie
+ */
+@Data
+public class WxMpOcrPos implements Serializable {
+  private static final long serialVersionUID = 4204160206873907920L;
+
+  @SerializedName("left_top")
+  private Coordinate leftTop;
+  @SerializedName("right_top")
+  private Coordinate rightTop;
+  @SerializedName("right_bottom")
+  private Coordinate rightBottom;
+  @SerializedName("left_bottom")
+  private Coordinate leftBottom;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  @Data
+  public static class Coordinate implements Serializable{
+    private static final long serialVersionUID = 8675059935386304399L;
+    @SerializedName("x")
+    private int x;
+    @SerializedName("y")
+    private int y;
+
+    @Override
+    public String toString() {
+      return WxMpGsonBuilder.create().toJson(this);
+    }
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
index df62324d..442f0305 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
@@ -440,9 +440,58 @@ public interface WxMpApiUrl {
     /**
      * 身份证识别.
      */
-    IDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?type=%s&img_url=%s"),
+    IDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?img_url=%s"),
 
-    FILEIDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?type=%s");
+    FILEIDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard"),
+
+    /**
+     * 银行卡OCR识别
+     */
+    BANK_CARD(API_DEFAULT_HOST_URL, "/cv/ocr/bankcard?img_url=%s"),
+
+    /**
+     * 银行卡OCR识别(文件)
+     */
+    FILE_BANK_CARD(API_DEFAULT_HOST_URL, "/cv/ocr/bankcard"),
+
+    /**
+     * 行驶证OCR识别
+     */
+    DRIVING(API_DEFAULT_HOST_URL, "/cv/ocr/driving?img_url=%s"),
+    /**
+     * 行驶证OCR识别(文件)
+     */
+    FILE_DRIVING(API_DEFAULT_HOST_URL, "/cv/ocr/driving"),
+
+    /**
+     * 驾驶证OCR识别
+     */
+    DRIVING_LICENSE(API_DEFAULT_HOST_URL, "/cv/ocr/drivinglicense?img_url=%s"),
+
+    /**
+     * 驾驶证OCR识别(文件)
+     */
+    FILE_DRIVING_LICENSE(API_DEFAULT_HOST_URL, "/cv/ocr/drivinglicense"),
+
+    /**
+     * 营业执照OCR识别
+     */
+    BIZ_LICENSE(API_DEFAULT_HOST_URL, "/cv/ocr/bizlicense?img_url=%s"),
+
+    /**
+     * 营业执照OCR识别(文件)
+     */
+    FILE_BIZ_LICENSE(API_DEFAULT_HOST_URL, "/cv/ocr/bizlicense"),
+
+    /**
+     * 通用印刷体OCR识别
+     */
+    COMM(API_DEFAULT_HOST_URL, "/cv/ocr/comm?img_url=%s"),
+
+    /**
+     * 通用印刷体OCR识别(文件)
+     */
+    FILE_COMM(API_DEFAULT_HOST_URL, "/cv/ocr/comm");
 
     private String prefix;
     private String path;
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java
index 01706065..55bfa062 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java
@@ -1,16 +1,28 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.WxMpOcrService;
+import me.chanjar.weixin.common.util.fs.FileUtils;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.test.ApiTestModule;
+import me.chanjar.weixin.mp.api.test.TestConstants;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult;
 import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult;
-import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
 import javax.inject.Inject;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.UUID;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.mock;
@@ -30,12 +42,116 @@ public class WxMpOcrServiceImplTest {
 
   @Test
   public void testIdCard() throws WxErrorException {
-    final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard(WxMpOcrService.ImageType.PHOTO,
-      "http://www.baidu.com");
+    final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard(
+      "https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testIdCard2() throws Exception {
+    InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testBankCard() throws WxErrorException {
+    final WxMpOcrBankCardResult result = this.mpService.getOcrService().bankCard("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testBankCard2() throws Exception {
+    InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxMpOcrBankCardResult result = this.mpService.getOcrService().bankCard(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testDriving() throws WxErrorException {
+    final WxMpOcrDrivingResult result = this.mpService.getOcrService().driving("https://res.wx.qq.com/op_res/T051P5uWvh9gSJ9j78tWib53WiNi2pHSSZhoO8wnY3Av-djpsA4kA9whbtt6_Tb6");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testDriving2() throws Exception {
+    InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxMpOcrDrivingResult result = this.mpService.getOcrService().driving(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testDrivingLicense() throws WxErrorException {
+    final WxMpOcrDrivingLicenseResult result = this.mpService.getOcrService().drivingLicense("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testDrivingLicense2() throws Exception {
+    InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxMpOcrDrivingLicenseResult result = this.mpService.getOcrService().drivingLicense(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testBizLicense() throws WxErrorException {
+    final WxMpOcrBizLicenseResult result = this.mpService.getOcrService().bizLicense("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testBizLicense2() throws Exception {
+    InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxMpOcrBizLicenseResult result = this.mpService.getOcrService().bizLicense(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testComm() throws WxErrorException {
+    final WxMpOcrCommResult result = this.mpService.getOcrService().comm("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
 
+  @Test
+  public void testComm2() throws Exception {
+    InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxMpOcrCommResult result = this.mpService.getOcrService().comm(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  private InputStream getImageStream(String url) {
+    try {
+      HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+      connection.setReadTimeout(5000);
+      connection.setConnectTimeout(5000);
+      connection.setRequestMethod("GET");
+      if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
+        return connection.getInputStream();
+      }
+    } catch (IOException e) {
+      System.out.println("获取网络图片出现异常,图片路径为:" + url);
+    }
+    return null;
+  }
+
   public static class MockTest {
     private WxMpService wxService = mock(WxMpService.class);
 
@@ -46,7 +162,231 @@ public class WxMpOcrServiceImplTest {
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
       final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
 
-      final WxMpOcrIdCardResult result = wxMpOcrService.idCard(WxMpOcrService.ImageType.PHOTO, "abc");
+      final WxMpOcrIdCardResult result = wxMpOcrService.idCard("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testBankCard() throws Exception {
+      String returnJson = "{\"number\":\"24234234345234\"}";
+
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+      final WxMpOcrBankCardResult result = wxMpOcrService.bankCard("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testDriving() throws Exception {
+      String returnJson = "{\n" +
+        "    \"errcode\": 0,\n" +
+        "    \"errmsg\": \"ok\",\n" +
+        "    \"plate_num\": \"粤xxxxx\", //车牌号码\n" +
+        "    \"vehicle_type\": \"小型普通客车\", //车辆类型\n" +
+        "    \"owner\": \"东莞市xxxxx机械厂\", //所有人\n" +
+        "    \"addr\": \"广东省东莞市xxxxx号\", //住址\n" +
+        "    \"use_character\": \"非营运\", //使用性质\n" +
+        "    \"model\": \"江淮牌HFCxxxxxxx\", //品牌型号\n" +
+        "    \"vin\": \"LJ166xxxxxxxx51\", //车辆识别代号\n" +
+        "    \"engine_num\": \"J3xxxxx3\", //发动机号码\n" +
+        "    \"register_date\": \"2018-07-06\", //注册日期\n" +
+        "    \"issue_date\": \"2018-07-01\", //发证日期\n" +
+        "    \"plate_num_b\": \"粤xxxxx\", //车牌号码\n" +
+        "    \"record\": \"441xxxxxx3\", //号牌\n" +
+        "    \"passengers_num\": \"7人\", //核定载人数\n" +
+        "    \"total_quality\": \"2700kg\", //总质量\n" +
+        "    \"prepare_quality\": \"1995kg\", //整备质量\n" +
+        "    \"overall_size\": \"4582x1795x1458mm\", //外廓尺寸\n" +
+        "    \"card_position_front\": {//卡片正面位置(检测到卡片正面才会返回)\n" +
+        "        \"pos\": {\n" +
+        "            \"left_top\": {\n" +
+        "                \"x\": 119, \n" +
+        "                \"y\": 2925\n" +
+        "            }, \n" +
+        "            \"right_top\": {\n" +
+        "                \"x\": 1435, \n" +
+        "                \"y\": 2887\n" +
+        "            }, \n" +
+        "            \"right_bottom\": {\n" +
+        "                \"x\": 1435, \n" +
+        "                \"y\": 3793\n" +
+        "            }, \n" +
+        "            \"left_bottom\": {\n" +
+        "                \"x\": 119, \n" +
+        "                \"y\": 3831\n" +
+        "            }\n" +
+        "        }\n" +
+        "    }, \n" +
+        "    \"card_position_back\": {//卡片反面位置(检测到卡片反面才会返回)\n" +
+        "        \"pos\": {\n" +
+        "            \"left_top\": {\n" +
+        "                \"x\": 1523, \n" +
+        "                \"y\": 2849\n" +
+        "            }, \n" +
+        "            \"right_top\": {\n" +
+        "                \"x\": 2898, \n" +
+        "                \"y\": 2887\n" +
+        "            }, \n" +
+        "            \"right_bottom\": {\n" +
+        "                \"x\": 2927, \n" +
+        "                \"y\": 3831\n" +
+        "            }, \n" +
+        "            \"left_bottom\": {\n" +
+        "                \"x\": 1523, \n" +
+        "                \"y\": 3831\n" +
+        "            }\n" +
+        "        }\n" +
+        "    }, \n" +
+        "    \"img_size\": {//图片大小\n" +
+        "        \"w\": 3120, \n" +
+        "        \"h\": 4208\n" +
+        "    }\n" +
+        "}";
+
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+      final WxMpOcrDrivingResult result = wxMpOcrService.driving("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testDrivingLicense() throws Exception {
+      String returnJson = "{\n" +
+        "    \"errcode\": 0,\n" +
+        "    \"errmsg\": \"ok\",\n" +
+        "    \"id_num\": \"660601xxxxxxxx1234\", //证号\n" +
+        "    \"name\": \"张三\", //姓名\n" +
+        "    \"sex\": \"男\", //性别\n" +
+        "    \"nationality\": \"中国\", //国籍\n" +
+        "    \"address\": \"广东省东莞市xxxxx号\", //住址\n" +
+        "    \"birth_date\": \"1990-12-21\", //出生日期\n" +
+        "    \"issue_date\": \"2012-12-21\", //初次领证日期\n" +
+        "    \"car_class\": \"C1\", //准驾车型\n" +
+        "    \"valid_from\": \"2018-07-06\", //有效期限起始日\n" +
+        "    \"valid_to\": \"2020-07-01\", //有效期限终止日\n" +
+        "    \"official_seal\": \"xx市公安局公安交通管理局\" //印章文字\n" +
+        "}";
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+      final WxMpOcrDrivingLicenseResult result = wxMpOcrService.drivingLicense("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testBizLicense() throws Exception {
+      String returnJson = "{\n" +
+        "    \"errcode\": 0, \n" +
+        "    \"errmsg\": \"ok\", \n" +
+        "    \"reg_num\": \"123123\",//注册号\n" +
+        "    \"serial\": \"123123\",//编号\n" +
+        "    \"legal_representative\": \"张三\", //法定代表人姓名\n" +
+        "    \"enterprise_name\": \"XX饮食店\", //企业名称\n" +
+        "    \"type_of_organization\": \"个人经营\", //组成形式\n" +
+        "    \"address\": \"XX市XX区XX路XX号\", //经营场所/企业住所\n" +
+        "    \"type_of_enterprise\": \"xxx\", //公司类型\n" +
+        "    \"business_scope\": \"中型餐馆(不含凉菜、不含裱花蛋糕,不含生食海产品)。\", //经营范围\n" +
+        "    \"registered_capital\": \"200万\", //注册资本\n" +
+        "    \"paid_in_capital\": \"200万\", //实收资本\n" +
+        "    \"valid_period\": \"2019年1月1日\", //营业期限\n" +
+        "    \"registered_date\": \"2018年1月1日\", //注册日期/成立日期\n" +
+        "    \"cert_position\": { //营业执照位置\n" +
+        "        \"pos\": {\n" +
+        "            \"left_top\": {\n" +
+        "                \"x\": 155, \n" +
+        "                \"y\": 191\n" +
+        "            }, \n" +
+        "            \"right_top\": {\n" +
+        "                \"x\": 725, \n" +
+        "                \"y\": 157\n" +
+        "            }, \n" +
+        "            \"right_bottom\": {\n" +
+        "                \"x\": 743, \n" +
+        "                \"y\": 512\n" +
+        "            }, \n" +
+        "            \"left_bottom\": {\n" +
+        "                \"x\": 164, \n" +
+        "                \"y\": 525\n" +
+        "            }\n" +
+        "        }\n" +
+        "    }, \n" +
+        "    \"img_size\": { //图片大小\n" +
+        "        \"w\": 966, \n" +
+        "        \"h\": 728\n" +
+        "    }\n" +
+        "}";
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+      final WxMpOcrBizLicenseResult result = wxMpOcrService.bizLicense("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testComm() throws Exception {
+      String returnJson = "{\n" +
+        "    \"errcode\": 0, \n" +
+        "    \"errmsg\": \"ok\", \n" +
+        "    \"items\": [ //识别结果\n" +
+        "        {\n" +
+        "            \"text\": \"腾讯\", \n" +
+        "            \"pos\": {\n" +
+        "                \"left_top\": {\n" +
+        "                    \"x\": 575, \n" +
+        "                    \"y\": 519\n" +
+        "                }, \n" +
+        "                \"right_top\": {\n" +
+        "                    \"x\": 744, \n" +
+        "                    \"y\": 519\n" +
+        "                }, \n" +
+        "                \"right_bottom\": {\n" +
+        "                    \"x\": 744, \n" +
+        "                    \"y\": 532\n" +
+        "                }, \n" +
+        "                \"left_bottom\": {\n" +
+        "                    \"x\": 573, \n" +
+        "                    \"y\": 532\n" +
+        "                }\n" +
+        "            }\n" +
+        "        }, \n" +
+        "        {\n" +
+        "            \"text\": \"微信团队\", \n" +
+        "            \"pos\": {\n" +
+        "                \"left_top\": {\n" +
+        "                    \"x\": 670, \n" +
+        "                    \"y\": 516\n" +
+        "                }, \n" +
+        "                \"right_top\": {\n" +
+        "                    \"x\": 762, \n" +
+        "                    \"y\": 517\n" +
+        "                }, \n" +
+        "                \"right_bottom\": {\n" +
+        "                    \"x\": 762, \n" +
+        "                    \"y\": 532\n" +
+        "                }, \n" +
+        "                \"left_bottom\": {\n" +
+        "                    \"x\": 670, \n" +
+        "                    \"y\": 531\n" +
+        "                }\n" +
+        "            }\n" +
+        "        }\n" +
+        "    ], \n" +
+        "    \"img_size\": { //图片大小\n" +
+        "        \"w\": 1280, \n" +
+        "        \"h\": 720\n" +
+        "    }\n" +
+        "}";
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+      final WxMpOcrCommResult result = wxMpOcrService.comm("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }

From 159347eb9bc00b56d600d85a981a68535e5db9ec Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Fri, 18 Oct 2019 17:27:24 +0800
Subject: [PATCH 59/79] =?UTF-8?q?:art:=20#1233=20=E5=85=AC=E4=BC=97?=
 =?UTF-8?q?=E5=8F=B7=E6=A8=A1=E6=9D=BF=E6=B6=88=E6=81=AF=E8=AE=BE=E7=BD=AE?=
 =?UTF-8?q?=E8=A1=8C=E4=B8=9A=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3=E4=BC=98?=
 =?UTF-8?q?=E5=8C=96=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=9E=9A=E4=B8=BE=E7=B1=BB?=
 =?UTF-8?q?=20WxMpTemplateIndustryEnum=20=E6=96=B9=E4=BE=BF=E4=BD=BF?=
 =?UTF-8?q?=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/mp/api/WxMpTemplateMsgService.java |   9 +
 .../api/impl/WxMpTemplateMsgServiceImpl.java  |   4 +-
 .../bean/template/WxMpTemplateIndustry.java   |  35 +--
 .../template/WxMpTemplateIndustryEnum.java    | 224 ++++++++++++++++++
 .../mp/util/json/WxMpIndustryGsonAdapter.java |  37 ++-
 .../impl/WxMpTemplateMsgServiceImplTest.java  |  15 +-
 6 files changed, 267 insertions(+), 57 deletions(-)
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
index 656840cb..24c6eded 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
@@ -24,7 +24,9 @@ public interface WxMpTemplateMsgService {
    * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
    * 
* + * @param wxMpIndustry 行业信息 * @return 是否成功 + * @throws WxErrorException . */ boolean setIndustry(WxMpTemplateIndustry wxMpIndustry) throws WxErrorException; @@ -35,6 +37,7 @@ public interface WxMpTemplateMsgService { *
* * @return wxMpIndustry + * @throws WxErrorException . */ WxMpTemplateIndustry getIndustry() throws WxErrorException; @@ -44,7 +47,9 @@ public interface WxMpTemplateMsgService { * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN *
* + * @param templateMessage 模板消息 * @return 消息Id + * @throws WxErrorException . */ String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException; @@ -58,6 +63,7 @@ public interface WxMpTemplateMsgService { * * @param shortTemplateId 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式 * @return templateId 模板Id + * @throws WxErrorException . */ String addTemplate(String shortTemplateId) throws WxErrorException; @@ -70,6 +76,7 @@ public interface WxMpTemplateMsgService { * * * @return templateId 模板Id + * @throws WxErrorException . */ List getAllPrivateTemplate() throws WxErrorException; @@ -82,6 +89,8 @@ public interface WxMpTemplateMsgService { * * * @param templateId 模板Id + * @return . + * @throws WxErrorException . */ boolean delPrivateTemplate(String templateId) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java index 4cab8d71..daaf60c2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java @@ -42,8 +42,8 @@ public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService { @Override public boolean setIndustry(WxMpTemplateIndustry wxMpIndustry) throws WxErrorException { - if (null == wxMpIndustry.getPrimaryIndustry() || null == wxMpIndustry.getPrimaryIndustry().getId() - || null == wxMpIndustry.getSecondIndustry() || null == wxMpIndustry.getSecondIndustry().getId()) { + if (null == wxMpIndustry.getPrimaryIndustry() || null == wxMpIndustry.getPrimaryIndustry().getCode() + || null == wxMpIndustry.getSecondIndustry() || null == wxMpIndustry.getSecondIndustry().getCode()) { throw new IllegalArgumentException("行业Id不能为空,请核实"); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java index 4507cacb..adab3785 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java @@ -1,28 +1,26 @@ package me.chanjar.weixin.mp.bean.template; -import java.io.Serializable; - +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import java.io.Serializable; + /** * @author miller */ @Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) public class WxMpTemplateIndustry implements Serializable { private static final long serialVersionUID = -7700398224795914722L; - private Industry primaryIndustry; - private Industry secondIndustry; - - public WxMpTemplateIndustry() { - } - - public WxMpTemplateIndustry(Industry primaryIndustry, Industry secondIndustry) { - this.primaryIndustry = primaryIndustry; - this.secondIndustry = secondIndustry; - } + private WxMpTemplateIndustryEnum primaryIndustry; + private WxMpTemplateIndustryEnum secondIndustry; public static WxMpTemplateIndustry fromJson(String json) { return WxMpGsonBuilder.create().fromJson(json, WxMpTemplateIndustry.class); @@ -41,29 +39,22 @@ public class WxMpTemplateIndustry implements Serializable { * 官方文档中,创建和获取的数据结构不一样。所以采用冗余字段的方式,实现相应的接口. */ @Data + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) public static class Industry implements Serializable { private static final long serialVersionUID = -1707184885588012142L; private String id; private String firstClass; private String secondClass; - public Industry() { - } - public Industry(String id) { this.id = id; } - public Industry(String id, String firstClass, String secondClass) { - this.id = id; - this.firstClass = firstClass; - this.secondClass = secondClass; - } - @Override public String toString() { return WxMpGsonBuilder.create().toJson(this); } - } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java new file mode 100644 index 00000000..8a0a9137 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java @@ -0,0 +1,224 @@ +package me.chanjar.weixin.mp.bean.template; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 模版消息行业枚举. + * + * @author Binary Wang + * @date 2019-10-18 + */ +@Getter +@AllArgsConstructor +public enum WxMpTemplateIndustryEnum { + /** + * IT科技 - 互联网|电子商务 + */ + E_COMMERCE("IT科技", "互联网|电子商务", 1), + /** + * IT科技 - IT软件与服务 + */ + IT_SOFTWARE_AND_SERVICES("IT科技", "IT软件与服务", 2), + /** + * IT科技 - IT硬件与设备 + */ + IT_HARDWARE_AND_EQUIPMENT("IT科技", "IT硬件与设备", 3), + /** + * IT科技 - 电子技术 + */ + ELECTRONIC_TECHNIQUE("IT科技", "电子技术", 4), + /** + * IT科技 - 通信与运营商 + */ + COMMUNICATION_AND_OPERATOR("IT科技", "通信与运营商", 5), + /** + * IT科技 - 网络游戏 + */ + ONLINE_GAME("IT科技", "网络游戏", 6), + /** + * 金融业 - 银行 + */ + BANK("金融业", "银行", 7), + /** + * 金融业 - 基金|理财|信托 + */ + FUND("金融业", "基金|理财|信托", 8), + /** + * 金融业 - 保险 + */ + INSURANCE("金融业", "保险", 9), + /** + * 餐饮 - 餐饮 + */ + REPAST("餐饮", "餐饮", 10), + /** + * 酒店旅游 - 酒店 + */ + HOTEL("酒店旅游", "酒店", 11), + /** + * 酒店旅游 - 旅游 + */ + TRAVEL("酒店旅游", "旅游", 12), + /** + * 运输与仓储 - 快递 + */ + EXPRESS("运输与仓储", "快递", 13), + /** + * 运输与仓储 - 物流 + */ + LOGISTICS("运输与仓储", "物流", 14), + /** + * 运输与仓储 - 仓储 + */ + STORAGE("运输与仓储", "仓储", 15), + /** + * 教育 - 培训 + */ + CULTIVATE("教育", "培训", 16), + /** + * 教育 - 院校 + */ + ACADEMY("教育", "院校", 17), + /** + * 政府与公共事业 - 学术科研 + */ + ACADEMIC_RESEARCH("政府与公共事业", "学术科研", 18), + /** + * 政府与公共事业 - 交警 + */ + TRAFFIC_POLICE("政府与公共事业", "交警", 19), + /** + * 政府与公共事业 - 博物馆 + */ + MUSEUM("政府与公共事业", "博物馆", 20), + /** + * 政府与公共事业 - 公共事业|非盈利机构 + */ + PUBLIC_WORKS_NONPROFIT("政府与公共事业", "公共事业|非盈利机构", 21), + /** + * 医药护理 - 医药医疗 + */ + MEDICAL_HEALTH("医药护理", "医药医疗", 22), + /** + * 医药护理 - 护理美容 + */ + CARE_AND_BEAUTY("医药护理", "护理美容", 23), + /** + * 医药护理 - 保健与卫生 + */ + HEALTH_AND_HYGIENE("医药护理", "保健与卫生", 24), + /** + * 交通工具 - 汽车相关 + */ + AUTOMOTIVE_RELATED("交通工具", "汽车相关", 25), + /** + * 交通工具 - 摩托车相关 + */ + MOTORCYCLE_CORRELATION("交通工具", "摩托车相关", 26), + /** + * 交通工具 - 火车相关 + */ + THE_TRAIN_RELATED("交通工具", "火车相关", 27), + /** + * 交通工具 - 飞机相关 + */ + THE_PLANE_RELATED("交通工具", "飞机相关", 28), + /** + * 房地产 - 建筑 + */ + ARCHITECTURE("房地产", "建筑", 29), + /** + * 房地产 - 物业 + */ + REAL_ESTATE("房地产", "物业", 30), + /** + * 消费品 - 消费品 + */ + CONSUMER_GOODS("消费品", "消费品", 31), + /** + * 商业服务 - 法律 + */ + LEGISLATION("商业服务", "法律", 32), + /** + * 商业服务 - 会展 + */ + CONVENTION_AND_EXHIBITION("商业服务", "会展", 33), + /** + * 商业服务 - 中介服务 + */ + INTERMEDIARY_SERVICES("商业服务", "中介服务", 34), + /** + * 商业服务 - 认证 + */ + AUTHENTICATION("商业服务", "认证", 35), + /** + * 商业服务 - 会计|审计 + */ + AUDIT("商业服务", "会计|审计", 36), + /** + * 文体娱乐 - 传媒 + */ + MASS_MEDIA("文体娱乐", "传媒", 37), + /** + * 文体娱乐 - 体育 + */ + SPORTS("文体娱乐", "体育", 38), + /** + * 文体娱乐 - 娱乐休闲 + */ + LEISURE_AND_ENTERTAINMENT("文体娱乐", "娱乐休闲", 39), + /** + * 印刷 - 印刷 + */ + PRINTING("印刷", "印刷", 40), + /** + * 其它 - 其它 + */ + OTHER("其它", "其它", 41); + + /** + * 主行业(一级行业) + */ + public final String firstClass; + /** + * 副行业(二级行业) + */ + public final String secondClass; + /** + * 行业代码 + */ + public final Integer code; + + /** + * 查找行业 + * + * @param industry 二级行业名称 + * @return . + */ + public static WxMpTemplateIndustryEnum findBySecondary(String industry) { + for (WxMpTemplateIndustryEnum industryEnum : WxMpTemplateIndustryEnum.values()) { + if (industryEnum.secondClass.equals(industry)) { + return industryEnum; + } + } + + return null; + } + + /** + * 查找行业 + * + * @param code 行业编码 + * @return . + */ + public static WxMpTemplateIndustryEnum findByCode(int code) { + for (WxMpTemplateIndustryEnum industryEnum : WxMpTemplateIndustryEnum.values()) { + if (industryEnum.code == code) { + return industryEnum; + } + } + + return null; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java index eb0972bc..0c457195 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java @@ -3,41 +3,32 @@ 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.template.WxMpTemplateIndustry; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustryEnum; import java.lang.reflect.Type; /** * @author miller */ -public class WxMpIndustryGsonAdapter - implements JsonSerializer, JsonDeserializer { - private static WxMpTemplateIndustry.Industry convertFromJson(JsonObject json) { - WxMpTemplateIndustry.Industry industry = new WxMpTemplateIndustry.Industry(); - industry.setFirstClass(GsonHelper.getString(json, "first_class")); - industry.setSecondClass(GsonHelper.getString(json, "second_class")); - return industry; - } - +public class WxMpIndustryGsonAdapter implements JsonSerializer, JsonDeserializer { @Override - public JsonElement serialize(WxMpTemplateIndustry wxMpIndustry, Type type, - JsonSerializationContext jsonSerializationContext) { + public JsonElement serialize(WxMpTemplateIndustry wxMpIndustry, Type type, JsonSerializationContext context) { JsonObject json = new JsonObject(); - json.addProperty("industry_id1", wxMpIndustry.getPrimaryIndustry().getId()); - json.addProperty("industry_id2", wxMpIndustry.getSecondIndustry().getId()); + json.addProperty("industry_id1", wxMpIndustry.getPrimaryIndustry().getCode()); + json.addProperty("industry_id2", wxMpIndustry.getSecondIndustry().getCode()); return json; } @Override - public WxMpTemplateIndustry deserialize(JsonElement jsonElement, Type type, - JsonDeserializationContext jsonDeserializationContext) + public WxMpTemplateIndustry deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException { - WxMpTemplateIndustry wxMpIndustry = new WxMpTemplateIndustry(); - JsonObject primaryIndustry = jsonElement.getAsJsonObject() - .get("primary_industry").getAsJsonObject(); - wxMpIndustry.setPrimaryIndustry(convertFromJson(primaryIndustry)); - JsonObject secondaryIndustry = jsonElement.getAsJsonObject() - .get("secondary_industry").getAsJsonObject(); - wxMpIndustry.setSecondIndustry(convertFromJson(secondaryIndustry)); - return wxMpIndustry; + return new WxMpTemplateIndustry() + .setPrimaryIndustry(this.convertFromJson(jsonElement.getAsJsonObject().get("primary_industry").getAsJsonObject())) + .setSecondIndustry(this.convertFromJson(jsonElement.getAsJsonObject().get("secondary_industry").getAsJsonObject())); } + + private WxMpTemplateIndustryEnum convertFromJson(JsonObject json) { + return WxMpTemplateIndustryEnum.findBySecondary(GsonHelper.getString(json, "second_class")); + } + } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java index 94d759fc..181411df 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java @@ -5,10 +5,7 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.test.ApiTestModule; import me.chanjar.weixin.mp.api.test.TestConfigStorage; -import me.chanjar.weixin.mp.bean.template.WxMpTemplate; -import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; -import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry; -import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; +import me.chanjar.weixin.mp.bean.template.*; import org.apache.commons.lang3.RandomStringUtils; import org.testng.Assert; import org.testng.annotations.Guice; @@ -32,10 +29,8 @@ public class WxMpTemplateMsgServiceImplTest { @Test(invocationCount = 5, threadPoolSize = 3) public void testSendTemplateMsg() throws WxErrorException { - SimpleDateFormat dateFormat = new SimpleDateFormat( - "yyyy-MM-dd HH:mm:ss.SSS"); - TestConfigStorage configStorage = (TestConfigStorage) this.wxService - .getWxMpConfigStorage(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + TestConfigStorage configStorage = (TestConfigStorage) this.wxService.getWxMpConfigStorage(); WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() .toUser(configStorage.getOpenid()) .templateId(configStorage.getTemplateId()) @@ -58,8 +53,8 @@ public class WxMpTemplateMsgServiceImplTest { @Test public void testSetIndustry() throws Exception { - WxMpTemplateIndustry industry = new WxMpTemplateIndustry(new WxMpTemplateIndustry.Industry("1"), - new WxMpTemplateIndustry.Industry("04")); + WxMpTemplateIndustry industry = new WxMpTemplateIndustry(WxMpTemplateIndustryEnum.findByCode(1), + WxMpTemplateIndustryEnum.findByCode(4)); boolean result = this.wxService.getTemplateMsgService().setIndustry(industry); Assert.assertTrue(result); } From 70ce3a2ff91c7b89f14336e9e48467d033e22960 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 19 Oct 2019 11:10:36 +0800 Subject: [PATCH 60/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.7.B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- spring-boot-starters/pom.xml | 2 +- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-miniapp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- weixin-java-open/pom.xml | 2 +- weixin-java-pay/pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 406de16e..efb61efa 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.5.6.B + 3.5.7.B pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 9834950f..0bad4baf 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.6.B + 3.5.7.B pom wx-java-spring-boot-starters diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index b6a2345f..f03fbd55 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.6.B + 3.5.7.B 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index f8e3f8f2..bc9c18e6 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.6.B + 3.5.7.B 4.0.0 diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml index 990af158..22cde91b 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.6.B + 3.5.7.B 4.0.0 diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index edd90417..d9d7fcd6 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.6.B + 3.5.7.B 4.0.0 diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index d6954f4e..e12a0d42 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.6.B + 3.5.7.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index b221da69..6716dd14 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.6.B + 3.5.7.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index b806ccc1..c75b0750 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.6.B + 3.5.7.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 471417a1..9c8b4612 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.6.B + 3.5.7.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index bf7a32e3..90b88a74 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.6.B + 3.5.7.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 2854cbbe..3ce30e30 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.5.6.B + 3.5.7.B 4.0.0 From 81df397536d03fd4a582a005684c823613aea64b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B9=BF=E9=91=AB?= <2717764887@qq.com> Date: Tue, 22 Oct 2019 13:45:55 +0800 Subject: [PATCH 61/79] =?UTF-8?q?:sparkles:=09#1010=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E6=AC=A1=E5=88=86=E8=B4=A6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../profitsharing/ProfitSharingResult.java | 33 +++++++ .../profitsharing/ProfitsharingRequest.java | 86 +++++++++++++++++++ .../wxpay/bean/profitsharing/Receiver.java | 47 ++++++++++ .../bean/profitsharing/ReceiverList.java | 51 +++++++++++ .../wxpay/constant/WxPayConstants.java | 26 +++++- .../wxpay/service/ProfitSharingService.java | 26 ++++++ .../wxpay/service/WxPayService.java | 8 ++ .../service/impl/BaseWxPayServiceImpl.java | 8 +- .../impl/ProfitSharingServiceImpl.java | 31 +++++++ .../impl/ProfitSharingServiceImplTest.java | 40 +++++++++ 10 files changed, 351 insertions(+), 5 deletions(-) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitsharingRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/Receiver.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ReceiverList.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java new file mode 100644 index 00000000..122821cf --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java @@ -0,0 +1,33 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * @author Wang GuangXin 2019/10/22 10:06 + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class ProfitSharingResult extends BaseWxPayResult { + /** + * 微信订单号. + */ + @XStreamAlias("transaction_id") + private String transactionId; + /** + * 商户分账单号. + */ + @XStreamAlias("out_order_no") + private String outOrderNo; + /** + * 微信分账单号. + */ + @XStreamAlias("order_id") + private String orderId; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitsharingRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitsharingRequest.java new file mode 100644 index 00000000..10ed0d93 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitsharingRequest.java @@ -0,0 +1,86 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; + +/** + * @author Wang GuangXin 2019/10/21 17:57 + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class ProfitsharingRequest extends BaseWxPayRequest { + private static final long serialVersionUID = 212049937430575842L; + + /** + *
+   * 字段名:微信订单号.
+   * 变量名:transaction_id
+   * 是否必填:是
+   * String(32)
+   * 示例值:4208450740201411110007820472
+   * 描述:微信支付订单号
+   * 
+ */ + @XStreamAlias("transaction_id") + @Required + private String transactionId; + + /** + *
+   * 字段名:商户分账单号.
+   * 变量名:out_order_no
+   * 是否必填:是
+   * String(64)
+   * 示例值:P20150806125346
+   * 描述:商户系统内部的分账单号,在商户系统内部唯一(单次分账、多次分账、完结分账应使用不同的商户分账单号),同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
+   * 
+ */ + @XStreamAlias("out_order_no") + @Required + private String outOrderNo; + + /** + *
+   * 字段名:分账接收方列表.
+   * 变量名:receivers
+   * 是否必填:是
+   * String(10240)
+   * 示例值:[
+   *     {
+   *          "type": "MERCHANT_ID",
+   *          "account":"190001001",
+   *          "amount":100,
+   *          "description": "分到商户"
+   * },
+   *     {
+   *          "type": "PERSONAL_WECHATID",
+   *          "account":"86693952",
+   *          "amount":888,
+   *          "description": "分到个人"
+   * }
+   * ]
+   * 描述:分账接收方列表,不超过50个json对象,不能设置分账方作为分账接受方,使用Json格式
+   * 
+ */ + @XStreamAlias("receivers") + @Required + private String receivers; + + + @Override + protected void checkConstraints() throws WxPayException { + /** + * 目前仅支持HMAC-SHA256 + */ + this.setSignType(WxPayConstants.SignType.HMAC_SHA256); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/Receiver.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/Receiver.java new file mode 100644 index 00000000..439b60a2 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/Receiver.java @@ -0,0 +1,47 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import java.io.Serializable; + +/** + * @author Wang GuangXin 2019/10/22 11:07 + * @version 1.0 + */ +public class Receiver implements Serializable { + private String type; + private String account; + private Integer amount; + private String description; + + /** + * @param type MERCHANT_ID:商户ID + * PERSONAL_WECHATID:个人微信号PERSONAL_OPENID:个人openid(由父商户APPID转换得到)PERSONAL_SUB_OPENID: 个人sub_openid(由子商户APPID转换得到) + * @param account 类型是MERCHANT_ID时,是商户ID + * 类型是PERSONAL_WECHATID时,是个人微信号 + * 类型是PERSONAL_OPENID时,是个人openid + * 类型是PERSONAL_SUB_OPENID时,是个人sub_openid + * @param amount 分账金额,单位为分,只能为整数,不能超过原订单支付金额及最大分账比例金额 + * @param description 分账的原因描述,分账账单中需要体现 + */ + public Receiver(String type, String account, Integer amount, String description) { + this.type = type; + this.account = account; + this.amount = amount; + this.description = description; + } + + public String getType() { + return type; + } + + public String getAccount() { + return account; + } + + public Integer getAmount() { + return amount; + } + + public String getDescription() { + return description; + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ReceiverList.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ReceiverList.java new file mode 100644 index 00000000..d3d8c07d --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ReceiverList.java @@ -0,0 +1,51 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.google.gson.Gson; + +import java.io.Serializable; +import java.util.ArrayList; + +/** + * @author Wang GuangXin 2019/10/22 11:01 + * @version 1.0 + */ + +public class ReceiverList implements Serializable { + private static final long serialVersionUID = -1316860887694489921L; + ArrayList list; + + private ReceiverList() { + } + + /** + * 获取一个实例 + * @return + */ + public static ReceiverList getInstance() { + ReceiverList receiverList = new ReceiverList(); + receiverList.list = new ArrayList(); + return receiverList; + } + + /** + * 添加一个分账条目 + * 注意微信上限为50个 + * @param receiver + * @return + */ + public ReceiverList add(Receiver receiver) { + this.list.add(receiver); + return this; + } + + + /** + * 转为JSON格式 + * @return + */ + public String toJSONString() { + Gson gson = new Gson(); + return gson.toJson(this.list); + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java index 76f823cc..4f8480b6 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/constant/WxPayConstants.java @@ -1,11 +1,10 @@ package com.github.binarywang.wxpay.constant; -import java.text.Format; -import java.util.List; - +import com.google.common.collect.Lists; import org.apache.commons.lang3.time.FastDateFormat; -import com.google.common.collect.Lists; +import java.text.Format; +import java.util.List; /** *
@@ -273,4 +272,23 @@ public class WxPayConstants {
      */
     public static final String CHANGE = "CHANGE";
   }
+
+  public static class ReceiverType {
+    /**
+     * 商户id
+     */
+    public static final String MERCHANT_ID = "MERCHANT_ID";
+    /**
+     * 个人微信号
+     */
+    public static final String PERSONAL_WECHATID = "PERSONAL_WECHATID";
+    /**
+     * 个人openid
+     */
+    public static final String PERSONAL_OPENID = "PERSONAL_OPENID";
+    /**
+     * 个人sub_openid
+     */
+    public static final String PERSONAL_SUB_OPENID = "PERSONAL_SUB_OPENID";
+  }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java
new file mode 100644
index 00000000..754c7c2f
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java
@@ -0,0 +1,26 @@
+package com.github.binarywang.wxpay.service;
+
+import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingResult;
+import com.github.binarywang.wxpay.bean.profitsharing.ProfitsharingRequest;
+import com.github.binarywang.wxpay.exception.WxPayException;
+
+/**
+ * @author Wang GuangXin 2019/10/22 10:05
+ * @version 1.0
+ */
+public interface ProfitSharingService {
+  /**
+   * 单次分账请求按照传入的分账接收方账号和资金进行分账,同时会将订单剩余的待分账金额解冻给特约商户。故操作成功后,订单不能再进行分账,也不能进行分账完结。
+   * 

+ * 接口频率:30QPS + * 文档详见: https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_1&index=1 + * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/profitsharing + * + * @param profitsharingRequest + * @return + * @throws WxPayException the wx pay exception + */ + ProfitSharingResult profitsharing(ProfitsharingRequest profitsharingRequest) throws WxPayException; + + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java index 51d46512..555362e6 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java @@ -65,6 +65,13 @@ public interface WxPayService { */ EntPayService getEntPayService(); + /** + * 获取分账服务类. + * + * @return the ent pay service + */ + ProfitSharingService getProfitSharingService(); + /** * 设置企业付款服务类,允许开发者自定义实现类. * @@ -304,6 +311,7 @@ public interface WxPayService { * @throws WxPayException the wx pay exception */ WxPayRedpackQueryResult queryRedpack(String mchBillNo) throws WxPayException; + /** *

    *   查询红包记录.
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
index 2f671488..13473a5d 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
@@ -18,6 +18,7 @@ import com.github.binarywang.wxpay.constant.WxPayConstants.SignType;
 import com.github.binarywang.wxpay.constant.WxPayConstants.TradeType;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.EntPayService;
+import com.github.binarywang.wxpay.service.ProfitSharingService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.util.SignUtils;
 import com.google.common.base.Joiner;
@@ -59,7 +60,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
   static ThreadLocal wxApiData = new ThreadLocal<>();
 
   private EntPayService entPayService = new EntPayServiceImpl(this);
-
+  private ProfitSharingService profitSharingService = new ProfitSharingServiceImpl(this);
   /**
    * The Config.
    */
@@ -70,6 +71,11 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
     return entPayService;
   }
 
+  @Override
+  public ProfitSharingService getProfitSharingService() {
+    return profitSharingService;
+  }
+
   @Override
   public void setEntPayService(EntPayService entPayService) {
     this.entPayService = entPayService;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java
new file mode 100644
index 00000000..dd6c23d0
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java
@@ -0,0 +1,31 @@
+package com.github.binarywang.wxpay.service.impl;
+
+import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
+import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingResult;
+import com.github.binarywang.wxpay.bean.profitsharing.ProfitsharingRequest;
+import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.ProfitSharingService;
+import com.github.binarywang.wxpay.service.WxPayService;
+
+/**
+ * @author Wang GuangXin 2019/10/22 10:13
+ * @version 1.0
+ */
+public class ProfitSharingServiceImpl implements ProfitSharingService {
+  private WxPayService payService;
+  public ProfitSharingServiceImpl(WxPayService payService) {
+    this.payService = payService;
+  }
+
+  @Override
+  public ProfitSharingResult profitsharing(ProfitsharingRequest request) throws WxPayException {
+    request.checkAndSign(this.payService.getConfig());
+    String url = this.payService.getPayBaseUrl() + "/secapi/pay/profitsharing";
+
+    String responseContent = this.payService.post(url, request.toXML(), true);
+    ProfitSharingResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingResult.class);
+    result.checkResult(this.payService, request.getSignType(), true);
+    return result;
+  }
+}
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java
new file mode 100644
index 00000000..5d955e51
--- /dev/null
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java
@@ -0,0 +1,40 @@
+package com.github.binarywang.wxpay.service.impl;
+
+import com.github.binarywang.wxpay.bean.profitsharing.ProfitsharingRequest;
+import com.github.binarywang.wxpay.bean.profitsharing.Receiver;
+import com.github.binarywang.wxpay.bean.profitsharing.ReceiverList;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.testbase.ApiTestModule;
+import com.google.inject.Inject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+@Test
+@Guice(modules = ApiTestModule.class)
+public class ProfitSharingServiceImplTest {
+  private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+  @Inject
+  private WxPayService payService;
+
+  @Test
+  public void testProfitsharing() throws WxPayException {
+    ReceiverList instance = ReceiverList.getInstance();
+    instance.add(new Receiver(WxPayConstants.ReceiverType.PERSONAL_OPENID,
+      "oyOUE5ql4TtzrBg5cVOwxq6tbjOs",
+      100,
+      "分到用户"));
+    ProfitsharingRequest request = ProfitsharingRequest
+      .newBuilder()
+      .outOrderNo("P20150806125346")
+      .transactionId("4208450740201411110007820472")
+//      .receivers("[{\"type\": \"PERSONAL_OPENID\",\"account\":\"oyOUE5ql4TtzrBg5cVOwxq6tbjOs\",\"amount\":100,\"description\": \"分到用户\"}]")
+      .receivers(instance.toJSONString())
+      .build();
+    this.logger.info(this.payService.getProfitSharingService().profitsharing(request).toString());
+  }
+}

From d184ff830321a3096e4cc63b6ac5bd2b9802cf58 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E5=B9=BF=E9=91=AB?= <2717764887@qq.com>
Date: Thu, 24 Oct 2019 09:23:56 +0800
Subject: [PATCH 62/79] =?UTF-8?q?:sparkles:=09#1010=20=E5=A2=9E=E5=8A=A0?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=88=86=E8=B4=A6=E7=9B=B8=E5=85=B3=E6=8E=A5?=
 =?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* 微信单次分账接口

* - 微信多次分账
- 微信完结分账
- 添加分账接受方
- 删除分账接受方
- 查询分账结果【未能完成单元测试,微信返回签名失败】
- 分账回退【未能完成单元测试,使用真实数据返回“参数不正确”,我对比官方文档除了缺少`sub_mch_id`和`sub_appid`之外其他相同,当我随便填了一个商户id的时候,提示“回退方没有开通分账回退功能”】
- 回退结果查询【未能完成单元测试,因分账回退无法进行,模拟数据返回”记录不存在“】
---
 .../ProfitSharingFinishRequest.java           |  70 +++++++++
 .../ProfitSharingQueryRequest.java            |  54 +++++++
 .../ProfitSharingQueryResult.java             | 114 +++++++++++++++
 .../ProfitSharingReceiverRequest.java         |  47 +++++++
 .../ProfitSharingReceiverResult.java          |  25 ++++
 ...Request.java => ProfitSharingRequest.java} |   2 +-
 .../ProfitSharingReturnQueryRequest.java      |  72 ++++++++++
 .../ProfitSharingReturnRequest.java           | 133 ++++++++++++++++++
 .../ProfitSharingReturnResult.java            |  74 ++++++++++
 .../wxpay/bean/profitsharing/Receiver.java    |  81 +++++++++++
 .../request/WxPayUnifiedOrderRequest.java     |  11 ++
 .../wxpay/service/ProfitSharingService.java   | 120 +++++++++++++++-
 .../impl/ProfitSharingServiceImpl.java        |  85 ++++++++++-
 .../impl/ProfitSharingServiceImplTest.java    | 105 +++++++++++++-
 14 files changed, 977 insertions(+), 16 deletions(-)
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryRequest.java
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverRequest.java
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java
 rename weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/{ProfitsharingRequest.java => ProfitSharingRequest.java} (97%)
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnQueryRequest.java
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnRequest.java
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java
new file mode 100644
index 00000000..22cd5450
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java
@@ -0,0 +1,70 @@
+package com.github.binarywang.wxpay.bean.profitsharing;
+
+import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.*;
+import me.chanjar.weixin.common.annotation.Required;
+
+/**
+ * @author Wang GuangXin 2019/10/23 14:02
+ * @version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+@XStreamAlias("xml")
+public class ProfitSharingFinishRequest extends BaseWxPayRequest {
+
+  private static final long serialVersionUID = -4265779954583596627L;
+
+  /**
+   * 
+   * 字段名:微信订单号.
+   * 变量名:transaction_id
+   * 是否必填:是
+   * String(32)
+   * 示例值:4208450740201411110007820472
+   * 描述:微信支付订单号
+   * 
+ */ + @XStreamAlias("transaction_id") + @Required + private String transactionId; + + /** + *
+   * 字段名:商户分账单号.
+   * 变量名:out_order_no
+   * 是否必填:是
+   * String(64)
+   * 示例值:P20150806125346
+   * 描述:商户系统内部的分账单号,在商户系统内部唯一(单次分账、多次分账、完结分账应使用不同的商户分账单号),同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
+   * 
+ */ + @XStreamAlias("out_order_no") + @Required + private String outOrderNo; + + /** + *
+   * 字段名:分账完结描述.
+   * 变量名:out_order_no
+   * 是否必填:是
+   * String(80)
+   * 示例值:分账已完成
+   * 描述:分账完结的原因描述
+   * 
+ */ + @XStreamAlias("description") + @Required + private String description; + + @Override + protected void checkConstraints() throws WxPayException { + this.setSignType(WxPayConstants.SignType.HMAC_SHA256); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryRequest.java new file mode 100644 index 00000000..353170b0 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryRequest.java @@ -0,0 +1,54 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; + +/** + * @author Wang GuangXin 2019/10/22 15:44 + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class ProfitSharingQueryRequest extends BaseWxPayRequest { + private static final long serialVersionUID = 3566332883053157102L; + /** + *
+   * 字段名:微信支付订单号.
+   * 变量名:transaction_id
+   * 是否必填:是
+   * String(32)
+   * 示例值:4208450740201411110007820472
+   * 描述:微信支付订单号
+   * 
+ */ + @XStreamAlias("transaction_id") + @Required + private String transactionId; + + /** + *
+   * 字段名:商户分账单号.
+   * 变量名:out_order_no
+   * 是否必填:是
+   * String(64)
+   * 示例值:P20150806125346
+   * 描述:查询分账结果,输入申请分账时的商户分账单号; 查询分账完结的执行结果,输入发起分账完结时的商户分账单号
+   * 
+ */ + @XStreamAlias("out_order_no") + @Required + private String outOrderNo; + + @Override + protected void checkConstraints() throws WxPayException { + this.setSignType(WxPayConstants.SignType.HMAC_SHA256); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java new file mode 100644 index 00000000..6affffe6 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingQueryResult.java @@ -0,0 +1,114 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import com.google.gson.FieldNamingPolicy; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * @author Wang GuangXin 2019/10/22 15:51 + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class ProfitSharingQueryResult extends BaseWxPayResult { + private static final long serialVersionUID = 2548673608075775067L; + /** + * 微信订单号 + */ + @XStreamAlias("transaction_id") + private String transactionId; + /** + * 商户分账单号 + */ + @XStreamAlias("out_order_no") + private String outOrderNo; + /** + * 微信分账单号 + */ + @XStreamAlias("orderId") + private String orderId; + /** + * 分账单状态 + */ + @XStreamAlias("status") + private String status; + /** + * 关单原因 + */ + @XStreamAlias("close_reason") + private String closeReason; + /** + * 分账接收方列表 + */ + @XStreamAlias("receivers") + private String receivers; + /** + * 分账金额 + */ + @XStreamAlias("amount") + private Integer amount; + /** + * 分账描述 + */ + @XStreamAlias("description") + private String description; + + public ProfitSharingQueryResult.Receivers formatReceivers() { + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); + Gson gson = gsonBuilder.create(); + return gson.fromJson(receivers, Receivers.class); + } + + @Data + public class Receivers { + /** + * 分账接收方类型 + */ + private String type; + /** + * 分账接收方帐号 + */ + private String account; + /** + * 分账金额 + */ + private Integer amount; + /** + * 分账描述 + */ + private String description; + /** + * 分账结果 + */ + private String result; + /** + * 分账完成时间 + */ + private String finishTime; + /** + * 分账失败原因 + */ + private String failReason; + + @Override + public String toString() { + return "Receivers{" + + "type='" + type + '\'' + + ", account='" + account + '\'' + + ", amount=" + amount + + ", description='" + description + '\'' + + ", result='" + result + '\'' + + ", finishTime='" + finishTime + '\'' + + ", failReason='" + failReason + '\'' + + '}'; + } + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverRequest.java new file mode 100644 index 00000000..3d00d5dd --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverRequest.java @@ -0,0 +1,47 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; + +/** + * 添加/删除分账接受方请求对象 + * + * @author Wang GuangXin 2019/10/22 13:41 + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class ProfitSharingReceiverRequest extends BaseWxPayRequest { + private static final long serialVersionUID = 2628263563539120323L; + /** + *
+   * 字段名:分账接收方.
+   * 变量名:receiver
+   * 是否必填:是
+   * String(2048)
+   * 示例值:{
+   *    "type": "MERCHANT_ID",
+   *    "account": "190001001",
+   *    "name": "示例商户全称",
+   *    "relation_type": "STORE_OWNER"
+   *    }
+   * 描述:分账接收方对象,json格式
+   * 
+ */ + @XStreamAlias("receiver") + @Required + private String receiver; + + @Override + protected void checkConstraints() throws WxPayException { + this.setSignType(WxPayConstants.SignType.HMAC_SHA256); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java new file mode 100644 index 00000000..0b9f5388 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReceiverResult.java @@ -0,0 +1,25 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * @author Wang GuangXin 2019/10/22 14:54 + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class ProfitSharingReceiverResult extends BaseWxPayResult { + private static final long serialVersionUID = 876204163877798066L; + /** + * 分账接收方. + */ + @XStreamAlias("receiver") + private String receiver; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitsharingRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingRequest.java similarity index 97% rename from weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitsharingRequest.java rename to weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingRequest.java index 10ed0d93..aeb2e817 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitsharingRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingRequest.java @@ -17,7 +17,7 @@ import me.chanjar.weixin.common.annotation.Required; @NoArgsConstructor @AllArgsConstructor @XStreamAlias("xml") -public class ProfitsharingRequest extends BaseWxPayRequest { +public class ProfitSharingRequest extends BaseWxPayRequest { private static final long serialVersionUID = 212049937430575842L; /** diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnQueryRequest.java new file mode 100644 index 00000000..e2a2da47 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnQueryRequest.java @@ -0,0 +1,72 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; +import org.apache.commons.lang3.StringUtils; + +/** + * @author Wang GuangXin 2019/10/23 15:32 + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class ProfitSharingReturnQueryRequest extends BaseWxPayRequest { + private static final long serialVersionUID = -8838464614726086009L; + /** + *
+   * 字段名:微信分账单号.
+   * 变量名:order_id
+   * 是否必填:二选一
+   * string(64)
+   * 示例值:3008450740201411110007820472
+   * 描述:原发起分账请求时,微信返回的微信分账单号,与商户分账单号一一对应。
+   * 微信分账单号与商户分账单号二选一填写
+   * 
+ */ + @XStreamAlias("order_id") + private String orderId; + + /** + *
+   * 字段名:商户分账单号.
+   * 变量名:out_order_no
+   * 是否必填:二选一
+   * Sstring(64)
+   * 示例值:P20180806125346
+   * 描述:原发起分账请求时使用的商户后台系统的分账单号。
+   * 微信分账单号与商户分账单号二选一填写
+   * 
+ */ + @XStreamAlias("out_order_no") + private String outOrderNo; + + /** + *
+   * 字段名:商户回退单号.
+   * 变量名:out_return_no
+   * 是否必填:是
+   * string(64)
+   * 示例值:R20190516001
+   * 描述:调用回退接口提供的商户系统内部的回退单号
+   * 
+ */ + @Required + @XStreamAlias("out_return_no") + private String outReturnNo; + + @Override + protected void checkConstraints() throws WxPayException { + if (StringUtils.isBlank(orderId) && StringUtils.isBlank(outOrderNo)) { + throw new WxPayException("order_id 和 outOrderNo 必须有一个存在"); + } + this.setSignType(WxPayConstants.SignType.HMAC_SHA256); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnRequest.java new file mode 100644 index 00000000..6bdc73aa --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnRequest.java @@ -0,0 +1,133 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; +import org.apache.commons.lang3.StringUtils; + +/** + * @author Wang GuangXin 2019/10/23 14:27 + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class ProfitSharingReturnRequest extends BaseWxPayRequest { + private static final long serialVersionUID = 5926280401474809744L; + /** + *
+   * 字段名:微信分账单号.
+   * 变量名:order_id
+   * 是否必填:二选一
+   * string(64)
+   * 示例值:3008450740201411110007820472
+   * 描述:原发起分账请求时,微信返回的微信分账单号,与商户分账单号一一对应。
+   * 微信分账单号与商户分账单号二选一填写
+   * 
+ */ + @XStreamAlias("order_id") + private String orderId; + + /** + *
+   * 字段名:商户分账单号.
+   * 变量名:out_order_no
+   * 是否必填:二选一
+   * Sstring(64)
+   * 示例值:P20180806125346
+   * 描述:原发起分账请求时使用的商户后台系统的分账单号。
+   * 微信分账单号与商户分账单号二选一填写
+   * 
+ */ + @XStreamAlias("out_order_no") + private String outOrderNo; + + /** + *
+   * 字段名:商户回退单号.
+   * 变量名:out_return_no
+   * 是否必填:是
+   * string(64)
+   * 示例值:R20190516001
+   * 描述:此回退单号是商户在自己后台生成的一个新的回退单号,在商户后台唯一
+   * 只能是数字、大小写字母_-|*@ ,同一回退单号多次请求等同一次。
+   * 
+ */ + @Required + @XStreamAlias("out_return_no") + private String outReturnNo; + + /** + *
+   * 字段名:回退方类型.
+   * 变量名:return_account_type
+   * 是否必填:是
+   * String(32)
+   * 示例值:MERCHANT_ID
+   * 描述:枚举值:
+   * MERCHANT_ID:商户ID
+   * 暂时只支持从商户接收方回退分账金额
+   * 
+ */ + @Required + @XStreamAlias("return_account_type") + private String returnAccountType; + + /** + *
+   * 字段名:回退方账号.
+   * 变量名:return_account
+   * 是否必填:是
+   * String(64)
+   * 示例值:86693852
+   * 描述:回退方类型是MERCHANT_ID时,填写商户ID
+   * 只能对原分账请求中成功分给商户接收方进行回退
+   * 
+ */ + @Required + @XStreamAlias("return_account") + private String returnAccount; + + /** + *
+   * 字段名:回退金额.
+   * 变量名:return_amount
+   * 是否必填:是
+   * int
+   * 示例值:888
+   * 描述:需要从分账接收方回退的金额,单位为分,只能为整数,不能超过原始分账单分出给该接收方的金额
+   * 
+ */ + @Required + @XStreamAlias("return_amount") + private Integer returnAmount; + + /** + *
+   * 字段名:回退描述.
+   * 变量名:description
+   * 是否必填:是
+   * String(80)
+   * 示例值:用户退款
+   * 描述:分账回退的原因描述
+   * 
+ */ + @Required + @XStreamAlias("description") + private String description; + + + @Override + protected void checkConstraints() throws WxPayException { + if (StringUtils.isBlank(orderId) && StringUtils.isBlank(outOrderNo)) { + throw new WxPayException("order_id 和 outOrderNo 必须有一个存在"); + } + this.setSignType(WxPayConstants.SignType.HMAC_SHA256); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java new file mode 100644 index 00000000..814bcf2d --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingReturnResult.java @@ -0,0 +1,74 @@ +package com.github.binarywang.wxpay.bean.profitsharing; + +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * @author Wang GuangXin 2019/10/23 14:41 + * @version 1.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class ProfitSharingReturnResult extends BaseWxPayResult { + private static final long serialVersionUID = 718554909816994568L; + /** + * 微信分账单号 + */ + @XStreamAlias("order_id") + private String orderId; + /** + * 商户分账单号 + */ + @XStreamAlias("out_order_no") + private String outOrderNo; + /** + * 商户回退单号 + */ + @XStreamAlias("out_return_no") + private String outReturnNo; + /** + * 微信回退单号 + */ + @XStreamAlias("return_no") + private String returnNo; + /** + * 回退方类型 + */ + @XStreamAlias("return_account_type") + private String returnAccountType; + /** + * 回退方账号 + */ + @XStreamAlias("return_account") + private String returnAccount; + /** + * 回退金额 + */ + @XStreamAlias("return_amount") + private Integer returnAmount; + /** + * 回退描述 + */ + @XStreamAlias("description") + private String description; + /** + * 回退结果 + */ + @XStreamAlias("result") + private String result; + /** + * 失败原因 + */ + @XStreamAlias("fail_reason") + private String failReason; + /** + * 完成时间 + */ + @XStreamAlias("finish_time") + private String finishTime; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/Receiver.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/Receiver.java index 439b60a2..671e2951 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/Receiver.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/Receiver.java @@ -1,5 +1,9 @@ package com.github.binarywang.wxpay.bean.profitsharing; +import com.google.gson.FieldNamingPolicy; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + import java.io.Serializable; /** @@ -11,8 +15,13 @@ public class Receiver implements Serializable { private String account; private Integer amount; private String description; + private String name; + private String relationType; + private String customRelation; /** + * 此构造函数用于单次分账 + * * @param type MERCHANT_ID:商户ID * PERSONAL_WECHATID:个人微信号PERSONAL_OPENID:个人openid(由父商户APPID转换得到)PERSONAL_SUB_OPENID: 个人sub_openid(由子商户APPID转换得到) * @param account 类型是MERCHANT_ID时,是商户ID @@ -29,6 +38,66 @@ public class Receiver implements Serializable { this.description = description; } + /** + * 此构造用于添加分账方 + * + * @param type MERCHANT_ID:商户ID + * PERSONAL_WECHATID:个人微信号PERSONAL_OPENID:个人openid(由父商户APPID转换得到)PERSONAL_SUB_OPENID: 个人sub_openid(由子商户APPID转换得到) + * @param account 类型是MERCHANT_ID时,是商户ID + * 类型是PERSONAL_WECHATID时,是个人微信号 + * 类型是PERSONAL_OPENID时,是个人openid + * 类型是PERSONAL_SUB_OPENID时,是个人sub_openid + * @param name 分账接收方类型是MERCHANT_ID时,是商户全称(必传) + * 分账接收方类型是PERSONAL_NAME 时,是个人姓名(必传) + * 分账接收方类型是PERSONAL_OPENID时,是个人姓名(选传,传则校验) + * 分账接收方类型是PERSONAL_SUB_OPENID时,是个人姓名(选传,传则校验) + * @param relationType 子商户与接收方的关系。 + * 本字段值为枚举: + * SERVICE_PROVIDER:服务商 + * STORE:门店 + * STAFF:员工 + * STORE_OWNER:店主 + * PARTNER:合作伙伴 + * HEADQUARTER:总部 + * BRAND:品牌方 + * DISTRIBUTOR:分销商 + * USER:用户 + * SUPPLIER:供应商 + * CUSTOM:自定义 + * @param customRelation 子商户与接收方具体的关系,本字段最多10个字。 + * 当字段relation_type的值为CUSTOM时,本字段必填 + * 当字段relation_type的值不为CUSTOM时,本字段无需填写 + */ + public Receiver(String type, String account, String name, String relationType, String customRelation) { + this.type = type; + this.account = account; + this.name = name; + this.relationType = relationType; + this.customRelation = customRelation; + } + + /** + * 用于删除分账接受方 + * + * @param type MERCHANT_ID:商户ID + * PERSONAL_WECHATID:个人微信号PERSONAL_OPENID:个人openid(由父商户APPID转换得到)PERSONAL_SUB_OPENID: 个人sub_openid(由子商户APPID转换得到) + * @param account 类型是MERCHANT_ID时,是商户ID + * 类型是PERSONAL_WECHATID时,是个人微信号 + * 类型是PERSONAL_OPENID时,是个人openid + * 类型是PERSONAL_SUB_OPENID时,是个人sub_openid + */ + public Receiver(String type, String account) { + this.type = type; + this.account = account; + } + + public String toJSONString() { + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); + Gson gson = gsonBuilder.create(); + return gson.toJson(this); + } + public String getType() { return type; } @@ -44,4 +113,16 @@ public class Receiver implements Serializable { public String getDescription() { return description; } + + public String getName() { + return name; + } + + public String getRelationType() { + return relationType; + } + + public String getCustomRelation() { + return customRelation; + } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayUnifiedOrderRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayUnifiedOrderRequest.java index 5ce85e7f..54d44388 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayUnifiedOrderRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayUnifiedOrderRequest.java @@ -346,6 +346,17 @@ public class WxPayUnifiedOrderRequest extends BaseWxPayRequest { */ @XStreamAlias("fingerprint") private String fingerprint; + /** + *
+   * 字段名:是否指定服务商分账.
+   * 变量名:profit_sharing
+   * 是否必填:否
+   * 详情:Y-是,需要分账  N-否,不分账,字母要求大写,不传默认不分账
+   * 详细参考 https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=24_3&index=3
+   * 
+ */ + @XStreamAlias("profit_sharing") + private String profitSharing; /** * 如果配置中已经设置,可以不设置值. diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java index 754c7c2f..8371fcb0 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java @@ -1,26 +1,136 @@ package com.github.binarywang.wxpay.service; -import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingResult; -import com.github.binarywang.wxpay.bean.profitsharing.ProfitsharingRequest; +import com.github.binarywang.wxpay.bean.profitsharing.*; import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingResult; +import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingRequest; + /** + * 注意:微信最高分账比例为30% + * 可多次分账到同一个人,但是依然不能超过30% + * * @author Wang GuangXin 2019/10/22 10:05 * @version 1.0 */ public interface ProfitSharingService { /** + *
    * 单次分账请求按照传入的分账接收方账号和资金进行分账,同时会将订单剩余的待分账金额解冻给特约商户。故操作成功后,订单不能再进行分账,也不能进行分账完结。
-   * 

* 接口频率:30QPS * 文档详见: https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_1&index=1 * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/profitsharing + *

+ * + * @param profitsharingRequest + * @return + * @throws WxPayException the wx pay exception + */ + ProfitSharingResult profitsharing(ProfitSharingRequest profitsharingRequest) throws WxPayException; + + /** + *
+   * 微信订单支付成功后,服务商代子商户发起分账请求,将结算后的钱分到分账接收方。多次分账请求仅会按照传入的分账接收方进行分账,不会对剩余的金额进行任何操作。故操作成功后,在待分账金额不等于零时,订单依旧能够再次进行分账。
+   * 多次分账,可以将本商户作为分账接收方直接传入,实现释放资金给本商户的功能
+   * 对同一笔订单最多能发起20次多次分账请求
+   * 接口频率:30QPS
+   * 
+ * 文档详见: https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_6&index=2 + * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/multiprofitsharing * * @param profitsharingRequest * @return * @throws WxPayException the wx pay exception */ - ProfitSharingResult profitsharing(ProfitsharingRequest profitsharingRequest) throws WxPayException; + ProfitSharingResult multiprofitsharing(ProfitSharingRequest profitsharingRequest) throws WxPayException; + + /** + *
+   * 1、不需要进行分账的订单,可直接调用本接口将订单的金额全部解冻给特约商户
+   * 2、调用多次分账接口后,需要解冻剩余资金时,调用本接口将剩余的分账金额全部解冻给特约商户
+   * 3、已调用请求单次分账后,剩余待分账金额为零,不需要再调用此接口。
+   * 接口频率:30QPS
+   * 文档详见: https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_5&index=6
+   * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/profitsharingfinish
+   * 
+ * + * @param profitSharingFinishRequest + * @return + * @throws WxPayException the wx pay exception + */ + ProfitSharingResult profitsharingfinish(ProfitSharingFinishRequest profitSharingFinishRequest) throws WxPayException; + + /** + *
+   * 服务商代子商户发起添加分账接收方请求,后续可通过发起分账请求将结算后的钱分到该分账接收方。
+   * 文档详见: https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_3&index=4
+   * 接口链接:https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver
+   * 
+ * + * @param profitSharingReceiverRequest + * @return + * @throws WxPayException + */ + ProfitSharingReceiverResult addReceiver(ProfitSharingReceiverRequest profitSharingReceiverRequest) throws WxPayException; + + /** + *
+   * 服务商代子商户发起删除分账接收方请求,删除后不支持将结算后的钱分到该分账接收方。
+   * 文档详见: https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_4&index=5
+   * 接口链接:https://api.mch.weixin.qq.com/pay/profitsharingremovereceiver
+   * 
+ * + * @param profitSharingReceiverRequest + * @return + * @throws WxPayException + */ + ProfitSharingReceiverResult removeReceiver(ProfitSharingReceiverRequest profitSharingReceiverRequest) throws WxPayException; + + /** + * TODO:微信返回签名失败 + *
+   * 发起分账请求后,可调用此接口查询分账结果;发起分账完结请求后,可调用此接口查询分账完结的执行结果。
+   * 接口频率:80QPS
+   * 
+ * + * @param profitSharingReceiverRequest + * @return + * @throws WxPayException + */ + ProfitSharingQueryResult profitsharingQuery(ProfitSharingQueryRequest profitSharingReceiverRequest) throws WxPayException; + + /** + * TODO:这个接口用真实的数据返回【参数不正确】,我对比官方文档除了缺少sub_mch_id,和sub_appid之外其他相同,当我随便填了一个商户id的时候,提示【回退方没有开通分账回退功能】 + *
+   * 仅对订单进行退款时,如果订单已经分账,可以先调用此接口将指定的金额从分账接收方(仅限商户类型的分账接收方)回退给特约商户,然后再退款。
+   * 回退以原分账请求为依据,可以对分给分账接收方的金额进行多次回退,只要满足累计回退不超过该请求中分给接收方的金额。
+   * 此接口采用同步处理模式,即在接收到商户请求后,会实时返回处理结果。
+   * 此功能需要接收方在商户平台-交易中心-分账-分账接收设置下,开启同意分账回退后,才能使用。
+   * 接口频率:30QPS
+   * 文档详见: https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_7&index=7
+   * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/profitsharingreturn
+   * 
+ * + * @param profitSharingReturnRequest + * @return + * @throws WxPayException + */ + ProfitSharingReturnResult profitsharingReturn(ProfitSharingReturnRequest profitSharingReturnRequest) throws WxPayException; + + /** + * TODO:因profitsharingReturn接口无法使用,没有办法对这里进行真实的测试,模拟数据这里返回【记录不存在】 + *
+   * 商户需要核实回退结果,可调用此接口查询回退结果。
+   * 如果分账回退接口返回状态为处理中,可调用此接口查询回退结果。
+   * 接口频率:30QPS
+   * 文档详见: https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_8&index=8
+   * 接口链接:https://api.mch.weixin.qq.com/pay/profitsharingreturnquery
+   * 
+ * + * @param profitSharingReturnQueryRequest + * @return + * @throws WxPayException + */ + ProfitSharingReturnResult profitsharingReturnQuery(ProfitSharingReturnQueryRequest profitSharingReturnQueryRequest) throws WxPayException; - ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java index dd6c23d0..d660f67c 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java @@ -1,8 +1,8 @@ package com.github.binarywang.wxpay.service.impl; -import com.github.binarywang.wxpay.bean.entpay.EntPayResult; +import com.github.binarywang.wxpay.bean.profitsharing.*; import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingResult; -import com.github.binarywang.wxpay.bean.profitsharing.ProfitsharingRequest; +import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingRequest; import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.ProfitSharingService; @@ -14,12 +14,13 @@ import com.github.binarywang.wxpay.service.WxPayService; */ public class ProfitSharingServiceImpl implements ProfitSharingService { private WxPayService payService; + public ProfitSharingServiceImpl(WxPayService payService) { this.payService = payService; } @Override - public ProfitSharingResult profitsharing(ProfitsharingRequest request) throws WxPayException { + public ProfitSharingResult profitsharing(ProfitSharingRequest request) throws WxPayException { request.checkAndSign(this.payService.getConfig()); String url = this.payService.getPayBaseUrl() + "/secapi/pay/profitsharing"; @@ -28,4 +29,82 @@ public class ProfitSharingServiceImpl implements ProfitSharingService { result.checkResult(this.payService, request.getSignType(), true); return result; } + + @Override + public ProfitSharingResult multiprofitsharing(ProfitSharingRequest request) throws WxPayException { + request.checkAndSign(this.payService.getConfig()); + String url = this.payService.getPayBaseUrl() + "/secapi/pay/multiprofitsharing"; + + String responseContent = this.payService.post(url, request.toXML(), true); + ProfitSharingResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingResult.class); + result.checkResult(this.payService, request.getSignType(), true); + return result; + } + + @Override + public ProfitSharingResult profitsharingfinish(ProfitSharingFinishRequest request) throws WxPayException { + request.checkAndSign(this.payService.getConfig()); + String url = this.payService.getPayBaseUrl() + "/secapi/pay/profitsharingfinish"; + + String responseContent = this.payService.post(url, request.toXML(), true); + ProfitSharingResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingResult.class); + result.checkResult(this.payService, request.getSignType(), true); + return result; + } + + @Override + public ProfitSharingReceiverResult addReceiver(ProfitSharingReceiverRequest request) throws WxPayException { + request.checkAndSign(this.payService.getConfig()); + String url = this.payService.getPayBaseUrl() + "/pay/profitsharingaddreceiver"; + + String responseContent = this.payService.post(url, request.toXML(), true); + ProfitSharingReceiverResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingReceiverResult.class); + result.checkResult(this.payService, request.getSignType(), true); + return result; + } + + @Override + public ProfitSharingReceiverResult removeReceiver(ProfitSharingReceiverRequest request) throws WxPayException { + request.checkAndSign(this.payService.getConfig()); + String url = this.payService.getPayBaseUrl() + "/pay/profitsharingremovereceiver"; + + String responseContent = this.payService.post(url, request.toXML(), true); + ProfitSharingReceiverResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingReceiverResult.class); + result.checkResult(this.payService, request.getSignType(), true); + return result; + } + + @Override + public ProfitSharingQueryResult profitsharingQuery(ProfitSharingQueryRequest request) throws WxPayException { + if (true) throw new WxPayException("暂不支持,微信一直返回签名失败"); + request.checkAndSign(this.payService.getConfig()); + String url = this.payService.getPayBaseUrl() + "/pay/profitsharingquery"; + + String responseContent = this.payService.post(url, request.toXML(), true); + ProfitSharingQueryResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingQueryResult.class); + result.checkResult(this.payService, request.getSignType(), true); + return result; + } + + @Override + public ProfitSharingReturnResult profitsharingReturn(ProfitSharingReturnRequest request) throws WxPayException { + request.checkAndSign(this.payService.getConfig()); + String url = this.payService.getPayBaseUrl() + "/secapi/pay/profitsharingreturn"; + + String responseContent = this.payService.post(url, request.toXML(), true); + ProfitSharingReturnResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingReturnResult.class); + result.checkResult(this.payService, request.getSignType(), true); + return result; + } + + @Override + public ProfitSharingReturnResult profitsharingReturnQuery(ProfitSharingReturnQueryRequest request) throws WxPayException { + request.checkAndSign(this.payService.getConfig()); + String url = this.payService.getPayBaseUrl() + "/pay/profitsharingreturnquery"; + + String responseContent = this.payService.post(url, request.toXML(), true); + ProfitSharingReturnResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingReturnResult.class); + result.checkResult(this.payService, request.getSignType(), true); + return result; + } } diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java index 5d955e51..44949896 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java @@ -1,6 +1,7 @@ package com.github.binarywang.wxpay.service.impl; -import com.github.binarywang.wxpay.bean.profitsharing.ProfitsharingRequest; +import com.github.binarywang.wxpay.bean.profitsharing.*; +import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingRequest; import com.github.binarywang.wxpay.bean.profitsharing.Receiver; import com.github.binarywang.wxpay.bean.profitsharing.ReceiverList; import com.github.binarywang.wxpay.constant.WxPayConstants; @@ -26,15 +27,105 @@ public class ProfitSharingServiceImplTest { ReceiverList instance = ReceiverList.getInstance(); instance.add(new Receiver(WxPayConstants.ReceiverType.PERSONAL_OPENID, "oyOUE5ql4TtzrBg5cVOwxq6tbjOs", - 100, - "分到用户")); - ProfitsharingRequest request = ProfitsharingRequest + 20, + "***")); + //30000002922019102310811092093 + ProfitSharingRequest request = ProfitSharingRequest .newBuilder() - .outOrderNo("P20150806125346") - .transactionId("4208450740201411110007820472") -// .receivers("[{\"type\": \"PERSONAL_OPENID\",\"account\":\"oyOUE5ql4TtzrBg5cVOwxq6tbjOs\",\"amount\":100,\"description\": \"分到用户\"}]") + .outOrderNo("20191023112023031060677") + .transactionId("4200000431201910234736634272") .receivers(instance.toJSONString()) .build(); this.logger.info(this.payService.getProfitSharingService().profitsharing(request).toString()); } + + @Test + public void testMultiprofitsharing() throws WxPayException { + ReceiverList instance = ReceiverList.getInstance(); + instance.add(new Receiver(WxPayConstants.ReceiverType.MERCHANT_ID, + "86693852", + 1, + "***")); + ProfitSharingRequest request = ProfitSharingRequest + .newBuilder() + .outOrderNo("20191023154723316420060") + .transactionId("4200000448201910238249687345")//order_id=30000102922019102310821824010 + .receivers(instance.toJSONString()) + .build(); + this.logger.info(this.payService.getProfitSharingService().multiprofitsharing(request).toString()); + } + + @Test + public void testProfitsharingFinish() throws WxPayException { + ProfitSharingFinishRequest request = ProfitSharingFinishRequest + .newBuilder() + .outOrderNo("20191023103251431856285") + .transactionId("4200000441201910238267278073") + .description("分账完成") + .build(); + this.logger.info(this.payService.getProfitSharingService().profitsharingfinish(request).toString()); + } + + @Test + public void testAddreceiver() throws WxPayException { + Receiver receiver = new Receiver(WxPayConstants.ReceiverType.PERSONAL_OPENID, + "oyOUE5ql4TtzrBg5cVOwxq6tbjOs", + "***", + "STORE_OWNER", + null); + ProfitSharingReceiverRequest request = ProfitSharingReceiverRequest + .newBuilder() + .receiver(receiver.toJSONString()) + .build(); + this.logger.info(this.payService.getProfitSharingService().addReceiver(request).toString()); + } + + @Test + public void testRemoveReceiver() throws WxPayException { + Receiver receiver = new Receiver(WxPayConstants.ReceiverType.PERSONAL_OPENID, + "oyOUE5ql4TtzrBg5cVOwxq6tbjOs"); + ProfitSharingReceiverRequest request = ProfitSharingReceiverRequest + .newBuilder() + .receiver(receiver.toJSONString()) + .build(); + this.logger.info(this.payService.getProfitSharingService().removeReceiver(request).toString()); + } + + @Test + public void testProfitsharingQuery() throws WxPayException { + ProfitSharingQueryRequest request = ProfitSharingQueryRequest + .newBuilder() + .outOrderNo("20191023112023031060677") + .transactionId("4200000431201910234736634272") + .build(); + ProfitSharingQueryResult result = this.payService.getProfitSharingService().profitsharingQuery(request); + this.logger.info(result.formatReceivers().toString()); + this.logger.info(result.toString()); + } + + @Test + public void testProfitsharingReturn() throws WxPayException { + ProfitSharingReturnRequest request = ProfitSharingReturnRequest + .newBuilder() + .outOrderNo("20191023154723316420060") + .outReturnNo("R2019102315") + .returnAccountType("MERCHANT_ID") + .returnAccount("86693852") + .returnAmount(2) + .description("用户退款") + .build(); + this.logger.info(this.payService.getProfitSharingService().profitsharingReturn(request).toString()); + } + + @Test + public void testProfitsharingReturnQuery() throws WxPayException { + ProfitSharingReturnQueryRequest request = ProfitSharingReturnQueryRequest + .newBuilder() + .outOrderNo("20191023154723316420060") + .outReturnNo("R2019102315") + .build(); + this.logger.info(this.payService.getProfitSharingService().profitsharingReturnQuery(request).toString()); + } + + } From 8dffbd4fdbbb0c12abe444a4e24b38178327836e Mon Sep 17 00:00:00 2001 From: dingzhiwei Date: Thu, 24 Oct 2019 09:25:31 +0800 Subject: [PATCH 63/79] =?UTF-8?q?:sparkles:=20#1248=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=88=B7=E8=84=B8=E6=94=AF=E4=BB=98=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 增加获取微信刷脸调用凭证接口 * 增加微信刷脸接口 1. 获取刷脸支付凭证接口 2. 刷脸支付接口 --- .../request/WxPayFaceAuthInfoRequest.java | 126 +++++++++ .../bean/request/WxPayFacepayRequest.java | 177 +++++++++++++ .../bean/result/WxPayFaceAuthInfoResult.java | 38 +++ .../wxpay/bean/result/WxPayFacepayResult.java | 245 ++++++++++++++++++ .../wxpay/service/WxPayService.java | 33 +++ .../service/impl/BaseWxPayServiceImpl.java | 21 ++ 6 files changed, 640 insertions(+) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayFaceAuthInfoRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayFacepayRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayFaceAuthInfoRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayFaceAuthInfoRequest.java new file mode 100644 index 00000000..eb53e38c --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayFaceAuthInfoRequest.java @@ -0,0 +1,126 @@ +package com.github.binarywang.wxpay.bean.request; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; + +/** + *
+ *  获取微信刷脸调用凭证请求对象类
+ *  详见文档:https://pay.weixin.qq.com/wiki/doc/wxfacepay/develop/sdk-android.html#获取数据-getwxpayfacerawdata
+ * Created by Jmdhappy on 2019-09-04.
+ * 
+ * + * @author XxPay + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxPayFaceAuthInfoRequest extends BaseWxPayRequest { + + /** + *
+   * 字段名:门店编号
+   * 变量名:store_id
+   * 是否必填:是
+   * 类型:string(32)
+   * 示例值:1001
+   * 描述:门店编号, 由商户定义, 各门店唯一
+   * 
+ */ + @Required + @XStreamAlias("store_id") + private String storeId; + + /** + *
+   * 字段名:门店名称
+   * 变量名:store_name
+   * 是否必填:是
+   * 类型:string(128)
+   * 示例值:骏易科技
+   * 描述:门店名称,由商户定义。(可用于展示)
+   * 
+ */ + @Required + @XStreamAlias("store_name") + private String storeName; + + /** + *
+   * 字段名:终端设备编号
+   * 变量名:device_id
+   * 是否必填:是
+   * 类型:string(32)
+   * 示例值:
+   * 描述:终端设备编号,由商户定义。
+   * 
+ */ + @Required + @XStreamAlias("device_id") + private String deviceId; + + /** + *
+   * 字段名:附加字段
+   * 变量名:attach
+   * 是否必填:是
+   * 类型:string
+   * 示例值:
+   * 描述:附加字段。字段格式使用Json
+   * 
+ */ + @XStreamAlias("attach") + private String attach; + + /** + *
+   * 字段名:初始化数据
+   * 变量名:attach
+   * 是否必填:是
+   * 类型:string(2048)
+   * 示例值:
+   * 描述:初始化数据。由微信人脸SDK的接口返回。
+   * 
+ */ + @Required + @XStreamAlias("rawdata") + private String rawdata; + + /** + *
+   * 字段名:当前时间
+   * 变量名:now
+   * 是否必填:否
+   * 类型:String(10)
+   * 示例值:1239878956
+   * 描述:取当前时间,10位unix时间戳。 例如:1239878956
+   * 
+ */ + @Required + @XStreamAlias("now") + private String now; + + /** + *
+   * 字段名:接口版本号.
+   * 变量名:version
+   * 是否必填:是
+   * 类型:String
+   * 示例值:1.0
+   * 描述:版本号。固定为1
+   * 
+ */ + @Required + @XStreamAlias("version") + private String version; + + @Override + protected void checkConstraints() { + //do nothing + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayFacepayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayFacepayRequest.java new file mode 100644 index 00000000..2c70a894 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayFacepayRequest.java @@ -0,0 +1,177 @@ +package com.github.binarywang.wxpay.bean.request; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; + +/** + *
+ *  提交刷脸支付请求对象类
+ *  详见文档:微信人脸支付商户开发文档
+ * Created by Jmdhappy on 2019-09-05.
+ * 
+ * + * @author XxPay + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxPayFacepayRequest extends BaseWxPayRequest { + + /** + *
+   * 字段名:设备号.
+   * 变量名:device_info
+   * 是否必填:否
+   * 类型:String(32)
+   * 示例值:013467007045764
+   * 描述:终端设备号(商户自定义,如门店编号)
+   * 
+ */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + *
+   * 字段名:商品描述.
+   * 变量名:body
+   * 是否必填:是
+   * 类型:String(128)
+   * 示例值:image形象店-深圳腾大- QQ公仔
+   * 描述:商品或支付单简要描述,格式要求:门店品牌名-城市分店名-实际商品名称
+   * 
+ **/ + @Required + @XStreamAlias("body") + private String body; + + /** + *
+   * 字段名:商品详情.
+   * 变量名:detail
+   * 是否必填:否
+   * 类型:String(8192)
+   * 示例值:
+   * 描述:商品详细列表,使用Json格式,传输签名前请务必使用CDATA标签将JSON文本串保护起来。
+ **/ + @XStreamAlias("detail") + private String detail; + + /** + *
+   * 字段名:附加数据.
+   * 变量名:attach
+   * 是否必填:否
+   * 类型:String(127)
+   * 示例值:说明
+   * 描述:附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
+   * 
+ **/ + @XStreamAlias("attach") + private String attach; + + /** + *
+   * 字段名:商户订单号.
+   * 变量名:out_trade_no
+   * 是否必填:是
+   * 类型:String(32)
+   * 示例值:1217752501201407033233368018
+   * 描述:商户系统内部的订单号,32个字符内、可包含字母;更换授权码必须要换新的商户订单号 其他说明见商户订单号
+   * 
+ **/ + @Required + @XStreamAlias("out_trade_no") + private String outTradeNo; + + /** + *
+   * 字段名:总金额.
+   * 变量名:total_fee
+   * 是否必填:是
+   * 类型:Int
+   * 示例值:888
+   * 描述:订单总金额,单位为分,只能为整数,详见支付金额
+   * 
+ **/ + @Required + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + *
+   * 字段名:货币类型.
+   * 变量名:fee_type
+   * 是否必填:否
+   * 类型:String(16)
+   * 示例值:CNY
+   * 描述:符合ISO4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
+   * 
+ **/ + @XStreamAlias("fee_type") + private String feeType; + + /** + *
+   * 字段名:终端IP.
+   * 变量名:spbill_create_ip
+   * 是否必填:是
+   * 类型:String(16)
+   * 示例值:127.0.0.1
+   * 描述:调用微信支付API的机器IP
+   * 
+ **/ + @Required + @XStreamAlias("spbill_create_ip") + private String spbillCreateIp; + + /** + *
+   * 字段名:商品标记.
+   * 变量名:goods_tag
+   * 是否必填:否
+   * 类型:String(32)
+   * 示例值:1234
+   * 描述:商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
+   * 
+ **/ + @XStreamAlias("goods_tag") + private String goodsTag; + + /** + *
+   * 字段名:用户标识.
+   * 变量名:openid
+   * 是否必填:是
+   * 类型:String(128)
+   * 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
+   * 描述:用户在商户appid 下的唯一标识
+   * 
+ */ + @Required + @XStreamAlias("openid") + private String openid; + + /** + *
+   * 字段名:人脸凭证.
+   * 变量名:face_code
+   * 是否必填:是
+   * 类型:String(128)
+   * 示例值:
+   * 描述:人脸凭证,用于刷脸支付
+   * 
+ **/ + @Required + @XStreamAlias("face_code") + private String faceCode; + + @Override + protected void checkConstraints() { + //do nothing + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java new file mode 100644 index 00000000..95dcf71e --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFaceAuthInfoResult.java @@ -0,0 +1,38 @@ +package com.github.binarywang.wxpay.bean.result; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *
+ * 获取微信刷脸调用凭证返回结果.
+ * 详见文档:https://pay.weixin.qq.com/wiki/doc/wxfacepay/develop/sdk-android.html#获取数据-getwxpayfacerawdata
+ * 
+ * + * @author Jmdhappy + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class WxPayFaceAuthInfoResult extends BaseWxPayResult implements Serializable { + + private static final long serialVersionUID = -65138145275211272L; + + /** + * SDK调用凭证. + */ + @XStreamAlias("authinfo") + private String authinfo; + + /** + * authinfo的有效时间, 单位秒. + */ + @XStreamAlias("expires_in") + private String expiresIn; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java new file mode 100644 index 00000000..27e33d7b --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayFacepayResult.java @@ -0,0 +1,245 @@ +package com.github.binarywang.wxpay.bean.result; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + *
+ * 提交书刷脸支付接口响应结果对象类
+ * Created by Jmdhappy on 2019-09-05.
+ * 
+ * + * @author XxPay + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class WxPayFacepayResult extends BaseWxPayResult { + + private static final long serialVersionUID = -4116580976046716911L; + + /** + *
+   * 设备号.
+   * device_info
+   * 否
+   * String(32)
+   * 013467007045764
+   * 调用接口提交的终端设备号
+   * 
+ */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + *
+   * 用户标识.
+   * openid
+   * 是
+   * String(128)
+   * Y
+   * 用户在商户appid 下的唯一标识
+   * 
+ **/ + @XStreamAlias("openid") + private String openid; + + /** + *
+   * 是否关注公众账号.
+   * is_subscribe
+   * 是
+   * String(1)
+   * Y
+   * 用户是否关注公众账号,仅在公众账号类型支付有效,取值范围:Y或N;Y-关注;N-未关注
+   * 
+ **/ + @XStreamAlias("is_subscribe") + private String isSubscribe; + + /** + *
+   * 用户子标识.
+   * sub_openid
+   * 否
+   * String(128)
+   * Y
+   * 子商户appid下用户唯一标识,如需返回则请求时需要传sub_appid
+   * 
+ **/ + @XStreamAlias("sub_openid") + private String subOpenid; + + /** + *
+   * 是否关注子公众账号.
+   * sub_is_subscribe
+   * 是
+   * String(1)
+   * Y
+   * 用户是否关注子公众账号,仅在公众账号类型支付有效,取值范围:Y或N;Y-关注;N-未关注
+   * 
+ **/ + @XStreamAlias("sub_is_subscribe") + private String subsSubscribe; + + /** + *
+   * 交易类型.
+   * trade_type
+   * 是
+   * String(16)
+   * FACEPAY
+   * 支付类型为 FACEPAY(即刷脸支付)
+   * 
+ **/ + @XStreamAlias("trade_type") + private String tradeType; + + /** + *
+   * 付款银行.
+   * bank_type
+   * 是
+   * String(32)
+   * CMC
+   * 银行类型,采用字符串类型的银行标识,值列表详见银行类型
+   * 
+ **/ + @XStreamAlias("bank_type") + private String bankType; + + /** + *
+   * 货币类型.
+   * fee_type
+   * 否
+   * String(16)
+   * CNY
+   * 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
+   * 
+ **/ + @XStreamAlias("fee_type") + private String feeType; + + /** + *
+   * 订单金额.
+   * total_fee
+   * 是
+   * Int
+   * 888
+   * 订单总金额,单位为分,只能为整数,详见支付金额
+   * 
+ **/ + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + *
+   * 现金支付货币类型.
+   * cash_fee_type
+   * 否
+   * String(16)
+   * CNY
+   * 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
+   * 
+ **/ + @XStreamAlias("cash_fee_type") + private String cashFeeType; + + /** + *
+   * 现金支付金额.
+   * cash_fee
+   * 是
+   * Int
+   * 100
+   * 订单现金支付金额,详见支付金额
+   * 
+ **/ + @XStreamAlias("cash_fee") + private Integer cashFee; + + /** + *
+   * 微信支付订单号.
+   * transaction_id
+   * 是
+   * String(32)
+   * 1217752501201407033233368018
+   * 微信支付订单号
+   * 
+ **/ + @XStreamAlias("transaction_id") + private String transactionId; + + /** + *
+   * 商户订单号.
+   * out_trade_no
+   * 是
+   * String(32)
+   * 1217752501201407033233368018
+   * 商户系统的订单号,与请求一致。
+   * 
+ **/ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + /** + *
+   * 商品详情.
+   * detail
+   * 否
+   * String(8192)
+   * 与提交数据一致
+   * 实际提交的返回
+   * 
+ **/ + @XStreamAlias("detail") + private String detail; + + /** + *
+   * 商家数据包.
+   * attach
+   * 否
+   * String(128)
+   * 123456
+   * 商家数据包,原样返回
+   * 
+ **/ + @XStreamAlias("attach") + private String attach; + + /** + *
+   * 营销详情.
+   * promotion_detail
+   * 否
+   * String(6000)
+   * 示例见下文
+   * 新增返回,单品优惠功能字段,需要接入请见详细说明
+   * 
+ **/ + @XStreamAlias("promotion_detail") + private String promotionDetail; + + /** + *
+   * 支付完成时间.
+   * time_end
+   * 是
+   * String(14)
+   * 20141030133525
+   * 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。详见时间规则
+   * 
+ **/ + @XStreamAlias("time_end") + private String timeEnd; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java index 555362e6..d3fc4be7 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java @@ -704,4 +704,37 @@ public interface WxPayService { * @throws WxPayException the wx pay exception */ String queryComment(WxPayQueryCommentRequest request) throws WxPayException; + + /** + *
+   * 获取微信刷脸支付凭证.
+   * 接口请求链接:https://payapp.weixin.qq.com/face/get_wxpayface_authinfo
+   * 文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_5
+   * 
+ * + * @param request the request + * @return the wx pay get face authinfo result + * @throws WxPayException the wx pay exception + */ + WxPayFaceAuthInfoResult getWxPayFaceAuthInfo(WxPayFaceAuthInfoRequest request) throws WxPayException; + + /** + *
+   * 提交刷脸支付.
+   * 文档地址:https://share.weiyun.com/5dxUgCw
+   * 应用场景:
+   * 用户在商超,便利店,餐饮等场景,在屏幕上通过刷脸完成支付。
+   * 步骤1:用户在自助收银机上点击“刷脸支付”;
+   * 步骤2:发起人脸识别,摄像头自动抓取识别用户人脸,提示用户输入11位手机号码;
+   * 步骤3:商户收银系统提交刷脸支付;
+   * 步骤4:微信支付后台收到支付请求,验证人脸信息,返回支付结果给商户收银系统。
+   * 是否需要证书:不需要。
+   * 
+ * + * @param request the request + * @return the wx pay facepay result + * @throws WxPayException the wx pay exception + */ + WxPayFacepayResult facepay(WxPayFacepayRequest request) throws WxPayException; + } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index 13473a5d..4c3465f8 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java @@ -788,4 +788,25 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { return responseContent; } + @Override + public WxPayFaceAuthInfoResult getWxPayFaceAuthInfo(WxPayFaceAuthInfoRequest request) throws WxPayException { + request.checkAndSign(this.getConfig()); + String url = "https://payapp.weixin.qq.com/face/get_wxpayface_authinfo"; + String responseContent = this.post(url, request.toXML(), false); + WxPayFaceAuthInfoResult result = BaseWxPayResult.fromXML(responseContent, WxPayFaceAuthInfoResult.class); + result.checkResult(this, request.getSignType(), true); + return result; + } + + @Override + public WxPayFacepayResult facepay(WxPayFacepayRequest request) throws WxPayException { + request.checkAndSign(this.getConfig()); + + String url = this.getPayBaseUrl() + "/pay/facepay"; + String responseContent = this.post(url, request.toXML(), false); + WxPayFacepayResult result = BaseWxPayResult.fromXML(responseContent, WxPayFacepayResult.class); + result.checkResult(this, request.getSignType(), true); + return result; + } + } From f394a62fadc2f64a8cf96e9d7d4b05501689041a Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 27 Oct 2019 17:12:59 +0800 Subject: [PATCH 64/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.8.B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- spring-boot-starters/pom.xml | 2 +- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-miniapp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- weixin-java-open/pom.xml | 2 +- weixin-java-pay/pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index efb61efa..d4bd8535 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.5.7.B + 3.5.8.B pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 0bad4baf..12b9092e 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.7.B + 3.5.8.B pom wx-java-spring-boot-starters diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index f03fbd55..27b26fdf 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.7.B + 3.5.8.B 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index bc9c18e6..286f52e6 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.7.B + 3.5.8.B 4.0.0 diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml index 22cde91b..0b90cbf1 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.7.B + 3.5.8.B 4.0.0 diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index d9d7fcd6..791e8829 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.7.B + 3.5.8.B 4.0.0 diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index e12a0d42..a9610f93 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.7.B + 3.5.8.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 6716dd14..2f49e02d 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.7.B + 3.5.8.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index c75b0750..e70da6cc 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.7.B + 3.5.8.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 9c8b4612..867d3b87 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.7.B + 3.5.8.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index 90b88a74..c72de36b 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.7.B + 3.5.8.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 3ce30e30..22cd1e14 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.5.7.B + 3.5.8.B 4.0.0 From 70e6016d4ab435541e32eb7a7570bab24a9b4b09 Mon Sep 17 00:00:00 2001 From: S Date: Wed, 30 Oct 2019 20:27:46 +0800 Subject: [PATCH 65/79] =?UTF-8?q?:bug:=20#1259=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=BC=80=E6=94=BE=E5=B9=B3=E5=8F=B0=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=9F=9F=E5=90=8D=E8=AE=BE=E7=BD=AE=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/open/api/WxOpenMaService.java | 4 ++-- .../open/api/impl/WxOpenMaServiceImpl.java | 6 +++--- .../bean/result/WxOpenMaWebDomainResult.java | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaWebDomainResult.java diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java index 8bec5b2c..78177a3c 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java @@ -231,7 +231,7 @@ public interface WxOpenMaService extends WxMaService { * * @return */ - public WxOpenResult getWebViewDomainInfo() throws WxErrorException; + public WxOpenMaWebDomainResult getWebViewDomainInfo() throws WxErrorException; /** * 设置小程序的业务域名 @@ -249,7 +249,7 @@ public interface WxOpenMaService extends WxMaService { * @param domainList * @return */ - WxOpenResult setWebViewDomainInfo(String action, List domainList) throws WxErrorException; + WxOpenMaWebDomainResult setWebViewDomainInfo(String action, List domainList) throws WxErrorException; /** * 获取小程序的信息 diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java index 0d1554b5..230968d5 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java @@ -110,7 +110,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ * @return */ @Override - public WxOpenResult getWebViewDomainInfo() throws WxErrorException { + public WxOpenMaWebDomainResult getWebViewDomainInfo() throws WxErrorException { return setWebViewDomainInfo("get", null); } @@ -141,9 +141,9 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ * @return */ @Override - public WxOpenResult setWebViewDomainInfo(String action, List domainList) throws WxErrorException { + public WxOpenMaWebDomainResult setWebViewDomainInfo(String action, List domainList) throws WxErrorException { String response = this.setWebViewDomain(action, domainList); - return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + return WxMaGsonBuilder.create().fromJson(response, WxOpenMaWebDomainResult.class); } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaWebDomainResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaWebDomainResult.java new file mode 100644 index 00000000..4ff878e9 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaWebDomainResult.java @@ -0,0 +1,18 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxOpenMaWebDomainResult extends WxOpenResult { + + private static final long serialVersionUID = -2182687859448940313L; + + @SerializedName("webviewdomain") + List webviewdomainList; + +} From 7e079f770915cce52120a2a0aeb053b0f50a0f57 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 30 Oct 2019 22:03:55 +0800 Subject: [PATCH 66/79] =?UTF-8?q?:bug:=20#1254=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=87=AA=E5=8A=A8=E5=9B=9E=E5=A4=8D?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=9C=89=E9=97=AE=E9=A2=98=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../miniapp/util/xml/XStreamTransformer.java | 2 ++ .../message/WxMaXmlOutMessageTest.java | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java index 95b09713..f0961d5e 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; import cn.binarywang.wx.miniapp.bean.WxMaMessage; +import cn.binarywang.wx.miniapp.message.WxMaXmlOutMessage; import com.thoughtworks.xstream.XStream; import me.chanjar.weixin.common.util.xml.XStreamInitializer; @@ -19,6 +20,7 @@ public class XStreamTransformer { static { registerClass(WxMaMessage.class); + registerClass(WxMaXmlOutMessage.class); } /** diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java new file mode 100644 index 00000000..f07c57b1 --- /dev/null +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java @@ -0,0 +1,23 @@ +package cn.binarywang.wx.miniapp.message; + +import me.chanjar.weixin.common.api.WxConsts; +import org.testng.annotations.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.testng.Assert.*; + +public class WxMaXmlOutMessageTest { + + @Test + public void testToXml() { + WxMaXmlOutMessage message = WxMaXmlOutMessage.builder() + .fromUserName("1") + .toUserName("2") + .msgType(WxConsts.XmlMsgType.TRANSFER_CUSTOMER_SERVICE) + .createTime(System.currentTimeMillis() / 1000) + .build(); + + assertThat(message.toXml()).isNotEmpty(); + System.out.println(message.toXml()); + } +} From bd1cf2d8c3b5ab82ddf1b63c375e6f4a07eac3b0 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 2 Nov 2019 21:36:01 +0800 Subject: [PATCH 67/79] =?UTF-8?q?:sparkles:=20#1230=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=A2=9E=E5=8A=A0=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E8=8E=B7=E5=8F=96=E6=9C=8D=E5=8A=A1=E5=95=86?= =?UTF-8?q?=E5=87=AD=E8=AF=81=E5=87=AD=E8=AF=81=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/cp/api/WxCpService.java | 29 ++++++++++++++++-- .../cp/api/impl/BaseWxCpServiceImpl.java | 9 ++++++ .../weixin/cp/bean/WxCpProviderToken.java | 30 +++++++++++++++++++ .../weixin/cp/constant/WxCpApiPathConsts.java | 3 +- .../cp/api/impl/BaseWxCpServiceImplTest.java | 5 ++++ 5 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java index e25fd63c..73776228 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java @@ -10,10 +10,12 @@ import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult; import me.chanjar.weixin.cp.bean.WxCpMessage; import me.chanjar.weixin.cp.bean.WxCpMessageSendResult; +import me.chanjar.weixin.cp.bean.WxCpProviderToken; import me.chanjar.weixin.cp.config.WxCpConfigStorage; /** * 微信API的Service. + * * @author chanjaster */ public interface WxCpService { @@ -72,9 +74,10 @@ public interface WxCpService { /** * 获得jsapi_ticket,不强制刷新jsapi_ticket * 应用的jsapi_ticket用于计算agentConfig(参见“通过agentConfig注入应用的权限”)的签名,签名计算方法与上述介绍的config的签名算法完全相同,但需要注意以下区别: - * + *

* 签名的jsapi_ticket必须使用以下接口获取。且必须用wx.agentConfig中的agentid对应的应用secret去获取access_token。 * 签名用的noncestr和timestamp必须与wx.agentConfig中的nonceStr和timestamp相同。 + * * @see #getJsapiTicket(boolean) */ String getAgentJsapiTicket() throws WxErrorException; @@ -134,6 +137,26 @@ public interface WxCpService { */ String[] getCallbackIp() throws WxErrorException; + /** + *

+   * 获取服务商凭证
+   * 文档地址:https://work.weixin.qq.com/api/doc#90001/90143/91200
+   * 请求方式:POST(HTTPS)
+   * 请求地址: https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token
+   * 
+ * + * @param corpId 服务商的corpid + * @param providerSecret 服务商的secret,在服务商管理后台可见 + * @return { + * "errcode":0 , + * "errmsg":"ok" , + * "provider_access_token":"enLSZ5xxxxxxJRL", + * "expires_in":7200 + * } + * @throws WxErrorException . + */ + WxCpProviderToken getProviderToken(String corpId, String providerSecret) throws WxErrorException; + /** * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求 * @@ -206,7 +229,7 @@ public interface WxCpService { * @return WxSessionManager */ WxSessionManager getSessionManager(); - + /** *
    * 设置WxSessionManager,只有当需要使用个性化的WxSessionManager的时候才需要调用此方法,
@@ -289,7 +312,7 @@ public interface WxCpService {
 
   /**
    * 获取群聊服务
-   * 
+   *
    * @return 群聊服务
    */
   WxCpChatService getChatService();
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
index 52ccbf8e..9c7396ab 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
@@ -24,6 +24,7 @@ import me.chanjar.weixin.cp.api.*;
 import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
 import me.chanjar.weixin.cp.bean.WxCpMessage;
 import me.chanjar.weixin.cp.bean.WxCpMessageSendResult;
+import me.chanjar.weixin.cp.bean.WxCpProviderToken;
 import me.chanjar.weixin.cp.config.WxCpConfigStorage;
 
 import java.io.File;
@@ -199,6 +200,14 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH
     return ips;
   }
 
+  @Override
+  public WxCpProviderToken getProviderToken(String corpId, String providerSecret) throws WxErrorException {
+    JsonObject jsonObject = new JsonObject();
+    jsonObject.addProperty("corpid", corpId);
+    jsonObject.addProperty("provider_secret", providerSecret);
+    return WxCpProviderToken.fromJson(this.post(this.configStorage.getApiUrl(GET_PROVIDER_TOKEN), jsonObject.toString()));
+  }
+
   @Override
   public String get(String url, String queryParam) throws WxErrorException {
     return execute(SimpleGetRequestExecutor.create(this), url, queryParam);
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java
new file mode 100644
index 00000000..2c98f8e3
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java
@@ -0,0 +1,30 @@
+package me.chanjar.weixin.cp.bean;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+/**
+ * 服务商凭证.
+ *
+ * @author Binary Wang
+ * @date 2019-11-02
+ */
+@Data
+public class WxCpProviderToken {
+  /**
+   * 服务商的access_token,最长为512字节。
+   */
+  @SerializedName("provider_access_token")
+  private String providerAccessToken;
+
+  /**
+   * provider_access_token有效期(秒)
+   */
+  @SerializedName("expires_in")
+  private Integer expiresIn;
+
+  public static WxCpProviderToken fromJson(String json) {
+    return WxCpGsonBuilder.create().fromJson(json, WxCpProviderToken.class);
+  }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
index 6de1a63a..46813464 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
@@ -20,7 +20,8 @@ public final class WxCpApiPathConsts {
   public static final String BATCH_REPLACE_USER = "/cgi-bin/batch/replaceuser";
   public static final String BATCH_GET_RESULT = "/cgi-bin/batch/getresult?jobid=";
   public static final String JSCODE_TO_SESSION = "/cgi-bin/miniprogram/jscode2session";
-  public static final String GET_TOKEN = "/cgi-bin/gettoken?&corpid=%s&corpsecret=%s";
+  public static final String GET_TOKEN = "/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
+  public static final String GET_PROVIDER_TOKEN = "/cgi-bin/service/get_provider_token";
 
   public static class Agent {
     public static final String AGENT_GET = "/cgi-bin/agent/get?agentid=%d";
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
index 69a6aa43..f18f8b74 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
@@ -33,4 +33,9 @@ public class BaseWxCpServiceImplTest {
   public void testJsCode2Session() throws WxErrorException {
     assertThat(this.wxService.jsCode2Session("111")).isNotNull();
   }
+
+  @Test
+  public void testGetProviderToken() throws WxErrorException {
+    assertThat(this.wxService.getProviderToken("111","123")).isNotNull();
+  }
 }

From 913aec6e9364cb36760077f13c3476a592754e13 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 2 Nov 2019 21:40:03 +0800
Subject: [PATCH 68/79] =?UTF-8?q?:art:=20#1147=20=E5=B1=8F=E8=94=BD?=
 =?UTF-8?q?=E5=AF=BC=E8=87=B4=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=8A=A5?=
 =?UTF-8?q?=E9=94=99=E2=80=9CAppID=E4=B8=8D=E6=AD=A3=E7=A1=AE=E2=80=9D?=
 =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../me/chanjar/weixin/common/util/crypto/WxCryptUtil.java | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
index 3c5750e6..5c16e71c 100755
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
@@ -270,10 +270,10 @@ public class WxCryptUtil {
       throw new RuntimeException(e);
     }
 
-    // appid不相同的情况
-    if (!fromAppid.equals(this.appidOrCorpid)) {
-      throw new RuntimeException("AppID不正确,请核实!");
-    }
+    // appid不相同的情况 暂时忽略这段判断
+//    if (!fromAppid.equals(this.appidOrCorpid)) {
+//      throw new RuntimeException("AppID不正确,请核实!");
+//    }
 
     return xmlContent;
 

From acc08336226c48b06ad158f5dbaf9dcea2f54f2a Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sat, 2 Nov 2019 21:47:21 +0800
Subject: [PATCH 69/79] =?UTF-8?q?:art:=20=E8=A7=84=E8=8C=83=E5=8C=96?=
 =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E5=92=8C?=
 =?UTF-8?q?=E5=91=BD=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../profitsharing/ProfitSharingRequest.java   |  4 +-
 .../wxpay/service/ProfitSharingService.java   | 62 +++++++++----------
 .../impl/ProfitSharingServiceImpl.java        | 24 +++----
 .../impl/ProfitSharingServiceImplTest.java    | 12 ++--
 4 files changed, 49 insertions(+), 53 deletions(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingRequest.java
index aeb2e817..6e6c2a31 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingRequest.java
@@ -78,9 +78,7 @@ public class ProfitSharingRequest extends BaseWxPayRequest {
 
   @Override
   protected void checkConstraints() throws WxPayException {
-    /**
-     * 目前仅支持HMAC-SHA256
-     */
+    // 目前仅支持HMAC-SHA256.
     this.setSignType(WxPayConstants.SignType.HMAC_SHA256);
   }
 }
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java
index 8371fcb0..7f8d6ad3 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingService.java
@@ -3,9 +3,6 @@ package com.github.binarywang.wxpay.service;
 import com.github.binarywang.wxpay.bean.profitsharing.*;
 import com.github.binarywang.wxpay.exception.WxPayException;
 
-import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingResult;
-import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingRequest;
-
 /**
  * 注意:微信最高分账比例为30%
  * 可多次分账到同一个人,但是依然不能超过30%
@@ -22,11 +19,11 @@ public interface ProfitSharingService {
    * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/profitsharing
    * 
* - * @param profitsharingRequest - * @return + * @param request . + * @return . * @throws WxPayException the wx pay exception */ - ProfitSharingResult profitsharing(ProfitSharingRequest profitsharingRequest) throws WxPayException; + ProfitSharingResult profitSharing(ProfitSharingRequest request) throws WxPayException; /** *
@@ -38,11 +35,11 @@ public interface ProfitSharingService {
    * 文档详见: https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_6&index=2
    * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/multiprofitsharing
    *
-   * @param profitsharingRequest
-   * @return
+   * @param request .
+   * @return .
    * @throws WxPayException the wx pay exception
    */
-  ProfitSharingResult multiprofitsharing(ProfitSharingRequest profitsharingRequest) throws WxPayException;
+  ProfitSharingResult multiProfitSharing(ProfitSharingRequest request) throws WxPayException;
 
   /**
    * 
@@ -54,11 +51,11 @@ public interface ProfitSharingService {
    * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/profitsharingfinish
    * 
* - * @param profitSharingFinishRequest - * @return + * @param request . + * @return . * @throws WxPayException the wx pay exception */ - ProfitSharingResult profitsharingfinish(ProfitSharingFinishRequest profitSharingFinishRequest) throws WxPayException; + ProfitSharingResult profitSharingFinish(ProfitSharingFinishRequest request) throws WxPayException; /** *
@@ -67,11 +64,11 @@ public interface ProfitSharingService {
    * 接口链接:https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver
    * 
* - * @param profitSharingReceiverRequest - * @return - * @throws WxPayException + * @param request . + * @return . + * @throws WxPayException . */ - ProfitSharingReceiverResult addReceiver(ProfitSharingReceiverRequest profitSharingReceiverRequest) throws WxPayException; + ProfitSharingReceiverResult addReceiver(ProfitSharingReceiverRequest request) throws WxPayException; /** *
@@ -80,11 +77,11 @@ public interface ProfitSharingService {
    * 接口链接:https://api.mch.weixin.qq.com/pay/profitsharingremovereceiver
    * 
* - * @param profitSharingReceiverRequest - * @return - * @throws WxPayException + * @param request . + * @return . + * @throws WxPayException . */ - ProfitSharingReceiverResult removeReceiver(ProfitSharingReceiverRequest profitSharingReceiverRequest) throws WxPayException; + ProfitSharingReceiverResult removeReceiver(ProfitSharingReceiverRequest request) throws WxPayException; /** * TODO:微信返回签名失败 @@ -93,11 +90,11 @@ public interface ProfitSharingService { * 接口频率:80QPS *
* - * @param profitSharingReceiverRequest - * @return - * @throws WxPayException + * @param request . + * @return . + * @throws WxPayException . */ - ProfitSharingQueryResult profitsharingQuery(ProfitSharingQueryRequest profitSharingReceiverRequest) throws WxPayException; + ProfitSharingQueryResult profitSharingQuery(ProfitSharingQueryRequest request) throws WxPayException; /** * TODO:这个接口用真实的数据返回【参数不正确】,我对比官方文档除了缺少sub_mch_id,和sub_appid之外其他相同,当我随便填了一个商户id的时候,提示【回退方没有开通分账回退功能】 @@ -111,11 +108,11 @@ public interface ProfitSharingService { * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/profitsharingreturn *
* - * @param profitSharingReturnRequest - * @return - * @throws WxPayException + * @param returnRequest . + * @return . + * @throws WxPayException . */ - ProfitSharingReturnResult profitsharingReturn(ProfitSharingReturnRequest profitSharingReturnRequest) throws WxPayException; + ProfitSharingReturnResult profitSharingReturn(ProfitSharingReturnRequest returnRequest) throws WxPayException; /** * TODO:因profitsharingReturn接口无法使用,没有办法对这里进行真实的测试,模拟数据这里返回【记录不存在】 @@ -127,10 +124,11 @@ public interface ProfitSharingService { * 接口链接:https://api.mch.weixin.qq.com/pay/profitsharingreturnquery *
* - * @param profitSharingReturnQueryRequest - * @return - * @throws WxPayException + * @param queryRequest . + * @return . + * @throws WxPayException . */ - ProfitSharingReturnResult profitsharingReturnQuery(ProfitSharingReturnQueryRequest profitSharingReturnQueryRequest) throws WxPayException; + ProfitSharingReturnResult profitSharingReturnQuery(ProfitSharingReturnQueryRequest queryRequest) + throws WxPayException; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java index d660f67c..114ae023 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java @@ -20,7 +20,7 @@ public class ProfitSharingServiceImpl implements ProfitSharingService { } @Override - public ProfitSharingResult profitsharing(ProfitSharingRequest request) throws WxPayException { + public ProfitSharingResult profitSharing(ProfitSharingRequest request) throws WxPayException { request.checkAndSign(this.payService.getConfig()); String url = this.payService.getPayBaseUrl() + "/secapi/pay/profitsharing"; @@ -31,7 +31,7 @@ public class ProfitSharingServiceImpl implements ProfitSharingService { } @Override - public ProfitSharingResult multiprofitsharing(ProfitSharingRequest request) throws WxPayException { + public ProfitSharingResult multiProfitSharing(ProfitSharingRequest request) throws WxPayException { request.checkAndSign(this.payService.getConfig()); String url = this.payService.getPayBaseUrl() + "/secapi/pay/multiprofitsharing"; @@ -42,7 +42,7 @@ public class ProfitSharingServiceImpl implements ProfitSharingService { } @Override - public ProfitSharingResult profitsharingfinish(ProfitSharingFinishRequest request) throws WxPayException { + public ProfitSharingResult profitSharingFinish(ProfitSharingFinishRequest request) throws WxPayException { request.checkAndSign(this.payService.getConfig()); String url = this.payService.getPayBaseUrl() + "/secapi/pay/profitsharingfinish"; @@ -75,7 +75,7 @@ public class ProfitSharingServiceImpl implements ProfitSharingService { } @Override - public ProfitSharingQueryResult profitsharingQuery(ProfitSharingQueryRequest request) throws WxPayException { + public ProfitSharingQueryResult profitSharingQuery(ProfitSharingQueryRequest request) throws WxPayException { if (true) throw new WxPayException("暂不支持,微信一直返回签名失败"); request.checkAndSign(this.payService.getConfig()); String url = this.payService.getPayBaseUrl() + "/pay/profitsharingquery"; @@ -87,24 +87,24 @@ public class ProfitSharingServiceImpl implements ProfitSharingService { } @Override - public ProfitSharingReturnResult profitsharingReturn(ProfitSharingReturnRequest request) throws WxPayException { - request.checkAndSign(this.payService.getConfig()); + public ProfitSharingReturnResult profitSharingReturn(ProfitSharingReturnRequest returnRequest) throws WxPayException { + returnRequest.checkAndSign(this.payService.getConfig()); String url = this.payService.getPayBaseUrl() + "/secapi/pay/profitsharingreturn"; - String responseContent = this.payService.post(url, request.toXML(), true); + String responseContent = this.payService.post(url, returnRequest.toXML(), true); ProfitSharingReturnResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingReturnResult.class); - result.checkResult(this.payService, request.getSignType(), true); + result.checkResult(this.payService, returnRequest.getSignType(), true); return result; } @Override - public ProfitSharingReturnResult profitsharingReturnQuery(ProfitSharingReturnQueryRequest request) throws WxPayException { - request.checkAndSign(this.payService.getConfig()); + public ProfitSharingReturnResult profitSharingReturnQuery(ProfitSharingReturnQueryRequest queryRequest) throws WxPayException { + queryRequest.checkAndSign(this.payService.getConfig()); String url = this.payService.getPayBaseUrl() + "/pay/profitsharingreturnquery"; - String responseContent = this.payService.post(url, request.toXML(), true); + String responseContent = this.payService.post(url, queryRequest.toXML(), true); ProfitSharingReturnResult result = BaseWxPayResult.fromXML(responseContent, ProfitSharingReturnResult.class); - result.checkResult(this.payService, request.getSignType(), true); + result.checkResult(this.payService, queryRequest.getSignType(), true); return result; } } diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java index 44949896..d21cca55 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java @@ -36,7 +36,7 @@ public class ProfitSharingServiceImplTest { .transactionId("4200000431201910234736634272") .receivers(instance.toJSONString()) .build(); - this.logger.info(this.payService.getProfitSharingService().profitsharing(request).toString()); + this.logger.info(this.payService.getProfitSharingService().profitSharing(request).toString()); } @Test @@ -52,7 +52,7 @@ public class ProfitSharingServiceImplTest { .transactionId("4200000448201910238249687345")//order_id=30000102922019102310821824010 .receivers(instance.toJSONString()) .build(); - this.logger.info(this.payService.getProfitSharingService().multiprofitsharing(request).toString()); + this.logger.info(this.payService.getProfitSharingService().multiProfitSharing(request).toString()); } @Test @@ -63,7 +63,7 @@ public class ProfitSharingServiceImplTest { .transactionId("4200000441201910238267278073") .description("分账完成") .build(); - this.logger.info(this.payService.getProfitSharingService().profitsharingfinish(request).toString()); + this.logger.info(this.payService.getProfitSharingService().profitSharingFinish(request).toString()); } @Test @@ -98,7 +98,7 @@ public class ProfitSharingServiceImplTest { .outOrderNo("20191023112023031060677") .transactionId("4200000431201910234736634272") .build(); - ProfitSharingQueryResult result = this.payService.getProfitSharingService().profitsharingQuery(request); + ProfitSharingQueryResult result = this.payService.getProfitSharingService().profitSharingQuery(request); this.logger.info(result.formatReceivers().toString()); this.logger.info(result.toString()); } @@ -114,7 +114,7 @@ public class ProfitSharingServiceImplTest { .returnAmount(2) .description("用户退款") .build(); - this.logger.info(this.payService.getProfitSharingService().profitsharingReturn(request).toString()); + this.logger.info(this.payService.getProfitSharingService().profitSharingReturn(request).toString()); } @Test @@ -124,7 +124,7 @@ public class ProfitSharingServiceImplTest { .outOrderNo("20191023154723316420060") .outReturnNo("R2019102315") .build(); - this.logger.info(this.payService.getProfitSharingService().profitsharingReturnQuery(request).toString()); + this.logger.info(this.payService.getProfitSharingService().profitSharingReturnQuery(request).toString()); } From d9da800af142adbe4768c202226e76239be7b662 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 2 Nov 2019 22:02:08 +0800 Subject: [PATCH 70/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.9.B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- spring-boot-starters/pom.xml | 2 +- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-miniapp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- weixin-java-open/pom.xml | 2 +- weixin-java-pay/pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index d4bd8535..8a577ad1 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.5.8.B + 3.5.9.B pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 12b9092e..52ecdaf9 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.8.B + 3.5.9.B pom wx-java-spring-boot-starters diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index 27b26fdf..098ee8e1 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.8.B + 3.5.9.B 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index 286f52e6..78722252 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.8.B + 3.5.9.B 4.0.0 diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml index 0b90cbf1..34b621f9 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.8.B + 3.5.9.B 4.0.0 diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index 791e8829..7b7b61dd 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.8.B + 3.5.9.B 4.0.0 diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index a9610f93..23a6508c 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.8.B + 3.5.9.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 2f49e02d..3147c320 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.8.B + 3.5.9.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index e70da6cc..b6c5856a 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.8.B + 3.5.9.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 867d3b87..8897e32a 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.8.B + 3.5.9.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index c72de36b..e8124cae 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.8.B + 3.5.9.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 22cd1e14..37ac901a 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.5.8.B + 3.5.9.B 4.0.0 From e7a0d6a5971b77c7d4bdd0ef232a922d9b787742 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 11 Nov 2019 15:06:56 +0800 Subject: [PATCH 71/79] =?UTF-8?q?:sparkles:=20#1271=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=A0=87=E7=AD=BE=E5=88=9B=E5=BB=BA=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=94=AF=E6=8C=81=E4=BC=A0=E5=85=A5id=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/cp/api/WxCpTagService.java | 31 +++++++++++++++++++ .../cp/api/impl/WxCpTagServiceImpl.java | 20 +++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java index 78f1d791..52bf9323 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java @@ -18,11 +18,29 @@ import java.util.List; */ public interface WxCpTagService { + /** + * 创建标签. + *
+   * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/tag/create?access_token=ACCESS_TOKEN
+   * 文档地址:https://work.weixin.qq.com/api/doc#90000/90135/90210
+   * 
+ * + * @param name 标签名称,长度限制为32个字以内(汉字或英文字母),标签名不可与其他标签重名。 + * @param id 标签id,非负整型,指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增。 + * @return 标签id + * @throws WxErrorException . + */ + String create(String name, Integer id) throws WxErrorException; + /** * 创建标签. * * @param tagName 标签名 + * @return 标签id + * @throws WxErrorException . + * @deprecated 建议使用 {@link #create(String, Integer)},其中后面的参数可以为空 */ + @Deprecated String create(String tagName) throws WxErrorException; /** @@ -30,6 +48,7 @@ public interface WxCpTagService { * * @param tagId 标签id * @param tagName 标签名 + * @throws WxErrorException . */ void update(String tagId, String tagName) throws WxErrorException; @@ -37,11 +56,15 @@ public interface WxCpTagService { * 删除标签. * * @param tagId 标签id + * @throws WxErrorException . */ void delete(String tagId) throws WxErrorException; /** * 获得标签列表. + * + * @return 标签列表 + * @throws WxErrorException . */ List listAll() throws WxErrorException; @@ -49,6 +72,8 @@ public interface WxCpTagService { * 获取标签成员. * * @param tagId 标签ID + * @return 成员列表 + * @throws WxErrorException . */ List listUsersByTagId(String tagId) throws WxErrorException; @@ -57,6 +82,8 @@ public interface WxCpTagService { * 对应: http://qydev.weixin.qq.com/wiki/index.php?title=管理标签 中的get接口 * * @param tagId 标签id + * @return . + * @throws WxErrorException . */ WxCpTagGetResult get(String tagId) throws WxErrorException; @@ -66,6 +93,8 @@ public interface WxCpTagService { * @param tagId 标签id * @param userIds 用户ID 列表 * @param partyIds 企业部门ID列表 + * @return . + * @throws WxErrorException . */ WxCpTagAddOrRemoveUsersResult addUsers2Tag(String tagId, List userIds, List partyIds) throws WxErrorException; @@ -75,6 +104,8 @@ public interface WxCpTagService { * @param tagId 标签id * @param userIds 用户id列表 * @param partyIds 企业部门ID列表 + * @return . + * @throws WxErrorException . */ WxCpTagAddOrRemoveUsersResult removeUsersFromTag(String tagId, List userIds, List partyIds) throws WxErrorException; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java index d0e97c6e..753f2493 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java @@ -10,14 +10,11 @@ import me.chanjar.weixin.cp.bean.WxCpTag; import me.chanjar.weixin.cp.bean.WxCpTagAddOrRemoveUsersResult; import me.chanjar.weixin.cp.bean.WxCpTagGetResult; import me.chanjar.weixin.cp.bean.WxCpUser; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.util.List; import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tag.*; -import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tag.TAG_CREATE; -import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tag.TAG_UPDATE; /** *
@@ -31,12 +28,27 @@ import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tag.TAG_UPDATE;
 public class WxCpTagServiceImpl implements WxCpTagService {
   private final WxCpService mainService;
 
+  @Override
+  public String create(String name, Integer id) throws WxErrorException {
+    JsonObject o = new JsonObject();
+    o.addProperty("tagname", name);
+
+    if (id != null) {
+      o.addProperty("tagid", id);
+    }
+    return this.create(o);
+  }
+
   @Override
   public String create(String tagName) throws WxErrorException {
     JsonObject o = new JsonObject();
     o.addProperty("tagname", tagName);
+    return this.create(o);
+  }
+
+  private String create(JsonObject param) throws WxErrorException {
     String url = this.mainService.getWxCpConfigStorage().getApiUrl(TAG_CREATE);
-    String responseContent = this.mainService.post(url, o.toString());
+    String responseContent = this.mainService.post(url, param.toString());
     JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
     return tmpJsonElement.getAsJsonObject().get("tagid").getAsString();
   }

From 2e14b5479ec294076e3a3cdb077abf283fe1292f Mon Sep 17 00:00:00 2001
From: qizai 
Date: Tue, 12 Nov 2019 12:39:00 +0800
Subject: [PATCH 72/79] =?UTF-8?q?:bug:=20#1276=20=E4=BF=AE=E5=A4=8D?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=BC=80=E6=94=BE=E5=B9=B3=E5=8F=B0=E8=8E=B7?=
 =?UTF-8?q?=E5=8F=96=E6=8E=88=E6=9D=83=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?=
 =?UTF-8?q?token=E5=8F=82=E6=95=B0=E5=AF=BC=E8=87=B4=E6=AD=BB=E5=BE=AA?=
 =?UTF-8?q?=E7=8E=AF=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

WxOpenComponentServiceImpl#getAuthorizerList由post内部维护token,否则总是使用旧token导致死循环
---
 .../me/chanjar/weixin/open/api/WxOpenComponentService.java   | 2 +-
 .../weixin/open/api/impl/WxOpenComponentServiceImpl.java     | 5 +----
 2 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index f0da385c..5f4994cd 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -27,7 +27,7 @@ public interface WxOpenComponentService {
   String API_GET_AUTHORIZER_INFO_URL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info";
   String API_GET_AUTHORIZER_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option";
   String API_SET_AUTHORIZER_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/component/api_set_authorizer_option";
-  String API_GET_AUTHORIZER_LIST = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list?component_access_token=%s";
+  String API_GET_AUTHORIZER_LIST = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list";
 
   String COMPONENT_LOGIN_PAGE_URL = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s&auth_type=xxx&biz_appid=xxx";
 
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
index 510ee305..27e76569 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
@@ -304,16 +304,13 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
 
   @Override
   public WxOpenAuthorizerListResult getAuthorizerList(int begin, int len) throws WxErrorException {
-
-    String url = String.format(API_GET_AUTHORIZER_LIST, getComponentAccessToken(false));
     begin = begin < 0 ? 0 : begin;
     len = len == 0 ? 10 : len;
-
     JsonObject jsonObject = new JsonObject();
     jsonObject.addProperty("component_appid", getWxOpenConfigStorage().getComponentAppId());
     jsonObject.addProperty("offset", begin);
     jsonObject.addProperty("count", len);
-    String responseContent = post(url, jsonObject.toString());
+    String responseContent = post(API_GET_AUTHORIZER_LIST, jsonObject.toString());
     WxOpenAuthorizerListResult ret = WxOpenGsonBuilder.create().fromJson(responseContent, WxOpenAuthorizerListResult.class);
     if (ret != null && ret.getList() != null) {
       for (Map data : ret.getList()) {

From ac67482a95e1d81366742ddf1d8e796febca6266 Mon Sep 17 00:00:00 2001
From: hanwei59 
Date: Thu, 14 Nov 2019 09:46:54 +0800
Subject: [PATCH 73/79] =?UTF-8?q?:sparkles:=20#1123=20=E5=A2=9E=E5=8A=A0?=
 =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=B0=8F=E7=A8=8B=E5=BA=8F=E2=80=9C=E6=89=AB?=
 =?UTF-8?q?=E6=99=AE=E9=80=9A=E9=93=BE=E6=8E=A5=E4=BA=8C=E7=BB=B4=E7=A0=81?=
 =?UTF-8?q?=E6=89=93=E5=BC=80=E5=B0=8F=E7=A8=8B=E5=BA=8F=E2=80=9D=E8=83=BD?=
 =?UTF-8?q?=E5=8A=9B=E7=9A=84=E4=BA=94=E4=B8=AA=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/open/api/WxOpenMaService.java      | 53 +++++++++++++++-
 .../open/api/impl/WxOpenMaServiceImpl.java    | 62 +++++++++++++++++++
 .../result/WxDownlooadQrcodeJumpResult.java   | 30 +++++++++
 .../bean/result/WxGetQrcodeJumpResult.java    | 40 ++++++++++++
 .../open/bean/result/WxQrcodeJumpRule.java    | 43 +++++++++++++
 5 files changed, 225 insertions(+), 3 deletions(-)
 create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxDownlooadQrcodeJumpResult.java
 create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxGetQrcodeJumpResult.java
 create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxQrcodeJumpRule.java

diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
index 78177a3c..2b6e2d13 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
@@ -167,10 +167,33 @@ public interface WxOpenMaService extends WxMaService {
 
   /**
    * 14.设置小程序“扫普通链接二维码打开小程序”能力
-   * 

- * TODO 暂时不实现 - *

+ * + * https://mp.weixin.qq.com/debug/wxadoc/introduction/qrcode.html + */ + /** + * 14.1 增加或修改二维码规则 + */ + String API_QRCODE_JUMP_ADD = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpadd"; + + /** + * 14.2 获取已设置的二维码规则 */ + String API_QRCODE_JUMP_GET = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpget"; + + /** + * 14.3 获取校验文件名称及内容 + */ + String API_QRCODE_JUMP_DOWNLOAD = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdownload"; + + /** + * 14.4 删除已设置的二维码规则 + */ + String API_QRCODE_JUMP_DELETE = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdelete"; + + /** + * 14.5 发布已设置的二维码规则 + */ + String API_QRCODE_JUMP_PUBLISH = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumppublish"; /** * 15.小程序审核撤回 @@ -421,4 +444,28 @@ public interface WxOpenMaService extends WxMaService { */ Boolean speedAudit(Long auditid) throws WxErrorException; + /** + * (1)增加或修改二维码规则 + */ + WxOpenResult addQrcodeJump(WxQrcodeJumpRule wxQrcodeJumpRule) throws WxErrorException; + + /** + * (2)获取已设置的二维码规则 + */ + WxGetQrcodeJumpResult getQrcodeJump() throws WxErrorException; + + /** + * (3)获取校验文件名称及内容 + */ + WxDownlooadQrcodeJumpResult downloadQrcodeJump() throws WxErrorException; + + /** + * (4)删除已设置的二维码规则 + */ + WxOpenResult deleteQrcodeJump(String prefix) throws WxErrorException; + + /** + * (5)发布已设置的二维码规则 + */ + WxOpenResult publishQrcodeJump(String prefix) throws WxErrorException; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java index 230968d5..1d30a57f 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java @@ -548,6 +548,68 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ } + /** + * (1)增加或修改二维码规则 + * @param wxQrcodeJumpRule + * @return + * @throws WxErrorException + */ + @Override + public WxOpenResult addQrcodeJump(WxQrcodeJumpRule wxQrcodeJumpRule) throws WxErrorException { + String response = post(API_QRCODE_JUMP_ADD, GSON.toJson(wxQrcodeJumpRule)); + return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + } + + /** + * (2)获取已设置的二维码规则 + * @return + * @throws WxErrorException + */ + @Override + public WxGetQrcodeJumpResult getQrcodeJump() throws WxErrorException { + String response = post(API_QRCODE_JUMP_GET, "{}"); + return WxMaGsonBuilder.create().fromJson(response, WxGetQrcodeJumpResult.class); + } + + /** + * (3)获取校验文件名称及内容 + * @return + * @throws WxErrorException + */ + @Override + public WxDownlooadQrcodeJumpResult downloadQrcodeJump() throws WxErrorException { + String response = post(API_QRCODE_JUMP_DOWNLOAD, "{}"); + return WxMaGsonBuilder.create().fromJson(response, WxDownlooadQrcodeJumpResult.class); + } + + /** + * (4)删除已设置的二维码规则 + * @param prefix + * @return + * @throws WxErrorException + */ + @Override + public WxOpenResult deleteQrcodeJump(String prefix) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("prefix", prefix); + String response = post(API_QRCODE_JUMP_DELETE, GSON.toJson(params)); + return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + } + + /** + * (5)发布已设置的二维码规则 + * @param prefix + * @return + * @throws WxErrorException + */ + @Override + public WxOpenResult publishQrcodeJump(String prefix) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("prefix", prefix); + String response = post(API_QRCODE_JUMP_PUBLISH, GSON.toJson(params)); + return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class); + } + /** * 将字符串对象转化为GsonArray对象 * diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxDownlooadQrcodeJumpResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxDownlooadQrcodeJumpResult.java new file mode 100644 index 00000000..3bdc532b --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxDownlooadQrcodeJumpResult.java @@ -0,0 +1,30 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; + +/** + * 二维码规则的校验文件名称及内容 + * + * @author hanwei59 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class WxDownlooadQrcodeJumpResult extends WxOpenResult { + + //文件名称 + @SerializedName("file_name") + private String fileName; + + //文件内容 + @SerializedName("file_content") + private String fileContent; + + @Override + public String toString() { + return WxOpenGsonBuilder.create().toJson(this); + } + +} diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxGetQrcodeJumpResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxGetQrcodeJumpResult.java new file mode 100644 index 00000000..f47e8be6 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxGetQrcodeJumpResult.java @@ -0,0 +1,40 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder; + +import java.util.List; + +/** + * 已设置的二维码规则信息 + * + * @author hanwei59 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class WxGetQrcodeJumpResult extends WxOpenResult { + + //二维码规则详情,数组形式 + @SerializedName("rule_list") + List ruleList; + + //是否已经打开二维码跳转链接设置 + @SerializedName("qrcodejump_open") + private String qrcodejumpOpen; + + //本月还可发布的次数 + @SerializedName("qrcodejump_pub_quota") + private Integer qrcodejumpPubQuota; + + //二维码规则数量 + @SerializedName("list_size") + private Integer listSize; + + @Override + public String toString() { + return WxOpenGsonBuilder.create().toJson(this); + } + +} diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxQrcodeJumpRule.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxQrcodeJumpRule.java new file mode 100644 index 00000000..eb8a074b --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxQrcodeJumpRule.java @@ -0,0 +1,43 @@ +package me.chanjar.weixin.open.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.util.List; + +/** + * 二维码规则 + * + * hanwei59 + */ +@Data +public class WxQrcodeJumpRule { + + //二维码规则 + @SerializedName("prefix") + private String prefix; + + //是否独占符合二维码前缀匹配规则的所有子规则:1为不占用,2为占用 + //详细说明:https://mp.weixin.qq.com/debug/wxadoc/introduction/qrcode.html#前缀占用规则 + @SerializedName("permit_sub_rule") + private String permitSubRule; + + //小程序功能页面 + @SerializedName("path") + private String path; + + //测试范围: + //1为开发版(配置只对开发者生效) + //2为体验版(配置对管理员、体验者生效) + //3为线上版本(配置对管理员、开发者和体验者生效) + @SerializedName("open_version") + private String openVersion; + + //测试链接(选填)可填写不多于5个用于测试的二维码完整链接,此链接必须符合已填写的二维码规则。 + @SerializedName("debug_url") + private List debugUrl; + + //编辑标志位,0表示新增二维码规则,1表示修改已有二维码规则 + @SerializedName("is_edit") + private String isEdit; +} From 92c5d62af42484d345fcda4103bb6f3bce2a25fa Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 17 Nov 2019 00:55:55 +0800 Subject: [PATCH 74/79] =?UTF-8?q?:art:=20#1265=20=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E9=80=9A=E8=AE=AF=E5=BD=95=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=AE=BE=E7=BD=AE=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java | 4 ++++ .../me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java | 4 ++++ .../weixin/cp/util/json/WxCpUserGsonAdapterTest.java | 6 +++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java index 8f4e4989..b7389afa 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java @@ -27,6 +27,10 @@ public class WxCpUser implements Serializable { private Gender gender; private String email; private String avatar; + /** + * 地址。长度最大128个字符 + */ + private String address; private String avatarMediaId; private Integer status; private Integer enable; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java index ed125c57..482a42b4 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java @@ -66,6 +66,7 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri user.setGender(Gender.fromCode(GsonHelper.getString(o, "gender"))); user.setEmail(GsonHelper.getString(o, "email")); user.setAvatar(GsonHelper.getString(o, "avatar")); + user.setAddress(GsonHelper.getString(o, "address")); user.setAvatarMediaId(GsonHelper.getString(o, "avatar_mediaid")); user.setStatus(GsonHelper.getInteger(o, "status")); user.setEnable(GsonHelper.getInteger(o, "enable")); @@ -186,6 +187,9 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri if (user.getAvatar() != null) { o.addProperty("avatar", user.getAvatar()); } + if (user.getAddress() != null) { + o.addProperty("address", user.getAddress()); + } if (user.getAvatarMediaId() != null) { o.addProperty("avatar_mediaid", user.getAvatarMediaId()); } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java index 9cdc51f8..d1770022 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java @@ -1,8 +1,7 @@ package me.chanjar.weixin.cp.util.json; -import org.testng.annotations.*; - import me.chanjar.weixin.cp.bean.WxCpUser; +import org.testng.annotations.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -32,6 +31,7 @@ public class WxCpUserGsonAdapterTest { " \"isleader\": 1,\n" + " \"avatar\": \"http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0\",\n" + " \"telephone\": \"020-123456\",\n" + + " \"address\": \"广州市海珠区新港中路\"," + " \"enable\": 1,\n" + " \"alias\": \"jackzhang\",\n" + " \"extattr\": {\n" + @@ -82,7 +82,7 @@ public class WxCpUserGsonAdapterTest { assertThat(user.getOrders()[0]).isEqualTo(1); assertThat(user.getOrders()[1]).isEqualTo(2); - + assertThat(user.getAddress()).isEqualTo("广州市海珠区新港中路"); assertThat(user.getExternalAttrs()).isNotEmpty(); final WxCpUser.ExternalAttribute externalAttr1 = user.getExternalAttrs().get(0); From b92c42180208ec3457bb19bcd69919cf00bca02e Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 17 Nov 2019 01:27:08 +0800 Subject: [PATCH 75/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.5.10.B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- spring-boot-starters/pom.xml | 2 +- .../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +- spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-miniapp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- weixin-java-open/pom.xml | 2 +- weixin-java-pay/pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 8a577ad1..8b91ecd7 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.binarywang wx-java - 3.5.9.B + 3.5.10.B pom WxJava - Weixin/Wechat Java SDK 微信开发Java SDK diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 52ecdaf9..96412926 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.9.B + 3.5.10.B pom wx-java-spring-boot-starters diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml index 098ee8e1..4ca07119 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.9.B + 3.5.10.B 4.0.0 diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml index 78722252..f110d3d9 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.9.B + 3.5.10.B 4.0.0 diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml index 34b621f9..bb4efc86 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.9.B + 3.5.10.B 4.0.0 diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml index 7b7b61dd..0666fa0c 100644 --- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ wx-java-spring-boot-starters com.github.binarywang - 3.5.9.B + 3.5.10.B 4.0.0 diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 23a6508c..b70ba119 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang wx-java - 3.5.9.B + 3.5.10.B weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 3147c320..0351f767 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.9.B + 3.5.10.B weixin-java-cp diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index b6c5856a..d424a024 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.9.B + 3.5.10.B weixin-java-miniapp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 8897e32a..fb24264f 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.9.B + 3.5.10.B weixin-java-mp diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index e8124cae..deae0bc4 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java - 3.5.9.B + 3.5.10.B weixin-java-open diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 37ac901a..3ede9176 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@ com.github.binarywang wx-java - 3.5.9.B + 3.5.10.B 4.0.0 From 4f280bb9390a03365b1b206f5f1725a55d8ae09e Mon Sep 17 00:00:00 2001 From: kennywgx <543444431@qq.com> Date: Tue, 19 Nov 2019 11:33:52 +0800 Subject: [PATCH 76/79] =?UTF-8?q?:sparkles:=09#1287=20=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1jssdk=E4=B8=8A=E4=BC=A0=E7=9A=84=E9=AB=98?= =?UTF-8?q?=E6=B8=85=E8=AF=AD=E9=9F=B3=E7=B4=A0=E6=9D=90=E7=9A=84=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 新增下载微信jssdk上传的高清语音素材的接口,格式为.speex * 添加高清语音接口测试代码 --- .../weixin/mp/api/WxMpMaterialService.java | 16 +++++++++++++ .../mp/api/impl/WxMpMaterialServiceImpl.java | 8 +++++++ .../chanjar/weixin/mp/enums/WxMpApiUrl.java | 4 ++++ .../api/impl/WxMpMaterialServiceImplTest.java | 23 +++++++++++++++++++ 4 files changed, 51 insertions(+) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java index 686c86f2..998939ca 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java @@ -88,6 +88,22 @@ public interface WxMpMaterialService { */ File mediaDownload(String mediaId) throws WxErrorException; + /** + *
+   * 获取高清语音素材
+   * 公众号可以使用本接口获取从JSSDK的uploadVoice接口上传的临时语音素材,格式为speex,16K采样率。
+   * 该音频比上文的临时素材获取接口(格式为amr,8K采样率)更加清晰,适合用作语音识别等对音质要求较高的业务。
+   * 详情请见: 
+   * 获取高清语音素材
+   * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/get/jssdk?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
+   * 
+ * + * @param mediaId 媒体文件Id + * @return 保存到本地的临时文件 + * @throws WxErrorException + */ + File jssdkMediaDownload(String mediaId) throws WxErrorException; + /** *
    * 上传图文消息内的图片获取URL
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
index 2ceec219..4b852c03 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
@@ -65,6 +65,14 @@ public class WxMpMaterialServiceImpl implements WxMpMaterialService {
       "media_id=" + mediaId);
   }
 
+  @Override
+  public File jssdkMediaDownload(String mediaId) throws WxErrorException {
+    return this.wxMpService.execute(
+      BaseMediaDownloadRequestExecutor.create(this.wxMpService.getRequestHttp(), this.wxMpService.getWxMpConfigStorage().getTmpDirFile()),
+      JSSDK_MEDIA_GET_URL,
+      "media_id=" + mediaId);
+  }
+
   @Override
   public WxMediaImgUploadResult mediaImgUpload(File file) throws WxErrorException {
     return this.wxMpService.execute(MediaImgUploadRequestExecutor.create(this.wxMpService.getRequestHttp()), IMG_UPLOAD_URL, file);
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
index 442f0305..5963af92 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
@@ -819,6 +819,10 @@ public interface WxMpApiUrl {
      * get.
      */
     MEDIA_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/media/get"),
+    /**
+     * jssdk media get.
+     */
+    JSSDK_MEDIA_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/media/get/jssdk"),
     /**
      * upload.
      */
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
index 024697cb..6d14b336 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
@@ -44,6 +44,8 @@ public class WxMpMaterialServiceImplTest {
   private WxMpMaterialCountResult wxMaterialCountResultBeforeTest;
   // 以下为media接口的测试
   private List mediaIdsToDownload = new ArrayList<>();
+  // 以下为高清语音接口的测试
+  private List voiceMediaIdsToDownload = new ArrayList<>();
 
   @DataProvider
   public Object[][] mediaFiles() {
@@ -289,6 +291,11 @@ public class WxMpMaterialServiceImplTest {
       if (res.getMediaId() != null && !mediaType.equals(WxConsts.MediaFileType.VIDEO)) {
         //video 不支持下载,所以不加入
         this.mediaIdsToDownload.add(res.getMediaId());
+
+        // 音频media, 用于测试下载高清语音接口
+        if (mediaType.equals(WxConsts.MediaFileType.VOICE)) {
+          this.voiceMediaIdsToDownload.add(res.getMediaId());
+        }
       }
 
       if (res.getThumbMediaId() != null) {
@@ -308,10 +315,26 @@ public class WxMpMaterialServiceImplTest {
     return params;
   }
 
+  @DataProvider
+  public Object[][] downloadJssdkMedia() {
+    Object[][] params = new Object[this.voiceMediaIdsToDownload.size()][];
+    for (int i = 0; i < this.voiceMediaIdsToDownload.size(); i++) {
+      params[i] = new Object[]{this.voiceMediaIdsToDownload.get(i)};
+    }
+    return params;
+  }
+
   @Test(dependsOnMethods = {"testUploadMedia"}, dataProvider = "downloadMedia")
   public void testDownloadMedia(String mediaId) throws WxErrorException {
     File file = this.wxService.getMaterialService().mediaDownload(mediaId);
     assertNotNull(file);
     System.out.println(file.getAbsolutePath());
   }
+
+  @Test(dependsOnMethods = {"testUploadMedia"}, dataProvider = "downloadJssdkMedia")
+  public void testDownloadJssdkMedia(String mediaId) throws WxErrorException {
+    File file = this.wxService.getMaterialService().jssdkMediaDownload(mediaId);
+    assertNotNull(file);
+    System.out.println(file.getAbsolutePath());
+  }
 }

From 2faac86310a052b6854d1fcf40402f7375781eaa Mon Sep 17 00:00:00 2001
From: shushi <741536172@qq.com>
Date: Tue, 19 Nov 2019 17:21:06 +0800
Subject: [PATCH 77/79] =?UTF-8?q?:bug:=20#1288=20=E4=BC=81=E4=B8=9A?=
 =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E4=BF=AE=E5=A4=8D=E5=88=9B=E5=BB=BA=E6=88=90?=
 =?UTF-8?q?=E5=91=98=E5=90=8C=E6=97=B6=E5=9B=9E=E8=B0=83create=5Fuser?=
 =?UTF-8?q?=E5=92=8Cupdate=5Fuser=E4=BA=8B=E4=BB=B6=E5=88=A4=E6=96=AD?=
 =?UTF-8?q?=E6=88=90=E9=87=8D=E5=A4=8D=E7=9A=84BUG?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
index 947ac28b..b5424be0 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
@@ -219,8 +219,11 @@ public class WxCpMessageRouter {
       messageId.append("-").append(wxMessage.getUserId());
     }
 
-    return this.messageDuplicateChecker.isDuplicate(messageId.toString());
+    if (StringUtils.isNotEmpty(wxMessage.getChangeType())) {
+      messageId.append("-").append(wxMessage.getChangeType());
+    }
 
+    return this.messageDuplicateChecker.isDuplicate(messageId.toString());
   }
 
   /**

From dc89396ead9056b6f6f32de3bf32f9202c3518f8 Mon Sep 17 00:00:00 2001
From: kennywgx <543444431@qq.com>
Date: Fri, 22 Nov 2019 14:58:40 +0800
Subject: [PATCH 78/79] =?UTF-8?q?:art:=20#1294=20=E4=BC=98=E5=8C=96getAcce?=
 =?UTF-8?q?ssToken=E6=96=B9=E6=B3=95,=E8=A7=A3=E5=86=B3=E5=B9=B6=E5=8F=91?=
 =?UTF-8?q?=E6=97=B6=E9=87=8D=E5=A4=8D=E5=88=B7=E6=96=B0=E7=9A=84=E9=97=AE?=
 =?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../api/impl/WxMpServiceHttpClientImpl.java   |  3 ++
 .../mp/api/impl/WxMpServiceJoddHttpImpl.java  |  3 ++
 .../mp/api/impl/WxMpServiceOkHttpImpl.java    |  3 ++
 .../mp/api/impl/BaseWxMpServiceImplTest.java  | 37 +++++++++++++++++++
 4 files changed, 46 insertions(+)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java
index d13a95b1..a25a910e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java
@@ -74,6 +74,9 @@ public class WxMpServiceHttpClientImpl extends BaseWxMpServiceImpl set = Sets.newConcurrentHashSet();
+    Runnable r = new Runnable() {
+      @Override
+      public void run() {
+        try {
+          String accessToken = wxService.getAccessToken();
+          set.add(accessToken);
+        } catch (WxErrorException e) {
+          e.printStackTrace();
+        }
+      }
+    };
+
+    final int threadNumber = 10;
+    ExecutorService executorService = Executors.newFixedThreadPool(threadNumber);
+    for ( int i = 0; i < threadNumber; i++ ) {
+      executorService.submit(r);
+    }
+    executorService.shutdown();
+    boolean isTerminated = executorService.awaitTermination(15, TimeUnit.SECONDS);
+    System.out.println("isTerminated: " + isTerminated);
+    System.out.println("times of refreshing accessToken: " + set.size());
+
+    assertEquals(set.size(), 1);
+
+  }
 }

From f00f5e60d5e20da20a6857f3fc73021d41795a13 Mon Sep 17 00:00:00 2001
From: Binary Wang 
Date: Sun, 24 Nov 2019 23:12:31 +0800
Subject: [PATCH 79/79] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=833.6.0?=
 =?UTF-8?q?=E6=AD=A3=E5=BC=8F=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml                                                         | 2 +-
 spring-boot-starters/pom.xml                                    | 2 +-
 .../wx-java-miniapp-spring-boot-starter/pom.xml                 | 2 +-
 spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml     | 2 +-
 spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml   | 2 +-
 spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml    | 2 +-
 weixin-java-common/pom.xml                                      | 2 +-
 weixin-java-cp/pom.xml                                          | 2 +-
 weixin-java-miniapp/pom.xml                                     | 2 +-
 weixin-java-mp/pom.xml                                          | 2 +-
 weixin-java-open/pom.xml                                        | 2 +-
 weixin-java-pay/pom.xml                                         | 2 +-
 12 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/pom.xml b/pom.xml
index 8b91ecd7..930c7ce9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
   4.0.0
   com.github.binarywang
   wx-java
-  3.5.10.B
+  3.6.0
   pom
   WxJava - Weixin/Wechat Java SDK
   微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 96412926..a04dc135 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.10.B
+    3.6.0
   
   pom
   wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 4ca07119..c5383576 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.5.10.B
+    3.6.0
   
   4.0.0
 
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index f110d3d9..d45c1bd7 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.5.10.B
+    3.6.0
   
   4.0.0
 
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index bb4efc86..52ab7e3d 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.5.10.B
+    3.6.0
   
   4.0.0
 
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 0666fa0c..6c643615 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
   
     wx-java-spring-boot-starters
     com.github.binarywang
-    3.5.10.B
+    3.6.0
   
   4.0.0
 
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index b70ba119..68c430f5 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.10.B
+    3.6.0
   
 
   weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 0351f767..2dc09480 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.10.B
+    3.6.0
   
 
   weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index d424a024..cefda9b5 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.10.B
+    3.6.0
   
 
   weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index fb24264f..7db18593 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.10.B
+    3.6.0
   
 
   weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index deae0bc4..d25b5083 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.10.B
+    3.6.0
   
 
   weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index 3ede9176..fedc9f50 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
   
     com.github.binarywang
     wx-java
-    3.5.10.B
+    3.6.0
   
   4.0.0