diff --git a/README.md b/README.md
index def36134f..083c01135 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-## WxJava - 微信开发 Java SDK(开发工具包) [](https://github.com/996icu/996.ICU/blob/master/LICENSE) [](https://996.icu/#/zh_CN) [](https://mp.weixin.qq.com/s/dfwatgMgARaBjh421Todyg)
+## WxJava - 微信开发 Java SDK(开发工具包) [](https://github.com/996icu/996.ICU/blob/master/LICENSE) [](https://996.icu/#/zh_CN)
[](https://gitee.com/binary/weixin-java-tools)
[](https://github.com/Wechat-Group/WxJava)
@@ -23,11 +23,6 @@
-
+ * 发生以下情况时尝试刷新access_token + * 40001 获取access_token时AppSecret错误,或者access_token无效 + * 42001 access_token超时 + * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 + *+ */ + public static final List
- * 获取审批数据 (已过期, 请使用"批量获取审批单号" && "获取审批申请详情") - * 通过本接口来获取公司一段时间内的审批记录。一次拉取调用最多拉取10000个审批记录,可以通过多次拉取的方式来满足需求,但调用频率不可超过600次/分。 - * API doc : https://work.weixin.qq.com/api/doc#90000/90135/91530 - *- * - * @param startTime 获取审批记录的开始时间 - * @param endTime 获取审批记录的结束时间 - * @param nextSpnum 第一个拉取的审批单号,不填从该时间段的第一个审批单拉取 - * @throws WxErrorException . - * @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalInfo - * @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalDetail - */ - @Deprecated - WxCpApprovalDataResult getApprovalData(Date startTime, Date endTime, Long nextSpnum) throws WxErrorException; - /** * 获取公费电话拨打记录 * 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 73776228e..036265815 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 @@ -173,6 +173,14 @@ public interface WxCpService { */ String post(String url, String postData) throws WxErrorException; + /** + * 当不需要自动带accessToken的时候,可以用这个发起post请求 + * + * @param url 接口地址 + * @param postData 请求body字符串 + */ + String postWithoutToken(String url, String postData) throws WxErrorException; + /** *
* Service没有实现某个API的时候,可以用这个, @@ -328,6 +336,13 @@ public interface WxCpService { WxCpOaService getOAService(); + /** + * 获取群机器人消息推送服务 + * + * @return 群机器人消息推送服务 + */ + WxCpGroupRobotService getGroupRobotService(); + /** * http请求对象 */ 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 52bf93230..045264f7d 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 @@ -17,7 +17,6 @@ import java.util.List; * @author Binary Wang */ public interface WxCpTagService { - /** * 创建标签. *@@ -32,17 +31,6 @@ public interface WxCpTagService { */ 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; - /** * 更新标签. * 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 75cf92aa9..52d88e456 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 @@ -4,8 +4,9 @@ import com.google.common.base.Joiner; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.enums.WxType; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.session.StandardSessionManager; @@ -51,6 +52,7 @@ public abstract class BaseWxCpServiceImplimplements WxCpService, RequestH private WxCpOaService oaService = new WxCpOaServiceImpl(this); private WxCpTaskCardService taskCardService = new WxCpTaskCardServiceImpl(this); private WxCpExternalContactService externalContactService = new WxCpExternalContactServiceImpl(this); + private WxCpGroupRobotService groupRobotService = new WxCpGroupRobotServiceImpl(this); /** * 全局的是否正在刷新access token的锁. @@ -217,6 +219,11 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH return execute(SimplePostRequestExecutor.create(this), url, postData); } + @Override + public String postWithoutToken(String url, String postData) throws WxErrorException { + return this.executeNormal(SimplePostRequestExecutor.create(this), url, postData); + } + /** * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求. */ @@ -271,16 +278,12 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH return result; } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - * 40001 获取access_token时AppSecret错误,或者access_token无效 - * 42001 access_token超时 - * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 - */ - if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { + + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { // 强制设置wxCpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token this.configStorage.expireAccessToken(); if (this.getWxCpConfigStorage().autoRefreshToken()) { + log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg()); return this.execute(executor, uri, data); } } @@ -296,6 +299,27 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH } } + /** + * 普通请求,不自动带accessToken + */ + private T executeNormal(RequestExecutor executor, String uri, E data) throws WxErrorException { + try { + T result = executor.execute(uri, data, WxType.CP); + log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uri, data, result); + return result; + } catch (WxErrorException e) { + WxError error = e.getError(); + if (error.getErrorCode() != 0) { + log.error("\n【请求地址】: {}\n【请求参数】:{}\n【错误信息】:{}", uri, data, error); + throw new WxErrorException(error, e); + } + return null; + } catch (IOException e) { + log.error("\n【请求地址】: {}\n【请求参数】:{}\n【异常信息】:{}", uri, data, e.getMessage()); + throw new RuntimeException(e); + } + } + @Override public void setWxCpConfigStorage(WxCpConfigStorage wxConfigProvider) { this.configStorage = wxConfigProvider; @@ -412,6 +436,11 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH return oaService; } + @Override + public WxCpGroupRobotService getGroupRobotService() { + return groupRobotService; + } + @Override public WxCpTaskCardService getTaskCardService() { return taskCardService; 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 b58672f3a..191bfec0d 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 @@ -6,6 +6,7 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.enums.WxType; import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.error.WxCpErrorMsgEnum; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.DataUtils; @@ -222,10 +223,11 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ * 发生以下情况时尝试刷新suite_access_token * 42009 suite_access_token已过期 */ - if (error.getErrorCode() == 42009) { + if (error.getErrorCode() == WxCpErrorMsgEnum.CODE_42009.getCode()) { // 强制设置wxCpTpConfigStorage它的suite access token过期了,这样在下一次请求里就会刷新suite access token this.configStorage.expireSuiteAccessToken(); if (this.getWxCpTpConfigStorage().autoRefreshToken()) { + log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg()); return this.execute(executor, uri, data); } } 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 db85d2f25..10af36afe 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 @@ -24,11 +24,10 @@ import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Chat.*; */ @RequiredArgsConstructor public class WxCpChatServiceImpl implements WxCpChatService { - private final WxCpService cpService; @Override - public String chatCreate(String name, String owner, List users, String chatId) throws WxErrorException { + public String create(String name, String owner, List users, String chatId) throws WxErrorException { Map data = new HashMap<>(4); if (StringUtils.isNotBlank(name)) { data.put("name", name); @@ -48,12 +47,7 @@ public class WxCpChatServiceImpl implements WxCpChatService { } @Override - public String create(String name, String owner, List users, String chatId) throws WxErrorException { - return this.chatCreate(name, owner, users, chatId); - } - - @Override - public void chatUpdate(String chatId, String name, String owner, List usersToAdd, List usersToDelete) + public void update(String chatId, String name, String owner, List usersToAdd, List usersToDelete) throws WxErrorException { Map data = new HashMap<>(5); if (StringUtils.isNotBlank(chatId)) { @@ -77,24 +71,13 @@ public class WxCpChatServiceImpl implements WxCpChatService { } @Override - 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 { + public WxCpChat get(String chatId) throws WxErrorException { final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_GET_CHATID + chatId); String result = this.cpService.get(url, null); final String chatInfo = GsonParser.parse(result).getAsJsonObject("chat_info").toString(); return WxCpGsonBuilder.create().fromJson(chatInfo, WxCpChat.class); } - @Override - public WxCpChat get(String chatId) throws WxErrorException { - return this.chatGet(chatId); - } - @Override public void sendMsg(WxCpAppChatMessage message) throws WxErrorException { this.cpService.post(this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_SEND), message.toJson()); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImpl.java new file mode 100644 index 000000000..ed4d8a108 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImpl.java @@ -0,0 +1,65 @@ +package me.chanjar.weixin.cp.api.impl; + +import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpGroupRobotService; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.WxCpGroupRobotMessage; +import me.chanjar.weixin.cp.bean.article.NewArticle; +import me.chanjar.weixin.cp.config.WxCpConfigStorage; +import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; + +import java.util.List; + +/** + * 微信群机器人消息发送api 实现 + * + * @author yr + * @date 2020-08-20 + */ +@RequiredArgsConstructor +public class WxCpGroupRobotServiceImpl implements WxCpGroupRobotService { + private final WxCpService cpService; + + private String getApiUrl() { + WxCpConfigStorage wxCpConfigStorage = cpService.getWxCpConfigStorage(); + return wxCpConfigStorage.getApiUrl(WxCpApiPathConsts.WEBHOOK_SEND) + wxCpConfigStorage.getWebhookKey(); + } + + @Override + public void sendText(String content, List mentionedList, List mobileList) throws WxErrorException { + WxCpGroupRobotMessage message = new WxCpGroupRobotMessage() + .setMsgType(WxConsts.GroupRobotMsgType.TEXT) + .setContent(content) + .setMentionedList(mentionedList) + .setMentionedMobileList(mobileList); + cpService.postWithoutToken(this.getApiUrl(), message.toJson()); + } + + @Override + public void sendMarkDown(String content) throws WxErrorException { + WxCpGroupRobotMessage message = new WxCpGroupRobotMessage() + .setMsgType(WxConsts.GroupRobotMsgType.MARKDOWN) + .setContent(content); + cpService.postWithoutToken(this.getApiUrl(), message.toJson()); + } + + @Override + public void sendImage(String base64, String md5) throws WxErrorException { + WxCpGroupRobotMessage message = new WxCpGroupRobotMessage() + .setMsgType(WxConsts.GroupRobotMsgType.IMAGE) + .setBase64(base64) + .setMd5(md5); + cpService.postWithoutToken(this.getApiUrl(), message.toJson()); + } + + @Override + public void sendNews(List articleList) throws WxErrorException { + WxCpGroupRobotMessage message = new WxCpGroupRobotMessage() + .setMsgType(WxConsts.GroupRobotMsgType.NEWS) + .setArticles(articleList); + cpService.postWithoutToken(this.getApiUrl(), message.toJson()); + } + +} 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 bdb1e026c..17a2ba274 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 @@ -164,20 +164,6 @@ public class WxCpOaServiceImpl implements WxCpOaService { return WxCpGsonBuilder.create().fromJson(responseContent, WxCpApprovalDetailResult.class); } - @Override - public WxCpApprovalDataResult getApprovalData(Date startTime, Date endTime, Long nextSpnum) throws WxErrorException { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("starttime", startTime.getTime() / 1000L); - jsonObject.addProperty("endtime", endTime.getTime() / 1000L); - if (nextSpnum != null) { - jsonObject.addProperty("next_spnum", nextSpnum); - } - - 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 { 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 9a507e461..0e079160f 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 @@ -40,13 +40,6 @@ public class WxCpTagServiceImpl implements WxCpTagService { 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, param.toString()); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpGroupRobotMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpGroupRobotMessage.java new file mode 100644 index 000000000..937a88cb0 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpGroupRobotMessage.java @@ -0,0 +1,118 @@ +package me.chanjar.weixin.cp.bean; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import me.chanjar.weixin.cp.bean.article.NewArticle; + +import java.util.List; + +import static me.chanjar.weixin.common.api.WxConsts.GroupRobotMsgType.*; + +/** + * 微信群机器人消息 + * + * @author yr + * @date 2020-08-20 + */ +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +@Data +public class WxCpGroupRobotMessage { + /** + * 消息类型 + */ + private String msgType; + + /** + * 文本内容,最长不超过2048个字节,markdown内容,最长不超过4096个字节,必须是utf8编码 + * 必填 + */ + private String content; + /** + * userid的列表,提醒群中的指定成员(@某个成员),@all表示提醒所有人,如果开发者获取不到userid,可以使用mentioned_mobile_list + */ + private List mentionedList; + /** + * 手机号列表,提醒手机号对应的群成员(@某个成员),@all表示提醒所有人 + */ + private List mentionedMobileList; + /** + * 图片内容的base64编码 + */ + private String base64; + /** + * 图片内容(base64编码前)的md5值 + */ + private String md5; + /** + * 图文消息,一个图文消息支持1到8条图文 + */ + private List articles; + + public String toJson() { + JsonObject messageJson = new JsonObject(); + messageJson.addProperty("msgtype", this.getMsgType()); + + switch (this.getMsgType()) { + case TEXT: { + JsonObject text = new JsonObject(); + JsonArray uidJsonArray = new JsonArray(); + JsonArray mobileJsonArray = new JsonArray(); + + text.addProperty("content", this.getContent()); + + if (this.getMentionedList() != null) { + for (String item : this.getMentionedList()) { + uidJsonArray.add(item); + } + } + if (this.getMentionedMobileList() != null) { + for (String item : this.getMentionedMobileList()) { + mobileJsonArray.add(item); + } + } + text.add("mentioned_list", uidJsonArray); + text.add("mentioned_mobile_list", mobileJsonArray); + messageJson.add("text", text); + break; + } + case MARKDOWN: { + JsonObject text = new JsonObject(); + text.addProperty("content", this.getContent()); + messageJson.add("markdown", text); + break; + } + case IMAGE: { + JsonObject text = new JsonObject(); + text.addProperty("base64", this.getBase64()); + text.addProperty("md5", this.getMd5()); + messageJson.add("image", text); + break; + } + case NEWS: { + JsonObject text = new JsonObject(); + JsonArray array = new JsonArray(); + for (NewArticle article : this.getArticles()) { + JsonObject articleJson = new JsonObject(); + articleJson.addProperty("title", article.getTitle()); + articleJson.addProperty("description", article.getDescription()); + articleJson.addProperty("url", article.getUrl()); + articleJson.addProperty("picurl", article.getPicUrl()); + array.add(articleJson); + } + text.add("articles", array); + messageJson.add("news", text); + break; + } + default: + + } + + return messageJson.toString(); + } +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDataResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDataResult.java deleted file mode 100644 index b348c97a9..000000000 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDataResult.java +++ /dev/null @@ -1,69 +0,0 @@ -package me.chanjar.weixin.cp.bean.oa; - -import com.google.gson.annotations.SerializedName; -import lombok.Data; - -import java.io.Serializable; -import java.util.Map; - -/** - * 企业微信 OA 审批数据. - * - * @author Element - * @date 2019-04-06 14:36 - */ -@Deprecated -@Data -public class WxCpApprovalDataResult implements Serializable { - private static final long serialVersionUID = -1046940445840716590L; - - @SerializedName("errcode") - private Integer errCode; - - @SerializedName("errmsg") - private String errMsg; - - private Integer count; - - private Integer total; - - @SerializedName("next_spnum") - private Long nextSpNum; - - private WxCpApprovalData[] data; - - - @Data - public static class WxCpApprovalData implements Serializable { - private static final long serialVersionUID = -3051785319608491640L; - @SerializedName("spname") - private String spName; - - @SerializedName("apply_name") - private String applyName; - - @SerializedName("apply_org") - private String applyOrg; - - @SerializedName("approval_name") - private String[] approvalName; - - @SerializedName("notify_name") - private String[] notifyName; - - @SerializedName("sp_status") - private Integer spStatus; - - @SerializedName("sp_num") - private Long spNum; - - @SerializedName("apply_time") - private Long applyTime; - - @SerializedName("apply_user_id") - private String applyUserId; - - @SerializedName("comm") - private Map comm; - } -} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetailResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetailResult.java index eb8cd1c1a..fdbc096a5 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetailResult.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalDetailResult.java @@ -12,7 +12,6 @@ import java.io.Serializable; */ @Data public class WxCpApprovalDetailResult implements Serializable { - private static final long serialVersionUID = 3909779949756252918L; @SerializedName("errcode") diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalInfo.java index b12d88baf..4856af419 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalInfo.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpApprovalInfo.java @@ -11,7 +11,6 @@ import lombok.Data; */ @Data public class WxCpApprovalInfo implements Serializable { - private static final long serialVersionUID = 7387181805254287167L; @SerializedName("errcode") diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/WxCpConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/WxCpConfigStorage.java index 19c04f4be..e81870ebe 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/WxCpConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/WxCpConfigStorage.java @@ -107,7 +107,15 @@ public interface WxCpConfigStorage { /** * 是否自动刷新token + * * @return . */ boolean autoRefreshToken(); + + /** + * 获取群机器人webhook的key + * + * @return key + */ + String getWebhookKey(); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpDefaultConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpDefaultConfigImpl.java index bd407af6d..a9b449530 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpDefaultConfigImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpDefaultConfigImpl.java @@ -50,6 +50,8 @@ public class WxCpDefaultConfigImpl implements WxCpConfigStorage, Serializable { private volatile String baseApiUrl; + private volatile String webhookKey; + @Override public void setBaseApiUrl(String baseUrl) { this.baseApiUrl = baseUrl; @@ -287,6 +289,11 @@ public class WxCpDefaultConfigImpl implements WxCpConfigStorage, Serializable { return true; } + @Override + public String getWebhookKey() { + return this.webhookKey; + } + public void setApacheHttpClientBuilder(ApacheHttpClientBuilder apacheHttpClientBuilder) { this.apacheHttpClientBuilder = apacheHttpClientBuilder; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java index 9133a6ce3..a92af02d1 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java @@ -46,6 +46,8 @@ public class WxCpRedisConfigImpl implements WxCpConfigStorage { protected volatile String baseApiUrl; + private volatile String webhookKey; + @Override public void setBaseApiUrl(String baseUrl) { this.baseApiUrl = baseUrl; @@ -344,6 +346,11 @@ public class WxCpRedisConfigImpl implements WxCpConfigStorage { return true; } + @Override + public String getWebhookKey() { + return this.getWebhookKey(); + } + public void setApacheHttpClientBuilder(ApacheHttpClientBuilder apacheHttpClientBuilder) { this.apacheHttpClientBuilder = apacheHttpClientBuilder; } 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 6b5e9444c..00e7616d1 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 @@ -21,6 +21,7 @@ public final class WxCpApiPathConsts { 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 WEBHOOK_SEND = "/cgi-bin/webhook/send?key="; public static class Agent { public static final String AGENT_GET = "/cgi-bin/agent/get?agentid=%d"; @@ -67,8 +68,6 @@ public final class WxCpApiPathConsts { public static final String GET_APPROVAL_INFO = "/cgi-bin/oa/getapprovalinfo"; public static final String GET_APPROVAL_DETAIL = "/cgi-bin/oa/getapprovaldetail"; public static final String GET_DIAL_RECORD = "/cgi-bin/dial/get_dial_record"; - @Deprecated - public static final String GET_APPROVAL_DATA = "/cgi-bin/corp/getapprovaldata"; public static final String GET_TEMPLATE_DETAIL = "/cgi-bin/oa/gettemplatedetail"; public static final String APPLY_EVENT = "/cgi-bin/oa/applyevent"; } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImplTest.java index bb4d3904d..0056b88f7 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImplTest.java @@ -38,24 +38,24 @@ public class WxCpChatServiceImplTest { } @Test - public void testChatCreate() throws Exception { - final String result = cpService.getChatService().chatCreate("测试群聊", userId, + public void testCreate() throws Exception { + final String result = cpService.getChatService().create("测试群聊", userId, Arrays.asList(userId, userId), chatId); assertThat(result).isNotEmpty(); assertThat(result).isEqualTo(chatId); } @Test - public void testChatGet() throws Exception { - WxCpChat chat = this.cpService.getChatService().chatGet(chatId); + public void testGet() throws Exception { + WxCpChat chat = this.cpService.getChatService().get(chatId); System.out.println(chat); Assert.assertEquals(chat.getName(), "测试群聊"); } @Test - public void testChatUpdate() throws Exception { - this.cpService.getChatService().chatUpdate(chatId, "", "", Arrays.asList("ZhengWuYao"), null); - WxCpChat chat = this.cpService.getChatService().chatGet(chatId); + public void testUpdate() throws Exception { + this.cpService.getChatService().update(chatId, "", "", Arrays.asList("ZhengWuYao"), null); + WxCpChat chat = this.cpService.getChatService().get(chatId); System.out.println(chat); Assert.assertEquals(chat.getUsers().size(), 3); } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImplTest.java new file mode 100644 index 000000000..b697efd53 --- /dev/null +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpGroupRobotServiceImplTest.java @@ -0,0 +1,68 @@ +package me.chanjar.weixin.cp.api.impl; + +import com.google.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.fs.FileUtils; +import me.chanjar.weixin.cp.api.ApiTestModule; +import me.chanjar.weixin.cp.api.WxCpGroupRobotService; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.article.NewArticle; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.testng.Assert.*; + +/** + * 微信群机器人消息发送api 单元测试 + * + * @author yr + * @date 2020-08-20 + */ +@Slf4j +@Guice(modules = ApiTestModule.class) +public class WxCpGroupRobotServiceImplTest { + @Inject + protected WxCpService wxService; + + private WxCpGroupRobotService robotService; + + @BeforeTest + public void setup() { + robotService = wxService.getGroupRobotService(); + } + + @Test + public void testSendText() throws WxErrorException { + robotService.sendText("Hello World", null, null); + } + + @Test + public void testSendMarkDown() throws WxErrorException { + String content = "实时新增用户反馈132例,请相关同事注意。\n" + + ">类型:用户反馈 \n" + + ">普通用户反馈:117例 \n" + + ">VIP用户反馈:15例"; + robotService.sendMarkDown(content); + } + + @Test + public void testSendImage() throws WxErrorException { + InputStream inputStream = getClass().getClassLoader().getResourceAsStream("mm.jpeg"); + assert inputStream != null; + String base64 = FileUtils.imageToBase64ByStream(inputStream); + String md5 = "1cb2e787063d66e24f5f89e7fc267a4d"; + robotService.sendImage(base64, md5); + } + + @Test + public void testSendNews() throws WxErrorException { + NewArticle article = new NewArticle("图文消息测试","hello world","http://www.baidu.com","http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png"); + robotService.sendNews(Stream.of(article).collect(Collectors.toList())); + } +} diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImplTest.java index 8d21bf17f..7db4564f6 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImplTest.java @@ -40,7 +40,7 @@ public class WxCpTagServiceImplTest { @Test public void testCreate() throws Exception { - this.tagId = this.wxService.getTagService().create("测试标签" + System.currentTimeMillis()); + this.tagId = this.wxService.getTagService().create("测试标签" + System.currentTimeMillis(), null); System.out.println(this.tagId); } diff --git a/weixin-java-cp/src/test/resources/test-config.sample.xml b/weixin-java-cp/src/test/resources/test-config.sample.xml index 6f98ebafc..76a74a25a 100644 --- a/weixin-java-cp/src/test/resources/test-config.sample.xml +++ b/weixin-java-cp/src/test/resources/test-config.sample.xml @@ -10,4 +10,5 @@ 企业号通讯录的某个部门id 企业号通讯录里的某个tagid 网页授权获取用户信息回调地址 +webhook链接地址的key值 diff --git a/weixin-java-cp/src/test/resources/testng.xml b/weixin-java-cp/src/test/resources/testng.xml index ffa8a2edf..563928bdf 100644 --- a/weixin-java-cp/src/test/resources/testng.xml +++ b/weixin-java-cp/src/test/resources/testng.xml @@ -1,6 +1,6 @@ - -+ + diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml index bbcd43e8d..16d56b930 100644 --- a/weixin-java-miniapp/pom.xml +++ b/weixin-java-miniapp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java -3.8.9.B +3.9.0 weixin-java-miniapp @@ -87,7 +87,6 @@com.github.jedis-lock jedis-lock -1.0.0 true 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 43c28bb80..f166a2b24 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 @@ -32,20 +32,6 @@ public interface WxMaMsgService { */ boolean sendKefuMsg(WxMaKefuMessage message) throws WxErrorException; - /** - * - * 发送模板消息 - * 详情请见: 发送模板消息 - * 接口url格式:https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN - * 小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能 - *- * - * @param templateMessage 模版消息 - * @throws WxErrorException . - */ - @Deprecated - void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException; - /** ** 发送订阅消息 diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java index b6fb72efe..13862b12f 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java @@ -229,13 +229,6 @@ public interface WxMaService extends WxService { */ WxMaQrcodeService getQrcodeService(); - /** - * 返回模板配置相关接口方法的实现类对象, 以方便调用其各个接口. - * - * @return WxMaTemplateService - */ - WxMaTemplateService getTemplateService(); - /** * 返回订阅消息配置相关接口方法的实现类对象, 以方便调用其各个接口. * 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 deleted file mode 100644 index cbdd3c758..000000000 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.binarywang.wx.miniapp.api; - -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.WxErrorException; - -import java.util.List; - -/** - * @author IOMan(lewis.lynn1006@gmail.com) - */ -@Deprecated -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"; - - /** - *- * 获取小程序模板库标题列表 - * - * 详情请见: 获取小程序模板库标题列表 - * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list?access_token=ACCESS_TOKEN - *- */ - WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException; - - /** - *- * 获取模板库某个模板标题下关键词库 - * - * 详情请见: 获取小程序模板库标题列表 - * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get?access_token=ACCESS_TOKEN - *- */ - WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException; - - /** - *- * 组合模板并添加至帐号下的个人模板库 - * - * 详情请见: 获取小程序模板库标题列表 - * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=ACCESS_TOKEN - *- */ - WxMaTemplateAddResult addTemplate(String id, ListkeywordIdList) throws WxErrorException; - - /** - * - * 获取帐号下已存在的模板列表 - * - * 详情请见: 获取小程序模板库标题列表 - * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN - *- */ - WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException; - - /** - *- * 删除帐号下的某个模板 - * - * 详情请见: 获取小程序模板库标题列表 - * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN - *- */ - boolean delTemplate(String templateId) throws WxErrorException; -} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java index fc04b5b6f..7bd1eec74 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java @@ -10,6 +10,7 @@ import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.api.WxImgProcService; import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxAccessToken; @@ -32,8 +33,6 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; -import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ErrorCode.*; - /** * @author Binary Wang * @see #doGetAccessTokenRequest @@ -41,13 +40,11 @@ import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ErrorCode.*; @Slf4j public abstract class BaseWxMaServiceImplimplements WxMaService, RequestHttp { private Map configMap; - private WxMaConfig wxMaConfig; private final WxMaMsgService kefuService = new WxMaMsgServiceImpl(this); private final WxMaMediaService materialService = new WxMaMediaServiceImpl(this); private final WxMaUserService userService = new WxMaUserServiceImpl(this); private final WxMaQrcodeService qrCodeService = new WxMaQrcodeServiceImpl(this); - private final WxMaTemplateService templateService = new WxMaTemplateServiceImpl(this); private final WxMaAnalysisService analysisService = new WxMaAnalysisServiceImpl(this); private final WxMaCodeService codeService = new WxMaCodeServiceImpl(this); private final WxMaSettingService settingService = new WxMaSettingServiceImpl(this); @@ -169,8 +166,8 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH /** * 通过网络请求获取AccessToken * - * @return - * @throws IOException + * @return . + * @throws IOException . */ protected abstract String doGetAccessTokenRequest() throws IOException; @@ -244,12 +241,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH return result; } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - */ - if (error.getErrorCode() == ERR_40001 - || error.getErrorCode() == ERR_42001 - || error.getErrorCode() == ERR_40014) { + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { // 强制设置WxMaConfig的access token过期了,这样在下一次请求里就会刷新access token Lock lock = this.getWxMaConfig().getAccessTokenLock(); lock.lock(); @@ -263,6 +255,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH lock.unlock(); } if (this.getWxMaConfig().autoRefreshToken()) { + log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg()); return this.execute(executor, uri, data); } } @@ -281,9 +274,9 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH /** * 设置当前的AccessToken * - * @param resultContent - * @return - * @throws WxErrorException + * @param resultContent 响应内容 + * @return access token + * @throws WxErrorException 异常 */ protected String extractAccessToken(String resultContent) throws WxErrorException { WxMaConfig config = this.getWxMaConfig(); @@ -298,7 +291,12 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH @Override public WxMaConfig getWxMaConfig() { - return this.wxMaConfig; + if (this.configMap.size() == 1) { + // 只有一个小程序,直接返回其配置即可 + return this.configMap.values().iterator().next(); + } + + return this.configMap.get(WxMaConfigHolder.get()); } @Override @@ -400,11 +398,6 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH return this.qrCodeService; } - @Override - public WxMaTemplateService getTemplateService() { - return this.templateService; - } - @Override public WxMaSubscribeService getSubscribeService() { return this.subscribeService; 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 3d37d9dbe..f647a80fe 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 @@ -17,8 +17,7 @@ import me.chanjar.weixin.common.util.json.GsonParser; */ @AllArgsConstructor public class WxMaMsgServiceImpl implements WxMaMsgService { - - private WxMaService wxMaService; + private final WxMaService wxMaService; @Override public boolean sendKefuMsg(WxMaKefuMessage message) throws WxErrorException { @@ -26,15 +25,6 @@ public class WxMaMsgServiceImpl implements WxMaMsgService { return responseContent != null; } - @Override - public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException { - String responseContent = this.wxMaService.post(TEMPLATE_MSG_SEND_URL, templateMessage.toJson()); - JsonObject jsonObject = GsonParser.parse(responseContent); - if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { - throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); - } - } - @Override public void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException { String responseContent = this.wxMaService.post(SUBSCRIBE_MSG_SEND_URL, subscribeMessage.toJson()); 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 deleted file mode 100644 index 9f5fbf0fc..000000000 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.binarywang.wx.miniapp.api.impl; - -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 com.google.common.collect.ImmutableMap; -import lombok.AllArgsConstructor; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.util.json.WxGsonBuilder; - -import java.util.List; -import java.util.Map; - -/** - * @author Binary - */ -@AllArgsConstructor -public class WxMaTemplateServiceImpl implements WxMaTemplateService { - private WxMaService wxMaService; - - @Override - public WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException { - Map params = ImmutableMap.of("offset", offset, "count", count); - String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_LIST_URL, WxGsonBuilder.create().toJson(params)); - return WxMaTemplateLibraryListResult.fromJson(responseText); - } - - @Override - public WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException { - 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 { - 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 = ImmutableMap.of("offset", offset, "count", count); - String responseText = this.wxMaService.post(TEMPLATE_LIST_URL, WxGsonBuilder.create().toJson(params)); - return WxMaTemplateListResult.fromJson(responseText); - } - - @Override - public boolean delTemplate(String templateId) throws WxErrorException { - 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/bean/WxMaTemplateMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java deleted file mode 100644 index 00c7e52f4..000000000 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessage.java +++ /dev/null @@ -1,101 +0,0 @@ -package cn.binarywang.wx.miniapp.bean; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -/** - * 模板消息. - * 参考 https://developers.weixin.qq.com/miniprogram/dev/api-backend/templateMessage.send.html - * - * @author Binary Wang - */ -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class WxMaTemplateMessage implements Serializable { - private static final long serialVersionUID = 5063374783759519418L; - - /** - * 接收者(用户)的 openid. - * - * 参数:touser - * 是否必填: 是 - * 描述: 接收者(用户)的 openid - *- */ - private String toUser; - - /** - * 所需下发的模板消息的id. - *- * 参数:template_id - * 是否必填: 是 - * 描述: 所需下发的模板消息的id - *- */ - private String templateId; - - /** - * 点击模板卡片后的跳转页面,仅限本小程序内的页面. - *- * 参数:page - * 是否必填: 否 - * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 - *- */ - private String page; - - /** - * 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id. - *- * 参数:form_id - * 是否必填: 是 - * 描述: 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id - *- */ - private String formId; - - /** - * 模板内容,不填则下发空模板. - *- * 参数:data - * 是否必填: 是 - * 描述: 模板内容,不填则下发空模板 - *- */ - private Listdata; - - /** - * 模板需要放大的关键词,不填则默认无放大. - * - * 参数:emphasis_keyword - * 是否必填: 否 - * 描述: 模板需要放大的关键词,不填则默认无放大 - *- */ - private String emphasisKeyword; - - public WxMaTemplateMessage addData(WxMaTemplateData 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/config/WxMaConfig.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java index bc381f43a..6854c87e7 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java @@ -12,10 +12,25 @@ import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; */ public interface WxMaConfig { + /** + * Gets access token. + * + * @return the access token + */ String getAccessToken(); + /** + * Gets access token lock. + * + * @return the access token lock + */ Lock getAccessTokenLock(); + /** + * Is access token expired boolean. + * + * @return the boolean + */ boolean isAccessTokenExpired(); /** @@ -38,10 +53,25 @@ public interface WxMaConfig { */ void updateAccessToken(String accessToken, int expiresInSeconds); + /** + * Gets jsapi ticket. + * + * @return the jsapi ticket + */ String getJsapiTicket(); + /** + * Gets jsapi ticket lock. + * + * @return the jsapi ticket lock + */ Lock getJsapiTicketLock(); + /** + * Is jsapi ticket expired boolean. + * + * @return the boolean + */ boolean isJsapiTicketExpired(); /** @@ -59,11 +89,23 @@ public interface WxMaConfig { /** * 卡券api_ticket. + * + * @return the card api ticket */ String getCardApiTicket(); + /** + * Gets card api ticket lock. + * + * @return the card api ticket lock + */ Lock getCardApiTicketLock(); + /** + * Is card api ticket expired boolean. + * + * @return the boolean + */ boolean isCardApiTicketExpired(); /** @@ -74,44 +116,106 @@ public interface WxMaConfig { /** * 应该是线程安全的. * - * @param apiTicket 新的卡券api ticket值 + * @param apiTicket 新的卡券api ticket值 * @param expiresInSeconds 过期时间,以秒为单位 */ void updateCardApiTicket(String apiTicket, int expiresInSeconds); + /** + * Gets appid. + * + * @return the appid + */ String getAppid(); + /** + * Gets secret. + * + * @return the secret + */ String getSecret(); + /** + * Gets token. + * + * @return the token + */ String getToken(); + /** + * Gets aes key. + * + * @return the aes key + */ String getAesKey(); + /** + * Gets original id. + * + * @return the original id + */ String getOriginalId(); + /** + * Gets cloud env. + * + * @return the cloud env + */ String getCloudEnv(); + /** + * Gets msg data format. + * + * @return the msg data format + */ String getMsgDataFormat(); + /** + * Gets expires time. + * + * @return the expires time + */ long getExpiresTime(); + /** + * Gets http proxy host. + * + * @return the http proxy host + */ String getHttpProxyHost(); + /** + * Gets http proxy port. + * + * @return the http proxy port + */ int getHttpProxyPort(); + /** + * Gets http proxy username. + * + * @return the http proxy username + */ String getHttpProxyUsername(); + /** + * Gets http proxy password. + * + * @return the http proxy password + */ String getHttpProxyPassword(); /** * http client builder * - * @return ApacheHttpClientBuilder + * @return ApacheHttpClientBuilder apache http client builder */ ApacheHttpClientBuilder getApacheHttpClientBuilder(); /** * 是否自动刷新token + * + * @return the boolean */ boolean autoRefreshToken(); 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 0d2a8675e..2ca92d084 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 @@ -53,23 +53,6 @@ public class WxMaConstants { public static final String MA_PAGE = "miniprogrampage"; } - public static final class ErrorCode { - /** - * 40001 获取access_token时AppSecret错误,或者access_token无效. - */ - public static final int ERR_40001 = 40001; - - /** - * 42001 access_token超时. - */ - public static final int ERR_42001 = 42001; - - /** - * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期). - */ - public static final int ERR_40014 = 40014; - } - /** * 内容安全检测的媒体类型 */ 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 5fab9de74..21b582d5b 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,7 +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; import cn.binarywang.wx.miniapp.bean.analysis.WxMaUserPortrait; @@ -19,7 +18,6 @@ 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()); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaTemplateMessageGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaTemplateMessageGsonAdapter.java deleted file mode 100644 index 15eff1ff4..000000000 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaTemplateMessageGsonAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.binarywang.wx.miniapp.util.json; - -import java.lang.reflect.Type; - -import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -/** - * @author Binary Wang - */ -public class WxMaTemplateMessageGsonAdapter implements JsonSerializer{ - - @Override - public JsonElement serialize(WxMaTemplateMessage 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()); - } - - if (message.getFormId() != null) { - messageJson.addProperty("form_id", message.getFormId()); - } - - if (message.getEmphasisKeyword() != null) { - messageJson.addProperty("emphasis_keyword", message.getEmphasisKeyword()); - } - - JsonObject data = new JsonObject(); - messageJson.add("data", data); - - if (message.getData() == null) { - return messageJson; - } - - for (WxMaTemplateData 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 554ac1da9..cf127970f 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 @@ -40,28 +40,6 @@ public class WxMaMsgServiceImplTest { this.wxService.getMsgService().sendKefuMsg(message); } - @Test(invocationCount = 5, threadPoolSize = 3) - public void testSendTemplateMsg() throws WxErrorException { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); - - WxMaTemplateMessage templateMessage = WxMaTemplateMessage.builder() - .toUser(config.getOpenid()) - .formId("FORMID") - .page("index") - .data(Lists.newArrayList( - new WxMaTemplateData("keyword1", "339208499"), - new WxMaTemplateData("keyword2", dateFormat.format(new Date())), - new WxMaTemplateData("keyword3", "粤海喜来登酒店"), - new WxMaTemplateData("keyword4", "广州市天河区天河路208号"))) - .templateId(config.getTemplateId()) - .emphasisKeyword("keyword1.DATA") - .build(); - //templateMessage.addData( new WxMaTemplateData("keyword1", "339208499", "#173177")); - this.wxService.getMsgService().sendTemplateMsg(templateMessage); - } - - @Test public void testSendSubscribeMsg() throws WxErrorException { TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java deleted file mode 100644 index 57896685b..000000000 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.binarywang.wx.miniapp.api.impl; - -import cn.binarywang.wx.miniapp.api.WxMaService; -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 cn.binarywang.wx.miniapp.test.ApiTestModule; -import com.google.inject.Inject; -import org.assertj.core.util.Lists; -import org.testng.Assert; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - -import java.util.List; - -@Test -@Guice(modules = ApiTestModule.class) -public class WxMaTemplateServiceImplTest { - @Inject - protected WxMaService wxService; - - @Test - public void testFindTemplateLibraryList() throws Exception { - WxMaTemplateLibraryListResult result = this.wxService.getTemplateService().findTemplateLibraryList(0, 20); - Assert.assertEquals(20, result.getList().size()); - } - - @Test - public void testFindTemplateLibraryKeywordList() throws Exception { - WxMaTemplateLibraryGetResult result = this.wxService.getTemplateService().findTemplateLibraryKeywordList("AT0004"); - Assert.assertEquals("AT0004", result.getId()); - Assert.assertEquals("交易提醒", result.getTitle()); - Assert.assertEquals(100, result.getKeywordList().size()); - } - - @Test - public void testAddTemplate() throws Exception { - List list = Lists.newArrayList(); - list.add(1); - list.add(20); - list.add(84); - - WxMaTemplateAddResult result = this.wxService.getTemplateService().addTemplate("AT0004", list); - Assert.assertNotNull(result.getTemplateId()); - System.out.println(result); - } - - @Test - public void testFindTemplateList() throws Exception { - WxMaTemplateListResult result = this.wxService.getTemplateService().findTemplateList(0, 20); - System.out.println(result); - } - - @Test - public void testDelTemplate() throws Exception { - - //add - List list = Lists.newArrayList(); - list.add(1); - list.add(20); - list.add(84); - - WxMaTemplateAddResult result = this.wxService.getTemplateService().addTemplate("AT0004", list); - - //delete - this.wxService.getTemplateService().delTemplate(result.getTemplateId()); - } -} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java deleted file mode 100644 index 51eb0e872..000000000 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaTemplateMessageTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.binarywang.wx.miniapp.bean; - -import org.testng.annotations.*; - -import com.google.common.collect.Lists; - -import static org.testng.AssertJUnit.*; - -/** - * @author Binary Wang - */ -public class WxMaTemplateMessageTest { - @Test - public void testToJson() throws Exception { - WxMaTemplateMessage tm = WxMaTemplateMessage.builder() - .toUser("OPENID") - //.color("aaaaa") - .formId("FORMID") - .page("index") - .data(Lists.newArrayList( - new WxMaTemplateData("keyword1", "339208499", "#173177"), - new WxMaTemplateData("keyword2", "2015年01月05日12:30", "#173177"), - new WxMaTemplateData("keyword3", "粤海喜来登酒店", "#173177"), - new WxMaTemplateData("keyword4", "广州市天河区天河路208号", "#173177"))) - .templateId("TEMPLATE_ID") - .emphasisKeyword("keyword1.DATA") - .build(); - - assertEquals(tm.toJson(), "{\"touser\":\"OPENID\",\"template_id\":\"TEMPLATE_ID\",\"page\":\"index\",\"form_id\":\"FORMID\",\"emphasis_keyword\":\"keyword1.DATA\",\"data\":{\"keyword1\":{\"value\":\"339208499\",\"color\":\"#173177\"},\"keyword2\":{\"value\":\"2015年01月05日12:30\",\"color\":\"#173177\"},\"keyword3\":{\"value\":\"粤海喜来登酒店\",\"color\":\"#173177\"},\"keyword4\":{\"value\":\"广州市天河区天河路208号\",\"color\":\"#173177\"}}}"); - } - -} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java index 89df24441..7784cf3a1 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/demo/WxMaDemoServer.java @@ -4,15 +4,12 @@ import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; import cn.binarywang.wx.miniapp.bean.WxMaMessage; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; -import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; import cn.binarywang.wx.miniapp.config.WxMaConfig; import cn.binarywang.wx.miniapp.constant.WxMaConstants; import cn.binarywang.wx.miniapp.message.WxMaMessageHandler; import cn.binarywang.wx.miniapp.message.WxMaMessageRouter; import cn.binarywang.wx.miniapp.message.WxMaXmlOutMessage; import cn.binarywang.wx.miniapp.test.TestConfig; -import com.google.common.collect.Lists; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.error.WxErrorException; @@ -97,22 +94,6 @@ public class WxMaDemoServer { } }; - private static final WxMaMessageHandler templateMsgHandler = new WxMaMessageHandler() { - @Override - public WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map context, - WxMaService service, WxSessionManager sessionManager) - throws WxErrorException { - service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder() - .templateId(templateId).data(Lists.newArrayList( - new WxMaTemplateData("keyword1", "339208499", "#173177"))) - .toUser(wxMessage.getFromUser()) - .formId("自己替换可用的formid") - .build()); - return null; - } - - }; - private static final WxMaMessageHandler customerServiceMessageHandler = new WxMaMessageHandler() { @Override public WxMaXmlOutMessage handle(WxMaMessage message, Map context, WxMaService service, WxSessionManager sessionManager) { @@ -157,7 +138,6 @@ public class WxMaDemoServer { router = new WxMaMessageRouter(service); router.rule().handler(logHandler).next() - .rule().async(false).content("模板").handler(templateMsgHandler).end() .rule().async(false).content("文本").handler(textHandler).end() .rule().async(false).content("图片").handler(picHandler).end() .rule().async(false).content("二维码").handler(qrcodeHandler).end() diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 34bee7fcf..a89664d46 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -7,7 +7,7 @@ com.github.binarywang wx-java -3.8.9.B +3.9.0 weixin-java-mp 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 e9376368e..aa7a872f3 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 @@ -163,70 +163,6 @@ public interface WxMpService extends WxService { */ String buildQrConnectUrl(String redirectUri, String scope, String state); - /** - *- * 构造oauth2授权的url连接. - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息 - *- * - * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode - * @param scope scope - * @param state state - * @return url string - * @deprecated use oauth2Service.buildAuthorizationUrl() instead - */ - @Deprecated - String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state); - - /** - *- * 用code换取oauth2的access token. - * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息 - *- * - * @param code code - * @return token对象 - * @throws WxErrorException . - */ - @Deprecated - WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException; - - /** - *- * 刷新oauth2的access token. - *- * - * @param refreshToken 刷新token - * @return 新的token对象 - * @throws WxErrorException . - */ - @Deprecated - WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException; - - /** - *- * 用oauth2获取用户信息, 当前面引导授权时的scope是snsapi_userinfo的时候才可以. - *- * - * @param oAuth2AccessToken token对象 - * @param lang zh_CN, zh_TW, en - * @return 用户对象 - * @throws WxErrorException . - */ - @Deprecated - WxMpUser oauth2getUserInfo(WxMpOAuth2AccessToken oAuth2AccessToken, String lang) throws WxErrorException; - - /** - *- * 验证oauth2的access token是否有效. - *- * - * @param oAuth2AccessToken token对象 - * @return 是否有效 - */ - @Deprecated - boolean oauth2validateAccessToken(WxMpOAuth2AccessToken oAuth2AccessToken); - /** ** 获取微信服务器IP地址 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 ee861e076..f836cebaa 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 @@ -7,6 +7,7 @@ import com.google.gson.JsonObject; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.api.WxImgProcService; import me.chanjar.weixin.common.api.WxOcrService; import me.chanjar.weixin.common.bean.WxAccessToken; @@ -220,48 +221,12 @@ public abstract class BaseWxMpServiceImplimplements WxMpService, RequestH return WxMpSemanticQueryResult.fromJson(responseContent); } - @Override - public String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state) { - return String.format(CONNECT_OAUTH2_AUTHORIZE_URL.getUrl(this.getWxMpConfigStorage()), - this.getWxMpConfigStorage().getAppId(), URIUtil.encodeURIComponent(redirectURI), scope, StringUtils.trimToEmpty(state)); - } - @Override public String buildQrConnectUrl(String redirectUri, String scope, String state) { return String.format(QRCONNECT_URL.getUrl(this.getWxMpConfigStorage()), this.getWxMpConfigStorage().getAppId(), URIUtil.encodeURIComponent(redirectUri), scope, StringUtils.trimToEmpty(state)); } - private WxMpOAuth2AccessToken getOAuth2AccessToken(String url) throws WxErrorException { - try { - RequestExecutor executor = SimpleGetRequestExecutor.create(this); - String responseText = executor.execute(url, null, WxType.MP); - return WxMpOAuth2AccessToken.fromJson(responseText); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException { - return this.oAuth2Service.getAccessToken(code); - } - - @Override - public WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException { - return this.oAuth2Service.refreshAccessToken(refreshToken); - } - - @Override - public WxMpUser oauth2getUserInfo(WxMpOAuth2AccessToken token, String lang) throws WxErrorException { - return this.oAuth2Service.getUserInfo(token,lang); - } - - @Override - public boolean oauth2validateAccessToken(WxMpOAuth2AccessToken token) { - return this.oAuth2Service.validateAccessToken(token); - } - @Override public String[] getCallbackIP() throws WxErrorException { String responseContent = this.get(GET_CALLBACK_IP_URL, null); @@ -377,13 +342,7 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH return result; } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - * 40001 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口 - * 42001 access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明 - * 40014 不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 - */ - if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { // 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token Lock lock = this.getWxMpConfigStorage().getAccessTokenLock(); lock.lock(); @@ -397,6 +356,7 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH lock.unlock(); } if (this.getWxMpConfigStorage().autoRefreshToken()) { + log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg()); return this.execute(executor, uri, data); } } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java index 91020c4ec..ce23512e2 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java @@ -17,7 +17,7 @@ public class DemoOAuth2Handler implements WxMpMessageHandler { public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) { - String href = "测试oauth2"; return WxMpXmlOutMessage.TEXT().content(href) diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java index 4712fb322..476a56a65 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java @@ -31,15 +31,15 @@ public class WxMpOAuth2Servlet extends HttpServlet { response.getWriter().println(" code
"); response.getWriter().println(code); - WxMpOAuth2AccessToken wxMpOAuth2AccessToken = this.wxMpService.oauth2getAccessToken(code); + WxMpOAuth2AccessToken wxMpOAuth2AccessToken = this.wxMpService.getOAuth2Service().getAccessToken(code); response.getWriter().println("access token
"); response.getWriter().println(wxMpOAuth2AccessToken.toString()); - WxMpUser wxMpUser = this.wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null); + WxMpUser wxMpUser = this.wxMpService.getOAuth2Service().getUserInfo(wxMpOAuth2AccessToken, null); response.getWriter().println("user info
"); response.getWriter().println(wxMpUser.toString()); - wxMpOAuth2AccessToken = this.wxMpService.oauth2refreshAccessToken(wxMpOAuth2AccessToken.getRefreshToken()); + wxMpOAuth2AccessToken = this.wxMpService.getOAuth2Service().refreshAccessToken(wxMpOAuth2AccessToken.getRefreshToken()); response.getWriter().println("after refresh
"); response.getWriter().println(wxMpOAuth2AccessToken.toString()); diff --git a/weixin-java-open/README.md b/weixin-java-open/README.md index 1f935a971..dd6916184 100644 --- a/weixin-java-open/README.md +++ b/weixin-java-open/README.md @@ -1,7 +1,8 @@ 消息机制未实现,下面为通知回调中设置的代码部分 以下代码可通过腾讯全网发布测试用例 -``` + +```Java @RestController @RequestMapping("notify") public class NotifyController extends WechatThridBaseController { diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml index f24c81186..cf743a404 100644 --- a/weixin-java-open/pom.xml +++ b/weixin-java-open/pom.xml @@ -7,7 +7,7 @@com.github.binarywang wx-java -3.8.9.B +3.9.0 weixin-java-open 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 80961921f..d460152df 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 @@ -146,14 +146,8 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { return getWxOpenService().post(uriWithComponentAccessToken, postData); } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - * 40001 获取access_token时AppSecret错误,或者access_token无效 - * 42001 access_token超时 - * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 - */ - if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { - // 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { + // 强制设置access token过期,这样在下一次请求里就会刷新access token Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock(); lock.lock(); try { @@ -167,6 +161,7 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { } if (this.getWxOpenConfigStorage().autoRefreshToken()) { + log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg()); return this.post(uri, postData, accessTokenKey); } } @@ -190,13 +185,7 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { return getWxOpenService().get(uriWithComponentAccessToken, null); } catch (WxErrorException e) { WxError error = e.getError(); - /* - * 发生以下情况时尝试刷新access_token - * 40001 获取access_token时AppSecret错误,或者access_token无效 - * 42001 access_token超时 - * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 - */ - if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) { + if (WxConsts.ACCESS_TOKEN_ERROR_CODES.contains(error.getErrorCode())) { // 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock(); lock.lock(); @@ -210,6 +199,7 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { lock.unlock(); } if (this.getWxOpenConfigStorage().autoRefreshToken()) { + log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg()); return this.get(uri, accessTokenKey); } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java index aa845fb22..5efa429ad 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMpServiceImpl.java @@ -31,18 +31,4 @@ public class WxOpenMpServiceImpl extends WxMpServiceImpl { return wxOpenComponentService.getAuthorizerAccessToken(appId, forceRefresh); } - @Override - public WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException { - return wxOpenComponentService.oauth2getAccessToken(appId, code); - } - - @Override - public WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException { - return wxOpenComponentService.oauth2refreshAccessToken(appId, refreshToken); - } - - @Override - public String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state) { - return wxOpenComponentService.oauth2buildAuthorizationUrl(appId, redirectURI, scope, state); - } } diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 5bb895343..1a51f3aad 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -5,7 +5,7 @@com.github.binarywang wx-java -3.8.9.B +3.9.0 4.0.0 @@ -74,7 +74,7 @@com.fasterxml.jackson.core jackson-databind -2.9.10.4 +2.10.0.pr1 com.google.code.gson diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java index 41954a2aa..24019fb91 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java @@ -8,6 +8,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import java.io.Serializable; import java.util.List; /** @@ -18,70 +19,69 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) -public class ApplymentStateQueryResult { +public class ApplymentStateQueryResult implements Serializable { + private static final long serialVersionUID = 6539090917423486409L; + /** + * 业务申请编号 + */ + @SerializedName("business_code") + private String businessCode; + /** + * 微信支付申请单号 + */ + @SerializedName("applyment_id") + private String applymentId; + /** + * 特约商户号 + */ + @SerializedName("sub_mchid") + private String subMchid; + /** + * 超级管理员签约链接 + */ + @SerializedName("sign_url") + private String signUrl; - /** - * 业务申请编号 - */ - @SerializedName("business_code") - private String businessCode; - /** - * 微信支付申请单号 - */ - @SerializedName("applyment_id") - private String applymentId; - /** - * 特约商户号 - */ - @SerializedName("sub_mchid") - private String subMchid; - /** - * 超级管理员签约链接 - */ - @SerializedName("sign_url") - private String signUrl; + /** + * 申请单状态 + */ + @SerializedName("applyment_state") + private ApplymentStateEnum applymentState; + /** + * 申请状态描述 + */ + @SerializedName("applyment_state_msg") + private String applymentStateMsg; + /** + * 驳回原因详情 + */ + @SerializedName("audit_detail") + private ListauditDetail; + /** + * 驳回原因详情 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AuditDetail { /** - * 申请单状态 - * + * 字段名 */ - @SerializedName("applyment_state") - private ApplymentStateEnum applymentState; + @SerializedName("field") + private String field; /** - * 申请状态描述 + * 字段名称 */ - @SerializedName("applyment_state_msg") - private String applymentStateMsg; + @SerializedName("field_name") + private String fieldName; /** - * 驳回原因详情 + * 驳回原因 */ - @SerializedName("audit_detail") - private List auditDetail; + @SerializedName("reject_reason") + private String rejectReason; - /** - * 驳回原因详情 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class AuditDetail { - /** - * 字段名 - */ - @SerializedName("field") - private String field; - /** - * 字段名称 - */ - @SerializedName("field_name") - private String fieldName; - /** - * 驳回原因 - */ - @SerializedName("reject_reason") - private String rejectReason; - - } + } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java index e31af2aed..8623b5cd6 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java @@ -1,13 +1,15 @@ package com.github.binarywang.wxpay.bean.applyment; import com.github.binarywang.wxpay.bean.applyment.enums.AccountTypeEnum; +import com.github.binarywang.wxpay.v3.SpecEncrypt; import com.google.gson.annotations.SerializedName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import com.github.binarywang.wxpay.v3.SpecEncrypt; + +import java.io.Serializable; /** * 修改结算账户请求对象 @@ -17,37 +19,38 @@ import com.github.binarywang.wxpay.v3.SpecEncrypt; @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) -public class ModifySettlementRequest { - /** - *账户类型 - */ - @SerializedName("account_type") - private AccountTypeEnum accountType; - /** - *开户银行 - */ - @SerializedName("account_bank") - private String accountBank; - /** - *开户银行省市编码 - */ - @SerializedName("bank_address_code") - private String bankAddressCode; - /** - *开户银行全称(含支行) - */ - @SerializedName("bank_name") - private String bankName; - /** - *开户银行联行号 - */ - @SerializedName("bank_branch_id") - private String bankBranchId; +public class ModifySettlementRequest implements Serializable { + private static final long serialVersionUID = 4568552340365230872L; + /** + * 账户类型 + */ + @SerializedName("account_type") + private AccountTypeEnum accountType; + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + /** + * 开户银行省市编码 + */ + @SerializedName("bank_address_code") + private String bankAddressCode; + /** + * 开户银行全称(含支行) + */ + @SerializedName("bank_name") + private String bankName; + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; - /** - *银行账号 - */ - @SpecEncrypt - @SerializedName("account_number") - private String accountNumber; + /** + * 银行账号 + */ + @SpecEncrypt + @SerializedName("account_number") + private String accountNumber; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java index b284f7926..ffa3bf73e 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import java.io.Serializable; + /** * 查询结算账户返回对象信息 */ @@ -15,37 +17,38 @@ import lombok.experimental.Accessors; @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) -public class SettlementInfoResult { - - /** - * 账户类型 - */ - @SerializedName("account_type") - private String accountType; - /** - * 开户银行 - */ - @SerializedName("account_bank") - private String accountBank; - /** - * 开户银行全称(含支行] - */ - @SerializedName("bank_name") - private String bankName; - /** - * 开户银行联行号 - */ - @SerializedName("bank_branch_id") - private String bankBranchId; - /** - * 银行账号 - */ - @SerializedName("account_number") - private String accountNumber; - /** - * 汇款验证结果 - * @see com.github.binarywang.wxpay.bean.applyment.enums.SettlementVerifyResultEnum - */ - @SerializedName("verify_result") - private String verifyResult; +public class SettlementInfoResult implements Serializable { + private static final long serialVersionUID = 4568552340365230872L; + /** + * 账户类型 + */ + @SerializedName("account_type") + private String accountType; + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + /** + * 开户银行全称(含支行] + */ + @SerializedName("bank_name") + private String bankName; + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + /** + * 银行账号 + */ + @SerializedName("account_number") + private String accountNumber; + /** + * 汇款验证结果 + * + * @see com.github.binarywang.wxpay.bean.applyment.enums.SettlementVerifyResultEnum + */ + @SerializedName("verify_result") + private String verifyResult; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java index cfdbdd8ed..8fa1aa0ca 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java @@ -1,13 +1,13 @@ package com.github.binarywang.wxpay.bean.applyment; import com.github.binarywang.wxpay.bean.applyment.enums.*; +import com.github.binarywang.wxpay.v3.SpecEncrypt; import com.google.gson.annotations.SerializedName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import com.github.binarywang.wxpay.v3.SpecEncrypt; import java.io.Serializable; import java.util.List; @@ -23,861 +23,868 @@ import java.util.List; @AllArgsConstructor @Accessors(chain = true) public class WxPayApplyment4SubCreateRequest implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 业务申请编号 + */ + @SerializedName("business_code") + private String businessCode; + /** + * 超级管理员信息 + */ + @SerializedName("contact_info") + @SpecEncrypt + private ContactInfo contactInfo; + + /** + * 主体资料 + */ + @SerializedName("subject_info") + @SpecEncrypt + private SubjectInfo subjectInfo; + + /** + * 经营资料 + */ + @SerializedName("business_info") + private BusinessInfo businessInfo; + + /** + * 结算规则 + */ + @SerializedName("settlement_info") + private SettlementInfo settlementInfo; + + /** + * 结算银行账户 + */ + @SerializedName("bank_account_info") + @SpecEncrypt + private BankAccountInfo bankAccountInfo; + + /** + * 结算银行账户 + */ + @SerializedName("addition_info") + private AdditionInfo additionInfo; + + /** + * 超级管理员需在开户后进行签约,并接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class ContactInfo implements Serializable { private static final long serialVersionUID = 1L; /** - * 业务申请编号 + * 超级管理员姓名 */ - @SerializedName("business_code") - private String businessCode; - /** - * 超级管理员信息 - */ - @SerializedName("contact_info") + @SerializedName("contact_name") @SpecEncrypt - private ContactInfo contactInfo; + private String contactName; /** - * 主体资料 + * 超级管理员身份证件号码 + * 1、“超级管理员身份证号码”与“超级管理员微信openid”,二选一必填。 + * 2、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。 + * 3、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。 */ - @SerializedName("subject_info") + @SerializedName("contact_id_number") @SpecEncrypt - private SubjectInfo subjectInfo; + private String contactIdNumber; /** - * 经营资料 + * 超级管理员微信openid + * 1、“超级管理员身份证件号码”与“超级管理员微信openid”,二选一必填。 + * 2、超级管理员签约时,校验微信号是否与该微信openid一致。 */ - @SerializedName("business_info") - private BusinessInfo businessInfo; + @SerializedName("openid") + private String openid; /** - * 结算规则 + * 1、11位数字。 + * 2、用于接收微信支付的重要管理信息及日常操作验证码。 */ - @SerializedName("settlement_info") - private SettlementInfo settlementInfo; - - /** - * 结算银行账户 - */ - @SerializedName("bank_account_info") + @SerializedName("mobile_phone") @SpecEncrypt - private BankAccountInfo bankAccountInfo; + private String mobilePhone; /** - * 结算银行账户 + * 1、用于接收微信支付的开户邮件及日常业务通知。 + * 2、需要带@,遵循邮箱格式校验,该字段需进行加密处理, */ - @SerializedName("addition_info") - private AdditionInfo additionInfo; + @SerializedName("contact_email") + @SpecEncrypt + private String contactEmail; + + } + + /** + * 主体资料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SubjectInfo implements Serializable { + private static final long serialVersionUID = 1L; /** - * 超级管理员需在开户后进行签约,并接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。 + * 主体类型 */ + @SerializedName("subject_type") + private SubjectTypeEnum subjectType; + + /** + * 营业执照 + */ + @SerializedName("business_license_info") + private BusinessLicenseInfo businessLicenseInfo; + /** + * 登记证书 + */ + @SerializedName("certificate_info") + private CertificateInfo certificateInfo; + + /** + * 组织机构代码证 + */ + @SerializedName("organization_info") + private OrganizationInfo organizationInfo; + + /** + * 单位证明函照片 + */ + @SerializedName("certificate_letter_copy") + private String certificateLetterCopy; + + /** + * 经营者/法人身份证件 + */ + @SerializedName("identity_info") + @SpecEncrypt + private IdentityInfo identityInfo; + + /** + * 最终受益人信息(UBO] + */ + @SerializedName("ubo_info") + @SpecEncrypt + private UboInfo uboInfo; + + @Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) - public static class ContactInfo implements Serializable { - private static final long serialVersionUID = 1L; - - /** - * 超级管理员姓名 - */ - @SerializedName("contact_name") - @SpecEncrypt - private String contactName; - - /** - * 超级管理员身份证件号码 - * 1、“超级管理员身份证号码”与“超级管理员微信openid”,二选一必填。 - * 2、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。 - * 3、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。 - */ - @SerializedName("contact_id_number") - @SpecEncrypt - private String contactIdNumber; - - /** - * 超级管理员微信openid - * 1、“超级管理员身份证件号码”与“超级管理员微信openid”,二选一必填。 - * 2、超级管理员签约时,校验微信号是否与该微信openid一致。 - */ - @SerializedName("openid") - private String openid; - - /** - * 1、11位数字。 - * 2、用于接收微信支付的重要管理信息及日常操作验证码。 - */ - @SerializedName("mobile_phone") - @SpecEncrypt - private String mobilePhone; - - /** - * 1、用于接收微信支付的开户邮件及日常业务通知。 - * 2、需要带@,遵循邮箱格式校验,该字段需进行加密处理, - */ - @SerializedName("contact_email") - @SpecEncrypt - private String contactEmail; - + public static class BusinessLicenseInfo implements Serializable { + private static final long serialVersionUID = -1016615300418945838L; + /** + * 营业执照照片 + */ + @SerializedName("license_copy") + private String licenseCopy; + /** + * 注册号/统一社会信用代码 + */ + @SerializedName("license_number") + private String licenseNumber; + /** + * 商户名称 + */ + @SerializedName("merchant_name") + private String merchantName; + /** + * 个体户经营者/法人姓名 + */ + @SerializedName("legal_person") + private String legalPerson; } - /** - * 主体资料 - */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) - public static class SubjectInfo implements Serializable { - private static final long serialVersionUID = 1L; + public static class CertificateInfo implements Serializable { + private static final long serialVersionUID = 5080675335337916895L; - /** - * 主体类型 - */ - @SerializedName("subject_type") - private SubjectTypeEnum subjectType; + /** + * 登记证书照片 + */ + @SerializedName("cert_copy") + private String certCopy; - /** - * 营业执照 - */ - @SerializedName("business_license_info") - private BusinessLicenseInfo businessLicenseInfo; - /** - * 登记证书 - */ - @SerializedName("certificate_info") - private CertificateInfo certificateInfo; - - /** - * 组织机构代码证 - */ - @SerializedName("organization_info") - private OrganizationInfo organizationInfo; - - /** - * 单位证明函照片 - */ - @SerializedName("certificate_letter_copy") - private String certificateLetterCopy; - - /** - * 经营者/法人身份证件 - */ - @SerializedName("identity_info") - @SpecEncrypt - private IdentityInfo identityInfo; - - /** - * 最终受益人信息(UBO] - */ - @SerializedName("ubo_info") - @SpecEncrypt - private UboInfo uboInfo; + /** + * 登记证书类型 + */ + @SerializedName("cert_type") + private CertTypeEnum certType; - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class BusinessLicenseInfo { - /** - * 营业执照照片 - */ - @SerializedName("license_copy") - private String licenseCopy; - /** - * 注册号/统一社会信用代码 - */ - @SerializedName("license_number") - private String licenseNumber; - /** - * 商户名称 - */ - @SerializedName("merchant_name") - private String merchantName; - /** - * 个体户经营者/法人姓名 - */ - @SerializedName("legal_person") - private String legalPerson; - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class CertificateInfo { - - /** - * 登记证书照片 - */ - @SerializedName("cert_copy") - private String certCopy; - - /** - * 登记证书类型 - */ - @SerializedName("cert_type") - private CertTypeEnum certType; + /** + * 证书号 + */ + @SerializedName("cert_number") + private String certNumber; - /** - * 证书号 - */ - @SerializedName("cert_number") - private String certNumber; + /** + * 商户名称 + */ + @SerializedName("merchant_name") + private String merchantName; - /** - * 商户名称 - */ - @SerializedName("merchant_name") - private String merchantName; + /** + * 注册地址 + */ + @SerializedName("company_address") + private String companyAddress; - /** - * 注册地址 - */ - @SerializedName("company_address") - private String companyAddress; + /** + * 法人姓名 + */ + @SerializedName("legal_person") + private String legalPerson; - /** - * 法人姓名 - */ - @SerializedName("legal_person") - private String legalPerson; + /** + * 有效期限开始日期 + */ + @SerializedName("period_begin") + private String periodBegin; - /** - * 有效期限开始日期 - */ - @SerializedName("period_begin") - private String periodBegin; - - - /** - * 有效期限结束日期 - */ - @SerializedName("period_end") - private String periodEnd; - - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class OrganizationInfo { - /** - * 组织机构代码证照片 - */ - @SerializedName("organization_copy") - private String organizationCopy; - /** - * 组织机构代码 - */ - @SerializedName("organization_code") - private String organizationCode; - /** - * 组织机构代码证有效期开始日期 - */ - @SerializedName("org_period_begin") - private String orgPeriodBegin; - /** - * 组织机构代码证有效期结束日期 - */ - @SerializedName("org_period_end") - private String orgPeriodEnd; - - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class IdentityInfo { - - /** - * 证件类型 - */ - @SerializedName("id_doc_type") - private IdTypeEnum idDocType; - - /** - * 身份证信息 - */ - @SerializedName("id_card_info") - @SpecEncrypt - private IdCardInfo idCardInfo; - - /** - * 其他类型证件信息 - */ - @SerializedName("id_doc_info") - @SpecEncrypt - private IdDocInfo idDocInfo; - - /** - * 经营者/法人是否为受益人 - */ - @SerializedName("owner") - private boolean owner; - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class IdCardInfo { - /** - * 身份证人像面照片 - */ - @SerializedName("id_card_copy") - private String idCardCopy; - /** - * 身份证国徽面照片 - */ - @SerializedName("id_card_national") - private String idCardNational; - - /** - * 身份证姓名 - */ - @SerializedName("id_card_name") - @SpecEncrypt - private String idCardName; - /** - * 身份证号码 - */ - @SerializedName("id_card_number") - @SpecEncrypt - private String idCardNumber; - /** - * 身份证有效期开始时间 - */ - @SerializedName("card_period_begin") - private String cardPeriodBegin; - /** - * 身份证有效期结束时间 - */ - @SerializedName("card_period_end") - private String cardPeriodEnd; - - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class IdDocInfo { - /** - * 证件照片 - */ - @SerializedName("id_doc_copy") - private String idDocCopy; - - /** - * 证件姓名 - */ - @SerializedName("id_doc_name") - @SpecEncrypt - private String idDocName; - - /** - * 证件号码 - */ - @SerializedName("id_doc_number") - @SpecEncrypt - private String idDocNumber; - /** - * 证件有效期开始时间 - */ - @SerializedName("doc_period_begin") - private String docPeriodBegin; - /** - * 证件有效期结束时间 - */ - @SerializedName("doc_period_end") - private String docPeriodEnd; - } - } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class UboInfo { - /** - * 证件类型 - */ - @SerializedName("id_type") - private IdTypeEnum idType; - /** - * 身份证人像面照片 - */ - @SerializedName("id_card_copy") - private String idCardCopy; - /** - * 身份证国徽面照片 - */ - @SerializedName("id_card_national") - private String idCardNational; - /** - * 证件照片 - */ - @SerializedName("id_doc_copy") - private String idDocCopy; - /** - * 受益人姓名 - */ - @SerializedName("name") - @SpecEncrypt - private String name; - /** - * 证件号码 - */ - @SerializedName("id_number") - @SpecEncrypt - private String idNumber; - /** - * 证件有效期开始时间 - */ - @SerializedName("id_period_begin") - private String idPeriodBegin; - /** - * 证件有效期结束时间 - */ - @SerializedName("id_period_end") - private String idPeriodEnd; - } + /** + * 有效期限结束日期 + */ + @SerializedName("period_end") + private String periodEnd; } - /** - * 经营资料 - */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) - public static class BusinessInfo implements Serializable { - private static final long serialVersionUID = 1L; + public static class OrganizationInfo implements Serializable { + private static final long serialVersionUID = 6497045652770046337L; + /** + * 组织机构代码证照片 + */ + @SerializedName("organization_copy") + private String organizationCopy; + /** + * 组织机构代码 + */ + @SerializedName("organization_code") + private String organizationCode; + /** + * 组织机构代码证有效期开始日期 + */ + @SerializedName("org_period_begin") + private String orgPeriodBegin; + /** + * 组织机构代码证有效期结束日期 + */ + @SerializedName("org_period_end") + private String orgPeriodEnd; - /** - * 商户简称 - */ - @SerializedName("merchant_shortname") - private String merchantShortname; - - /** - * 客服电话 - */ - @SerializedName("service_phone") - private String servicePhone; - - /** - * 经营场景 - */ - @SerializedName("sales_info") - private SalesInfo salesInfo; - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class SalesInfo { - - /** - * 经营场景类型 - */ - @SerializedName("sales_scenes_type") - private List salesScenesType; - - /** - * 线下门店场景 - */ - @SerializedName("biz_store_info") - private BizStoreInfo bizStoreInfo; - - /** - * 公众号场景 - */ - @SerializedName("mp_info") - private MpInfo mpInfo; - - /** - * 小程序场景 - */ - @SerializedName("mini_program_info") - private MiniProgramInfo miniProgramInfo; - - /** - * APP场景 - */ - @SerializedName("app_info") - private AppInfo appInfo; - - /** - * 互联网网站场景 - */ - @SerializedName("web_info") - private WebInfo webInfo; - - /** - * 企业微信场景 - */ - @SerializedName("wework_info") - private WeworkInfo weworkInfo; - - /** - * 线下门店场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class BizStoreInfo { - - /** - * 门店名称 - */ - @SerializedName("biz_store_name") - private String bizStoreName; - - /** - * 门店省市编码 - */ - @SerializedName("biz_address_code") - private String bizAddressCode; - - /** - * 门店地址 - */ - @SerializedName("biz_store_address") - private String bizStoreAddress; - - /** - * 门店门头照片 - */ - @SerializedName("store_entrance_pic") - private List storeEntrancePic; - - /** - * 店内环境照片 - */ - @SerializedName("indoor_pic") - private List indoorPic; - - /** - * 线下场所对应的商家APPID - */ - @SerializedName("biz_sub_appid") - private String bizSubAppid; - - } - - /** - * 公众号场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class MpInfo { - - /** - * 服务商公众号APPID - */ - @SerializedName("mp_appid") - private String mpAppid; - - /** - * 商家公众号APPID - */ - @SerializedName("mp_sub_appid") - private String mpSubAppid; - - /** - * 公众号页面截图 - */ - @SerializedName("mp_pics") - private List mpPics; - - } - - /** - * 小程序场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class MiniProgramInfo { - - /** - * 服务商小程序APPID - */ - @SerializedName("mini_program_appid") - private String miniProgramAppid; - - /** - * 商家小程序APPID - */ - @SerializedName("mini_program_sub_appid") - private String miniProgramSubAppid; - - /** - * 小程序截图 - */ - @SerializedName("mini_program_pics") - private List miniProgramPics; - - - } - - /** - * APP场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class AppInfo { - - /** - * 服务商应用APPID - */ - @SerializedName("app_appid") - private String appAppid; - - /** - * 商家应用APPID - */ - @SerializedName("app_sub_appid") - private String appSubAppid; - - /** - * APP截图 - */ - @SerializedName("app_pics") - private List appPics; - - } - - /** - * 互联网网站场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class WebInfo { - - /** - * 互联网网站域名 - */ - @SerializedName("domain") - private String domain; - - /** - * 网站授权函 - */ - @SerializedName("web_authorisation") - private String webAuthorisation; - - /** - * 互联网网站对应的商家APPID - */ - @SerializedName("web_appid") - private String webAppid; - - } - - /** - * 企业微信场景 - */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class WeworkInfo { - - /** - * 商家企业微信CorpID - */ - @SerializedName("sub_corp_id") - private String subCorpId; - - /** - * 企业微信页面截图 - */ - @SerializedName("wework_pics") - private List weworkPics; - - } - } } - /** - * 结算规则 - */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) - public static class SettlementInfo implements Serializable { - private static final long serialVersionUID = 1L; + public static class IdentityInfo implements Serializable { + private static final long serialVersionUID = 1683704338370383827L; + + /** + * 证件类型 + */ + @SerializedName("id_doc_type") + private IdTypeEnum idDocType; + + /** + * 身份证信息 + */ + @SerializedName("id_card_info") + @SpecEncrypt + private IdCardInfo idCardInfo; + + /** + * 其他类型证件信息 + */ + @SerializedName("id_doc_info") + @SpecEncrypt + private IdDocInfo idDocInfo; + + /** + * 经营者/法人是否为受益人 + */ + @SerializedName("owner") + private boolean owner; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdCardInfo implements Serializable { + private static final long serialVersionUID = -2897792705297641786L; + /** + * 身份证人像面照片 + */ + @SerializedName("id_card_copy") + private String idCardCopy; + /** + * 身份证国徽面照片 + */ + @SerializedName("id_card_national") + private String idCardNational; /** - * 入驻结算规则ID + * 身份证姓名 */ - @SerializedName("settlement_id") - private String settlementId; + @SerializedName("id_card_name") + @SpecEncrypt + private String idCardName; + /** + * 身份证号码 + */ + @SerializedName("id_card_number") + @SpecEncrypt + private String idCardNumber; + /** + * 身份证有效期开始时间 + */ + @SerializedName("card_period_begin") + private String cardPeriodBegin; + /** + * 身份证有效期结束时间 + */ + @SerializedName("card_period_end") + private String cardPeriodEnd; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdDocInfo implements Serializable { + private static final long serialVersionUID = 7335589815924447719L; + /** + * 证件照片 + */ + @SerializedName("id_doc_copy") + private String idDocCopy; /** - * 所属行业 + * 证件姓名 */ - @SerializedName("qualification_type") - private String qualificationType; + @SerializedName("id_doc_name") + @SpecEncrypt + private String idDocName; /** - * 特殊资质图片 + * 证件号码 */ - @SerializedName("qualifications") - private List qualifications; - + @SerializedName("id_doc_number") + @SpecEncrypt + private String idDocNumber; /** - * 优惠费率活动ID + * 证件有效期开始时间 */ - @SerializedName("activities_id") - private String activitiesId; - + @SerializedName("doc_period_begin") + private String docPeriodBegin; /** - * 优惠费率活动值 + * 证件有效期结束时间 */ - @SerializedName("activities_rate") - private String activitiesRate; - - /** - * 优惠费率活动补充材料 - */ - @SerializedName("activities_additions") - private List activitiesAdditions; - + @SerializedName("doc_period_end") + private String docPeriodEnd; + } } - /** - * 结算银行账户 - */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) - public static class BankAccountInfo implements Serializable { - private static final long serialVersionUID = 1L; - - /** - * 账户类型 - */ - @SerializedName("bank_account_type") - private BankAccountTypeEnum bankAccountType; - - /** - * 开户名称 - */ - @SerializedName("account_name") - @SpecEncrypt - private String accountName; - - /** - * 开户银行 - */ - @SerializedName("account_bank") - private String accountBank; - - /** - * 开户银行省市编码 - */ - @SerializedName("bank_address_code") - private String bankAddressCode; - - /** - * 开户银行联行号 - */ - @SerializedName("bank_branch_id") - private String bankBranchId; - - /** - * 开户银行全称(含支行] - */ - @SerializedName("bank_name") - private String bankName; - - /** - * 银行账号 - */ - @SerializedName("account_number") - @SpecEncrypt - private String accountNumber; - + public static class UboInfo implements Serializable { + private static final long serialVersionUID = 7918585690831975042L; + /** + * 证件类型 + */ + @SerializedName("id_type") + private IdTypeEnum idType; + /** + * 身份证人像面照片 + */ + @SerializedName("id_card_copy") + private String idCardCopy; + /** + * 身份证国徽面照片 + */ + @SerializedName("id_card_national") + private String idCardNational; + /** + * 证件照片 + */ + @SerializedName("id_doc_copy") + private String idDocCopy; + /** + * 受益人姓名 + */ + @SerializedName("name") + @SpecEncrypt + private String name; + /** + * 证件号码 + */ + @SerializedName("id_number") + @SpecEncrypt + private String idNumber; + /** + * 证件有效期开始时间 + */ + @SerializedName("id_period_begin") + private String idPeriodBegin; + /** + * 证件有效期结束时间 + */ + @SerializedName("id_period_end") + private String idPeriodEnd; } + } + + /** + * 经营资料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BusinessInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 商户简称 + */ + @SerializedName("merchant_shortname") + private String merchantShortname; + + /** + * 客服电话 + */ + @SerializedName("service_phone") + private String servicePhone; + + /** + * 经营场景 + */ + @SerializedName("sales_info") + private SalesInfo salesInfo; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SalesInfo implements Serializable { + private static final long serialVersionUID = 6428044729204137659L; + /** + * 经营场景类型 + */ + @SerializedName("sales_scenes_type") + private List salesScenesType; + + /** + * 线下门店场景 + */ + @SerializedName("biz_store_info") + private BizStoreInfo bizStoreInfo; + + /** + * 公众号场景 + */ + @SerializedName("mp_info") + private MpInfo mpInfo; + + /** + * 小程序场景 + */ + @SerializedName("mini_program_info") + private MiniProgramInfo miniProgramInfo; + + /** + * APP场景 + */ + @SerializedName("app_info") + private AppInfo appInfo; + + /** + * 互联网网站场景 + */ + @SerializedName("web_info") + private WebInfo webInfo; + + /** + * 企业微信场景 + */ + @SerializedName("wework_info") + private WeworkInfo weworkInfo; + + /** + * 线下门店场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BizStoreInfo implements Serializable { + private static final long serialVersionUID = 4397253725912709093L; + /** + * 门店名称 + */ + @SerializedName("biz_store_name") + private String bizStoreName; + + /** + * 门店省市编码 + */ + @SerializedName("biz_address_code") + private String bizAddressCode; + + /** + * 门店地址 + */ + @SerializedName("biz_store_address") + private String bizStoreAddress; + + /** + * 门店门头照片 + */ + @SerializedName("store_entrance_pic") + private List storeEntrancePic; + + /** + * 店内环境照片 + */ + @SerializedName("indoor_pic") + private List indoorPic; + + /** + * 线下场所对应的商家APPID + */ + @SerializedName("biz_sub_appid") + private String bizSubAppid; + + } + + /** + * 公众号场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MpInfo implements Serializable { + private static final long serialVersionUID = 167582552189873597L; + /** + * 服务商公众号APPID + */ + @SerializedName("mp_appid") + private String mpAppid; + + /** + * 商家公众号APPID + */ + @SerializedName("mp_sub_appid") + private String mpSubAppid; + + /** + * 公众号页面截图 + */ + @SerializedName("mp_pics") + private List mpPics; + + } + + /** + * 小程序场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MiniProgramInfo implements Serializable { + private static final long serialVersionUID = -371749335686796436L; + /** + * 服务商小程序APPID + */ + @SerializedName("mini_program_appid") + private String miniProgramAppid; + + /** + * 商家小程序APPID + */ + @SerializedName("mini_program_sub_appid") + private String miniProgramSubAppid; + + /** + * 小程序截图 + */ + @SerializedName("mini_program_pics") + private List miniProgramPics; + + + } + + /** + * APP场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AppInfo implements Serializable { + private static final long serialVersionUID = 3959643687528770473L; + /** + * 服务商应用APPID + */ + @SerializedName("app_appid") + private String appAppid; + + /** + * 商家应用APPID + */ + @SerializedName("app_sub_appid") + private String appSubAppid; + + /** + * APP截图 + */ + @SerializedName("app_pics") + private List appPics; + + } + + /** + * 互联网网站场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class WebInfo implements Serializable { + private static final long serialVersionUID = -4183874827185822310L; + /** + * 互联网网站域名 + */ + @SerializedName("domain") + private String domain; + + /** + * 网站授权函 + */ + @SerializedName("web_authorisation") + private String webAuthorisation; + + /** + * 互联网网站对应的商家APPID + */ + @SerializedName("web_appid") + private String webAppid; + + } + + /** + * 企业微信场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class WeworkInfo implements Serializable { + private static final long serialVersionUID = 9075531305717309383L; + /** + * 商家企业微信CorpID + */ + @SerializedName("sub_corp_id") + private String subCorpId; + + /** + * 企业微信页面截图 + */ + @SerializedName("wework_pics") + private List weworkPics; + + } + } + } + + /** + * 结算规则 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SettlementInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 入驻结算规则ID + */ + @SerializedName("settlement_id") + private String settlementId; + + /** + * 所属行业 + */ + @SerializedName("qualification_type") + private String qualificationType; + + /** + * 特殊资质图片 + */ + @SerializedName("qualifications") + private List qualifications; + + /** + * 优惠费率活动ID + */ + @SerializedName("activities_id") + private String activitiesId; + + /** + * 优惠费率活动值 + */ + @SerializedName("activities_rate") + private String activitiesRate; + + /** + * 优惠费率活动补充材料 + */ + @SerializedName("activities_additions") + private List activitiesAdditions; + + } + + /** + * 结算银行账户 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BankAccountInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 账户类型 + */ + @SerializedName("bank_account_type") + private BankAccountTypeEnum bankAccountType; + + /** + * 开户名称 + */ + @SerializedName("account_name") + @SpecEncrypt + private String accountName; + + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + + /** + * 开户银行省市编码 + */ + @SerializedName("bank_address_code") + private String bankAddressCode; + + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + + /** + * 开户银行全称(含支行] + */ + @SerializedName("bank_name") + private String bankName; + + /** + * 银行账号 + */ + @SerializedName("account_number") + @SpecEncrypt + private String accountNumber; + + } + + + /** + * 补充材料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AdditionInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 法人开户承诺函 + */ + @SerializedName("legal_person_commitment") + private String legalPersonCommitment; + + /** + * 法人开户意愿视频 + */ + @SerializedName("legal_person_video") + private String legalPersonVideo; /** * 补充材料 */ - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - @Accessors(chain = true) - public static class AdditionInfo implements Serializable { - private static final long serialVersionUID = 1L; + @SerializedName("business_addition_pics") + private List businessAdditionPics; - /** - * 法人开户承诺函 - */ - @SerializedName("legal_person_commitment") - private String legalPersonCommitment; + /** + * 补充说明 + */ + @SerializedName("business_addition_msg") + private String businessAdditionMsg; - /** - * 法人开户意愿视频 - */ - @SerializedName("legal_person_video") - private String legalPersonVideo; - - /** - * 补充材料 - */ - @SerializedName("business_addition_pics") - private List businessAdditionPics; - - /** - * 补充说明 - */ - @SerializedName("business_addition_msg") - private String businessAdditionMsg; - - } + } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java index d68ba0ce8..157b8fc09 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java @@ -21,11 +21,11 @@ import java.io.Serializable; @AllArgsConstructor @Accessors(chain = true) public class WxPayApplymentCreateResult implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 微信支付申请单号 - */ - @SerializedName("applyment_id") - private String applymentId; + /** + * 微信支付申请单号 + */ + @SerializedName("applyment_id") + private String applymentId; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java index 3239709b6..15fcba9f9 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java @@ -5,14 +5,14 @@ package com.github.binarywang.wxpay.bean.applyment.enums; * 银行结算账户枚举类 */ public enum AccountTypeEnum { - /** - * 对公银行账户 - */ - ACCOUNT_TYPE_BUSINESS, + /** + * 对公银行账户 + */ + ACCOUNT_TYPE_BUSINESS, - /** - * 经营者个人银行卡 - */ - ACCOUNT_TYPE_PRIVATE, - ; + /** + * 经营者个人银行卡 + */ + ACCOUNT_TYPE_PRIVATE, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java index 50affe877..2997ed522 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java @@ -6,37 +6,37 @@ package com.github.binarywang.wxpay.bean.applyment.enums; * @author zhouyongshen */ public enum ApplymentStateEnum { - /** - * (编辑中):提交申请发生错误导致,请尝试重新提交。 - */ - APPLYMENT_STATE_EDITTING, - /** - * (审核中):申请单正在审核中,超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤。 - */ - APPLYMENT_STATE_AUDITING, - /** - * (已驳回):请按照驳回原因修改申请资料,超级管理员用微信打开“签约链接”,完成绑定微信号,后续申请单进度将通过微信公众号通知超级管理员。 - */ - APPLYMENT_STATE_REJECTED, - /** - * (待账户验证):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成账户验证。 - */ - APPLYMENT_STATE_TO_BE_CONFIRMED, - /** - * (待签约):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成签约。 - */ - APPLYMENT_STATE_TO_BE_SIGNED, - /** - * (开通权限中):系统开通相关权限中,请耐心等待。 - */ - APPLYMENT_STATE_SIGNING, - /** - * (已完成):商户入驻申请已完成。 - */ - APPLYMENT_STATE_FINISHED, - /** - * (已作废):申请单已被撤销。 - */ - APPLYMENT_STATE_CANCELED + /** + * (编辑中):提交申请发生错误导致,请尝试重新提交。 + */ + APPLYMENT_STATE_EDITTING, + /** + * (审核中):申请单正在审核中,超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤。 + */ + APPLYMENT_STATE_AUDITING, + /** + * (已驳回):请按照驳回原因修改申请资料,超级管理员用微信打开“签约链接”,完成绑定微信号,后续申请单进度将通过微信公众号通知超级管理员。 + */ + APPLYMENT_STATE_REJECTED, + /** + * (待账户验证):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成账户验证。 + */ + APPLYMENT_STATE_TO_BE_CONFIRMED, + /** + * (待签约):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成签约。 + */ + APPLYMENT_STATE_TO_BE_SIGNED, + /** + * (开通权限中):系统开通相关权限中,请耐心等待。 + */ + APPLYMENT_STATE_SIGNING, + /** + * (已完成):商户入驻申请已完成。 + */ + APPLYMENT_STATE_FINISHED, + /** + * (已作废):申请单已被撤销。 + */ + APPLYMENT_STATE_CANCELED } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java index 5d566702e..739ad2447 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java @@ -5,14 +5,14 @@ package com.github.binarywang.wxpay.bean.applyment.enums; * 银行结算账户枚举类 */ public enum BankAccountTypeEnum { - /** - * 对公银行账户 - */ - BANK_ACCOUNT_TYPE_CORPORATE, + /** + * 对公银行账户 + */ + BANK_ACCOUNT_TYPE_CORPORATE, - /** - * 经营者个人银行卡 - */ - BANK_ACCOUNT_TYPE_PERSONAL, - ; + /** + * 经营者个人银行卡 + */ + BANK_ACCOUNT_TYPE_PERSONAL, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java index 89ca59d19..f7415fdc3 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java @@ -4,57 +4,57 @@ package com.github.binarywang.wxpay.bean.applyment.enums; * 登记证书的类型枚举 */ public enum CertTypeEnum { - /** - * 事业单位法人证书 - */ - CERTIFICATE_TYPE_2388, - /** - * 统一社会信用代码证书 - */ - CERTIFICATE_TYPE_2389, - /** - * 有偿服务许可证(军队医院适用) - */ - CERTIFICATE_TYPE_2390, - /** - * 医疗机构执业许可证(军队医院适用) - */ - CERTIFICATE_TYPE_2391, - /** - * 企业营业执照(挂靠企业的党组织适用) - */ - CERTIFICATE_TYPE_2392, - /** - * 组织机构代码证(政府机关适用) - */ - CERTIFICATE_TYPE_2393, - /** - * 社会团体法人登记证书 - */ - CERTIFICATE_TYPE_2394, - /** - * 民办非企业单位登记证书 - */ - CERTIFICATE_TYPE_2395, - /** - * 基金会法人登记证书 - */ - CERTIFICATE_TYPE_2396, - /** - * 慈善组织公开募捐资格证书 - */ - CERTIFICATE_TYPE_2397, - /** - * 农民专业合作社法人营业执照 - */ - CERTIFICATE_TYPE_2398, - /** - * 宗教活动场所登记证 - */ - CERTIFICATE_TYPE_2399, - /** - * 其他证书/批文/证明 - */ - CERTIFICATE_TYPE_2400, - ; + /** + * 事业单位法人证书 + */ + CERTIFICATE_TYPE_2388, + /** + * 统一社会信用代码证书 + */ + CERTIFICATE_TYPE_2389, + /** + * 有偿服务许可证(军队医院适用) + */ + CERTIFICATE_TYPE_2390, + /** + * 医疗机构执业许可证(军队医院适用) + */ + CERTIFICATE_TYPE_2391, + /** + * 企业营业执照(挂靠企业的党组织适用) + */ + CERTIFICATE_TYPE_2392, + /** + * 组织机构代码证(政府机关适用) + */ + CERTIFICATE_TYPE_2393, + /** + * 社会团体法人登记证书 + */ + CERTIFICATE_TYPE_2394, + /** + * 民办非企业单位登记证书 + */ + CERTIFICATE_TYPE_2395, + /** + * 基金会法人登记证书 + */ + CERTIFICATE_TYPE_2396, + /** + * 慈善组织公开募捐资格证书 + */ + CERTIFICATE_TYPE_2397, + /** + * 农民专业合作社法人营业执照 + */ + CERTIFICATE_TYPE_2398, + /** + * 宗教活动场所登记证 + */ + CERTIFICATE_TYPE_2399, + /** + * 其他证书/批文/证明 + */ + CERTIFICATE_TYPE_2400, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java index 7bf88e6b5..d65c502b8 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java @@ -5,25 +5,25 @@ package com.github.binarywang.wxpay.bean.applyment.enums; * 枚举值 */ public enum IdTypeEnum { - /** - * 中国大陆居民-身份证 - */ - IDENTIFICATION_TYPE_IDCARD, - /** - * 其他国家或地区居民-护照 - */ - IDENTIFICATION_TYPE_OVERSEA_PASSPORT, - /** - * 中国香港居民-来往内地通行证 - */ - IDENTIFICATION_TYPE_HONGKONG_PASSPORT, - /** - * 中国澳门居民-来往内地通行证 - */ - IDENTIFICATION_TYPE_MACAO_PASSPORT, - /** - * 中国台湾居民-来往大陆通行证 - */ - IDENTIFICATION_TYPE_TAIWAN_PASSPORT, - ; + /** + * 中国大陆居民-身份证 + */ + IDENTIFICATION_TYPE_IDCARD, + /** + * 其他国家或地区居民-护照 + */ + IDENTIFICATION_TYPE_OVERSEA_PASSPORT, + /** + * 中国香港居民-来往内地通行证 + */ + IDENTIFICATION_TYPE_HONGKONG_PASSPORT, + /** + * 中国澳门居民-来往内地通行证 + */ + IDENTIFICATION_TYPE_MACAO_PASSPORT, + /** + * 中国台湾居民-来往大陆通行证 + */ + IDENTIFICATION_TYPE_TAIWAN_PASSPORT, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java index baf4d1839..b057dd574 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java @@ -4,29 +4,29 @@ package com.github.binarywang.wxpay.bean.applyment.enums; * 经营场景类型枚举值 */ public enum SalesScenesTypeEnum { - /** - * 线下门店 - */ - SALES_SCENES_STORE, - /** - * 公众号 - */ - SALES_SCENES_MP, - /** - * 小程序 - */ - SALES_SCENES_MINI_PROGRAM, - /** - * 互联网 - */ - SALES_SCENES_WEB, - /** - * APP - */ - SALES_SCENES_APP, - /** - * 企业微信 - */ - SALES_SCENES_WEWORK, - ; + /** + * 线下门店 + */ + SALES_SCENES_STORE, + /** + * 公众号 + */ + SALES_SCENES_MP, + /** + * 小程序 + */ + SALES_SCENES_MINI_PROGRAM, + /** + * 互联网 + */ + SALES_SCENES_WEB, + /** + * APP + */ + SALES_SCENES_APP, + /** + * 企业微信 + */ + SALES_SCENES_WEWORK, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java index f26e6c09f..ed2fbc719 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java @@ -6,18 +6,18 @@ package com.github.binarywang.wxpay.bean.applyment.enums; * @author zhouyognshen */ public enum SettlementVerifyResultEnum { - /** - * 系统汇款验证中,商户可发起提现尝试。 - */ - VERIFYING, - /** - * 系统成功汇款,该账户可正常发起提现。 - */ - VERIFY_SUCCESS, - /** - * 系统汇款失败,该账户无法发起提现,请检查修改。 - */ - VERIFY_FAIL, - ; + /** + * 系统汇款验证中,商户可发起提现尝试。 + */ + VERIFYING, + /** + * 系统成功汇款,该账户可正常发起提现。 + */ + VERIFY_SUCCESS, + /** + * 系统汇款失败,该账户无法发起提现,请检查修改。 + */ + VERIFY_FAIL, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java index c1555b7c5..7845c052c 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java @@ -5,24 +5,26 @@ package com.github.binarywang.wxpay.bean.applyment.enums; * * 商户申请接入时如何选择主体类型? https://kf.qq.com/faq/180910IBZVnQ180910naQ77b.html *+ * * @author zhouyongshen */ public enum SubjectTypeEnum { - /** - * (个体户):营业执照上的主体类型一般为个体户、个体工商户、个体经营; - */ - SUBJECT_TYPE_INDIVIDUAL, - /** - * (企业):营业执照上的主体类型一般为有限公司、有限责任公司; - */ - SUBJECT_TYPE_ENTERPRISE, - /** - * (党政、机关及事业单位):包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构); - */ - SUBJECT_TYPE_INSTITUTIONS, - /** - * (其他组织):不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。 - */ - SUBJECT_TYPE_OTHERS,; + /** + * (个体户):营业执照上的主体类型一般为个体户、个体工商户、个体经营; + */ + SUBJECT_TYPE_INDIVIDUAL, + /** + * (企业):营业执照上的主体类型一般为有限公司、有限责任公司; + */ + SUBJECT_TYPE_ENTERPRISE, + /** + * (党政、机关及事业单位):包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构); + */ + SUBJECT_TYPE_INSTITUTIONS, + /** + * (其他组织):不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。 + */ + SUBJECT_TYPE_OTHERS, + ; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java index 92e069f63..bd021fc57 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsRequest.java @@ -17,780 +17,781 @@ import java.io.Serializable; @Data @NoArgsConstructor public class ApplymentsRequest implements Serializable { - /** - *- * 字段名:业务申请编号 - * 变量名:out_request_no - * 是否必填:是 - * 类型:string(124) - * 描述: - * 1、服务商自定义的商户唯一编号。 - * 2、每个编号对应一个申请单,每个申请单审核通过后会生成一个微信支付商户号。 - * 3、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息 。 - * 示例值:APPLYMENT_00000000001 - *- */ - @SerializedName(value = "out_request_no") - private String outRequestNo; + private static final long serialVersionUID = -3092662029966103592L; + /** + *+ * 字段名:业务申请编号 + * 变量名:out_request_no + * 是否必填:是 + * 类型:string(124) + * 描述: + * 1、服务商自定义的商户唯一编号。 + * 2、每个编号对应一个申请单,每个申请单审核通过后会生成一个微信支付商户号。 + * 3、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息 。 + * 示例值:APPLYMENT_00000000001 + *+ */ + @SerializedName(value = "out_request_no") + private String outRequestNo; - /** - *- * 字段名:主体类型 - * 变量名:organization_type - * 是否必填:是 - * 类型:string(4) - * 描述: - * 枚举值: - * 2401:小微商户,指无营业执照的商户。 - * 4:个体工商户,营业执照上的主体类型一般为个体户、个体工商户、个体经营。 - * 2:企业,营业执照上的主体类型一般为有限公司、有限责任公司。 - * 3:党政、机关及事业单位,包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构)。 - * 1708:其他组织,不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。 - * 示例值:2401 - *- */ - @SerializedName(value = "organization_type") - private String organizationType; + /** + *+ * 字段名:主体类型 + * 变量名:organization_type + * 是否必填:是 + * 类型:string(4) + * 描述: + * 枚举值: + * 2401:小微商户,指无营业执照的商户。 + * 4:个体工商户,营业执照上的主体类型一般为个体户、个体工商户、个体经营。 + * 2:企业,营业执照上的主体类型一般为有限公司、有限责任公司。 + * 3:党政、机关及事业单位,包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构)。 + * 1708:其他组织,不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。 + * 示例值:2401 + *+ */ + @SerializedName(value = "organization_type") + private String organizationType; - /** - *- * 字段名:+营业执照/登记证书信息 - * 变量名:business_license_info - * 是否必填:条件选填 - * 类型:object - * 描述: - * 1、主体为“小微”时,不填。 - * 2、主体为“个体工商户/企业”时,请上传营业执照。 - * 3、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书。 - *- */ - @SerializedName(value = "business_license_info") - private BusinessLicenseInfo businessLicenseInfo; + /** + *+ * 字段名:+营业执照/登记证书信息 + * 变量名:business_license_info + * 是否必填:条件选填 + * 类型:object + * 描述: + * 1、主体为“小微”时,不填。 + * 2、主体为“个体工商户/企业”时,请上传营业执照。 + * 3、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书。 + *+ */ + @SerializedName(value = "business_license_info") + private BusinessLicenseInfo businessLicenseInfo; - /** - *- * 字段名:+组织机构代码证信息 - * 变量名:organization_cert_info - * 是否必填:条件选填 - * 类型:object - * 描述:主体为企业/党政、机关及事业单位/其他组织,且证件号码不是18位时必填。 - *- */ - @SerializedName(value = "organization_cert_info") - private OrganizationCertInfo organizationCertInfo; + /** + *+ * 字段名:+组织机构代码证信息 + * 变量名:organization_cert_info + * 是否必填:条件选填 + * 类型:object + * 描述:主体为企业/党政、机关及事业单位/其他组织,且证件号码不是18位时必填。 + *+ */ + @SerializedName(value = "organization_cert_info") + private OrganizationCertInfo organizationCertInfo; - /** - *- * 字段名:经营者/法人证件类型 - * 变量名:id_doc_type - * 是否必填:否 - * 类型:string(64) - * 描述: - * 1、主体为“小微”,只可选择:身份证。 - * 2、主体为“个体户/企业/党政、机关及事业单位/其他组织”,可选择:任一证件类型。 - * 3、若没有填写,系统默认选择:身份证。 - * 枚举值: - * IDENTIFICATION_TYPE_MAINLAND_IDCARD:中国大陆居民-身份证 - * IDENTIFICATION_TYPE_OVERSEA_PASSPORT:其他国家或地区居民-护照 - * IDENTIFICATION_TYPE_HONGKONG:中国香港居民–来往内地通行证 - * IDENTIFICATION_TYPE_MACAO:中国澳门居民–来往内地通行证 - * IDENTIFICATION_TYPE_TAIWAN:中国台湾居民–来往大陆通行证 - * 示例值:IDENTIFICATION_TYPE_MACAO - *- */ - @SerializedName(value = "id_doc_type") - private String idDocType; + /** + *+ * 字段名:经营者/法人证件类型 + * 变量名:id_doc_type + * 是否必填:否 + * 类型:string(64) + * 描述: + * 1、主体为“小微”,只可选择:身份证。 + * 2、主体为“个体户/企业/党政、机关及事业单位/其他组织”,可选择:任一证件类型。 + * 3、若没有填写,系统默认选择:身份证。 + * 枚举值: + * IDENTIFICATION_TYPE_MAINLAND_IDCARD:中国大陆居民-身份证 + * IDENTIFICATION_TYPE_OVERSEA_PASSPORT:其他国家或地区居民-护照 + * IDENTIFICATION_TYPE_HONGKONG:中国香港居民–来往内地通行证 + * IDENTIFICATION_TYPE_MACAO:中国澳门居民–来往内地通行证 + * IDENTIFICATION_TYPE_TAIWAN:中国台湾居民–来往大陆通行证 + * 示例值:IDENTIFICATION_TYPE_MACAO + *+ */ + @SerializedName(value = "id_doc_type") + private String idDocType; - /** - *- * 字段名:+经营者/法人身份证信息 - * 变量名:id_card_info - * 是否必填:条件选填 - * 类型:object - * 描述: - * 请填写经营者/法人的身份证信息 - * 证件类型为“身份证”时填写。 - * - *- */ - @SerializedName(value = "id_card_info") + /** + *+ * 字段名:+经营者/法人身份证信息 + * 变量名:id_card_info + * 是否必填:条件选填 + * 类型:object + * 描述: + * 请填写经营者/法人的身份证信息 + * 证件类型为“身份证”时填写。 + * + *+ */ + @SerializedName(value = "id_card_info") @SpecEncrypt - private IdCardInfo idCardInfo; + private IdCardInfo idCardInfo; - /** - *- * 字段名:+经营者/法人其他类型证件信息 - * 变量名:id_doc_info - * 是否必填:条件选填 - * 类型:object - * 描述:证件类型为“来往内地通行证、来往大陆通行证、护照”时填写。 - *- */ - @SerializedName(value = "id_doc_info") - private IdDocInfo idDocInfo; + /** + *+ * 字段名:+经营者/法人其他类型证件信息 + * 变量名:id_doc_info + * 是否必填:条件选填 + * 类型:object + * 描述:证件类型为“来往内地通行证、来往大陆通行证、护照”时填写。 + *+ */ + @SerializedName(value = "id_doc_info") + private IdDocInfo idDocInfo; - /** - *- * 字段名:是否填写结算账户信息 - * 变量名:need_account_info - * 是否必填:是 - * 类型:bool - * 描述: - * 可根据实际情况,填写“true”或“false”。 - * 1、若为“true”,则需填写结算账户信息。 - * 2、若为“false”,则无需填写结算账户信息。 - * 示例值:true - *- */ - @SerializedName(value = "need_account_info") - private Boolean needAccountInfo; + /** + *+ * 字段名:是否填写结算账户信息 + * 变量名:need_account_info + * 是否必填:是 + * 类型:bool + * 描述: + * 可根据实际情况,填写“true”或“false”。 + * 1、若为“true”,则需填写结算账户信息。 + * 2、若为“false”,则无需填写结算账户信息。 + * 示例值:true + *+ */ + @SerializedName(value = "need_account_info") + private Boolean needAccountInfo; - /** - *- * 字段名:+结算账户信息 - * 变量名:account_info - * 是否必填:条件选填 - * 类型:object - * 描述:若"是否填写结算账户信息"填写为“true”, 则必填,填写为“false”不填 。 - *- */ - @SerializedName(value = "account_info") + /** + *+ * 字段名:+结算账户信息 + * 变量名:account_info + * 是否必填:条件选填 + * 类型:object + * 描述:若"是否填写结算账户信息"填写为“true”, 则必填,填写为“false”不填 。 + *+ */ + @SerializedName(value = "account_info") @SpecEncrypt - private AccountInfo accountInfo; + private AccountInfo accountInfo; - /** - *- * 字段名:+超级管理员信息 - * 变量名:contact_info - * 是否必填:是 - * 类型:object - * 描述: - * 请填写店铺的超级管理员信息。 - * 超级管理员需在开户后进行签约,并可接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。 - *- */ - @SerializedName(value = "contact_info") + /** + *+ * 字段名:+超级管理员信息 + * 变量名:contact_info + * 是否必填:是 + * 类型:object + * 描述: + * 请填写店铺的超级管理员信息。 + * 超级管理员需在开户后进行签约,并可接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。 + *+ */ + @SerializedName(value = "contact_info") @SpecEncrypt - private ContactInfo contactInfo; + private ContactInfo contactInfo; - /** - *- * 字段名:+店铺信息 - * 变量名:sales_scene_info - * 是否必填:是 - * 类型:object - * 描述:请填写店铺信息 - *- */ - @SerializedName(value = "sales_scene_info") - private SalesSceneInfo salesSceneInfo; + /** + *+ * 字段名:+店铺信息 + * 变量名:sales_scene_info + * 是否必填:是 + * 类型:object + * 描述:请填写店铺信息 + *+ */ + @SerializedName(value = "sales_scene_info") + private SalesSceneInfo salesSceneInfo; - /** - *- * 字段名:商户简称 - * 变量名:merchant_shortname - * 是否必填:是 - * 类型:string(64) - * 描述: - * UTF-8格式,中文占3个字节,即最多16个汉字长度。将在支付完成页向买家展示,需与商家的实际售卖商品相符 。 - * 示例值:腾讯 - *- */ - @SerializedName(value = "merchant_shortname") - private String merchantShortname; + /** + *+ * 字段名:商户简称 + * 变量名:merchant_shortname + * 是否必填:是 + * 类型:string(64) + * 描述: + * UTF-8格式,中文占3个字节,即最多16个汉字长度。将在支付完成页向买家展示,需与商家的实际售卖商品相符 。 + * 示例值:腾讯 + *+ */ + @SerializedName(value = "merchant_shortname") + private String merchantShortname; - /** - *- * 字段名:特殊资质 - * 变量名:qualifications - * 是否必填:否 - * 类型:string(1024) - * 描述: - * 1、若店铺业务包含互联网售药,则需上传特殊资质-《互联网药品交易服务证》。 - * 2、最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。 - * 示例值:[\"jTpGmxUX3FBWVQ5NJInE4d2I6_H7I4\"] - *- */ - @SerializedName(value = "qualifications") - private String qualifications; + /** + *+ * 字段名:特殊资质 + * 变量名:qualifications + * 是否必填:否 + * 类型:string(1024) + * 描述: + * 1、若店铺业务包含互联网售药,则需上传特殊资质-《互联网药品交易服务证》。 + * 2、最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。 + * 示例值:[\"jTpGmxUX3FBWVQ5NJInE4d2I6_H7I4\"] + *+ */ + @SerializedName(value = "qualifications") + private String qualifications; - /** - *- * 字段名:补充材料 - * 变量名:business_addition_pics - * 是否必填:否 - * 类型:string(1024) - * 描述: - * 最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。 - * 示例值:[\"jTpGmg05InE4d2I6_H7I4\"] - *- */ - @SerializedName(value = "business_addition_pics") - private String businessAdditionPics; + /** + *+ * 字段名:补充材料 + * 变量名:business_addition_pics + * 是否必填:否 + * 类型:string(1024) + * 描述: + * 最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。 + * 示例值:[\"jTpGmg05InE4d2I6_H7I4\"] + *+ */ + @SerializedName(value = "business_addition_pics") + private String businessAdditionPics; - /** - *- * 字段名:补充说明 - * 变量名:business_addition_desc - * 是否必填:否 - * 类型:string(256) - * 描述: - * 可填写512字以内 。 - * 示例值:特殊情况,说明原因 - *- */ - @SerializedName(value = "business_addition_desc") - private String businessAdditionDesc; + /** + *+ * 字段名:补充说明 + * 变量名:business_addition_desc + * 是否必填:否 + * 类型:string(256) + * 描述: + * 可填写512字以内 。 + * 示例值:特殊情况,说明原因 + *+ */ + @SerializedName(value = "business_addition_desc") + private String businessAdditionDesc; - @Data + @Data @NoArgsConstructor - public static class BusinessLicenseInfo implements Serializable{ - /** - *- * 字段名:证件扫描件 - * 变量名:business_license_copy - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、主体为“个体工商户/企业”时,请上传营业执照的证件图片。 - * 2、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书的证件图片。 - * 3、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。 - * 4、图片要求: - * (1)请上传证件的彩色扫描件或彩色数码拍摄件,黑白复印件需加盖公章(公章信息需完整) 。 - * (2)不得添加无关水印(非微信支付商户申请用途的其他水印)。 - * (3)需提供证件的正面拍摄件,完整、照面信息清晰可见。信息不清晰、扭曲、压缩变形、反光、不完整均不接受。 - * (4)不接受二次剪裁、翻拍、PS的证件照片。 - * 示例值: 47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 - *- */ - @SerializedName(value = "business_license_copy") - private String businessLicenseCopy; + public static class BusinessLicenseInfo implements Serializable { + /** + *+ * 字段名:证件扫描件 + * 变量名:business_license_copy + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、主体为“个体工商户/企业”时,请上传营业执照的证件图片。 + * 2、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书的证件图片。 + * 3、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。 + * 4、图片要求: + * (1)请上传证件的彩色扫描件或彩色数码拍摄件,黑白复印件需加盖公章(公章信息需完整) 。 + * (2)不得添加无关水印(非微信支付商户申请用途的其他水印)。 + * (3)需提供证件的正面拍摄件,完整、照面信息清晰可见。信息不清晰、扭曲、压缩变形、反光、不完整均不接受。 + * (4)不接受二次剪裁、翻拍、PS的证件照片。 + * 示例值: 47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 + *+ */ + @SerializedName(value = "business_license_copy") + private String businessLicenseCopy; - /** - *- * 字段名:证件注册号 - * 变量名:business_license_number - * 是否必填:是 - * 类型:string(18) - * 描述: - * 1、主体为“个体工商户/企业”时,请填写营业执照上的注册号/统一社会信用代码,须为15位数字或 18位数字|大写字母。 - * 2、主体为“党政、机关及事业单位/其他组织”时,请填写登记证书的证书编号。 - * 示例值:123456789012345678 - * 特殊规则:长度最小15个字节 - *- */ - @SerializedName(value = "business_license_number") - private String businessLicenseNumber; + /** + *+ * 字段名:证件注册号 + * 变量名:business_license_number + * 是否必填:是 + * 类型:string(18) + * 描述: + * 1、主体为“个体工商户/企业”时,请填写营业执照上的注册号/统一社会信用代码,须为15位数字或 18位数字|大写字母。 + * 2、主体为“党政、机关及事业单位/其他组织”时,请填写登记证书的证书编号。 + * 示例值:123456789012345678 + * 特殊规则:长度最小15个字节 + *+ */ + @SerializedName(value = "business_license_number") + private String businessLicenseNumber; - /** - *- * 字段名:商户名称 - * 变量名:merchant_name - * 是否必填:是 - * 类型:string(128) - * 描述: - * 1、请填写营业执照/登记证书的商家名称,2~110个字符,支持括号 。 - * 2、个体工商户/党政、机关及事业单位,不能以“公司”结尾。 - * 3、个体工商户,若营业执照上商户名称为空或为“无”,请填写"个体户+经营者姓名",如“个体户张三” 。 - * 示例值:腾讯科技有限公司 - *- */ - @SerializedName(value = "merchant_name") - private String merchantName; + /** + *+ * 字段名:商户名称 + * 变量名:merchant_name + * 是否必填:是 + * 类型:string(128) + * 描述: + * 1、请填写营业执照/登记证书的商家名称,2~110个字符,支持括号 。 + * 2、个体工商户/党政、机关及事业单位,不能以“公司”结尾。 + * 3、个体工商户,若营业执照上商户名称为空或为“无”,请填写"个体户+经营者姓名",如“个体户张三” 。 + * 示例值:腾讯科技有限公司 + *+ */ + @SerializedName(value = "merchant_name") + private String merchantName; - /** - *- * 字段名:经营者/法定代表人姓名 - * 变量名:legal_person - * 是否必填:是 - * 类型:string(128) - * 描述: - * 请填写证件的经营者/法定代表人姓名 - * 示例值:张三 - *- */ - @SerializedName(value = "legal_person") - private String legalPerson; + /** + *+ * 字段名:经营者/法定代表人姓名 + * 变量名:legal_person + * 是否必填:是 + * 类型:string(128) + * 描述: + * 请填写证件的经营者/法定代表人姓名 + * 示例值:张三 + *+ */ + @SerializedName(value = "legal_person") + private String legalPerson; - /** - *- * 字段名:注册地址 - * 变量名:company_address - * 是否必填:条件选填 - * 类型:string(128) - * 描述: - * 主体为“党政、机关及事业单位/其他组织”时必填,请填写登记证书的注册地址。 - * 示例值:深圳南山区科苑路 - *- */ - @SerializedName(value = "company_address") - private String companyAddress; + /** + *+ * 字段名:注册地址 + * 变量名:company_address + * 是否必填:条件选填 + * 类型:string(128) + * 描述: + * 主体为“党政、机关及事业单位/其他组织”时必填,请填写登记证书的注册地址。 + * 示例值:深圳南山区科苑路 + *+ */ + @SerializedName(value = "company_address") + private String companyAddress; - /** - *- * 字段名:营业期限 - * 变量名:business_time - * 是否必填:条件选填 - * 类型:string(256) - * 描述: - * 1、主体为“党政、机关及事业单位/其他组织”时必填,请填写证件有效期。 - * 2、若证件有效期为长期,请填写:长期。 - * 3、结束时间需大于开始时间。 - * 4、有效期必须大于60天,即结束时间距当前时间需超过60天。 - * 示例值:[\"2014-01-01\",\"长期\"] - *- */ - @SerializedName(value = "business_time") - private String businessTime; + /** + *+ * 字段名:营业期限 + * 变量名:business_time + * 是否必填:条件选填 + * 类型:string(256) + * 描述: + * 1、主体为“党政、机关及事业单位/其他组织”时必填,请填写证件有效期。 + * 2、若证件有效期为长期,请填写:长期。 + * 3、结束时间需大于开始时间。 + * 4、有效期必须大于60天,即结束时间距当前时间需超过60天。 + * 示例值:[\"2014-01-01\",\"长期\"] + *+ */ + @SerializedName(value = "business_time") + private String businessTime; - } + } - @Data + @Data @NoArgsConstructor - public static class OrganizationCertInfo implements Serializable { - /** - *- * 字段名:组织机构代码证照片 - * 变量名:organization_copy - * 是否必填:是 - * 类型:string(256) - * 描述: - * 可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。 - * 示例值:vByf3Gjm7KE53JXv\prrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 - *- */ - @SerializedName(value = "organization_copy") - private String organizationCopy; + public static class OrganizationCertInfo implements Serializable { + /** + *+ * 字段名:组织机构代码证照片 + * 变量名:organization_copy + * 是否必填:是 + * 类型:string(256) + * 描述: + * 可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。 + * 示例值:vByf3Gjm7KE53JXv\prrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 + *+ */ + @SerializedName(value = "organization_copy") + private String organizationCopy; - /** - *- * 字段名:组织机构代码 - * 变量名:organization_number - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、请填写组织机构代码证上的组织机构代码。 - * 2、可填写9或10位 数字|字母|连字符。 - * 示例值:12345679-A - *- */ - @SerializedName(value = "organization_number") - private String organizationNumber; + /** + *+ * 字段名:组织机构代码 + * 变量名:organization_number + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、请填写组织机构代码证上的组织机构代码。 + * 2、可填写9或10位 数字|字母|连字符。 + * 示例值:12345679-A + *+ */ + @SerializedName(value = "organization_number") + private String organizationNumber; - /** - *- * 字段名:组织机构代码有效期限 - * 变量名:organization_time - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、请填写组织机构代码证的有效期限,注意参照示例中的格式。 - * 2、若证件有效期为长期,请填写:长期。 - * 3、结束时间需大于开始时间。 - * 4、有效期必须大于60天,即结束时间距当前时间需超过60天。 - * 示例值:[\"2014-01-01\",\"长期\"] - *- */ - @SerializedName(value = "organization_time") - private String organizationTime; + /** + *+ * 字段名:组织机构代码有效期限 + * 变量名:organization_time + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、请填写组织机构代码证的有效期限,注意参照示例中的格式。 + * 2、若证件有效期为长期,请填写:长期。 + * 3、结束时间需大于开始时间。 + * 4、有效期必须大于60天,即结束时间距当前时间需超过60天。 + * 示例值:[\"2014-01-01\",\"长期\"] + *+ */ + @SerializedName(value = "organization_time") + private String organizationTime; - } + } - @Data + @Data @NoArgsConstructor - public static class IdCardInfo implements Serializable { - /** - *- * 字段名:身份证人像面照片 - * 变量名:id_card_copy - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、请上传经营者/法定代表人的身份证人像面照片。 - * 2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。 - * 示例值:xpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ - *- */ - @SerializedName(value = "id_card_copy") - private String idCardCopy; + public static class IdCardInfo implements Serializable { + /** + *+ * 字段名:身份证人像面照片 + * 变量名:id_card_copy + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、请上传经营者/法定代表人的身份证人像面照片。 + * 2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。 + * 示例值:xpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ + *+ */ + @SerializedName(value = "id_card_copy") + private String idCardCopy; - /** - *- * 字段名:身份证国徽面照片 - * 变量名:id_card_national - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、请上传经营者/法定代表人的身份证国徽面照片。 - * 2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。 - * 示例值:vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 - *- */ - @SerializedName(value = "id_card_national") - private String idCardNational; + /** + *+ * 字段名:身份证国徽面照片 + * 变量名:id_card_national + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、请上传经营者/法定代表人的身份证国徽面照片。 + * 2、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID 。 + * 示例值:vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 + *+ */ + @SerializedName(value = "id_card_national") + private String idCardNational; - /** - *- * 字段名:身份证姓名 - * 变量名:id_card_name - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、请填写经营者/法定代表人对应身份证的姓名,2~30个中文字符、英文字符、符号。 - * 2、该字段需进行加密处理,加密方法详见敏感信息加密说明。 - * 示例值:pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg== - * 字段加密:使用APIv3定义的方式加密 - *- */ - @SerializedName(value = "id_card_name") + /** + *+ * 字段名:身份证姓名 + * 变量名:id_card_name + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、请填写经营者/法定代表人对应身份证的姓名,2~30个中文字符、英文字符、符号。 + * 2、该字段需进行加密处理,加密方法详见敏感信息加密说明。 + * 示例值:pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg== + * 字段加密:使用APIv3定义的方式加密 + *+ */ + @SerializedName(value = "id_card_name") @SpecEncrypt - private String idCardName; + private String idCardName; - /** - *- * 字段名:身份证号码 - * 变量名:id_card_number - * 是否必填:是 - * 类型:string(18) - * 描述: - * 1、请填写经营者/法定代表人对应身份证的号码。 - * 2、15位数字或17位数字+1位数字|X ,该字段需进行加密处理,加密方法详见敏感信息加密说明。 - * 示例值:zV+BEmytMNQCqQ8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==4 - * 特殊规则:长度最小15个字节 - *- */ - @SerializedName(value = "id_card_number") + /** + *+ * 字段名:身份证号码 + * 变量名:id_card_number + * 是否必填:是 + * 类型:string(18) + * 描述: + * 1、请填写经营者/法定代表人对应身份证的号码。 + * 2、15位数字或17位数字+1位数字|X ,该字段需进行加密处理,加密方法详见敏感信息加密说明。 + * 示例值:zV+BEmytMNQCqQ8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==4 + * 特殊规则:长度最小15个字节 + *+ */ + @SerializedName(value = "id_card_number") @SpecEncrypt - private String idCardNumber; + private String idCardNumber; - /** - *- * 字段名:身份证有效期限 - * 变量名:id_card_valid_time - * 是否必填:是 - * 类型:string(128) - * 描述: - * 1、请填写身份证有效期的结束时间,注意参照示例中的格式。 - * 2、若证件有效期为长期,请填写:长期。 - * 3、证件有效期需大于60天。 - * 示例值:2026-06-06,长期 - *- */ - @SerializedName(value = "id_card_valid_time") - private String idCardValidTime; + /** + *+ * 字段名:身份证有效期限 + * 变量名:id_card_valid_time + * 是否必填:是 + * 类型:string(128) + * 描述: + * 1、请填写身份证有效期的结束时间,注意参照示例中的格式。 + * 2、若证件有效期为长期,请填写:长期。 + * 3、证件有效期需大于60天。 + * 示例值:2026-06-06,长期 + *+ */ + @SerializedName(value = "id_card_valid_time") + private String idCardValidTime; - } + } - @Data + @Data @NoArgsConstructor - public static class IdDocInfo implements Serializable { - /** - *- * 字段名:证件姓名 - * 变量名:id_doc_name - * 是否必填:是 - * 类型:string(128) - * 描述: - * 请填写经营者/法人姓名。 - * 示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4LC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ - *- */ - @SerializedName(value = "id_doc_name") - private String idDocName; + public static class IdDocInfo implements Serializable { + /** + *+ * 字段名:证件姓名 + * 变量名:id_doc_name + * 是否必填:是 + * 类型:string(128) + * 描述: + * 请填写经营者/法人姓名。 + * 示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4LC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ + *+ */ + @SerializedName(value = "id_doc_name") + private String idDocName; - /** - *- * 字段名:证件号码 - * 变量名:id_doc_number - * 是否必填:是 - * 类型:string(128) - * 描述: - * 7~11位 数字|字母|连字符 。 - * 示例值:jTpGmxUX3FBWVQ5NJTZvlKX_go0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ - *- */ - @SerializedName(value = "id_doc_number") - private String idDocNumber; + /** + *+ * 字段名:证件号码 + * 变量名:id_doc_number + * 是否必填:是 + * 类型:string(128) + * 描述: + * 7~11位 数字|字母|连字符 。 + * 示例值:jTpGmxUX3FBWVQ5NJTZvlKX_go0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ + *+ */ + @SerializedName(value = "id_doc_number") + private String idDocNumber; - /** - *- * 字段名:证件照片 - * 变量名:id_doc_copy - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。 - * 2、2M内的彩色图片,格式可为bmp、png、jpeg、jpg或gif 。 - * 示例值:xi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 - *- */ - @SerializedName(value = "id_doc_copy") - private String idDocCopy; + /** + *+ * 字段名:证件照片 + * 变量名:id_doc_copy + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、可上传1张图片,请填写通过图片上传接口预先上传图片生成好的MediaID。 + * 2、2M内的彩色图片,格式可为bmp、png、jpeg、jpg或gif 。 + * 示例值:xi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 + *+ */ + @SerializedName(value = "id_doc_copy") + private String idDocCopy; - /** - *- * 字段名:证件结束日期 - * 变量名:doc_period_end - * 是否必填:是 - * 类型:string(128) - * 描述: - * 1、请按照示例值填写。 - * 2、若证件有效期为长期,请填写:长期。 - * 3、证件有效期需大于60天 。 - * 示例值:2020-01-02 - *- */ - @SerializedName(value = "doc_period_end") - private String docPeriodEnd; + /** + *+ * 字段名:证件结束日期 + * 变量名:doc_period_end + * 是否必填:是 + * 类型:string(128) + * 描述: + * 1、请按照示例值填写。 + * 2、若证件有效期为长期,请填写:长期。 + * 3、证件有效期需大于60天 。 + * 示例值:2020-01-02 + *+ */ + @SerializedName(value = "doc_period_end") + private String docPeriodEnd; - } + } - @Data + @Data @NoArgsConstructor - public static class AccountInfo implements Serializable { - /** - *- * 字段名:账户类型 - * 变量名:bank_account_type - * 是否必填:是 - * 类型:string(2) - * 描述: - * 1、若主体为企业/党政、机关及事业单位/其他组织,可填写:74-对公账户。 - * 2、若主体为小微,可填写:75-对私账户。 - * 3、若主体为个体工商户,可填写:74-对公账户或75-对私账户。 - * 示例值:75 - *- */ - @SerializedName(value = "bank_account_type") - private String bankAccountType; + public static class AccountInfo implements Serializable { + /** + *+ * 字段名:账户类型 + * 变量名:bank_account_type + * 是否必填:是 + * 类型:string(2) + * 描述: + * 1、若主体为企业/党政、机关及事业单位/其他组织,可填写:74-对公账户。 + * 2、若主体为小微,可填写:75-对私账户。 + * 3、若主体为个体工商户,可填写:74-对公账户或75-对私账户。 + * 示例值:75 + *+ */ + @SerializedName(value = "bank_account_type") + private String bankAccountType; - /** - *- * 字段名:开户银行 - * 变量名:account_bank - * 是否必填:是 - * 类型:string(10) - * 描述: - * 详细参见开户银行对照表。 - * 示例值:工商银行 - *- */ - @SerializedName(value = "account_bank") - private String accountBank; + /** + *+ * 字段名:开户银行 + * 变量名:account_bank + * 是否必填:是 + * 类型:string(10) + * 描述: + * 详细参见开户银行对照表。 + * 示例值:工商银行 + *+ */ + @SerializedName(value = "account_bank") + private String accountBank; - /** - *- * 字段名:开户名称 - * 变量名:account_name - * 是否必填:是 - * 类型:string(128) - * 描述: - * 1、选择经营者个人银行卡时,开户名称必须与身份证姓名一致。 - * 2、选择对公账户时,开户名称必须与营业执照上的“商户名称”一致。 - * 3、该字段需进行加密处理,加密方法详见敏感信息加密说明。 - * 示例值:AOZdYGISxo4yw96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw== - *- */ - @SerializedName(value = "account_name") + /** + *+ * 字段名:开户名称 + * 变量名:account_name + * 是否必填:是 + * 类型:string(128) + * 描述: + * 1、选择经营者个人银行卡时,开户名称必须与身份证姓名一致。 + * 2、选择对公账户时,开户名称必须与营业执照上的“商户名称”一致。 + * 3、该字段需进行加密处理,加密方法详见敏感信息加密说明。 + * 示例值:AOZdYGISxo4yw96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw== + *+ */ + @SerializedName(value = "account_name") @SpecEncrypt - private String accountName; + private String accountName; - /** - *- * 字段名:开户银行省市编码 - * 变量名:bank_address_code - * 是否必填:是 - * 类型:string(12) - * 描述: - * 至少精确到市,详细参见省市区编号对照表。 - * 示例值:110000 - *- */ - @SerializedName(value = "bank_address_code") - private String bankAddressCode; + /** + *+ * 字段名:开户银行省市编码 + * 变量名:bank_address_code + * 是否必填:是 + * 类型:string(12) + * 描述: + * 至少精确到市,详细参见省市区编号对照表。 + * 示例值:110000 + *+ */ + @SerializedName(value = "bank_address_code") + private String bankAddressCode; - /** - *- * 字段名:开户银行联行号 - * 变量名:bank_branch_id - * 是否必填:条件选填 - * 类型:string(64) - * 描述: - * 1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。 - * 2、详细参见开户银行全称(含支行)对照表。 - * 示例值:402713354941 - *- */ - @SerializedName(value = "bank_branch_id") - private String bankBranchId; + /** + *+ * 字段名:开户银行联行号 + * 变量名:bank_branch_id + * 是否必填:条件选填 + * 类型:string(64) + * 描述: + * 1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。 + * 2、详细参见开户银行全称(含支行)对照表。 + * 示例值:402713354941 + *+ */ + @SerializedName(value = "bank_branch_id") + private String bankBranchId; - /** - *- * 字段名:开户银行全称 (含支行) - * 变量名:bank_name - * 是否必填:条件选填 - * 类型:string(128) - * 描述: - * 1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。 - * 2、需填写银行全称,如"深圳农村商业银行XXX支行" 。 - * 3、详细参见开户银行全称(含支行)对照表。 - * 示例值:施秉县农村信用合作联社城关信用社 - *- */ - @SerializedName(value = "bank_name") - private String bankName; + /** + *+ * 字段名:开户银行全称 (含支行) + * 变量名:bank_name + * 是否必填:条件选填 + * 类型:string(128) + * 描述: + * 1、17家直连银行无需填写,如为其他银行,开户银行全称(含支行)和开户银行联行号二选一。 + * 2、需填写银行全称,如"深圳农村商业银行XXX支行" 。 + * 3、详细参见开户银行全称(含支行)对照表。 + * 示例值:施秉县农村信用合作联社城关信用社 + *+ */ + @SerializedName(value = "bank_name") + private String bankName; - /** - *- * 字段名:银行帐号 - * 变量名:account_number - * 是否必填:是 - * 类型:string(128) - * 描述: - * 1、数字,长度遵循系统支持的对公/对私卡号长度要求表。 - * 2、该字段需进行加密处理,加密方法详见敏感信息加密说明。 - * 示例值: d+xT+MQCvrLHUVDWv/8MR/dB7TkXLVfSrUxMPZy6jWWYzpRrEEaYQE8ZRGYoeorwC+w== - *- */ - @SerializedName(value = "account_number") + /** + *+ * 字段名:银行帐号 + * 变量名:account_number + * 是否必填:是 + * 类型:string(128) + * 描述: + * 1、数字,长度遵循系统支持的对公/对私卡号长度要求表。 + * 2、该字段需进行加密处理,加密方法详见敏感信息加密说明。 + * 示例值: d+xT+MQCvrLHUVDWv/8MR/dB7TkXLVfSrUxMPZy6jWWYzpRrEEaYQE8ZRGYoeorwC+w== + *+ */ + @SerializedName(value = "account_number") @SpecEncrypt - private String accountNumber; + private String accountNumber; - } + } - @Data + @Data @NoArgsConstructor - public static class ContactInfo implements Serializable { - /** - *- * 字段名:超级管理员类型 - * 变量名:contact_type - * 是否必填:是 - * 类型:string(2) - * 描述: - * 1、小微商户,选择:65-法人/经营者。 - * 2、个体工商户/企业/党政、机关及事业单位/其他组织,可选择:65-法人/经营者、66- 负责人。 (负责人:经商户授权办理微信支付业务的人员,授权范围包括但不限于签约,入驻过程需完成账户验证)。 - * 示例值:65 - *- */ - @SerializedName(value = "contact_type") - private String contactType; + public static class ContactInfo implements Serializable { + /** + *+ * 字段名:超级管理员类型 + * 变量名:contact_type + * 是否必填:是 + * 类型:string(2) + * 描述: + * 1、小微商户,选择:65-法人/经营者。 + * 2、个体工商户/企业/党政、机关及事业单位/其他组织,可选择:65-法人/经营者、66- 负责人。 (负责人:经商户授权办理微信支付业务的人员,授权范围包括但不限于签约,入驻过程需完成账户验证)。 + * 示例值:65 + *+ */ + @SerializedName(value = "contact_type") + private String contactType; - /** - *- * 字段名:超级管理员姓名 - * 变量名:contact_name - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、若管理员类型为“法人”,则该姓名需与法人身份证姓名一致。 - * 2、若管理员类型为“经办人”,则可填写实际经办人的姓名。 - * 3、该字段需进行加密处理,加密方法详见敏感信息加密说明。 - * (后续该管理员需使用实名微信号完成签约) - * 示例值: pVd1HJ6zyvPedzGaV+X3IdGdbDnuC4Eelw/wDa4SzfeespQO/0kjiwfqdfg== - *- */ - @SerializedName(value = "contact_name") + /** + *+ * 字段名:超级管理员姓名 + * 变量名:contact_name + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、若管理员类型为“法人”,则该姓名需与法人身份证姓名一致。 + * 2、若管理员类型为“经办人”,则可填写实际经办人的姓名。 + * 3、该字段需进行加密处理,加密方法详见敏感信息加密说明。 + * (后续该管理员需使用实名微信号完成签约) + * 示例值: pVd1HJ6zyvPedzGaV+X3IdGdbDnuC4Eelw/wDa4SzfeespQO/0kjiwfqdfg== + *+ */ + @SerializedName(value = "contact_name") @SpecEncrypt - private String contactName; + private String contactName; - /** - *- * 字段名:超级管理员身份证件号码 - * 变量名:contact_id_card_number - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、若管理员类型为法人,则该身份证号码需与法人身份证号码一致。若管理员类型为经办人,则可填写实际经办人的身份证号码。 - * 2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。 - * 3、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。 - * 4、该字段需进行加密处理,加密方法详见敏感信息加密说明。 - * 示例值:pVd1HJ6zmty7/mYNxLMpRSvMRtelw/wDa4SzfeespQO/0kjiwfqdfg== - *- */ - @SerializedName(value = "contact_id_card_number") + /** + *+ * 字段名:超级管理员身份证件号码 + * 变量名:contact_id_card_number + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、若管理员类型为法人,则该身份证号码需与法人身份证号码一致。若管理员类型为经办人,则可填写实际经办人的身份证号码。 + * 2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。 + * 3、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。 + * 4、该字段需进行加密处理,加密方法详见敏感信息加密说明。 + * 示例值:pVd1HJ6zmty7/mYNxLMpRSvMRtelw/wDa4SzfeespQO/0kjiwfqdfg== + *+ */ + @SerializedName(value = "contact_id_card_number") @SpecEncrypt - private String contactIdCardNumber; + private String contactIdCardNumber; - /** - *- * 字段名:超级管理员手机 - * 变量名:mobile_phone - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、请填写管理员的手机号,11位数字, 用于接收微信支付的重要管理信息及日常操作验证码 。 - * 2、该字段需进行加密处理,加密方法详见敏感信息加密说明。 - * 示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiNWWNeespQO/0kjiwfqdfg== - *- */ - @SerializedName(value = "mobile_phone") + /** + *+ * 字段名:超级管理员手机 + * 变量名:mobile_phone + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、请填写管理员的手机号,11位数字, 用于接收微信支付的重要管理信息及日常操作验证码 。 + * 2、该字段需进行加密处理,加密方法详见敏感信息加密说明。 + * 示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiNWWNeespQO/0kjiwfqdfg== + *+ */ + @SerializedName(value = "mobile_phone") @SpecEncrypt - private String mobilePhone; + private String mobilePhone; - /** - *- * 字段名:超级管理员邮箱 - * 变量名:contact_email - * 是否必填:是 - * 类型:string(256) - * 描述: - * 1、用于接收微信支付的开户邮件及日常业务通知。 - * 2、需要带@,遵循邮箱格式校验 。 - * 3、该字段需进行加密处理,加密方法详见敏感信息加密说明。 - * 示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+FWWNUlw/wDa4SzfeespQO/0kjiwfqdfg== - *- */ - @SerializedName(value = "contact_email") + /** + *+ * 字段名:超级管理员邮箱 + * 变量名:contact_email + * 是否必填:是 + * 类型:string(256) + * 描述: + * 1、用于接收微信支付的开户邮件及日常业务通知。 + * 2、需要带@,遵循邮箱格式校验 。 + * 3、该字段需进行加密处理,加密方法详见敏感信息加密说明。 + * 示例值:pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+FWWNUlw/wDa4SzfeespQO/0kjiwfqdfg== + *+ */ + @SerializedName(value = "contact_email") @SpecEncrypt - private String contactEmail; + private String contactEmail; - } + } - @Data + @Data @NoArgsConstructor - public static class SalesSceneInfo implements Serializable { - /** - *- * 字段名:店铺名称 - * 变量名:store_name - * 是否必填:是 - * 类型:string(256) - * 描述: - * 请填写店铺全称。 - * 示例值:爱烧烤 - *- */ - @SerializedName(value = "store_name") - private String storeName; + public static class SalesSceneInfo implements Serializable { + /** + *+ * 字段名:店铺名称 + * 变量名:store_name + * 是否必填:是 + * 类型:string(256) + * 描述: + * 请填写店铺全称。 + * 示例值:爱烧烤 + *+ */ + @SerializedName(value = "store_name") + private String storeName; - /** - *- * 字段名:店铺链接 - * 变量名:store_url - * 是否必填:二选一 - * 类型:string(1024) - * 描述: - * 1、店铺二维码or店铺链接二选一必填。 - * 2、请填写店铺主页链接,需符合网站规范。 - * 示例值:http://www.qq.com - *- */ - @SerializedName(value = "store_url") - private String storeUrl; + /** + *+ * 字段名:店铺链接 + * 变量名:store_url + * 是否必填:二选一 + * 类型:string(1024) + * 描述: + * 1、店铺二维码or店铺链接二选一必填。 + * 2、请填写店铺主页链接,需符合网站规范。 + * 示例值:http://www.qq.com + *+ */ + @SerializedName(value = "store_url") + private String storeUrl; - /** - *- * 字段名:店铺二维码 - * 变量名:store_qr_code - * 是否必填:1、店铺二维码 or 店铺链接二选一必填。 2、若为电商小程序,可上传店铺页面的小程序二维码。 3、请填写通过图片上传接口预先上传图片生成好的MediaID,仅能上传1张图片 。 示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO1D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ - * 类型:string(256) - * 描述: - *- */ - @SerializedName(value = "store_qr_code") - private String storeQrCode; + /** + *+ * 字段名:店铺二维码 + * 变量名:store_qr_code + * 是否必填:1、店铺二维码 or 店铺链接二选一必填。 2、若为电商小程序,可上传店铺页面的小程序二维码。 3、请填写通过图片上传接口预先上传图片生成好的MediaID,仅能上传1张图片 。 示例值:jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO1D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ + * 类型:string(256) + * 描述: + *+ */ + @SerializedName(value = "store_qr_code") + private String storeQrCode; - } + } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java index dd2d46122..38c8a3374 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsResult.java @@ -12,7 +12,7 @@ import java.io.Serializable; @Data @NoArgsConstructor public class ApplymentsResult implements Serializable { - + private static final long serialVersionUID = -4549193755252593150L; /** ** 字段名:微信支付申请单号 diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java index 00967cfa6..7defd2145 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ApplymentsStatusResult.java @@ -144,7 +144,8 @@ public class ApplymentsStatusResult implements Serializable { @Data @NoArgsConstructor - public static class AccountValidation implements Serializable{ + public static class AccountValidation implements Serializable { + private static final long serialVersionUID = 4379880030965808588L; /** ** * @param outRequestNo 业务申请编号 - * @return . + * @return . applyments status result + * @throws WxPayException the wx pay exception */ ApplymentsStatusResult queryApplyStatusByOutRequestNo(String outRequestNo) 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 2324fba17..27d86548c 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 @@ -413,30 +413,6 @@ public interface WxPayService { */ WxScanPayNotifyResult parseScanPayNotifyResult(String xmlData) throws WxPayException; - /** - * @deprecated 建议使用 {@link RedpackService#sendMiniProgramRedpack(WxPaySendMiniProgramRedpackRequest)} - */ - @Deprecated - WxPaySendMiniProgramRedpackResult sendMiniProgramRedpack(WxPaySendMiniProgramRedpackRequest request) throws WxPayException; - - /** - * @deprecated 建议使用 {@link RedpackService#sendRedpack(WxPaySendRedpackRequest)} - */ - @Deprecated - WxPaySendRedpackResult sendRedpack(WxPaySendRedpackRequest request) throws WxPayException; - - /** - * @deprecated 建议使用 {@link RedpackService#queryRedpack(String)} - */ - @Deprecated - WxPayRedpackQueryResult queryRedpack(String mchBillNo) throws WxPayException; - - /** - * @deprecated 建议使用 {@link RedpackService#queryRedpack(WxPayRedpackQueryRequest)} - */ - @Deprecated - WxPayRedpackQueryResult queryRedpack(WxPayRedpackQueryRequest request) throws WxPayException; - /** ** 字段名:付款户名 @@ -275,7 +276,8 @@ public class ApplymentsStatusResult implements Serializable { @Data @NoArgsConstructor - public static class AuditDetail implements Serializable{ + public static class AuditDetail implements Serializable { + private static final long serialVersionUID = 5446130564359386809L; /** ** * @param applymentId 申请单ID - * @return . + * @return . applyments status result + * @throws WxPayException the wx pay exception */ ApplymentsStatusResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException; @@ -48,7 +50,8 @@ public interface EcommerceService { ** 字段名:参数名称 diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java index 2187de0c0..4cb6785ff 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java @@ -10,18 +10,16 @@ import com.github.binarywang.wxpay.exception.WxPayException; * @author zhouyongshen */ public interface Applyment4SubService { - /** - * 提交申请单API - * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_1.shtml - * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/ - * - * @param request 请求对象 - * @return WxPayApplymentCreateResult 响应结果 - * @throws WxPayException the wx pay exception - */ - WxPayApplymentCreateResult createApply(WxPayApplyment4SubCreateRequest request) throws WxPayException; - - + /** + * 提交申请单API + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_1.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/ + * + * @param request 请求对象 + * @return WxPayApplymentCreateResult 响应结果 + * @throws WxPayException the wx pay exception + */ + WxPayApplymentCreateResult createApply(WxPayApplyment4SubCreateRequest request) throws WxPayException; /** * 通过业务申请编号查询申请状态 @@ -29,11 +27,13 @@ public interface Applyment4SubService { * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/business_code/{business_code} * * @param businessCode 业务申请编号 - * 1、只能由数字、字母或下划线组成,建议前缀为服务商商户号。 - * 2、服务商自定义的唯一编号。 - * 3、每个编号对应一个申请单,每个申请单审核通过后生成一个微信支付商户号。 - * 4、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息。 - * 示例值:1900013511_10000 + * 1、只能由数字、字母或下划线组成,建议前缀为服务商商户号。 + * 2、服务商自定义的唯一编号。 + * 3、每个编号对应一个申请单,每个申请单审核通过后生成一个微信支付商户号。 + * 4、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息。 + * 示例值:1900013511_10000 + * @return the applyment state query result + * @throws WxPayException the wx pay exception */ ApplymentStateQueryResult queryApplyStatusByBusinessCode(String businessCode) throws WxPayException; @@ -43,6 +43,8 @@ public interface Applyment4SubService { * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/applyment_id/{applyment_id} * * @param applymentId 微信支付分的申请单号。示例值:2000001234567890 + * @return the applyment state query result + * @throws WxPayException the wx pay exception */ ApplymentStateQueryResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException; @@ -52,6 +54,8 @@ public interface Applyment4SubService { * 接口链接:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/settlement * * @param subMchid 本服务商进件、已签约的特约商户号。 + * @return the settlement info result + * @throws WxPayException the wx pay exception */ SettlementInfoResult querySettlementBySubMchid(String subMchid) throws WxPayException; @@ -59,9 +63,11 @@ public interface Applyment4SubService { * 修改结算帐号 * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_3.shtml * 接口链接:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/modify-settlement + * * @param subMchid 特约商户号 - * @param request 修改结算账户请求对象信息 + * @param request 修改结算账户请求对象信息 + * @throws WxPayException the wx pay exception */ - void modifySettlement(String subMchid,ModifySettlementRequest request) throws WxPayException; + void modifySettlement(String subMchid, ModifySettlementRequest request) throws WxPayException; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java index f1bdb2b3e..5c86306b9 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java @@ -24,7 +24,8 @@ public interface EcommerceService { ** * @param request 请求对象 - * @return . + * @return . applyments result + * @throws WxPayException the wx pay exception */ ApplymentsResult createApply(ApplymentsRequest request) throws WxPayException; @@ -36,7 +37,8 @@ public interface EcommerceService { ** 扫码支付模式一生成二维码的方法。 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 3bd514a60..b5012643c 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 @@ -250,27 +250,6 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { } - @Override - public WxPaySendMiniProgramRedpackResult sendMiniProgramRedpack(WxPaySendMiniProgramRedpackRequest request) - throws WxPayException { - return this.redpackService.sendMiniProgramRedpack(request); - } - - @Override - public WxPaySendRedpackResult sendRedpack(WxPaySendRedpackRequest request) throws WxPayException { - return this.redpackService.sendRedpack(request); - } - - @Override - public WxPayRedpackQueryResult queryRedpack(String mchBillNo) throws WxPayException { - return this.redpackService.queryRedpack(mchBillNo); - } - - @Override - public WxPayRedpackQueryResult queryRedpack(WxPayRedpackQueryRequest request) throws WxPayException { - return this.redpackService.queryRedpack(request); - } - @Override public WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxPayException { WxPayOrderQueryRequest request = new WxPayOrderQueryRequest(); diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java index 0c7e3821b..963163127 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java @@ -9,21 +9,14 @@ import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.v3.util.RsaCryptoUtil; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import lombok.RequiredArgsConstructor; import java.net.URI; +@RequiredArgsConstructor public class EcommerceServiceImpl implements EcommerceService { - private static final Gson GSON = new GsonBuilder().create(); - private WxPayService payService; - - /** - * - * @param payService - */ - public EcommerceServiceImpl(WxPayService payService) { - this.payService = payService; - } + private final WxPayService payService; @Override public ApplymentsResult createApply(ApplymentsRequest request) throws WxPayException { diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java index 7923c4723..c03713473 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java @@ -27,7 +27,6 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import javax.net.ssl.SSLContext; -import java.math.BigInteger; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -129,10 +128,10 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl { try (CloseableHttpResponse response = httpClient.execute(httpPost)) { //v3已经改为通过状态码判断200 204 成功 int statusCode = response.getStatusLine().getStatusCode(); - String responseString="{}"; + String responseString = "{}"; HttpEntity entity = response.getEntity(); - if(entity!=null){ - responseString= EntityUtils.toString(entity, StandardCharsets.UTF_8); + if (entity != null) { + responseString = EntityUtils.toString(entity, StandardCharsets.UTF_8); } if (HttpStatus.SC_OK == statusCode || HttpStatus.SC_NO_CONTENT == statusCode) { @@ -262,7 +261,7 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl { } SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, - new String[]{"TLSv1"}, null, new DefaultHostnameVerifier()); + new DefaultHostnameVerifier()); httpClientBuilder.setSSLSocketFactory(connectionSocketFactory); }