From 96395c895f0f5bfcffb0e76986695736670ca720 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Wed, 2 Jun 2021 23:36:36 +0800
Subject: [PATCH 0001/1235] =?UTF-8?q?:memo:=20=E6=9B=B4=E6=96=B0=E7=89=88?=
=?UTF-8?q?=E6=9C=AC=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 4 ++--
.../me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java | 3 ++-
.../weixin/cp/tp/service/impl/WxCpTpTagServiceImplTest.java | 2 +-
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index c03fd9445d..4bf12701fd 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@
### 重要信息
-1. **2020-11-29 发布 [【4.0.0正式版】](https://mp.weixin.qq.com/s/OPoICwLifOZGVN_ZX_BBhw)**!
+1. **2021-06-02 发布 [【4.1.0正式版】](https://mp.weixin.qq.com/s/nIk_xOf6dxkhKfqq830Cuw)**!
1. 新手重要提示:本项目仅是一个SDK开发工具包,未提供Web实现,建议使用 `maven` 或 `gradle` 引用本项目即可使用本SDK提供的各种功能,详情可参考 **[【Demo项目】](demo.md)** 或本项目中的部分单元测试代码;另外微信开发新手请务必阅读[【开发文档 Wiki 首页】](https://github.com/Wechat-Group/WxJava/wiki)的常见问题部分,可以少走很多弯路,节省不少时间。
1. 技术交流群:想获得QQ群/微信群/钉钉企业群等信息的同学,请使用微信扫描上面的微信公众号二维码关注 `WxJava` 后点击相关菜单即可获取加入方式,同时也可以在微信中搜索 `weixin-java-tools` 或 `WxJava` 后选择正确的公众号进行关注,该公众号会及时通知SDK相关更新信息,并不定期分享微信Java开发相关技术知识;
1. 钉钉技术交流群: `30294972`(技术交流群),`35724728`(通知群,实时通知Github项目变更记录)。
@@ -67,7 +67,7 @@
com.github.binarywang
(不同模块参考下文)
- 4.0.0
+ 4.1.0
```
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java
index f6ab29df7f..1f6f73d068 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java
@@ -7,6 +7,7 @@
import me.chanjar.weixin.cp.tp.message.WxCpTpMessageHandler;
import me.chanjar.weixin.cp.tp.message.WxCpTpMessageRouter;
import me.chanjar.weixin.cp.tp.service.WxCpTpService;
+import me.chanjar.weixin.cp.tp.service.impl.WxCpTpServiceApacheHttpClientImpl;
import me.chanjar.weixin.cp.tp.service.impl.WxCpTpServiceImpl;
import org.testng.annotations.Test;
@@ -21,7 +22,7 @@ public class WxCpTpMessageRouterTest {
@Test
public void testMessageRouter() {
- WxCpTpService service = new WxCpTpServiceImpl();
+ WxCpTpService service = new WxCpTpServiceApacheHttpClientImpl();
WxCpTpMessageRouter router = new WxCpTpMessageRouter(service);
String xml = "\n" +
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpTagServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpTagServiceImplTest.java
index 44c3ff68d1..1dc1148582 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpTagServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpTagServiceImplTest.java
@@ -30,7 +30,7 @@
public class WxCpTpTagServiceImplTest {
@Mock
- private WxCpTpServiceImpl wxCpTpService;
+ private WxCpTpServiceApacheHttpClientImpl wxCpTpService;
private WxCpTpConfigStorage configStorage;
From 54222bd34625df8635b520fa1deb676bc4713eae Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Wed, 2 Jun 2021 23:46:22 +0800
Subject: [PATCH 0002/1235] =?UTF-8?q?:memo:=20=E6=9B=B4=E6=96=B0=E9=83=A8?=
=?UTF-8?q?=E5=88=86=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 4bf12701fd..a6323597c6 100644
--- a/README.md
+++ b/README.md
@@ -99,7 +99,7 @@
#### 开源项目:
- 基于微信公众号的签到、抽奖、发送弹幕程序:https://github.com/workcheng/weiya
-- XxPay聚合支付:https://github.com/jmdhappy/xxpay-master
+- Jeepay 支付系统:https://gitee.com/jeequan/jeepay
- 微同商城:https://gitee.com/fuyang_lipengjun/platform
- 微信点餐系统:https://github.com/sqmax/springboot-project
- 专注批量推送的小而美的工具:https://github.com/rememberber/WePush
From 4d94e17b96863fe13b6918ee504b68407ce8094e Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Thu, 3 Jun 2021 13:56:37 +0800
Subject: [PATCH 0003/1235] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E5=8D=95?=
=?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java | 3 ---
.../weixin/cp/tp/service/impl/BaseWxCpTpServiceImplTest.java | 2 +-
...plTest.java => WxCpTpServiceApacheHttpClientImplTest.java} | 4 ++--
weixin-java-cp/src/test/resources/testng.xml | 2 +-
4 files changed, 4 insertions(+), 7 deletions(-)
rename weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/{WxCpTpServiceImplTest.java => WxCpTpServiceApacheHttpClientImplTest.java} (97%)
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java
index 1f6f73d068..41c0b37968 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpTpMessageRouterTest.java
@@ -8,13 +8,11 @@
import me.chanjar.weixin.cp.tp.message.WxCpTpMessageRouter;
import me.chanjar.weixin.cp.tp.service.WxCpTpService;
import me.chanjar.weixin.cp.tp.service.impl.WxCpTpServiceApacheHttpClientImpl;
-import me.chanjar.weixin.cp.tp.service.impl.WxCpTpServiceImpl;
import org.testng.annotations.Test;
import java.util.Map;
import static org.testng.Assert.assertNotNull;
-import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
public class WxCpTpMessageRouterTest {
@@ -51,7 +49,6 @@ public WxCpXmlOutMessage handle(WxCpTpXmlMessage wxMessage, Map
assertNull(router.route(wxXmlMessage));
-
System.out.println("over");
}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImplTest.java
index 83ace79f3c..26ca567c12 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImplTest.java
@@ -23,7 +23,7 @@
* @date 2019-08-18
*/
public class BaseWxCpTpServiceImplTest {
- private final WxCpTpService tpService = Mockito.spy(new WxCpTpServiceImpl());
+ private final WxCpTpService tpService = Mockito.spy(new WxCpTpServiceApacheHttpClientImpl());
@Test
public void testCheckSignature() {
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceApacheHttpClientImplTest.java
similarity index 97%
rename from weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceImplTest.java
rename to weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceApacheHttpClientImplTest.java
index f0b57f2100..e0ded23d26 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceApacheHttpClientImplTest.java
@@ -21,7 +21,7 @@
*
* @author zhangq
*/
-public class WxCpTpServiceImplTest {
+public class WxCpTpServiceApacheHttpClientImplTest {
public static final String API_URL = "https://qyapi.weixin.qq.com";
public static final String SUITE_ID = "xxxxxx";
@@ -41,7 +41,7 @@ public class WxCpTpServiceImplTest {
@BeforeMethod
public void setUp() {
- wxCpTpService = new WxCpTpServiceImpl();
+ wxCpTpService = new WxCpTpServiceApacheHttpClientImpl();
wxCpTpService.setWxCpTpConfigStorage(wxCpTpConfigStorage());
}
diff --git a/weixin-java-cp/src/test/resources/testng.xml b/weixin-java-cp/src/test/resources/testng.xml
index 0bd6fbdd23..96da66bd21 100644
--- a/weixin-java-cp/src/test/resources/testng.xml
+++ b/weixin-java-cp/src/test/resources/testng.xml
@@ -6,7 +6,7 @@
-
+
From c7c834b4507a04b09c1623a67b7516c9fccecb34 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Thu, 3 Jun 2021 14:06:57 +0800
Subject: [PATCH 0004/1235] :arrow_up: upgrade guava version
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 0b026bfeee..611857caa0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -180,7 +180,7 @@
com.google.guava
guava
- 29.0-jre
+ 30.0-jre
com.google.code.gson
From 183bdb2cbee2d1b246472aee8003f60e4eaae381 Mon Sep 17 00:00:00 2001
From: arthur0201 <704538660@qq.com>
Date: Fri, 4 Jun 2021 09:33:42 +0800
Subject: [PATCH 0005/1235] =?UTF-8?q?:new:=20#2142=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E8=A2=AB=E5=8A=A8=E5=9B=9E?=
=?UTF-8?q?=E5=A4=8D=E6=B6=88=E6=81=AF=E5=86=85=E5=AE=B9=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=8D=A1=E7=89=87=E6=A0=BC=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/common/api/WxConsts.java | 1 +
.../common/util/xml/XStreamInitializer.java | 4 ++
.../util/xml/XStreamReplaceNameConverter.java | 8 +++
.../cp/bean/message/WxCpXmlOutMessage.java | 12 +++--
.../message/WxCpXmlOutTaskCardMessage.java | 24 +++++++++
.../bean/outxmlbuilder/TaskCardBuilder.java | 27 ++++++++++
.../cp/util/xml/XStreamTransformer.java | 18 ++++---
.../WxCpXmlOutTaskCardMessageTest.java | 49 +++++++++++++++++++
8 files changed, 130 insertions(+), 13 deletions(-)
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamReplaceNameConverter.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutTaskCardMessage.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/TaskCardBuilder.java
create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutTaskCardMessageTest.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
index 1e953d080b..cfc7fc0f37 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
@@ -44,6 +44,7 @@ public static class XmlMsgType {
public static final String DEVICE_STATUS = "device_status";
public static final String HARDWARE = "hardware";
public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
+ public static final String UPDATE_TASKCARD = "update_taskcard";
}
/**
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java
index cf0fbb5ae9..6997eb490d 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java
@@ -28,6 +28,8 @@ public HierarchicalStreamWriter createWriter(Writer out) {
private static final String SUFFIX_CDATA = "]]>";
private static final String PREFIX_MEDIA_ID = "";
private static final String SUFFIX_MEDIA_ID = "";
+ private static final String PREFIX_REPLACE_NAME = "";
+ private static final String SUFFIX_REPLACE_NAME = "";
@Override
protected void writeText(QuickWriter writer, String text) {
@@ -35,6 +37,8 @@ protected void writeText(QuickWriter writer, String text) {
writer.write(text);
} else if (text.startsWith(PREFIX_MEDIA_ID) && text.endsWith(SUFFIX_MEDIA_ID)) {
writer.write(text);
+ } else if (text.startsWith(PREFIX_REPLACE_NAME) && text.endsWith(SUFFIX_REPLACE_NAME)){
+ writer.write(text);
} else {
super.writeText(writer, text);
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamReplaceNameConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamReplaceNameConverter.java
new file mode 100644
index 0000000000..a136934383
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamReplaceNameConverter.java
@@ -0,0 +1,8 @@
+package me.chanjar.weixin.common.util.xml;
+
+public class XStreamReplaceNameConverter extends XStreamCDataConverter {
+ @Override
+ public String toString(Object obj) {
+ return "" + super.toString(obj) + "";
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java
index 96991a5403..ff036b4c0e 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java
@@ -6,11 +6,7 @@
import com.thoughtworks.xstream.annotations.XStreamConverter;
import lombok.Data;
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder;
+import me.chanjar.weixin.cp.bean.outxmlbuilder.*;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
@@ -76,6 +72,12 @@ public static NewsBuilder NEWS() {
return new NewsBuilder();
}
+ /**
+ * 获得任务卡片消息builder.
+ */
+ public static TaskCardBuilder TASK_CARD() {
+ return new TaskCardBuilder();
+ }
protected String toXml() {
return XStreamTransformer.toXml((Class) this.getClass(), this);
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutTaskCardMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutTaskCardMessage.java
new file mode 100644
index 0000000000..63816f7e4c
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutTaskCardMessage.java
@@ -0,0 +1,24 @@
+package me.chanjar.weixin.cp.bean.message;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamConverter;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.util.xml.XStreamReplaceNameConverter;
+
+@XStreamAlias("xml")
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WxCpXmlOutTaskCardMessage extends WxCpXmlOutMessage {
+ private static final long serialVersionUID = 7028014900972827324L;
+
+ @XStreamAlias("TaskCard")
+ @XStreamConverter(value = XStreamReplaceNameConverter.class)
+ private String replaceName;
+
+ public WxCpXmlOutTaskCardMessage() {
+ this.msgType = WxConsts.XmlMsgType.UPDATE_TASKCARD;
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/TaskCardBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/TaskCardBuilder.java
new file mode 100644
index 0000000000..e71c5bd71d
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/TaskCardBuilder.java
@@ -0,0 +1,27 @@
+package me.chanjar.weixin.cp.bean.outxmlbuilder;
+
+import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTaskCardMessage;
+
+/**
+ * 任务卡片消息builder
+ *
+ * @author tao zhang
+ */
+public final class TaskCardBuilder extends BaseBuilder {
+
+ private String replaceName;
+
+ public TaskCardBuilder replaceName(String replaceName) {
+ this.replaceName = replaceName;
+ return this;
+ }
+
+ @Override
+ public WxCpXmlOutTaskCardMessage build() {
+ WxCpXmlOutTaskCardMessage m = new WxCpXmlOutTaskCardMessage();
+ setCommon(m);
+ m.setReplaceName(this.replaceName);
+ return m;
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
index ea90231112..aa907b7288 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
@@ -6,15 +6,8 @@
import com.thoughtworks.xstream.XStream;
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
-import me.chanjar.weixin.cp.bean.message.WxCpTpXmlMessage;
+import me.chanjar.weixin.cp.bean.message.*;
import me.chanjar.weixin.cp.bean.WxCpTpXmlPackage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutImageMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutNewsMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTextMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutVideoMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpXmlOutVoiceMessage;
public class XStreamTransformer {
@@ -60,6 +53,7 @@ private static Map configXStreamInstance() {
map.put(WxCpXmlOutImageMessage.class, configWxCpXmlOutImageMessage());
map.put(WxCpXmlOutVideoMessage.class, configWxCpXmlOutVideoMessage());
map.put(WxCpXmlOutVoiceMessage.class, configWxCpXmlOutVoiceMessage());
+ map.put(WxCpXmlOutTaskCardMessage.class, configWxCpXmlOutTaskCardMessage());
map.put(WxCpTpXmlPackage.class, configWxCpTpXmlPackage());
map.put(WxCpTpXmlMessage.class, configWxCpTpXmlMessage());
return map;
@@ -118,6 +112,14 @@ private static XStream configWxCpXmlOutVoiceMessage() {
return xstream;
}
+ private static XStream configWxCpXmlOutTaskCardMessage() {
+ XStream xstream = XStreamInitializer.getInstance();
+
+ xstream.processAnnotations(WxCpXmlOutMessage.class);
+ xstream.processAnnotations(WxCpXmlOutTaskCardMessage.class);
+ return xstream;
+ }
+
private static XStream configWxCpTpXmlPackage() {
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxCpTpXmlPackage.class);
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutTaskCardMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutTaskCardMessageTest.java
new file mode 100644
index 0000000000..bc867b72d1
--- /dev/null
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutTaskCardMessageTest.java
@@ -0,0 +1,49 @@
+package me.chanjar.weixin.cp.bean.message;
+
+import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTaskCardMessage;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+@Test
+public class WxCpXmlOutTaskCardMessageTest {
+
+ public void test() {
+ WxCpXmlOutTaskCardMessage m = new WxCpXmlOutTaskCardMessage();
+ m.setReplaceName("已驳回");
+ m.setCreateTime(1122L);
+ m.setFromUserName("from");
+ m.setToUserName("to");
+
+ String expected = ""
+ + ""
+ + ""
+ + "1122"
+ + ""
+ + ""
+ + "";
+ System.out.println(m.toXml());
+ Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
+ }
+
+ public void testBuild() {
+ WxCpXmlOutTaskCardMessage m = WxCpXmlOutMessage.TASK_CARD().replaceName("已驳回").fromUser("from").toUser("to").build();
+ String expected = ""
+ + ""
+ + ""
+ + "1122"
+ + ""
+ + ""
+ + "";
+ System.out.println(m.toXml());
+ Assert.assertEquals(
+ m
+ .toXml()
+ .replaceAll("\\s", "")
+ .replaceAll(".*?", ""),
+ expected
+ .replaceAll("\\s", "")
+ .replaceAll(".*?", "")
+ );
+ }
+
+}
From 3ab66e3447554d63236ecae130477cbb5436031d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 4 Jun 2021 09:34:07 +0800
Subject: [PATCH 0006/1235] :arrow_up: Bump httpclient from 4.5 to 4.5.13
(#2143)
Bumps httpclient from 4.5 to 4.5.13.
---
updated-dependencies:
- dependency-name: org.apache.httpcomponents:httpclient
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 611857caa0..83469f8ee5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -118,7 +118,7 @@
1.8
UTF-8
- 4.5
+ 4.5.13
9.4.38.v20210224
From 4ef9b5d91e4714768718f5b1a38b126a61f0e570 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Fri, 4 Jun 2021 16:11:48 +0800
Subject: [PATCH 0007/1235] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E9=83=A8?=
=?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../http/apache/ApacheHttpDnsClientBuilder.java | 17 +++++------------
.../apache/DefaultApacheHttpClientBuilder.java | 2 +-
.../cp/config/impl/WxCpTpDefaultConfigImpl.java | 10 +++++-----
3 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
index fe5472f3c0..af3a32ff71 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
@@ -1,12 +1,7 @@
package me.chanjar.weixin.common.util.http.apache;
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
-import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
@@ -25,10 +20,13 @@
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.protocol.HttpContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.annotation.concurrent.NotThreadSafe;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
/**
* httpclient 连接管理器 自带DNS解析.
* 大部分代码拷贝自:DefaultApacheHttpClientBuilder
@@ -50,12 +48,7 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
private DnsResolver dnsResover;
- private HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {
- @Override
- public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
- return false;
- }
- };
+ private HttpRequestRetryHandler httpRequestRetryHandler = (exception, executionCount, context) -> false;
private SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactory.getSocketFactory();
private PlainConnectionSocketFactory plainConnectionSocketFactory = PlainConnectionSocketFactory.getSocketFactory();
private String httpProxyHost;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilder.java
index 3fb08ab2c6..3bb0d6114c 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilder.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilder.java
@@ -4,7 +4,6 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
-import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
@@ -26,6 +25,7 @@
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContexts;
+import javax.annotation.concurrent.NotThreadSafe;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.security.KeyManagementException;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpDefaultConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpDefaultConfigImpl.java
index 6bab2a4e8f..c177250bac 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpDefaultConfigImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpDefaultConfigImpl.java
@@ -22,7 +22,7 @@
*/
public class WxCpTpDefaultConfigImpl implements WxCpTpConfigStorage, Serializable {
private static final long serialVersionUID = 6678780920621872824L;
- // locker
+
private final transient Map providerAccessTokenLocker = new ConcurrentHashMap<>();
private final transient Map suiteAccessTokenLocker = new ConcurrentHashMap<>();
private final transient Map accessTokenLocker = new ConcurrentHashMap<>();
@@ -319,10 +319,10 @@ public String getAuthCorpJsApiTicket(String authCorpId) {
public boolean isAuthCorpJsApiTicketExpired(String authCorpId) {
Long t = this.authCorpJsApiTicketExpireTimeMap.get(authCorpId);
if (t == null) {
- return System.currentTimeMillis() > t;
- } else {
return true;
}
+
+ return System.currentTimeMillis() > t;
}
@Override
@@ -348,10 +348,10 @@ public String getAuthSuiteJsApiTicket(String authCorpId) {
public boolean isAuthSuiteJsApiTicketExpired(String authCorpId) {
Long t = authSuiteJsApiTicketExpireTimeMap.get(authCorpId);
if (t == null) {
- return System.currentTimeMillis() > t;
- } else {
return true;
}
+
+ return System.currentTimeMillis() > t;
}
@Override
From 61303c2226c9d1c6d2b7f7cd0af904bce73dff8d Mon Sep 17 00:00:00 2001
From: arthur0201 <704538660@qq.com>
Date: Mon, 7 Jun 2021 11:37:38 +0800
Subject: [PATCH 0008/1235] =?UTF-8?q?:art:=20#2144=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E6=9B=B4=E6=96=B0=E4=BB=BB?=
=?UTF-8?q?=E5=8A=A1=E5=8D=A1=E7=89=87=E6=B6=88=E6=81=AF=E7=8A=B6=E6=80=81?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=8F=82=E6=95=B0=E8=B7=9F=E6=96=87=E6=A1=A3?=
=?UTF-8?q?=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/me/chanjar/weixin/cp/api/WxCpTaskCardService.java | 4 ++--
.../chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTaskCardService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTaskCardService.java
index 5bf50d36dc..3d97cb9283 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTaskCardService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTaskCardService.java
@@ -25,7 +25,7 @@ public interface WxCpTaskCardService {
*
* @param userIds 企业的成员ID列表
* @param taskId 任务卡片ID
- * @param clickedKey 已点击按钮的Key
+ * @param replaceName 替换文案
*/
- void update(List userIds, String taskId, String clickedKey) throws WxErrorException;
+ void update(List userIds, String taskId, String replaceName) throws WxErrorException;
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java
index 3993960642..384a3d30cd 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java
@@ -26,14 +26,14 @@ public class WxCpTaskCardServiceImpl implements WxCpTaskCardService {
private final WxCpService mainService;
@Override
- public void update(List userIds, String taskId, String clickedKey) throws WxErrorException {
+ public void update(List userIds, String taskId, String replaceName) throws WxErrorException {
Integer agentId = this.mainService.getWxCpConfigStorage().getAgentId();
Map data = new HashMap<>(4);
data.put("userids", userIds);
data.put("agentid", agentId);
data.put("task_id", taskId);
- data.put("clicked_key", clickedKey);
+ data.put("replace_name", replaceName);
String url = this.mainService.getWxCpConfigStorage().getApiUrl(UPDATE_TASK_CARD);
this.mainService.post(url, WxGsonBuilder.create().toJson(data));
From 8e0a6a3d4091ee58ae328699d4ba39577f254d51 Mon Sep 17 00:00:00 2001
From: mrxiao <39647988+mr-xiaoyu@users.noreply.github.com>
Date: Fri, 11 Jun 2021 11:51:43 +0800
Subject: [PATCH 0009/1235] =?UTF-8?q?:new:=20#2135=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=AE=9E=E7=8E=B0=E8=8E=B7=E5=8F=96?=
=?UTF-8?q?=20URL=20Link=E6=8E=A5=E5=8F=A3=20=E4=BB=A5=E5=8F=8A=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E7=94=B5=E5=AD=90=E5=8F=91=E7=A5=A8=E6=8A=A5=E9=94=80?=
=?UTF-8?q?=E6=96=B9=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaLinkService.java | 16 ++
.../api/WxMaReimburseInvoiceService.java | 48 ++++++
.../wx/miniapp/api/WxMaService.java | 12 ++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 12 ++
.../miniapp/api/impl/WxMaLinkServiceImpl.java | 35 +++++
.../impl/WxMaReimburseInvoiceServiceImpl.java | 44 ++++++
.../reimburse/InvoiceBatchRequest.java | 41 ++++++
.../reimburse/InvoiceCommodityInfo.java | 34 +++++
.../invoice/reimburse/InvoiceInfoRequest.java | 53 +++++++
.../reimburse/InvoiceInfoResponse.java | 79 ++++++++++
.../invoice/reimburse/InvoiceUserInfo.java | 137 ++++++++++++++++++
.../reimburse/UpdateInvoiceStatusRequest.java | 60 ++++++++
.../reimburse/UpdateStatusBatchRequest.java | 58 ++++++++
.../wx/miniapp/bean/urllink/CloudBase.java | 60 ++++++++
.../bean/urllink/GenerateUrlLinkRequest.java | 85 +++++++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 30 ++++
.../api/impl/WxMaLinkServiceImplTest.java | 31 ++++
.../WxMaReimburseInvoiceServiceImplTest.java | 89 ++++++++++++
18 files changed, 924 insertions(+)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaReimburseInvoiceService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaReimburseInvoiceServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceBatchRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceCommodityInfo.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceInfoRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceInfoResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceUserInfo.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/UpdateInvoiceStatusRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/UpdateStatusBatchRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/urllink/CloudBase.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/urllink/GenerateUrlLinkRequest.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaReimburseInvoiceServiceImplTest.java
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java
new file mode 100644
index 0000000000..c3c4559a83
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java
@@ -0,0 +1,16 @@
+package cn.binarywang.wx.miniapp.api;
+
+
+import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * 获取小程序 URL Link接口
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
+ * @author xiaoyu
+ * @since 2021-06-10
+ */
+public interface WxMaLinkService {
+
+ String generate(GenerateUrlLinkRequest request) throws WxErrorException;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaReimburseInvoiceService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaReimburseInvoiceService.java
new file mode 100644
index 0000000000..e8c2c5cfec
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaReimburseInvoiceService.java
@@ -0,0 +1,48 @@
+package cn.binarywang.wx.miniapp.api;
+
+import cn.binarywang.wx.miniapp.bean.invoice.reimburse.*;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+import java.util.List;
+
+/**
+ * 电子发票报销方相关接口
+ * 接口文档: https://developers.weixin.qq.com/doc/offiaccount/WeChat_Invoice/E_Invoice/Reimburser_API_List.html
+ * @author xiaoyu
+ * @since 2021-06-10
+ */
+public interface WxMaReimburseInvoiceService {
+
+ /**
+ * 查询报销发票信息
+ * @param request {@link InvoiceInfoRequest} 查询报销发票信息参数
+ * @return {@link InvoiceInfoResponse} 查询结果
+ * @throws WxErrorException 查询失败时
+ */
+ InvoiceInfoResponse getInvoiceInfo(InvoiceInfoRequest request) throws WxErrorException;
+
+
+ /**
+ * 批量查询报销发票信息
+ * @param request {@link InvoiceBatchRequest} 批量查询报销发票信息参数对象
+ * @return {@link InvoiceInfoResponse} 查询结果列表
+ * @throws WxErrorException 查询失败时
+ */
+ List getInvoiceBatch(InvoiceBatchRequest request) throws WxErrorException;
+
+
+ /**
+ * 更新发票状态
+ * @param request {@link UpdateInvoiceStatusRequest} 更新发票状态参数
+ * @throws WxErrorException 更新失败时
+ */
+ void updateInvoiceStatus(UpdateInvoiceStatusRequest request) throws WxErrorException;
+
+
+ /**
+ * 批量更新发票状态
+ * @param request {@link UpdateStatusBatchRequest} 批量更新发票状态参数
+ * @throws WxErrorException 更新失败时
+ */
+ void updateStatusBatch(UpdateStatusBatchRequest request) 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 55af89289f..962424430f 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
@@ -402,4 +402,16 @@ public interface WxMaService extends WxService {
* @return
*/
WxMaShopSpuService getShopSpuService();
+
+ /**
+ * 获取小程序 URL Link服务接口
+ * @return
+ */
+ WxMaLinkService getLinkService();
+
+ /**
+ * 获取电子发票报销方服务接口
+ * @return
+ */
+ WxMaReimburseInvoiceService getReimburseInvoiceService();
}
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 241d0b37f1..600ce0d076 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
@@ -65,6 +65,8 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxImgProcService imgProcService = new WxMaImgProcServiceImpl(this);
private final WxMaShopSpuService shopSpuService = new WxMaShopSpuServiceImpl(this);
private final WxMaShopOrderService shopOrderService = new WxMaShopOrderServiceImpl(this);
+ private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
+ private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
private int retrySleepMillis = 1000;
private int maxRetryTimes = 5;
@@ -512,4 +514,14 @@ public WxMaShopSpuService getShopSpuService() {
public WxMaShopOrderService getShopOrderService() {
return this.shopOrderService;
}
+
+ @Override
+ public WxMaLinkService getLinkService() {
+ return this.linkService;
+ }
+
+ @Override
+ public WxMaReimburseInvoiceService getReimburseInvoiceService() {
+ return this.reimburseInvoiceService;
+ }
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java
new file mode 100644
index 0000000000..c3b78e4e1e
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java
@@ -0,0 +1,35 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaLinkService;
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Link.GENERATE_URLLINK_URL;
+
+/**
+ * 获取小程序 URL Link接口实现
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
+ * @author xiaoyu
+ * @since 2021-06-10
+ */
+@AllArgsConstructor
+public class WxMaLinkServiceImpl implements WxMaLinkService {
+
+ private final WxMaService wxMaService;
+
+ @Override
+ public String generate(GenerateUrlLinkRequest request) throws WxErrorException {
+ String result = this.wxMaService.post(GENERATE_URLLINK_URL,request);
+ String linkField = "url_link";
+ JsonObject jsonObject = GsonParser.parse(result);
+ if(jsonObject.has(linkField)){
+ return jsonObject.get(linkField).toString();
+ }
+ throw new WxErrorException("无url_link");
+ }
+ }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaReimburseInvoiceServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaReimburseInvoiceServiceImpl.java
new file mode 100644
index 0000000000..3d217c8571
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaReimburseInvoiceServiceImpl.java
@@ -0,0 +1,44 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaReimburseInvoiceService;
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.invoice.reimburse.*;
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+import java.util.List;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Invoice.*;
+
+/**
+ * 电子发票报销方相关接口实现
+ * 接口文档: https://developers.weixin.qq.com/doc/offiaccount/WeChat_Invoice/E_Invoice/Reimburser_API_List.html
+ * @author xiaoyu
+ * @since 2021-06-10
+ */
+@AllArgsConstructor
+public class WxMaReimburseInvoiceServiceImpl implements WxMaReimburseInvoiceService {
+
+ private final WxMaService wxMaService;
+
+ @Override
+ public InvoiceInfoResponse getInvoiceInfo(InvoiceInfoRequest request) throws WxErrorException {
+ return InvoiceInfoResponse.fromJson(this.wxMaService.post(GET_INVOICE_INFO,request.toJson()));
+ }
+
+ @Override
+ public List getInvoiceBatch(InvoiceBatchRequest request) throws WxErrorException {
+ return InvoiceInfoResponse.toList(this.wxMaService.post(GET_INVOICE_BATCH,request.toJson()));
+ }
+
+ @Override
+ public void updateInvoiceStatus(UpdateInvoiceStatusRequest request) throws WxErrorException {
+ this.wxMaService.post(UPDATE_INVOICE_STATUS,request.toJson());
+ }
+
+ @Override
+ public void updateStatusBatch(UpdateStatusBatchRequest request) throws WxErrorException {
+ this.wxMaService.post(UPDATE_STATUS_BATCH,request.toJson());
+ }
+
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceBatchRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceBatchRequest.java
new file mode 100644
index 0000000000..2e974a7c01
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceBatchRequest.java
@@ -0,0 +1,41 @@
+package cn.binarywang.wx.miniapp.bean.invoice.reimburse;
+
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * 批量查询报销发票信息参数对象
+ *
+ * @author xiaoyu
+ * @since 2021-03-23
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class InvoiceBatchRequest implements Serializable {
+
+ private static final long serialVersionUID = -9121443117105107231L;
+
+ /**
+ * 发票卡券的card_id
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("item_list")
+ private List itemList;
+
+
+ public String toJson() {
+ return WxMaGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceCommodityInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceCommodityInfo.java
new file mode 100644
index 0000000000..05302d1e1d
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceCommodityInfo.java
@@ -0,0 +1,34 @@
+package cn.binarywang.wx.miniapp.bean.invoice.reimburse;
+
+import lombok.Data;
+
+/**
+ *
+ * 发票商品信息
+ *
+ * @author xiaoyu
+ * @since 2021-03-23
+ */
+@Data
+public class InvoiceCommodityInfo {
+
+ /**
+ * 项目(商品)名称
+ */
+ private String name;
+
+ /**
+ * 项目数量
+ */
+ private Integer num;
+
+ /**
+ * 项目单位
+ */
+ private String unit;
+
+ /**
+ * 单价,以分为单位
+ */
+ private Integer price;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceInfoRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceInfoRequest.java
new file mode 100644
index 0000000000..37efe5a91b
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceInfoRequest.java
@@ -0,0 +1,53 @@
+package cn.binarywang.wx.miniapp.bean.invoice.reimburse;
+
+
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 查询报销发票信息参数对象
+ *
+ * @author xiaoyu
+ * @since 2021-03-23
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class InvoiceInfoRequest implements Serializable {
+
+ private static final long serialVersionUID = 7854633127026139444L;
+
+
+ /**
+ * 发票卡券的card_id
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("card_id")
+ private String cardId;
+
+
+ /**
+ * 发票卡券的加密code,和card_id共同构成一张发票卡券的唯一标识
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("encrypt_code")
+ private String encryptCode;
+
+
+
+ public String toJson() {
+ return WxMaGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceInfoResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceInfoResponse.java
new file mode 100644
index 0000000000..d8348fdc5b
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceInfoResponse.java
@@ -0,0 +1,79 @@
+package cn.binarywang.wx.miniapp.bean.invoice.reimburse;
+
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.JsonObject;
+import com.google.gson.annotations.SerializedName;
+import com.google.gson.reflect.TypeToken;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
+
+import java.util.List;
+
+/**
+ *
+ * 查询报销发票信息响应对象
+ *
+ * @author xiaoyu
+ * @since 2021-03-23
+ */
+@Data
+public class InvoiceInfoResponse {
+
+ /**
+ * 发票ID
+ */
+ @SerializedName("card_id")
+ private String cardId;
+
+
+ /**
+ * 发票的有效期起始时间
+ */
+ @SerializedName("begin_time")
+ private Integer beginTime;
+
+ /**
+ * 发票的有效期截止时间
+ */
+ @SerializedName("end_time")
+ private Integer endTime;
+
+ /**
+ * 用户标识
+ */
+ private String openid;
+
+ /**
+ * 发票的类型
+ */
+ private String type;
+
+ /**
+ * 发票的收款方
+ */
+ private String payee;
+
+ /**
+ * 发票详情
+ */
+ private String detail;
+
+ /**
+ * 用户可在发票票面看到的主要信息
+ */
+ @SerializedName("user_info")
+ private InvoiceUserInfo userInfo;
+
+
+ public static InvoiceInfoResponse fromJson(String json) {
+ return WxMaGsonBuilder.create().fromJson(json, InvoiceInfoResponse.class);
+ }
+
+
+ public static List toList(String json) {
+ JsonObject jsonObject = GsonParser.parse(json);
+ return WxMaGsonBuilder.create().fromJson(jsonObject.get("item_list").toString(),
+ new TypeToken>() {
+ }.getType());
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceUserInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceUserInfo.java
new file mode 100644
index 0000000000..7e646089fc
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/InvoiceUserInfo.java
@@ -0,0 +1,137 @@
+package cn.binarywang.wx.miniapp.bean.invoice.reimburse;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * 用户可在发票票面看到的主要信息
+ *
+ * @author xiaoyu
+ * @since 2021-03-23
+ */
+@Data
+public class InvoiceUserInfo {
+
+ /**
+ * 发票加税合计金额,以分为单位
+ */
+ private Integer fee;
+
+ /**
+ * 发票的抬头
+ */
+ private String title;
+
+ /**
+ * 开票时间
+ */
+ @SerializedName("billing_time")
+ private Integer billingTime;
+
+ /**
+ * 发票代码
+ */
+ @SerializedName("billing_no")
+ private String billingNo;
+
+ /**
+ * 发票号码
+ */
+ @SerializedName("billing_code")
+ private String billingCode;
+
+ /**
+ * 不含税金额,以分为单位
+ */
+ @SerializedName("fee_without_tax")
+ private Integer feeWithoutTax;
+
+ /**
+ * 税额,以分为单位
+ */
+ private Integer tax;
+
+ /**
+ * 发票对应的PDF_URL
+ */
+ @SerializedName("pdf_url")
+ private String pdfUrl;
+
+ /**
+ * 其它消费凭证附件对应的URL
+ */
+ @SerializedName("trip_pdf_url")
+ private String tripPdfUrl;
+
+ /**
+ * 发票报销状态
+ */
+ @SerializedName("reimburse_status")
+ private String reimburseStatus;
+
+ /**
+ * 校验码
+ */
+ @SerializedName("check_code")
+ private String checkCode;
+
+ /**
+ * 购买方纳税人识别号
+ */
+ @SerializedName("buyer_number")
+ private String buyerNumber;
+
+ /**
+ * 购买方地址、电话
+ */
+ @SerializedName("buyer_address_and_phone")
+ private String buyerAddressAndPhone;
+
+ /**
+ * 购买方开户行及账号
+ */
+ @SerializedName("buyer_bank_account")
+ private String buyerBankAccount;
+
+ /**
+ * 销售方纳税人识别号
+ */
+ @SerializedName("seller_number")
+ private String sellerNumber;
+
+ /**
+ * 销售方地址、电话
+ */
+ @SerializedName("seller_address_and_phone")
+ private String sellerAddressAndPhone;
+
+ /**
+ * 销售方开户行及账号
+ */
+ @SerializedName("seller_bank_account")
+ private String sellerBankAccount;
+
+ /**
+ * 备注
+ */
+ private String remarks;
+
+ /**
+ * 收款人
+ */
+ private String cashier;
+
+ /**
+ * 开票人
+ */
+ private String maker;
+
+ /**
+ * 商品信息结构
+ */
+ private List info;
+}
+
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/UpdateInvoiceStatusRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/UpdateInvoiceStatusRequest.java
new file mode 100644
index 0000000000..74b30b49fc
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/UpdateInvoiceStatusRequest.java
@@ -0,0 +1,60 @@
+package cn.binarywang.wx.miniapp.bean.invoice.reimburse;
+
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import java.io.Serializable;
+
+/**
+ *
+ * 更新发票状态参数对象
+ *
+ * @author xiaoyu
+ * @since 2021-03-23
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UpdateInvoiceStatusRequest implements Serializable {
+
+ private static final long serialVersionUID = -4122242332481909977L;
+
+
+ /**
+ * 发票卡券的card_id
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("card_id")
+ private String cardId;
+
+
+ /**
+ * 发票卡券的加密code,和card_id共同构成一张发票卡券的唯一标识
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("encrypt_code")
+ private String encryptCode;
+
+
+ /**
+ * 发票报销状态
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("reimburse_status")
+ private String reimburseStatus;
+
+
+ public String toJson() {
+ return WxMaGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/UpdateStatusBatchRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/UpdateStatusBatchRequest.java
new file mode 100644
index 0000000000..c2e020356d
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/invoice/reimburse/UpdateStatusBatchRequest.java
@@ -0,0 +1,58 @@
+package cn.binarywang.wx.miniapp.bean.invoice.reimburse;
+
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * 批量更新发票状态参数对象
+ *
+ * @author xiaoyu
+ * @since 2021-03-23
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UpdateStatusBatchRequest implements Serializable {
+
+ private static final long serialVersionUID = 7016357689566912199L;
+ /**
+ * 用户openid
+ *
+ * 是否必填: 是
+ *
+ */
+ private String openid;
+
+ /**
+ * 发票报销状态
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("reimburse_status")
+ private String reimburseStatus;
+
+ /**
+ * 发票列表
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("invoice_list")
+ private List invoiceList;
+
+
+ public String toJson() {
+ return WxMaGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/urllink/CloudBase.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/urllink/CloudBase.java
new file mode 100644
index 0000000000..7e0d645b5d
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/urllink/CloudBase.java
@@ -0,0 +1,60 @@
+package cn.binarywang.wx.miniapp.bean.urllink;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ *
+ * 云开发静态网站自定义 H5 配置参数
+ *
+ * @author xiaoyu
+ * @since 2021-06-11
+ */
+@Data
+@Builder
+public class CloudBase {
+
+ /**
+ * 云开发环境
+ *
+ * 是否必填: 是
+ *
+ */
+ private String env;
+
+ /**
+ * 静态网站自定义域名,不填则使用默认域名
+ *
+ * 是否必填: 否
+ *
+ */
+ private String domain;
+
+ /**
+ * 云开发静态网站 H5 页面路径,不可携带 query
+ *
+ * 默认值:/
+ * 是否必填: 否
+ *
+ */
+ private String path;
+
+ /**
+ * 云开发静态网站 H5 页面 query 参数,最大 1024 个字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~
+ *
+ * 是否必填: 否
+ *
+ */
+ private String query;
+
+ /**
+ * 第三方批量代云开发时必填,表示创建该 env 的 appid (小程序/第三方平台)
+ *
+ * 是否必填: 否
+ *
+ */
+ @SerializedName("resource_appid")
+ private String resourceAppid;
+
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/urllink/GenerateUrlLinkRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/urllink/GenerateUrlLinkRequest.java
new file mode 100644
index 0000000000..207aa3deee
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/urllink/GenerateUrlLinkRequest.java
@@ -0,0 +1,85 @@
+package cn.binarywang.wx.miniapp.bean.urllink;
+
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 获取小程序 URL Link参数对象
+ *
+ * @author xiaoyu
+ * @since 2021-06-11
+ */
+@Data
+@Builder
+public class GenerateUrlLinkRequest implements Serializable {
+
+ private static final long serialVersionUID = -2183685760797791910L;
+
+ /**
+ * 通过 URL Link 进入的小程序页面路径,必须是已经发布的小程序存在的页面,不可携带 query 。path 为空时会跳转小程序主页
+ *
+ * 是否必填: 是
+ *
+ */
+ private String path;
+
+ /**
+ * 通过 URL Link 进入小程序时的query,最大1024个字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~
+ *
+ * 是否必填: 是
+ *
+ */
+ private String query;
+
+ /**
+ * 生成的 URL Link 类型,到期失效:true,永久有效:false
+ *
+ * 默认值:false
+ * 是否必填: 否
+ *
+ */
+ @SerializedName("is_expire")
+ private Boolean isExpire;
+
+ /**
+ * 小程序 URL Link 失效类型,失效时间:0,失效间隔天数:1
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("expire_type")
+ private Integer expireType;
+
+ /**
+ * 到期失效的 URL Link 的失效时间,为 Unix 时间戳。生成的到期失效 URL Link 在该时间前有效。最长有效期为1年。expire_type 为 0 必填
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("expire_time")
+ private Integer expireTime;
+
+ /**
+ * 到期失效的URL Link的失效间隔天数。生成的到期失效URL Link在该间隔时间到达前有效。最长间隔天数为365天。expire_type 为 1 必填
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("expire_interval")
+ private Integer expireInterval;
+
+ /**
+ * 云开发静态网站自定义 H5 配置参数,可配置中转的云开发 H5 页面。不填默认用官方 H5 页面
+ *
+ * 是否必填: 否
+ *
+ */
+ @SerializedName("cloud_base")
+ private CloudBase cloudBase;
+
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index 71ee8500e0..d2d15b8f50 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -222,6 +222,10 @@ public interface Scheme {
String GENERATE_SCHEME_URL = "https://api.weixin.qq.com/wxa/generatescheme";
}
+ public interface Link {
+ String GENERATE_URLLINK_URL = "https://api.weixin.qq.com/wxa/generate_urllink";
+ }
+
public interface SecCheck {
String IMG_SEC_CHECK_URL = "https://api.weixin.qq.com/wxa/img_sec_check";
String MSG_SEC_CHECK_URL = "https://api.weixin.qq.com/wxa/msg_sec_check";
@@ -316,4 +320,30 @@ interface Order {
String ORDER_GET = "https://api.weixin.qq.com/shop/order/get";
}
}
+
+ /**
+ * 电子发票报销方
+ */
+ public interface Invoice{
+
+ /**
+ * 报销方查询报销发票信息
+ */
+ String GET_INVOICE_INFO = "https://api.weixin.qq.com/card/invoice/reimburse/getinvoiceinfo";
+
+ /**
+ * 报销方批量查询报销发票信息
+ */
+ String GET_INVOICE_BATCH = "https://api.weixin.qq.com/card/invoice/reimburse/getinvoicebatch";
+
+ /**
+ * 报销方更新发票状态
+ */
+ String UPDATE_INVOICE_STATUS = "https://api.weixin.qq.com/card/invoice/reimburse/updateinvoicestatus";
+
+ /**
+ * 报销方批量更新发票状态
+ */
+ String UPDATE_STATUS_BATCH = "https://api.weixin.qq.com/card/invoice/reimburse/updatestatusbatch";
+ }
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java
new file mode 100644
index 0000000000..68ca9b6214
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java
@@ -0,0 +1,31 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaLinkServiceImplTest {
+
+ @Inject
+ private WxMaService wxMaService;
+
+ @Test
+ public void testGenerate() throws WxErrorException {
+
+ GenerateUrlLinkRequest request = GenerateUrlLinkRequest.builder()
+ .path("pages/tabBar/home/home")
+ .build();
+
+ String url = this.wxMaService.getLinkService().generate(request);
+
+ System.out.println(url);
+ }
+}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaReimburseInvoiceServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaReimburseInvoiceServiceImplTest.java
new file mode 100644
index 0000000000..a7263bdf59
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaReimburseInvoiceServiceImplTest.java
@@ -0,0 +1,89 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.invoice.reimburse.*;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.gson.GsonBuilder;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+@Slf4j
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaReimburseInvoiceServiceImplTest {
+
+ @Inject
+ private WxMaService wxMaService;
+
+ @Test
+ public void testGetInvoiceInfo() throws WxErrorException {
+
+ InvoiceInfoRequest request = InvoiceInfoRequest.builder()
+ .cardId("**********************")
+ .encryptCode("**********************")
+ .build();
+
+ InvoiceInfoResponse response = this.wxMaService.getReimburseInvoiceService().getInvoiceInfo(request);
+
+ log.info("response: {}", new GsonBuilder().create().toJson(response));
+ }
+
+ @Test
+ public void testGetInvoiceBatch() throws WxErrorException {
+
+ List invoices = new ArrayList<>();
+ InvoiceInfoRequest r = InvoiceInfoRequest.builder()
+ .cardId("**********************")
+ .encryptCode("********************************************")
+ .build();
+ invoices.add(r);
+ r = InvoiceInfoRequest.builder()
+ .cardId("**********************")
+ .encryptCode("********************************************")
+ .build();
+ invoices.add(r);
+
+ InvoiceBatchRequest request = InvoiceBatchRequest.builder().itemList(invoices).build();
+
+ List responses = this.wxMaService.getReimburseInvoiceService().getInvoiceBatch(request);
+ log.info("responses: {}",new GsonBuilder().create().toJson(responses));
+ }
+
+ @Test
+ public void testUpdateInvoiceStatus() throws WxErrorException {
+ UpdateInvoiceStatusRequest request = UpdateInvoiceStatusRequest.builder()
+ .cardId("**********************")
+ .encryptCode("********************************************")
+ .reimburseStatus("INVOICE_REIMBURSE_INIT")
+ .build();
+
+ this.wxMaService.getReimburseInvoiceService().updateInvoiceStatus(request);
+ }
+
+ @Test
+ public void testUpdateStatusBatch() throws WxErrorException {
+
+ List invoices = new ArrayList<>();
+ InvoiceInfoRequest r = InvoiceInfoRequest.builder()
+ .cardId("**************")
+ .encryptCode("**************")
+ .build();
+ invoices.add(r);
+
+ UpdateStatusBatchRequest request = UpdateStatusBatchRequest.builder()
+ .invoiceList(invoices)
+ .openid("**************")
+ .reimburseStatus("INVOICE_REIMBURSE_LOCK")
+ .build();
+
+ this.wxMaService.getReimburseInvoiceService().updateStatusBatch(request);
+ }
+}
From 566e5f31c7c74e202b47647c9aae1b3b51498dd9 Mon Sep 17 00:00:00 2001
From: pg
Date: Mon, 21 Jun 2021 11:58:13 +0800
Subject: [PATCH 0010/1235] =?UTF-8?q?:art:=20#2155=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=8F=91=E9=80=81=E6=96=B0?=
=?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=AC=A2=E8=BF=8E=E8=AF=AD=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E8=A7=86=E9=A2=91=E7=B1=BB=E5=9E=8B?=
=?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=8C=E5=90=8C=E6=97=B6=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8D=E7=BB=93=E6=9E=84=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/bean/external/WxCpWelcomeMsg.java | 12 +--
.../cp/bean/external/msg/Attachment.java | 76 +++++++++++++++++++
.../weixin/cp/bean/external/msg/Video.java | 19 +++++
.../weixin/cp/constant/WxCpConsts.java | 20 +++++
.../WxCpExternalContactServiceImplTest.java | 17 +++++
5 files changed, 135 insertions(+), 9 deletions(-)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Video.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java
index ce744b9f24..ade49684ce 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java
@@ -2,13 +2,11 @@
import com.google.gson.annotations.SerializedName;
import lombok.*;
-import me.chanjar.weixin.cp.bean.external.msg.Image;
-import me.chanjar.weixin.cp.bean.external.msg.Link;
-import me.chanjar.weixin.cp.bean.external.msg.MiniProgram;
-import me.chanjar.weixin.cp.bean.external.msg.Text;
+import me.chanjar.weixin.cp.bean.external.msg.*;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.io.Serializable;
+import java.util.List;
/**
* 新客户欢迎语.
@@ -28,11 +26,7 @@ public class WxCpWelcomeMsg implements Serializable {
private Text text;
- private Image image;
-
- private Link link;
-
- private MiniProgram miniprogram;
+ private List attachments;
public String toJson() {
return WxCpGsonBuilder.create().toJson(this);
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java
new file mode 100644
index 0000000000..0c64b9bf63
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java
@@ -0,0 +1,76 @@
+package me.chanjar.weixin.cp.bean.external.msg;
+
+import com.google.gson.annotations.SerializedName;
+import me.chanjar.weixin.cp.constant.WxCpConsts;
+
+import java.io.Serializable;
+
+public class Attachment implements Serializable {
+ private static final long serialVersionUID = -8078748379570640198L;
+
+ @SerializedName("msgtype")
+ private String msgType;
+
+ private Image image;
+
+ private Link link;
+
+ private MiniProgram miniprogram;
+
+ private Video video;
+
+ @Override
+ public String toString() {
+ return "Attachment{" +
+ "msgType='" + msgType + '\'' +
+ ", image=" + image +
+ ", link=" + link +
+ ", miniprogram=" + miniprogram +
+ ", video=" + video +
+ '}';
+ }
+
+ private String getMsgType() {
+ return msgType;
+ }
+
+ private void setMsgType(String msgType) {
+ this.msgType = msgType;
+ }
+
+ public Image getImage() {
+ return image;
+ }
+
+ public void setImage(Image image) {
+ this.image = image;
+ this.msgType = WxCpConsts.WelcomeMsgType.IMAGE;
+ }
+
+ public Link getLink() {
+ return link;
+ }
+
+ public void setLink(Link link) {
+ this.link = link;
+ this.msgType = WxCpConsts.WelcomeMsgType.LINK;
+ }
+
+ public MiniProgram getMiniprogram() {
+ return miniprogram;
+ }
+
+ public void setMiniprogram(MiniProgram miniprogram) {
+ this.miniprogram = miniprogram;
+ this.msgType = WxCpConsts.WelcomeMsgType.MINIPROGRAM;
+ }
+
+ public Video getVideo() {
+ return video;
+ }
+
+ public void setVideo(Video video) {
+ this.video = video;
+ this.msgType = WxCpConsts.WelcomeMsgType.VIDEO;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Video.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Video.java
new file mode 100644
index 0000000000..237fb75cfe
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Video.java
@@ -0,0 +1,19 @@
+package me.chanjar.weixin.cp.bean.external.msg;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 视频消息
+ *
+ * @author pg
+ * @date 2021-6-21
+ */
+@Data
+public class Video implements Serializable {
+ private static final long serialVersionUID = -6048642921382867138L;
+ @SerializedName("media_id")
+ private String mediaId;
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java
index 4a41fa8f71..69db78efbe 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java
@@ -334,4 +334,24 @@ public static class WorkBenchType {
* */
public static final String WEBVIEW = "webview";
}
+
+ @UtilityClass
+ public static class WelcomeMsgType {
+ /**
+ * 图片消息.
+ */
+ public static final String IMAGE = "image";
+ /**
+ * 图文消息.
+ */
+ public static final String LINK = "link";
+ /**
+ * 视频消息.
+ */
+ public static final String VIDEO = "video";
+ /**
+ * 小程序消息.
+ */
+ public static final String MINIPROGRAM = "miniprogram";
+ }
}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
index 29089d478d..4b6221d175 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
@@ -8,6 +8,9 @@
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.bean.external.*;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactInfo;
+import me.chanjar.weixin.cp.bean.external.msg.Attachment;
+import me.chanjar.weixin.cp.bean.external.msg.Image;
+import me.chanjar.weixin.cp.bean.external.msg.Video;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
@@ -214,8 +217,22 @@ public void testAddMsgTemplate() {
@Test
public void testSendWelcomeMsg() throws WxErrorException {
+ Image image = new Image();
+ image.setMediaId("123123");
+ Attachment attachment = new Attachment();
+ attachment.setImage(image);
+
+ Video video = new Video();
+ video.setMediaId("video_media_id");
+ Attachment attachment2 = new Attachment();
+ attachment2.setVideo(video);
+
+ List attachments = new ArrayList<>();
+ attachments.add(attachment);
+ attachments.add(attachment2);
this.wxCpService.getExternalContactService().sendWelcomeMsg(WxCpWelcomeMsg.builder()
.welcomeCode("abc")
+ .attachments(attachments)
.build());
}
From 3963c6d471c339dbf52f325478eeebd1b4d14539 Mon Sep 17 00:00:00 2001
From: pg
Date: Tue, 22 Jun 2021 10:57:32 +0800
Subject: [PATCH 0011/1235] =?UTF-8?q?:new:=20#2150=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E8=A1=A5=E5=85=85=E5=AE=8C?=
=?UTF-8?q?=E5=96=84=E9=83=A8=E5=88=86=E5=AE=A2=E6=88=B7=E8=81=94=E7=B3=BB?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BB=A5=E5=8F=8A=E6=9C=8D=E5=8A=A1?=
=?UTF-8?q?=E5=95=86=E6=A8=A1=E5=BC=8F=E5=A4=96=E9=83=A8=E8=81=94=E7=B3=BB?=
=?UTF-8?q?=E4=BA=BAopenid=E8=BD=AC=E6=8D=A2=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/api/WxCpExternalContactService.java | 113 ++++++++++++++++++
.../impl/WxCpExternalContactServiceImpl.java | 63 ++++++++++
...WxCpUserExternalGroupChatTransferResp.java | 51 ++++++++
.../external/WxCpUserTransferCustomerReq.java | 49 ++++++++
.../WxCpUserTransferCustomerResp.java | 60 ++++++++++
.../external/WxCpUserTransferResultResp.java | 92 ++++++++++++++
.../weixin/cp/constant/WxCpApiPathConsts.java | 7 ++
.../WxCpExternalContactServiceImplTest.java | 52 +++++++-
8 files changed, 486 insertions(+), 1 deletion(-)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatTransferResp.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferCustomerReq.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferCustomerResp.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
index 231e0bfa3e..cd65ad3771 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
@@ -6,6 +6,7 @@
import me.chanjar.weixin.cp.bean.external.*;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactBatchInfo;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactInfo;
+import org.jetbrains.annotations.NotNull;
import java.util.Date;
import java.util.List;
@@ -134,6 +135,14 @@ public interface WxCpExternalContactService {
*/
WxCpExternalContactInfo getContactDetail(String userId) throws WxErrorException;
+ /**
+ * 企业和服务商可通过此接口,将微信外部联系人的userid转为微信openid,用于调用支付相关接口。暂不支持企业微信外部联系人(ExternalUserid为wo开头)的userid转openid。
+ * @param externalUserid 微信外部联系人的userid
+ * @return 该企业的外部联系人openid
+ * @throws WxErrorException .
+ */
+ String convertToOpenid(String externalUserid) throws WxErrorException;
+
/**
* 批量获取客户详情.
*
@@ -225,9 +234,85 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* @param takeOverUserid the take over userid
* @return wx cp base resp
* @throws WxErrorException the wx error exception
+ * @deprecated 此后续将不再更新维护,建议使用 {@link #transferCustomer(WxCpUserTransferCustomerReq)}
*/
+ @Deprecated
WxCpBaseResp transferExternalContact(String externalUserid, String handOverUserid, String takeOverUserid) throws WxErrorException;
+ /**
+ * 企业可通过此接口,转接在职成员的客户给其他成员。
+ *
+ * external_userid必须是handover_userid的客户(即配置了客户联系功能的成员所添加的联系人)。
+ * 在职成员的每位客户最多被分配2次。客户被转接成功后,将有90个自然日的服务关系保护期,保护期内的客户无法再次被分配。
+ *
+ * 权限说明:
+ * * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
+ * 第三方应用需拥有“企业客户权限->客户联系->在职继承”权限
+ * 接替成员必须在此第三方应用或自建应用的可见范围内。
+ * 接替成员需要配置了客户联系功能。
+ * 接替成员需要在企业微信激活且已经过实名认证。
+ *
+ * @param req 转接在职成员的客户给其他成员请求实体
+ * @return wx cp base resp
+ * @throws WxErrorException the wx error exception
+ */
+ WxCpUserTransferCustomerResp transferCustomer(WxCpUserTransferCustomerReq req) throws WxErrorException;
+
+ /**
+ * 企业和第三方可通过此接口查询在职成员的客户转接情况。
+ *
+ * 权限说明:
+ *
+ * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
+ * 第三方应用需拥有“企业客户权限->客户联系->在职继承”权限
+ * 接替成员必须在此第三方应用或自建应用的可见范围内。
+ *
+ * @param handOverUserid 原添加成员的userid
+ * @param takeOverUserid 接替成员的userid
+ * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
+ * @return 客户转接接口实体
+ * @throws WxErrorException the wx error exception
+ */
+ WxCpUserTransferResultResp transferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
+
+ /**
+ * 企业可通过此接口,分配离职成员的客户给其他成员。
+ *
+ * handover_userid必须是已离职用户。
+ * external_userid必须是handover_userid的客户(即配置了客户联系功能的成员所添加的联系人)。
+ * 在职成员的每位客户最多被分配2次。客户被转接成功后,将有90个自然日的服务关系保护期,保护期内的客户无法再次被分配。
+ *
+ * 权限说明:
+ *
+ * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
+ * 第三方应用需拥有“企业客户权限->客户联系->离职分配”权限
+ * 接替成员必须在此第三方应用或自建应用的可见范围内。
+ * 接替成员需要配置了客户联系功能。
+ * 接替成员需要在企业微信激活且已经过实名认证。
+ *
+ * @param req 转接在职成员的客户给其他成员请求实体
+ * @return wx cp base resp
+ * @throws WxErrorException the wx error exception
+ */
+ WxCpUserTransferCustomerResp resignedTransferCustomer(WxCpUserTransferCustomerReq req) throws WxErrorException;
+
+ /**
+ * 企业和第三方可通过此接口查询离职成员的客户分配情况。
+ *
+ * 权限说明:
+ *
+ * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
+ * 第三方应用需拥有“企业客户权限->客户联系->在职继承”权限
+ * 接替成员必须在此第三方应用或自建应用的可见范围内。
+ *
+ * @param handOverUserid 原添加成员的userid
+ * @param takeOverUserid 接替成员的userid
+ * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
+ * @return 客户转接接口实体
+ * @throws WxErrorException the wx error exception
+ */
+ WxCpUserTransferResultResp resignedTransferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
+
/**
*
* 该接口用于获取配置过客户群管理的客户群列表。
@@ -260,6 +345,32 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
*/
WxCpUserExternalGroupChatInfo getGroupChat(String chatId) throws WxErrorException;
+ /**
+ *
+ * 企业可通过此接口,将已离职成员为群主的群,分配给另一个客服成员。
+ *
+ *
+ * 注意::
+ *
+ * 群主离职了的客户群,才可继承
+ * 继承给的新群主,必须是配置了客户联系功能的成员
+ * 继承给的新群主,必须有设置实名
+ * 继承给的新群主,必须有激活企业微信
+ * 同一个人的群,限制每天最多分配300个给新群主
+ *
+ * 权限说明:
+ *
+ * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
+ * 第三方应用需拥有“企业客户权限->客户联系->分配离职成员的客户群”权限
+ * 对于第三方/自建应用,群主必须在应用的可见范围。
+ *
+ * @param chatIds 需要转群主的客户群ID列表。取值范围: 1 ~ 100
+ * @param newOwner 新群主ID
+ * @return 分配结果,主要是分配失败的群列表
+ * @throws WxErrorException the wx error exception
+ */
+ WxCpUserExternalGroupChatTransferResp transferGroupChat(String[] chatIds, String newOwner) throws WxErrorException;
+
/**
*
* 企业可通过此接口获取成员联系客户的数据,包括发起申请数、新增客户数、聊天数、发送消息数和删除/拉黑成员的客户数等指标。
@@ -397,4 +508,6 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* @throws WxErrorException the wx error exception
*/
WxCpBaseResp markTag(String userid, String externalUserid, String[] addTag, String[] removeTag) throws WxErrorException;
+
+
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
index 19e7cdfe79..8065d21980 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
@@ -7,6 +7,8 @@
import me.chanjar.weixin.common.error.WxCpErrorMsgEnum;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.error.WxRuntimeException;
+import me.chanjar.weixin.common.util.BeanUtils;
+import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.cp.api.WxCpExternalContactService;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
@@ -15,6 +17,7 @@
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactInfo;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.Date;
@@ -106,6 +109,16 @@ public WxCpExternalContactInfo getContactDetail(String userId) throws WxErrorExc
return WxCpExternalContactInfo.fromJson(responseContent);
}
+ @Override
+ public String convertToOpenid(@NotNull String externalUserId) throws WxErrorException {
+ JsonObject json = new JsonObject();
+ json.addProperty("external_userid", externalUserId);
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(CONVERT_TO_OPENID);
+ String responseContent = this.mainService.post(url, json.toString());
+ JsonObject tmpJson = GsonParser.parse(responseContent);
+ return tmpJson.get("openid").getAsString();
+ }
+
@Override
public WxCpExternalContactBatchInfo getContactDetailBatch(String userId,
String cursor,
@@ -176,6 +189,44 @@ public WxCpBaseResp transferExternalContact(String externalUserid, String handOv
return WxCpBaseResp.fromJson(result);
}
+ @Override
+ public WxCpUserTransferCustomerResp transferCustomer(WxCpUserTransferCustomerReq req) throws WxErrorException {
+ BeanUtils.checkRequiredFields(req);
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(TRANSFER_CUSTOMER);
+ final String result = this.mainService.post(url, req.toJson());
+ return WxCpUserTransferCustomerResp.fromJson(result);
+ }
+
+ @Override
+ public WxCpUserTransferResultResp transferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException {
+ JsonObject json = new JsonObject();
+ json.addProperty("cursor", cursor);
+ json.addProperty("handover_userid", handOverUserid);
+ json.addProperty("takeover_userid", takeOverUserid);
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(TRANSFER_RESULT);
+ final String result = this.mainService.post(url, json.toString());
+ return WxCpUserTransferResultResp.fromJson(result);
+ }
+
+ @Override
+ public WxCpUserTransferCustomerResp resignedTransferCustomer(WxCpUserTransferCustomerReq req) throws WxErrorException {
+ BeanUtils.checkRequiredFields(req);
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(RESIGNED_TRANSFER_CUSTOMER);
+ final String result = this.mainService.post(url, req.toJson());
+ return WxCpUserTransferCustomerResp.fromJson(result);
+ }
+
+ @Override
+ public WxCpUserTransferResultResp resignedTransferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException {
+ JsonObject json = new JsonObject();
+ json.addProperty("cursor", cursor);
+ json.addProperty("handover_userid", handOverUserid);
+ json.addProperty("takeover_userid", takeOverUserid);
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(RESIGNED_TRANSFER_RESULT);
+ final String result = this.mainService.post(url, json.toString());
+ return WxCpUserTransferResultResp.fromJson(result);
+ }
+
@Override
public WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pageSize, int status, String[] userIds, String[] partyIds) throws WxErrorException {
JsonObject json = new JsonObject();
@@ -206,6 +257,18 @@ public WxCpUserExternalGroupChatInfo getGroupChat(String chatId) throws WxErrorE
return WxCpUserExternalGroupChatInfo.fromJson(result);
}
+ @Override
+ public WxCpUserExternalGroupChatTransferResp transferGroupChat(String[] chatIds, String newOwner) throws WxErrorException {
+ JsonObject json = new JsonObject();
+ if (ArrayUtils.isNotEmpty(chatIds)) {
+ json.add("chat_id_list", new Gson().toJsonTree(chatIds).getAsJsonArray());
+ }
+ json.addProperty("new_owner", newOwner);
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GROUP_CHAT_TRANSFER);
+ final String result = this.mainService.post(url, json.toString());
+ return WxCpUserExternalGroupChatTransferResp.fromJson(result);
+ }
+
@Override
public WxCpUserExternalUserBehaviorStatistic getUserBehaviorStatistic(Date startTime, Date endTime, String[] userIds, String[] partyIds) throws WxErrorException {
JsonObject json = new JsonObject();
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatTransferResp.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatTransferResp.java
new file mode 100644
index 0000000000..ff6fb82374
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatTransferResp.java
@@ -0,0 +1,51 @@
+package me.chanjar.weixin.cp.bean.external;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Getter;
+import lombok.Setter;
+import me.chanjar.weixin.cp.bean.WxCpBaseResp;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 分配离职成员的客户群结果
+ * @author pg
+ * @date 2021年6月21日
+ */
+@Getter
+@Setter
+public class WxCpUserExternalGroupChatTransferResp extends WxCpBaseResp {
+ private static final long serialVersionUID = -943124579487821819L;
+ /**
+ * 没有成功继承的群列表
+ */
+ @SerializedName("failed_chat_list")
+ private List failedChatList;
+
+ public static WxCpUserExternalGroupChatTransferResp fromJson(String json) {
+ return WxCpGsonBuilder.create().fromJson(json, WxCpUserExternalGroupChatTransferResp.class);
+ }
+
+ public String toJson() {
+ return WxCpGsonBuilder.create().toJson(this);
+ }
+
+ @Getter
+ @Setter
+ public static class GroupChatFailedTransfer extends WxCpBaseResp {
+ private static final long serialVersionUID = -5836775099634587239L;
+ /**
+ * 没能成功继承的群ID
+ */
+ private String chatId;
+
+ public static WxCpUserExternalGroupChatTransferResp.GroupChatFailedTransfer fromJson(String json) {
+ return WxCpGsonBuilder.create().fromJson(json, WxCpUserExternalGroupChatTransferResp.GroupChatFailedTransfer.class);
+ }
+
+ public String toJson() {
+ return WxCpGsonBuilder.create().toJson(this);
+ }
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferCustomerReq.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferCustomerReq.java
new file mode 100644
index 0000000000..e8b8142cc6
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferCustomerReq.java
@@ -0,0 +1,49 @@
+package me.chanjar.weixin.cp.bean.external;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Getter;
+import lombok.Setter;
+import me.chanjar.weixin.common.annotation.Required;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 转接在职成员的客户给其他成员,请求对象
+ *
+ * @author pg
+ * @date 2021年6月21日
+ */
+@Getter
+@Setter
+public class WxCpUserTransferCustomerReq implements Serializable {
+ private static final long serialVersionUID = -309819538677411801L;
+ /**
+ * 原跟进成员的userid
+ */
+ @SerializedName("handover_userid")
+ @Required
+ private String handOverUserid;
+ /**
+ * 接替成员的userid
+ */
+ @SerializedName("takeover_userid")
+ @Required
+ private String takeOverUserid;
+ /**
+ * 客户的external_userid列表,每次最多分配100个客户
+ */
+ @SerializedName("external_userid")
+ @Required
+ private List externalUserid;
+ /**
+ * 转移成功后发给客户的消息,最多200个字符,不填则使用默认文案
+ */
+ @SerializedName("transfer_success_msg")
+ private String transferMsg;
+
+ public String toJson() {
+ return WxCpGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferCustomerResp.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferCustomerResp.java
new file mode 100644
index 0000000000..27d1c0ad4c
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferCustomerResp.java
@@ -0,0 +1,60 @@
+package me.chanjar.weixin.cp.bean.external;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Getter;
+import lombok.Setter;
+import me.chanjar.weixin.cp.bean.WxCpBaseResp;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 转接在职成员的客户给其他成员,返回对象
+ *
+ * @author pg
+ * @date 2021年6月21日
+ */
+@Getter
+@Setter
+public class WxCpUserTransferCustomerResp extends WxCpBaseResp {
+ private static final long serialVersionUID = -8030598756503590089L;
+ /**
+ * 客户转移结果列表
+ */
+ private List customer;
+
+ public static WxCpUserTransferCustomerResp fromJson(String json) {
+ return WxCpGsonBuilder.create().fromJson(json, WxCpUserTransferCustomerResp.class);
+ }
+
+ public String toJson() {
+ return WxCpGsonBuilder.create().toJson(this);
+ }
+
+ /**
+ * 转接客户结果实体
+ */
+ @Getter
+ @Setter
+ public static class TransferCustomer implements Serializable {
+ private static final long serialVersionUID = 8720554208727083338L;
+ /**
+ * 客户的external_userid
+ */
+ @SerializedName("external_userid")
+ private String externalUserid;
+ /**
+ * 对此客户进行分配的结果, 0表示成功发起接替,待24小时后自动接替,并不代表最终接替成功
+ */
+ private Integer errcode;
+
+ public static WxCpUserTransferCustomerResp.TransferCustomer fromJson(String json) {
+ return WxCpGsonBuilder.create().fromJson(json, WxCpUserTransferCustomerResp.TransferCustomer.class);
+ }
+
+ public String toJson() {
+ return WxCpGsonBuilder.create().toJson(this);
+ }
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
new file mode 100644
index 0000000000..e1b8cc4591
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
@@ -0,0 +1,92 @@
+package me.chanjar.weixin.cp.bean.external;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Getter;
+import lombok.Setter;
+import me.chanjar.weixin.cp.bean.WxCpBaseResp;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 在职成员的客户转接情况
+ * @author pg
+ * @date 2021年6月21日
+ */
+@Getter
+@Setter
+public class WxCpUserTransferResultResp extends WxCpBaseResp {
+ private static final long serialVersionUID = 6897979567174991786L;
+ @SerializedName("next_cursor")
+ private String nextCursor;
+
+ public static WxCpUserTransferResultResp fromJson(String json) {
+ return WxCpGsonBuilder.create().fromJson(json, WxCpUserTransferResultResp.class);
+ }
+
+ public String toJson() {
+ return WxCpGsonBuilder.create().toJson(this);
+ }
+
+ /**
+ * 客户转接结果实体
+ */
+ @Getter
+ @Setter
+ public static class TransferResult implements Serializable {
+ private static final long serialVersionUID = 2847784363733118393L;
+
+ /**
+ * 客户的external_userid
+ */
+ @SerializedName("external_userid")
+ private String externalUserid;
+ /**
+ * 接替状态, 1-接替完毕 2-等待接替 3-客户拒绝 4-接替成员客户达到上限 5-无接替记录
+ */
+ private STATUS status;
+ /**
+ * 接替客户的时间,如果是等待接替状态,则为未来的自动接替时间
+ */
+ @SerializedName("takeover_time")
+ private Long takeOverTime;
+
+ public static WxCpUserTransferResultResp.TransferResult fromJson(String json) {
+ return WxCpGsonBuilder.create().fromJson(json, WxCpUserTransferResultResp.TransferResult.class);
+ }
+
+ public String toJson() {
+ return WxCpGsonBuilder.create().toJson(this);
+ }
+ }
+
+ public enum STATUS {
+
+ /**
+ * 接替完毕
+ */
+ @SerializedName("1")
+ COMPLETE,
+
+ /**
+ * 等待接替
+ */
+ @SerializedName("2")
+ WAITING,
+ /**
+ * 客户拒绝
+ */
+ @SerializedName("3")
+ REFUSED,
+ /**
+ * 接替成员客户达到上限
+ */
+ @SerializedName("4")
+ LIMIT,
+ /**
+ * 无接替记录
+ */
+ @SerializedName("5")
+ NORECORD
+ }
+}
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 bc96269ea8..c60a1bddbd 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
@@ -175,13 +175,20 @@ interface ExternalContact {
String CLOSE_TEMP_CHAT = "/cgi-bin/externalcontact/close_temp_chat";
String GET_FOLLOW_USER_LIST = "/cgi-bin/externalcontact/get_follow_user_list";
String GET_CONTACT_DETAIL = "/cgi-bin/externalcontact/get?external_userid=";
+ String CONVERT_TO_OPENID = "/cgi-bin/externalcontact/convert_to_openid";
String GET_CONTACT_DETAIL_BATCH = "/cgi-bin/externalcontact/batch/get_by_user?";
String UPDATE_REMARK = "/cgi-bin/externalcontact/remark";
String LIST_EXTERNAL_CONTACT = "/cgi-bin/externalcontact/list?userid=";
String LIST_UNASSIGNED_CONTACT = "/cgi-bin/externalcontact/get_unassigned_list";
+ @Deprecated
String TRANSFER_UNASSIGNED_CONTACT = "/cgi-bin/externalcontact/transfer";
+ String TRANSFER_CUSTOMER = "/cgi-bin/externalcontact/transfer_customer";
+ String TRANSFER_RESULT = "/cgi-bin/externalcontact/transfer_result";
+ String RESIGNED_TRANSFER_CUSTOMER = "/cgi-bin/externalcontact/resigned/transfer_customer";
+ String RESIGNED_TRANSFER_RESULT = "/cgi-bin/externalcontact/resigned/transfer_result";
String GROUP_CHAT_LIST = "/cgi-bin/externalcontact/groupchat/list";
String GROUP_CHAT_INFO = "/cgi-bin/externalcontact/groupchat/get";
+ String GROUP_CHAT_TRANSFER = "/cgi-bin/externalcontact/groupchat/transfer";
String LIST_USER_BEHAVIOR_DATA = "/cgi-bin/externalcontact/get_user_behavior_data";
String LIST_GROUP_CHAT_DATA = "/cgi-bin/externalcontact/groupchat/statistic";
String ADD_MSG_TEMPLATE = "/cgi-bin/externalcontact/add_msg_template";
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
index 4b6221d175..8869a6a02b 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
@@ -16,6 +16,7 @@
import org.testng.annotations.Test;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
import java.util.List;
@@ -196,13 +197,62 @@ public void testTransferExternalContact() {
}
@Test
- public void testListGroupChat() {
+ public void testTransferCustomer() throws WxErrorException {
+ WxCpUserTransferCustomerReq req = new WxCpUserTransferCustomerReq();
+ req.setExternalUserid(Collections.emptyList());
+ req.setHandOverUserid("123");
+ req.setTakeOverUserid("234");
+ WxCpBaseResp result = this.wxCpService.getExternalContactService().transferCustomer(req);
+
+ System.out.println(result);
+ assertNotNull(result);
+ }
+
+ @Test
+ public void testTrnsferResult() throws WxErrorException {
+ WxCpUserTransferResultResp result = this.wxCpService.getExternalContactService().transferResult("123", "234", "");
+ System.out.println(result);
+ assertNotNull(result);
+ }
+
+ @Test
+ public void testresignedTransferCustomer() throws WxErrorException {
+ WxCpUserTransferCustomerReq req = new WxCpUserTransferCustomerReq();
+ req.setExternalUserid(Collections.emptyList());
+ req.setHandOverUserid("123");
+ req.setTakeOverUserid("234");
+ WxCpBaseResp result = this.wxCpService.getExternalContactService().resignedTransferCustomer(req);
+
+ System.out.println(result);
+ assertNotNull(result);
+ }
+
+ @Test
+ public void testresignedTrnsferResult() throws WxErrorException {
+ WxCpUserTransferResultResp result = this.wxCpService.getExternalContactService().resignedTransferResult("123", "234", "");
+ System.out.println(result);
+ assertNotNull(result);
+ }
+
+ @Test
+ public void testListGroupChat() throws WxErrorException {
+ WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(0, 100 ,0,new String[1],new String[1]);
+ System.out.println(result);
+ assertNotNull(result);
}
@Test
public void testGetGroupChat() {
}
+ @Test
+ public void testTransferGroupChat() throws WxErrorException {
+ String[] str = {"wri1_QEAAATfnZl_VJ4hlQda0e4Mgf1A"};
+ WxCpUserExternalGroupChatTransferResp result = this.wxCpService.getExternalContactService().transferGroupChat(str, "123");
+ System.out.println(result);
+ assertNotNull(result);
+ }
+
@Test
public void testGetUserBehaviorStatistic() {
}
From 1e64a7f7b3e2ecc45c57180bbc16896ca7e4e735 Mon Sep 17 00:00:00 2001
From: arthur0201 <704538660@qq.com>
Date: Wed, 23 Jun 2021 13:47:24 +0800
Subject: [PATCH 0012/1235] =?UTF-8?q?:new:=20#2161=20=E3=80=90=E5=85=AC?=
=?UTF-8?q?=E4=BC=97=E5=8F=B7=E3=80=91=E5=BE=AE=E4=BF=A1=E6=8E=A8=E9=80=81?=
=?UTF-8?q?=E6=B6=88=E6=81=AF=E7=B1=BB=E5=A2=9E=E5=8A=A0=E7=BE=A4=E5=8F=91?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BA=8B=E4=BB=B6=E7=9B=B8=E5=85=B3=E5=AD=97?=
=?UTF-8?q?=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/me/chanjar/weixin/common/api/WxConsts.java | 11 +++++++++++
.../external/contact/WxCpExternalContactInfo.java | 3 +++
2 files changed, 14 insertions(+)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
index cfc7fc0f37..3e08462017 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
@@ -156,6 +156,12 @@ public static class MassMsgStatus {
public static final String ERR_20013 = "err(20013)";
public static final String ERR_22000 = "err(22000)";
public static final String ERR_21000 = "err(21000)";
+ public static final String ERR_30001 = "err(30001)";
+ public static final String ERR_30002 = "err(30002)";
+ public static final String ERR_30003 = "err(30003)";
+ public static final String ERR_40001 = "err(40001)";
+ public static final String ERR_40002 = "err(40002)";
+
/**
* 群发反馈消息代码所对应的文字描述.
@@ -174,6 +180,11 @@ public static class MassMsgStatus {
STATUS_DESC.put(ERR_20013, "涉嫌版权");
STATUS_DESC.put(ERR_22000, "涉嫌互推_互相宣传");
STATUS_DESC.put(ERR_21000, "涉嫌其他");
+ STATUS_DESC.put(ERR_30001, "原创校验出现系统错误且用户选择了被判为转载就不群发");
+ STATUS_DESC.put(ERR_30002, "原创校验被判定为不能群发");
+ STATUS_DESC.put(ERR_30003, "原创校验被判定为转载文且用户选择了被判为转载就不群发");
+ STATUS_DESC.put(ERR_40001, "管理员拒绝");
+ STATUS_DESC.put(ERR_40002, "管理员30分钟内无响应,超时");
}
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactInfo.java
index bd7229384c..468aa53f1e 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactInfo.java
@@ -26,6 +26,9 @@ public class WxCpExternalContactInfo implements Serializable {
@SerializedName("follow_user")
private List followedUsers;
+ @SerializedName("next_cursor")
+ private String nextCursor;
+
public static WxCpExternalContactInfo fromJson(String json) {
return WxCpGsonBuilder.create().fromJson(json, WxCpExternalContactInfo.class);
}
From 71289e4deadef7b1861356c56c61b4dd6e5629e2 Mon Sep 17 00:00:00 2001
From: pg
Date: Wed, 23 Jun 2021 16:12:19 +0800
Subject: [PATCH 0013/1235] =?UTF-8?q?:bug:=20#2148=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BF=AE=E5=A4=8D=E4=BA=92?=
=?UTF-8?q?=E8=81=94=E4=BC=81=E4=B8=9A=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E=E5=AD=97=E6=AE=B5=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/api/WxCpMessageService.java | 7 +---
.../cp/api/impl/WxCpMessageServiceImpl.java | 9 ++---
.../WxCpLinkedCorpMessageSendResult.java | 38 +++++++++++++++++++
3 files changed, 43 insertions(+), 11 deletions(-)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpLinkedCorpMessageSendResult.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageService.java
index fae0a6a0d6..1b66d00c07 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageService.java
@@ -1,10 +1,7 @@
package me.chanjar.weixin.cp.api;
import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.cp.bean.message.WxCpLinkedCorpMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
-import me.chanjar.weixin.cp.bean.message.WxCpMessageSendStatistics;
+import me.chanjar.weixin.cp.bean.message.*;
/**
* 消息推送接口.
@@ -52,5 +49,5 @@ public interface WxCpMessageService {
* @return the wx cp message send result
* @throws WxErrorException the wx error exception
*/
- WxCpMessageSendResult sendLinkedCorpMessage(WxCpLinkedCorpMessage message) throws WxErrorException;
+ WxCpLinkedCorpMessageSendResult sendLinkedCorpMessage(WxCpLinkedCorpMessage message) throws WxErrorException;
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMessageServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMessageServiceImpl.java
index 07824c2183..9be2f60dfe 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMessageServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMessageServiceImpl.java
@@ -5,10 +5,7 @@
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.api.WxCpMessageService;
import me.chanjar.weixin.cp.api.WxCpService;
-import me.chanjar.weixin.cp.bean.message.WxCpLinkedCorpMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpMessage;
-import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
-import me.chanjar.weixin.cp.bean.message.WxCpMessageSendStatistics;
+import me.chanjar.weixin.cp.bean.message.*;
import me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Message;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
@@ -40,13 +37,13 @@ public WxCpMessageSendStatistics getStatistics(int timeType) throws WxErrorExcep
}
@Override
- public WxCpMessageSendResult sendLinkedCorpMessage(WxCpLinkedCorpMessage message) throws WxErrorException {
+ public WxCpLinkedCorpMessageSendResult sendLinkedCorpMessage(WxCpLinkedCorpMessage message) throws WxErrorException {
Integer agentId = message.getAgentId();
if (null == agentId) {
message.setAgentId(this.cpService.getWxCpConfigStorage().getAgentId());
}
- return WxCpMessageSendResult.fromJson(this.cpService.post(this.cpService.getWxCpConfigStorage()
+ return WxCpLinkedCorpMessageSendResult.fromJson(this.cpService.post(this.cpService.getWxCpConfigStorage()
.getApiUrl(Message.LINKEDCORP_MESSAGE_SEND), message.toJson()));
}
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpLinkedCorpMessageSendResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpLinkedCorpMessageSendResult.java
new file mode 100644
index 0000000000..2955df54c6
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpLinkedCorpMessageSendResult.java
@@ -0,0 +1,38 @@
+package me.chanjar.weixin.cp.bean.message;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Getter;
+import lombok.Setter;
+import me.chanjar.weixin.cp.bean.WxCpBaseResp;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+/**
+ * 互联企业的消息推送接口返回实体
+ *
+ * @author pg
+ * @date 2021年6月22日
+ */
+@Setter
+@Getter
+public class WxCpLinkedCorpMessageSendResult extends WxCpBaseResp {
+ private static final long serialVersionUID = 3990693822996824333L;
+
+ @SerializedName("invaliduser")
+ private String[] invalidUser;
+
+ @SerializedName("invalidparty")
+ private String[] invalidParty;
+
+ @SerializedName("invalidtag")
+ private String[] invalidTag;
+
+ @Override
+ public String toString() {
+ return WxCpGsonBuilder.create().toJson(this);
+ }
+
+ public static WxCpLinkedCorpMessageSendResult fromJson(String json) {
+ return WxCpGsonBuilder.create().fromJson(json, WxCpLinkedCorpMessageSendResult.class);
+ }
+
+}
From 591b2d83c61d78f4c77e870f6d674e75fd7f0be6 Mon Sep 17 00:00:00 2001
From: hywr <33077958+hywr@users.noreply.github.com>
Date: Wed, 23 Jun 2021 16:14:20 +0800
Subject: [PATCH 0014/1235] =?UTF-8?q?:new:=20#2163=20=E3=80=90=E5=BC=80?=
=?UTF-8?q?=E6=94=BE=E5=B9=B3=E5=8F=B0=E3=80=91=E5=A2=9E=E5=8A=A0=E6=9F=A5?=
=?UTF-8?q?=E8=AF=A2=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=8F=AF=E5=9B=9E=E9=80=80?=
=?UTF-8?q?=E7=89=88=E6=9C=AC=E7=9A=84=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../open/api/WxOpenComponentService.java | 2 +
.../weixin/open/api/WxOpenFastMaService.java | 191 +----------------
.../weixin/open/api/WxOpenMaBasicService.java | 199 ++++++++++++++++++
.../weixin/open/api/WxOpenMaService.java | 17 ++
.../api/impl/WxOpenFastMaServiceImpl.java | 2 +
.../api/impl/WxOpenMaBasicServiceImpl.java | 135 ++++++++++++
.../open/api/impl/WxOpenMaServiceImpl.java | 11 +
.../open/bean/ma/WxOpenMaHistoryVersion.java | 34 +++
.../result/WxOpenMaHistoryVersionResult.java | 29 +++
9 files changed, 432 insertions(+), 188 deletions(-)
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaBasicService.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaBasicServiceImpl.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaHistoryVersion.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaHistoryVersionResult.java
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index 26dc2ba7f2..4c7f5b0911 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -148,7 +148,9 @@ public interface WxOpenComponentService {
*
* @param appid .
* @return . wx fast ma service by appid
+ * @deprecated 2021-06-23 本接口原有方法并非仅快速创建小程序的专用接口,普通小程序授权到第三方平台皆可使用,所以请使用 {@link WxOpenMaBasicService} 类替代。获取方法: WxOpenMaService.getBasicService()
*/
+ @Deprecated
WxOpenFastMaService getWxFastMaServiceByAppid(String appid);
/**
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java
index 8710689cdc..2114d1a816 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java
@@ -1,11 +1,6 @@
package me.chanjar.weixin.open.api;
import cn.binarywang.wx.miniapp.api.WxMaService;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.open.bean.ma.WxFastMaCategory;
-import me.chanjar.weixin.open.bean.result.*;
-
-import java.util.List;
/**
*
@@ -16,189 +11,9 @@
*
* @author Hipple
* @date 2019/01/23
+ * @deprecated 2021-06-23 本接口原有方法并非仅快速创建小程序的专用接口,普通小程序授权到第三方平台皆可使用,所以请使用 {@link WxOpenMaBasicService} 类替代。获取方法: WxOpenComponentService.getWxMaServiceByAppid(maApppId).getBasicService()
*/
-public interface WxOpenFastMaService extends WxMaService {
- /**
- * 1 获取帐号基本信息.
- */
- String OPEN_GET_ACCOUNT_BASIC_INFO = "https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo";
-
- /**
- * 2 小程序名称设置及改名.
- */
- String OPEN_SET_NICKNAME = "https://api.weixin.qq.com/wxa/setnickname";
-
- /**
- * 3 小程序改名审核状态查询.
- */
- String OPEN_API_WXA_QUERYNICKNAME = "https://api.weixin.qq.com/wxa/api_wxa_querynickname";
-
- /**
- * 4 微信认证名称检测.
- */
- String OPEN_CHECK_WX_VERIFY_NICKNAME = "https://api.weixin.qq.com/cgi-bin/wxverify/checkwxverifynickname";
-
- /**
- * 5 修改头像.
- */
- String OPEN_MODIFY_HEADIMAGE = "https://api.weixin.qq.com/cgi-bin/account/modifyheadimage";
-
- /**
- * 6修改功能介绍.
- */
- String OPEN_MODIFY_SIGNATURE = "https://api.weixin.qq.com/cgi-bin/account/modifysignature";
-
- /**
- * 7 换绑小程序管理员接口.
- */
- String OPEN_COMPONENT_REBIND_ADMIN = "https://api.weixin.qq.com/cgi-bin/account/componentrebindadmin";
-
- /**
- * 8.1 获取账号可以设置的所有类目
- */
- String OPEN_GET_ALL_CATEGORIES = "https://api.weixin.qq.com/cgi-bin/wxopen/getallcategories";
- /**
- * 8.2 添加类目
- */
- String OPEN_ADD_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/addcategory";
- /**
- * 8.3 删除类目
- */
- String OPEN_DELETE_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/deletecategory";
- /**
- * 8.4 获取账号已经设置的所有类目
- */
- String OPEN_GET_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/getcategory";
- /**
- * 8.5 修改类目
- */
- String OPEN_MODIFY_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/modifycategory";
-
-
- /**
- * 1.获取小程序的信息
- *
- * @return .
- * @throws WxErrorException .
- */
- WxFastMaAccountBasicInfoResult getAccountBasicInfo() throws WxErrorException;
-
- /**
- * 2.小程序名称设置及改名
- *
- * 若接口未返回audit_id,说明名称已直接设置成功,无需审核;若返回audit_id则名称正在审核中。
- *
- *
- * @param nickname 昵称
- * @param idCard 身份证照片–临时素材mediaid(个人号必填)
- * @param license 组织机构代码证或营业执照–临时素材mediaid(组织号必填)
- * @param namingOtherStuff1 其他证明材料---临时素材 mediaid
- * @param namingOtherStuff2 其他证明材料---临时素材 mediaid
- * @return .
- * @throws WxErrorException .
- */
- WxFastMaSetNickameResult setNickname(String nickname, String idCard, String license, String namingOtherStuff1,
- String namingOtherStuff2) throws WxErrorException;
-
- /**
- * 3 小程序改名审核状态查询
- *
- * @param auditId 审核单id
- * @return .
- * @throws WxErrorException .
- */
- WxFastMaQueryNicknameStatusResult querySetNicknameStatus(String auditId) throws WxErrorException;
-
- /**
- * 4. 微信认证名称检测
- *
- * @param nickname 名称
- * @return .
- * @throws WxErrorException .
- */
- WxFastMaCheckNickameResult checkWxVerifyNickname(String nickname) throws WxErrorException;
-
- /**
- * 5.修改头像
- *
- * 图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M
- * 注:实际头像始终为正方形
- *
- *
- * @param headImgMediaId 头像素材media_id
- * @param x1 裁剪框左上角x坐标(取值范围:[0, 1])
- * @param y1 裁剪框左上角y坐标(取值范围:[0, 1])
- * @param x2 裁剪框右下角x坐标(取值范围:[0, 1])
- * @param y2 裁剪框右下角y坐标(取值范围:[0, 1])
- * @return .
- * @throws WxErrorException .
- */
- WxOpenResult modifyHeadImage(String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException;
-
- /**
- * 6.修改功能介绍
- *
- * @param signature 简介:4-120字
- * @return .
- * @throws WxErrorException .
- */
- WxOpenResult modifySignature(String signature) throws WxErrorException;
-
- /**
- * 7.3 管理员换绑
- *
- * @param taskId 换绑管理员任务序列号(公众平台最终点击提交回跳到第三方平台时携带)
- * @return .
- * @throws WxErrorException .
- */
- WxOpenResult componentRebindAdmin(String taskId) throws WxErrorException;
-
- /**
- * 8.1 获取账号可以设置的所有类目
- *
- * 因为不同类目含有特定字段
- * 目前没有完整的类目信息数据
- * 为保证兼容性,放弃将response转换为实体
- *
- *
- * @return .
- * @throws WxErrorException .
- */
- String getAllCategories() throws WxErrorException;
-
- /**
- * 8.2添加类目
- *
- * @param categoryList 类目列表
- * @return .
- * @throws WxErrorException .
- */
- WxOpenResult addCategory(List categoryList) throws WxErrorException;
-
- /**
- * 8.3删除类目
- *
- * @param first 一级类目ID
- * @param second 二级类目ID
- * @return .
- * @throws WxErrorException .
- */
- WxOpenResult deleteCategory(int first, int second) throws WxErrorException;
-
- /**
- * 8.4获取账号已经设置的所有类目
- *
- * @return .
- * @throws WxErrorException .
- */
- WxFastMaBeenSetCategoryResult getCategory() throws WxErrorException;
+@Deprecated
+public interface WxOpenFastMaService extends WxOpenMaBasicService, WxMaService {
- /**
- * 8.5修改类目
- *
- * @param category 实体
- * @return .
- * @throws WxErrorException .
- */
- WxOpenResult modifyCategory(WxFastMaCategory category) throws WxErrorException;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaBasicService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaBasicService.java
new file mode 100644
index 0000000000..194da4b9b3
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaBasicService.java
@@ -0,0 +1,199 @@
+package me.chanjar.weixin.open.api;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.bean.ma.WxFastMaCategory;
+import me.chanjar.weixin.open.bean.result.*;
+
+import java.util.List;
+
+/**
+ * 微信第三方平台 小程序基础信息接口 (小程序名称、头像、描述、类目等信息设置)
+ * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/category/getallcategories.html
+ *
+ * @author 广州跨界
+ */
+public interface WxOpenMaBasicService {
+ /**
+ * 1 获取帐号基本信息.
+ */
+ String OPEN_GET_ACCOUNT_BASIC_INFO = "https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo";
+
+ /**
+ * 2 小程序名称设置及改名.
+ */
+ String OPEN_SET_NICKNAME = "https://api.weixin.qq.com/wxa/setnickname";
+
+ /**
+ * 3 小程序改名审核状态查询.
+ */
+ String OPEN_API_WXA_QUERYNICKNAME = "https://api.weixin.qq.com/wxa/api_wxa_querynickname";
+
+ /**
+ * 4 微信认证名称检测.
+ */
+ String OPEN_CHECK_WX_VERIFY_NICKNAME = "https://api.weixin.qq.com/cgi-bin/wxverify/checkwxverifynickname";
+
+ /**
+ * 5 修改头像.
+ */
+ String OPEN_MODIFY_HEADIMAGE = "https://api.weixin.qq.com/cgi-bin/account/modifyheadimage";
+
+ /**
+ * 6修改功能介绍.
+ */
+ String OPEN_MODIFY_SIGNATURE = "https://api.weixin.qq.com/cgi-bin/account/modifysignature";
+
+ /**
+ * 7 换绑小程序管理员接口.
+ */
+ String OPEN_COMPONENT_REBIND_ADMIN = "https://api.weixin.qq.com/cgi-bin/account/componentrebindadmin";
+
+ /**
+ * 8.1 获取账号可以设置的所有类目
+ */
+ String OPEN_GET_ALL_CATEGORIES = "https://api.weixin.qq.com/cgi-bin/wxopen/getallcategories";
+ /**
+ * 8.2 添加类目
+ */
+ String OPEN_ADD_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/addcategory";
+ /**
+ * 8.3 删除类目
+ */
+ String OPEN_DELETE_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/deletecategory";
+ /**
+ * 8.4 获取账号已经设置的所有类目
+ */
+ String OPEN_GET_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/getcategory";
+ /**
+ * 8.5 修改类目
+ */
+ String OPEN_MODIFY_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/modifycategory";
+
+
+ /**
+ * 1.获取小程序的信息
+ *
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxFastMaAccountBasicInfoResult getAccountBasicInfo() throws WxErrorException;
+
+ /**
+ * 2.小程序名称设置及改名
+ *
+ * 若接口未返回audit_id,说明名称已直接设置成功,无需审核;若返回audit_id则名称正在审核中。
+ *
+ *
+ * @param nickname 昵称
+ * @param idCard 身份证照片–临时素材mediaid(个人号必填)
+ * @param license 组织机构代码证或营业执照–临时素材mediaid(组织号必填)
+ * @param namingOtherStuff1 其他证明材料---临时素材 mediaid
+ * @param namingOtherStuff2 其他证明材料---临时素材 mediaid
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxFastMaSetNickameResult setNickname(String nickname, String idCard, String license, String namingOtherStuff1,
+ String namingOtherStuff2) throws WxErrorException;
+
+ /**
+ * 3 小程序改名审核状态查询
+ *
+ * @param auditId 审核单id
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxFastMaQueryNicknameStatusResult querySetNicknameStatus(String auditId) throws WxErrorException;
+
+ /**
+ * 4. 微信认证名称检测
+ *
+ * @param nickname 名称
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxFastMaCheckNickameResult checkWxVerifyNickname(String nickname) throws WxErrorException;
+
+ /**
+ * 5.修改头像
+ *
+ * 图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M
+ * 注:实际头像始终为正方形
+ *
+ *
+ * @param headImgMediaId 头像素材media_id
+ * @param x1 裁剪框左上角x坐标(取值范围:[0, 1])
+ * @param y1 裁剪框左上角y坐标(取值范围:[0, 1])
+ * @param x2 裁剪框右下角x坐标(取值范围:[0, 1])
+ * @param y2 裁剪框右下角y坐标(取值范围:[0, 1])
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxOpenResult modifyHeadImage(String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException;
+
+ /**
+ * 6.修改功能介绍
+ *
+ * @param signature 简介:4-120字
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxOpenResult modifySignature(String signature) throws WxErrorException;
+
+ /**
+ * 7.3 管理员换绑
+ *
+ * @param taskId 换绑管理员任务序列号(公众平台最终点击提交回跳到第三方平台时携带)
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxOpenResult componentRebindAdmin(String taskId) throws WxErrorException;
+
+ /**
+ * 8.1 获取账号可以设置的所有类目
+ *
+ * 因为不同类目含有特定字段
+ * 目前没有完整的类目信息数据
+ * 为保证兼容性,放弃将response转换为实体
+ *
+ *
+ * @return .
+ * @throws WxErrorException .
+ */
+ String getAllCategories() throws WxErrorException;
+
+ /**
+ * 8.2添加类目
+ *
+ * @param categoryList 类目列表
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxOpenResult addCategory(List categoryList) throws WxErrorException;
+
+ /**
+ * 8.3删除类目
+ *
+ * @param first 一级类目ID
+ * @param second 二级类目ID
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxOpenResult deleteCategory(int first, int second) throws WxErrorException;
+
+ /**
+ * 8.4获取账号已经设置的所有类目
+ *
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxFastMaBeenSetCategoryResult getCategory() throws WxErrorException;
+
+ /**
+ * 8.5修改类目
+ *
+ * @param category 实体
+ * @return .
+ * @throws WxErrorException .
+ */
+ WxOpenResult modifyCategory(WxFastMaCategory category) throws WxErrorException;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
index ccaeeff019..9732e614ac 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
@@ -452,6 +452,16 @@ WxOpenMaDomainResult modifyDomain(String action, List requestDomains, Li
*/
WxOpenResult revertCodeRelease() throws WxErrorException;
+ /**
+ * 获取可回退的小程序版本
+ * 调用本接口可以获取可回退的小程序版本(最多保存最近发布或回退的5个版本
+ * 文档地址: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/get_history_version.html
+ *
+ * @return 历史版本信息
+ * @throws WxErrorException 如果调用微信接口失败抛出此异常
+ */
+ WxOpenMaHistoryVersionResult getHistoryVersion() throws WxErrorException;
+
/**
* 15. 小程序审核撤回
*
@@ -583,4 +593,11 @@ WxOpenMaDomainResult modifyDomain(String action, List requestDomains, Li
* @throws WxErrorException the wx error exception
*/
WxOpenResult publishQrcodeJump(String prefix) throws WxErrorException;
+
+ /**
+ * 小程序基础信息服务 (小程序名称、头像、描述、类目等信息设置)
+ *
+ * @return 小程序基础信息服务
+ */
+ WxOpenMaBasicService getBasicService();
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java
index 2cea9530bb..f5f2160d21 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java
@@ -20,7 +20,9 @@
*
* @author Hipple
* @since 2019/1/23 15:27
+ * @deprecated 请使用 {@link WxOpenMaServiceImpl} 替代
*/
+@Deprecated
public class WxOpenFastMaServiceImpl extends WxMaServiceImpl implements WxOpenFastMaService {
private final WxOpenComponentService wxOpenComponentService;
private final WxMaConfig wxMaConfig;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaBasicServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaBasicServiceImpl.java
new file mode 100644
index 0000000000..4e4db75257
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaBasicServiceImpl.java
@@ -0,0 +1,135 @@
+package me.chanjar.weixin.open.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.api.WxOpenMaBasicService;
+import me.chanjar.weixin.open.bean.ma.WxFastMaCategory;
+import me.chanjar.weixin.open.bean.result.*;
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 微信第三方平台 小程序基础信息接口
+ *
+ * @author 广州跨界
+ */
+public class WxOpenMaBasicServiceImpl implements WxOpenMaBasicService {
+
+ private final WxMaService wxMaService;
+
+ public WxOpenMaBasicServiceImpl(WxMaService wxMaService) {
+ this.wxMaService = wxMaService;
+ }
+
+
+ @Override
+ public WxFastMaAccountBasicInfoResult getAccountBasicInfo() throws WxErrorException {
+ String response = wxMaService.get(OPEN_GET_ACCOUNT_BASIC_INFO, "");
+ return WxOpenGsonBuilder.create().fromJson(response, WxFastMaAccountBasicInfoResult.class);
+ }
+
+ @Override
+ public WxFastMaSetNickameResult setNickname(String nickname, String idCard, String license, String namingOtherStuff1, String namingOtherStuff2) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("nick_name", nickname);
+ params.addProperty("id_card", idCard);
+ params.addProperty("license", license);
+ params.addProperty("naming_other_stuff_1", namingOtherStuff1);
+ params.addProperty("naming_other_stuff_2", namingOtherStuff2);
+ String response = wxMaService.post(OPEN_SET_NICKNAME, params);
+ return WxOpenGsonBuilder.create().fromJson(response, WxFastMaSetNickameResult.class);
+ }
+
+ @Override
+ public WxFastMaQueryNicknameStatusResult querySetNicknameStatus(String auditId) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("audit_id", auditId);
+ String response = wxMaService.post(OPEN_API_WXA_QUERYNICKNAME, params);
+ return WxOpenGsonBuilder.create().fromJson(response, WxFastMaQueryNicknameStatusResult.class);
+ }
+
+ @Override
+ public WxFastMaCheckNickameResult checkWxVerifyNickname(String nickname) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("nick_name", nickname);
+ String response = wxMaService.post(OPEN_CHECK_WX_VERIFY_NICKNAME, params);
+ return WxOpenGsonBuilder.create().fromJson(response, WxFastMaCheckNickameResult.class);
+ }
+
+ @Override
+ public WxOpenResult modifyHeadImage(String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("head_img_media_id", headImgMediaId);
+ params.addProperty("x1", x1);
+ params.addProperty("y1", y1);
+ params.addProperty("x2", x2);
+ params.addProperty("y2", y2);
+ String response = wxMaService.post(OPEN_MODIFY_HEADIMAGE, params);
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult modifySignature(String signature) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("signature", signature);
+ String response = wxMaService.post(OPEN_MODIFY_SIGNATURE, params);
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult componentRebindAdmin(String taskid) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("taskid", taskid);
+ String response = wxMaService.post(OPEN_COMPONENT_REBIND_ADMIN, params);
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public String getAllCategories() throws WxErrorException {
+ return wxMaService.get(OPEN_GET_ALL_CATEGORIES, "");
+ }
+
+ @Override
+ public WxOpenResult addCategory(List categoryList) throws WxErrorException {
+ Map map = new HashMap<>();
+ map.put("categories", categoryList);
+ String response = wxMaService.post(OPEN_ADD_CATEGORY, WxOpenGsonBuilder.create().toJson(map));
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult deleteCategory(int first, int second) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("first", first);
+ params.addProperty("second", second);
+ String response = wxMaService.post(OPEN_DELETE_CATEGORY, params);
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxFastMaBeenSetCategoryResult getCategory() throws WxErrorException {
+ String response = wxMaService.get(OPEN_GET_CATEGORY, "");
+ return WxOpenGsonBuilder.create().fromJson(response, WxFastMaBeenSetCategoryResult.class);
+ }
+
+ @Override
+ public WxOpenResult modifyCategory(WxFastMaCategory category) throws WxErrorException {
+ String response = wxMaService.post(OPEN_MODIFY_CATEGORY, category);
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ private JsonArray toJsonArray(List strList) {
+ JsonArray jsonArray = new JsonArray();
+ if (strList != null && !strList.isEmpty()) {
+ for (String str : strList) {
+ jsonArray.add(str);
+ }
+ }
+ return jsonArray;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
index 24d9e23414..9febf639f4 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
@@ -7,8 +7,10 @@
import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
+import lombok.Getter;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.open.api.WxOpenComponentService;
+import me.chanjar.weixin.open.api.WxOpenMaBasicService;
import me.chanjar.weixin.open.api.WxOpenMaService;
import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
import me.chanjar.weixin.open.bean.ma.WxMaQrcodeParam;
@@ -34,11 +36,14 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
private final WxOpenComponentService wxOpenComponentService;
private final WxMaConfig wxMaConfig;
private final String appId;
+ @Getter
+ private final WxOpenMaBasicService basicService;
public WxOpenMaServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) {
this.wxOpenComponentService = wxOpenComponentService;
this.appId = appId;
this.wxMaConfig = wxMaConfig;
+ this.basicService = new WxOpenMaBasicServiceImpl(this);
initHttp();
}
@@ -247,6 +252,12 @@ public WxOpenResult revertCodeRelease() throws WxErrorException {
return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
}
+ @Override
+ public WxOpenMaHistoryVersionResult getHistoryVersion() throws WxErrorException {
+ String response = get(API_REVERT_CODE_RELEASE, "action=get_history_version");
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenMaHistoryVersionResult.class);
+ }
+
@Override
public WxOpenResult undoCodeAudit() throws WxErrorException {
String response = get(API_UNDO_CODE_AUDIT, null);
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaHistoryVersion.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaHistoryVersion.java
new file mode 100644
index 0000000000..6ef41c8bef
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaHistoryVersion.java
@@ -0,0 +1,34 @@
+package me.chanjar.weixin.open.bean.ma;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 微信开放平台小程序 可回退的小程序版本
+ *
+ * @author 广州跨界
+ */
+@Data
+public class WxOpenMaHistoryVersion implements Serializable {
+ private static final long serialVersionUID = 98923601148793365L;
+
+ @SerializedName("app_version")
+ private Integer appVersion;
+
+ @SerializedName("user_version")
+ private String userVersion;
+
+ @SerializedName("user_desc")
+ private String userDesc;
+
+ @SerializedName("commit_time")
+ private Integer commitTime;
+
+ @Override
+ public String toString() {
+ return WxOpenGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaHistoryVersionResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaHistoryVersionResult.java
new file mode 100644
index 0000000000..61b9f5dddf
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenMaHistoryVersionResult.java
@@ -0,0 +1,29 @@
+package me.chanjar.weixin.open.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.open.bean.ma.WxOpenMaHistoryVersion;
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 微信开放平台小程序 可回退的小程序版本 返回
+ *
+ * @author 广州跨界
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxOpenMaHistoryVersionResult extends WxOpenResult {
+ private static final long serialVersionUID = 4102311851687901079L;
+
+ @SerializedName("template_list")
+ List templateList;
+
+ @Override
+ public String toString() {
+ return WxOpenGsonBuilder.create().toJson(this);
+ }
+
+}
From b6d4b5e9022626870298478c4c76fbf135168c4f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 24 Jun 2021 10:44:43 +0800
Subject: [PATCH 0015/1235] :arrow_up: Bump jetty-server from 9.4.38.v20210224
to 9.4.41.v20210516 (#2164)
Bumps [jetty-server](https://github.com/eclipse/jetty.project) from 9.4.38.v20210224 to 9.4.41.v20210516.
- [Release notes](https://github.com/eclipse/jetty.project/releases)
- [Commits](https://github.com/eclipse/jetty.project/compare/jetty-9.4.38.v20210224...jetty-9.4.41.v20210516)
---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-server
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 83469f8ee5..9c230a0b66 100644
--- a/pom.xml
+++ b/pom.xml
@@ -119,7 +119,7 @@
UTF-8
4.5.13
- 9.4.38.v20210224
+ 9.4.41.v20210516
From e3f785f0065b9e3b4e5127a8d69b7f65f560ae96 Mon Sep 17 00:00:00 2001
From: ParkerJX
Date: Sat, 26 Jun 2021 21:08:48 +0800
Subject: [PATCH 0016/1235] =?UTF-8?q?:bug:=20#2171=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E7=AC=AC=E4=B8=89=E6=96=B9?=
=?UTF-8?q?=E5=BA=94=E7=94=A8CORP=5FJSAPI=5FTICKET=20,SUITE=5FJSAPI=5FTICK?=
=?UTF-8?q?ET=20=20=E8=8E=B7=E5=8F=96=20ticket=20=E5=A4=B1=E6=95=88?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/cp/tp/service/WxCpTpService.java | 11 +++++++++++
.../cp/tp/service/impl/BaseWxCpTpServiceImpl.java | 9 +++++++--
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/WxCpTpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/WxCpTpService.java
index 60f937122a..bd44911feb 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/WxCpTpService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/WxCpTpService.java
@@ -255,6 +255,17 @@ public interface WxCpTpService {
*/
String get(String url, String queryParam) throws WxErrorException;
+ /**
+ * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求.
+ *
+ * @param url 接口地址
+ * @param queryParam 请求参数
+ * @param withoutSuiteAccessToken 请求是否忽略SuiteAccessToken 默认不忽略-false
+ * @return the string
+ * @throws WxErrorException the wx error exception
+ */
+ String get(String url, String queryParam, boolean withoutSuiteAccessToken) throws WxErrorException;
+
/**
* 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求.
*
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java
index f681679b90..89903d6f00 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java
@@ -146,7 +146,7 @@ public String getSuiteJsApiTicket(String authCorpId) throws WxErrorException {
if (this.configStorage.isAuthSuiteJsApiTicketExpired(authCorpId)) {
String resp = get(configStorage.getApiUrl(GET_SUITE_JSAPI_TICKET),
- "type=agent_config&access_token=" + this.configStorage.getAccessToken(authCorpId));
+ "type=agent_config&access_token=" + this.configStorage.getAccessToken(authCorpId), true);
JsonObject jsonObject = GsonParser.parse(resp);
if (jsonObject.get("errcode").getAsInt() == 0) {
@@ -176,7 +176,7 @@ public String getAuthCorpJsApiTicket(String authCorpId) throws WxErrorException
if (this.configStorage.isAuthCorpJsApiTicketExpired(authCorpId)) {
String resp = get(configStorage.getApiUrl(GET_AUTH_CORP_JSAPI_TICKET),
- "access_token=" + this.configStorage.getAccessToken(authCorpId));
+ "access_token=" + this.configStorage.getAccessToken(authCorpId), true);
JsonObject jsonObject = GsonParser.parse(resp);
if (jsonObject.get("errcode").getAsInt() == 0) {
@@ -303,6 +303,11 @@ public String get(String url, String queryParam) throws WxErrorException {
return execute(SimpleGetRequestExecutor.create(this), url, queryParam);
}
+ @Override
+ public String get(String url, String queryParam, boolean withoutSuiteAccessToken) throws WxErrorException {
+ return execute(SimpleGetRequestExecutor.create(this), url, queryParam, withoutSuiteAccessToken);
+ }
+
@Override
public String post(String url, String postData) throws WxErrorException {
return execute(SimplePostRequestExecutor.create(this), url, postData,false);
From 577b7569122d826a77a38008678e7e4b5621e695 Mon Sep 17 00:00:00 2001
From: pg
Date: Sat, 26 Jun 2021 21:09:57 +0800
Subject: [PATCH 0017/1235] =?UTF-8?q?:new:=20#2120=20=E3=80=90=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E3=80=91=E5=BE=AE=E4=BF=A1=E5=88=86?=
=?UTF-8?q?=E8=B4=A6=E6=9C=8D=E5=8A=A1=E7=B1=BB=E5=A2=9E=E5=8A=A0v3?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ProfitSharingReceiver.java | 144 +++++++++++++++
.../profitsharingV3/ProfitSharingRequest.java | 77 ++++++++
.../profitsharingV3/ProfitSharingResult.java | 172 ++++++++++++++++++
.../ProfitSharingReturnRequest.java | 82 +++++++++
.../ProfitSharingReturnResult.java | 141 ++++++++++++++
.../ProfitSharingUnfreezeRequest.java | 54 ++++++
.../ProfitSharingUnfreezeResult.java | 162 +++++++++++++++++
.../ProfitSharingUnsplitResult.java | 39 ++++
.../wxpay/service/ProfitSharingV3Service.java | 164 +++++++++++++++++
.../wxpay/service/WxPayService.java | 9 +
.../service/impl/BaseWxPayServiceImpl.java | 6 +
.../impl/ProfitSharingV3ServiceImpl.java | 85 +++++++++
12 files changed, 1135 insertions(+)
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReceiver.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReturnRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReturnResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnfreezeRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnfreezeResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnsplitResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingV3Service.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingV3ServiceImpl.java
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReceiver.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReceiver.java
new file mode 100644
index 0000000000..cbdeeba285
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReceiver.java
@@ -0,0 +1,144 @@
+package com.github.binarywang.wxpay.bean.profitsharingV3;
+
+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 java.io.Serializable;
+
+/**
+ *
+ * 微信V3接口 分账接收方实体
+ * @author pg
+ * @date 2021-6-25
+ *
+ */
+@Data
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProfitSharingReceiver implements Serializable {
+ private static final long serialVersionUID = -4391888575149767840L;
+
+ /**
+ *
+ * 字段名:应用ID
+ * 是否必填:是
+ * 描述:微信分配的商户appid
+ *
+ */
+ @SerializedName("appid")
+ private String appid;
+
+ /**
+ *
+ * 字段名:分账接收方类型
+ * 是否必填:是
+ * 描述:
+ * 1、MERCHANT_ID:商户号
+ * 2、PERSONAL_OPENID:个人openid(由父商户APPID转换得到)
+ *
+ */
+ @SerializedName("type")
+ private String type;
+
+ /**
+ *
+ * 字段名:分账接收方帐号
+ * 是否必填:是
+ * 描述:
+ * 1、分账接收方类型为MERCHANT_ID时,分账接收方账号为商户号
+ * 2、分账接收方类型为PERSONAL_OPENID时,分账接收方账号为个人openid
+ *
+ */
+ @SerializedName("account")
+ private String account;
+
+ /**
+ *
+ * 字段名:分账个人接收方姓名
+ * 是否必填:否
+ * 描述:
+ * 可选项,在接收方类型为个人的时可选填,若有值,会检查与 name 是否实名匹配,不匹配会拒绝分账请求
+ * 1、分账接收方类型是PERSONAL_OPENID,是个人姓名的密文(选传,传则校验) 此字段的加密方法详见:敏感信息加密说明
+ * 2、使用微信支付平台证书中的公钥
+ * 3、使用RSAES-OAEP算法进行加密
+ * 4、将请求中HTTP头部的Wechatpay-Serial设置为证书序列号
+ *
+ */
+ @SerializedName("name")
+ @SpecEncrypt
+ private String name;
+
+ /**
+ *
+ * 字段名:与分账方的关系类型
+ * 是否必填:是
+ * 描述:子商户与接收方的关系。 本字段值为枚举:
+ * STORE:门店
+ * STAFF:员工
+ * STORE_OWNER:店主
+ * PARTNER:合作伙伴
+ * HEADQUARTER:总部
+ * BRAND:品牌方
+ * DISTRIBUTOR:分销商
+ * USER:用户
+ * SUPPLIER: 供应商
+ * CUSTOM:自定义
+ *
+ */
+ @SerializedName("relation_type")
+ private String relationType;
+
+ /**
+ *
+ * 字段名:自定义的分账关系
+ * 是否必填:是
+ * 描述:子商户与接收方具体的关系,本字段最多10个字。
+ * 当字段relationType的值为CUSTOM时,本字段必填;
+ * 当字段relationType的值不为CUSTOM时,本字段无需填写。
+ *
+ */
+ @SerializedName("custom_relation")
+ private String customRelation;
+
+ /**
+ *
+ * 字段名:分账描述
+ * 是否必填:是
+ * 描述: 分账的原因描述,分账账单中需要体现
+ *
+ */
+ private String description;
+ /**
+ *
+ * 字段名:分账金额
+ * 是否必填:是
+ * 描述: 分账金额,单位为分,只能为整数,不能超过原订单支付金额及最大分账比例金额
+ *
+ */
+ private Long amount;
+
+ /**
+ * 此构造函数用于分账接口
+ *
+ * @param type MERCHANT_ID:商户ID
+ * PERSONAL_WECHATID:个人微信号PERSONAL_OPENID:个人openid(由父商户APPID转换得到)PERSONAL_SUB_OPENID: 个人sub_openid(由子商户APPID转换得到)
+ * @param account 类型是MERCHANT_ID时,是商户ID
+ * 类型是PERSONAL_WECHATID时,是个人微信号
+ * 类型是PERSONAL_OPENID时,是个人openid
+ * 类型是PERSONAL_SUB_OPENID时,是个人sub_openid
+ * @param amount 分账金额,单位为分,只能为整数,不能超过原订单支付金额及最大分账比例金额
+ * @param description 分账的原因描述,分账账单中需要体现
+ */
+ public ProfitSharingReceiver(String type, String account, Long amount, String description) {
+ this.type = type;
+ this.account = account;
+ this.amount = amount;
+ this.description = description;
+ }
+
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingRequest.java
new file mode 100644
index 0000000000..78122bfbf0
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingRequest.java
@@ -0,0 +1,77 @@
+package com.github.binarywang.wxpay.bean.profitsharingV3;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 微信V3接口
+ * 请求分账API请求实体
+ *
+ * @author pg
+ * @date 2021-6-24
+ */
+@Data
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProfitSharingRequest implements Serializable {
+ private static final long serialVersionUID = 3644929701624280800L;
+
+ /**
+ *
+ * 字段名:应用ID
+ * 是否必填:是
+ * 描述:微信分配的商户appid
+ *
+ */
+ @SerializedName("appid")
+ private String appid;
+
+ /**
+ *
+ * 字段名:微信订单号
+ * 是否必填:是
+ * 描述:微信支付订单号
+ *
+ */
+ @SerializedName("transaction_id")
+ private String transactionId;
+
+ /**
+ *
+ * 字段名:商户分账单号
+ * 是否必填:是
+ * 描述:商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
+ *
+ */
+ @SerializedName("out_order_no")
+ private String outOrderNo;
+
+ /**
+ *
+ * 字段名:分账接收方列表
+ * 是否必填:是
+ * 描述:分账接收方列表,可以设置出资商户作为分账接受方,最多可有50个分账接收方
+ *
+ */
+ @SerializedName("receivers")
+ private List receivers;
+
+ /**
+ *
+ * 字段名:是否解冻剩余未分资金
+ * 是否必填:是
+ * 描述:
+ * 1、如果为true,该笔订单剩余未分账的金额会解冻回分账方商户;
+ * 2、如果为false,该笔订单剩余未分账的金额不会解冻回分账方商户,可以对该笔订单再次进行分账。
+ *
+ */
+ @SerializedName("unfreeze_unsplit")
+ private boolean unfreezeUnsplit;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingResult.java
new file mode 100644
index 0000000000..6e0626f652
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingResult.java
@@ -0,0 +1,172 @@
+package com.github.binarywang.wxpay.bean.profitsharingV3;
+
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 微信V3接口
+ * 请求分账API返回的分账结果实体
+ *
+ * @author pg
+ * @date 2021-6-24
+ */
+@Data
+public class ProfitSharingResult implements Serializable {
+ private static final long serialVersionUID = -6201692412535987502L;
+
+ /**
+ *
+ * 字段名:微信订单号
+ * 是否必填:是
+ * 描述:微信支付订单号
+ *
+ */
+ @SerializedName("transaction_id")
+ private String transactionId;
+
+ /**
+ *
+ * 字段名:商户分账单号
+ * 是否必填:是
+ * 描述:商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
+ *
+ */
+ @SerializedName("out_order_no")
+ private String outOrderNo;
+
+ /**
+ *
+ * 字段名:微信分账单号,
+ * 是否必填:是
+ * 描述:微信系统返回的唯一标识.
+ *
+ */
+ @SerializedName("order_id")
+ private String orderId;
+
+ /**
+ *
+ * 字段名:分账单状态
+ * 是否必填:是
+ * 描述:分账单状态(每个接收方的分账结果请查看receivers中的result字段):
+ * 1、PROCESSING:处理中
+ * 2、FINISHED:分账完成.
+ *
+ */
+ @SerializedName("state")
+ private String state;
+
+ /**
+ * 分账接收方列表
+ */
+ @SerializedName("receivers")
+ private List receivers;
+
+ @Data
+ public static class Receiver implements Serializable {
+ private static final long serialVersionUID = 4240983048700956806L;
+
+ /**
+ *
+ * 字段名:分账接收方类型
+ * 是否必填:是
+ * 描述:
+ * 1、MERCHANT_ID:商户号
+ * 2、PERSONAL_OPENID:个人openid(由父商户APPID转换得到)
+ *
+ */
+ @SerializedName("type")
+ private String type;
+
+ /**
+ *
+ * 字段名:分账接收方帐号
+ * 是否必填:是
+ * 描述:
+ * 1、分账接收方类型为MERCHANT_ID时,分账接收方账号为商户号
+ * 2、分账接收方类型为PERSONAL_OPENID时,分账接收方账号为个人openid
+ *
+ */
+ @SerializedName("account")
+ private String account;
+
+ /**
+ *
+ * 字段名:分账金额
+ * 是否必填:是
+ * 描述: 分账金额,单位为分,只能为整数,不能超过原订单支付金额及最大分账比例金额
+ *
+ */
+ @SerializedName("amount")
+ private Long amount;
+
+ /**
+ *
+ * 字段名:分账描述
+ * 是否必填:是
+ * 描述: 分账的原因描述,分账账单中需要体现
+ *
+ */
+ @SerializedName("description")
+ private String description;
+
+ /**
+ *
+ * 字段名:分账结果
+ * 是否必填:是
+ * 描述:
+ * 1、PENDING:待分账
+ * 2、SUCCESS:分账成功
+ * 3、CLOSED:已关闭
+ *
+ */
+ @SerializedName("result")
+ private String result;
+
+ /**
+ *
+ * 字段名:分账失败原因
+ * 是否必填:是
+ * 描述:包含以下枚举值:
+ * 1、ACCOUNT_ABNORMAL : 分账接收账户异常
+ * 2、NO_RELATION : 分账关系已解除
+ * 3、RECEIVER_HIGH_RISK : 高风险接收方
+ * 4、RECEIVER_REAL_NAME_NOT_VERIFIED : 接收方未实名
+ * 5、NO_AUTH : 分账权限已解除
+ *
+ */
+ @SerializedName("fail_reason")
+ private String failReason;
+
+ /**
+ *
+ * 字段名:分账创建时间
+ * 是否必填:是
+ * 描述:遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,
+ * YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,
+ * HH:mm:ss.sss表示时分秒毫秒,
+ * TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。
+ * 例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ *
+ */
+ @SerializedName("create_time")
+ private String createTime;
+ /**
+ *
+ * 字段名:分账完成时间
+ * 是否必填:是
+ * 描述:遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,
+ * YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,
+ * HH:mm:ss.sss表示时分秒毫秒,
+ * TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。
+ * 例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ *
+ */
+ @SerializedName("finish_time")
+ private String finishTime;
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReturnRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReturnRequest.java
new file mode 100644
index 0000000000..31e26775fb
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReturnRequest.java
@@ -0,0 +1,82 @@
+package com.github.binarywang.wxpay.bean.profitsharingV3;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 微信V3接口
+ * 请求分账回退API请求实体
+ *
+ * @author pg
+ * @date 2021-6-25
+ */
+@Data
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProfitSharingReturnRequest implements Serializable {
+ private static final long serialVersionUID = -2175582517588397426L;
+
+ /**
+ *
+ * 字段名:微信分账单号
+ * 是否必填:是
+ * 描述:微信分账单号,微信系统返回的唯一标识。
+ *
+ */
+ @SerializedName("order_id")
+ private String orderId;
+
+ /**
+ *
+ * 字段名:商户分账单号
+ * 是否必填:是
+ * 描述:商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
+ *
+ */
+ @SerializedName("out_order_no")
+ private String outOrderNo;
+
+ /**
+ *
+ * 字段名:商户回退单号
+ * 是否必填:是
+ * 描述:此回退单号是商户在自己后台生成的一个新的回退单号,在商户后台唯一
+ *
+ */
+ @SerializedName("out_return_no")
+ private String outReturnNo;
+
+ /**
+ *
+ * 字段名:回退商户号
+ * 是否必填:是
+ * 描述:分账回退的出资商户,只能对原分账请求中成功分给商户接收方进行回退
+ *
+ */
+ @SerializedName("return_mchid")
+ private String returnMchid;
+
+ /**
+ *
+ * 字段名:回退金额
+ * 是否必填:是
+ * 描述:需要从分账接收方回退的金额,单位为分,只能为整数,不能超过原始分账单分出给该接收方的金额
+ *
+ */
+ private Long amount;
+
+ /**
+ *
+ * 字段名:回退描述
+ * 是否必填:是
+ * 描述: 分账回退的原因描述
+ *
+ */
+ private String description;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReturnResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReturnResult.java
new file mode 100644
index 0000000000..6e08a9a418
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingReturnResult.java
@@ -0,0 +1,141 @@
+package com.github.binarywang.wxpay.bean.profitsharingV3;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 微信V3接口
+ * 请求分账回退API返回实体
+ *
+ * @author pg
+ * @date 2021-6-25
+ */
+@Data
+public class ProfitSharingReturnResult implements Serializable {
+ private static final long serialVersionUID = -2175582517588397426L;
+
+ /**
+ *
+ * 字段名:微信分账单号
+ * 是否必填:是
+ * 描述:微信分账单号,微信系统返回的唯一标识。
+ *
+ */
+ @SerializedName("order_id")
+ private String orderId;
+
+ /**
+ *
+ * 字段名:商户分账单号
+ * 是否必填:是
+ * 描述:商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
+ *
+ */
+ @SerializedName("out_order_no")
+ private String outOrderNo;
+
+ /**
+ *
+ * 字段名:商户回退单号
+ * 是否必填:是
+ * 描述:此回退单号是商户在自己后台生成的一个新的回退单号,在商户后台唯一
+ *
+ */
+ @SerializedName("out_return_no")
+ private String outReturnNo;
+
+ /**
+ *
+ * 字段名:微信回退单号
+ * 是否必填:是
+ * 描述:微信分账回退单号,微信系统返回的唯一标识
+ *
+ */
+ @SerializedName("return_id")
+ private String returnId;
+
+ /**
+ *
+ * 字段名:回退商户号
+ * 是否必填:是
+ * 描述:分账回退的出资商户,只能对原分账请求中成功分给商户接收方进行回退
+ *
+ */
+ @SerializedName("return_mchid")
+ private String returnMchid;
+
+ /**
+ *
+ * 字段名:回退金额
+ * 是否必填:是
+ * 描述:需要从分账接收方回退的金额,单位为分,只能为整数,不能超过原始分账单分出给该接收方的金额
+ *
+ */
+ private Long amount;
+
+ /**
+ *
+ * 字段名:回退描述
+ * 是否必填:是
+ * 描述: 分账回退的原因描述
+ *
+ */
+ private String description;
+
+ /**
+ *
+ * 字段名:分账结果
+ * 是否必填:是
+ * 描述:
+ * 如果请求返回为处理中,则商户可以通过调用回退结果查询接口获取请求的最终处理结果。
+ * 如果查询到回退结果在处理中,请勿变更商户回退单号,使用相同的参数再次发起分账回退,否则会出现资金风险。
+ * 在处理中状态的回退单如果5天没有成功,会因为超时被设置为已失败。
+ * PROCESSING:处理中
+ * SUCCESS:已成功
+ * FAILED:已失败
+ *
+ */
+ @SerializedName("result")
+ private String result;
+
+ /**
+ *
+ * 字段名:失败原因
+ * 是否必填:是
+ * 描述:失败原因。包含以下枚举值:
+ * ACCOUNT_ABNORMAL : 分账接收方账户异常
+ * TIME_OUT_CLOSED : 超时关单
+ *
+ */
+ @SerializedName("fail_reason")
+ private String failReason;
+
+ /**
+ *
+ * 字段名:分账回退创建时间
+ * 是否必填:是
+ * 描述:遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,
+ * YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,
+ * HH:mm:ss.sss表示时分秒毫秒,
+ * TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。
+ * 例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ *
+ */
+ @SerializedName("create_time")
+ private String createTime;
+ /**
+ *
+ * 字段名:分账回退完成时间
+ * 是否必填:是
+ * 描述:遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,
+ * YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,
+ * HH:mm:ss.sss表示时分秒毫秒,
+ * TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。
+ * 例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ *
+ */
+ @SerializedName("finish_time")
+ private String finishTime;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnfreezeRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnfreezeRequest.java
new file mode 100644
index 0000000000..c79b9b6389
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnfreezeRequest.java
@@ -0,0 +1,54 @@
+package com.github.binarywang.wxpay.bean.profitsharingV3;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 微信V3接口
+ * 解冻剩余资金API请求实体
+ *
+ * @author pg
+ * @date 2021-6-25
+ */
+@Data
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProfitSharingUnfreezeRequest implements Serializable {
+ private static final long serialVersionUID = 6835471990040104843L;
+
+ /**
+ *
+ * 字段名:微信订单号
+ * 是否必填:是
+ * 描述:微信支付订单号
+ *
+ */
+ @SerializedName("transaction_id")
+ private String transactionId;
+
+ /**
+ *
+ * 字段名:商户分账单号
+ * 是否必填:是
+ * 描述:商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
+ *
+ */
+ @SerializedName("out_order_no")
+ private String outOrderNo;
+
+ /**
+ *
+ * 字段名:分账描述
+ * 是否必填:是
+ * 描述: 分账的原因描述,分账账单中需要体现
+ *
+ */
+ @SerializedName("description")
+ private String description;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnfreezeResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnfreezeResult.java
new file mode 100644
index 0000000000..0e67eee4cd
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnfreezeResult.java
@@ -0,0 +1,162 @@
+package com.github.binarywang.wxpay.bean.profitsharingV3;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 微信V3接口
+ * 解冻剩余资金API返回实体
+ *
+ * @author pg
+ * @date 2021-6-25
+ */
+@Data
+public class ProfitSharingUnfreezeResult implements Serializable {
+ private static final long serialVersionUID = 5053171678880645337L;
+
+ /**
+ *
+ * 字段名:微信订单号
+ * 是否必填:是
+ * 描述:微信支付订单号
+ *
+ */
+ @SerializedName("transaction_id")
+ private String transactionId;
+
+ /**
+ *
+ * 字段名:商户分账单号
+ * 是否必填:是
+ * 描述:商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
+ *
+ */
+ @SerializedName("out_order_no")
+ private String outOrderNo;
+
+ /**
+ *
+ * 字段名:微信分账单号
+ * 是否必填:是
+ * 描述:微信分账单号,微信系统返回的唯一标识。
+ *
+ */
+ @SerializedName("order_id")
+ private String orderId;
+
+
+ /**
+ *
+ * 字段名:分账单状态
+ * 是否必填:是
+ * 描述:分账单状态(每个接收方的分账结果请查看receivers中的result字段),枚举值:
+ * 1、PROCESSING:处理中
+ * 2、FINISHED:分账完成
+ *
+ */
+ @SerializedName("state")
+ private String state;
+
+ @Data
+ public static class Receiver implements Serializable {
+ private static final long serialVersionUID = 4240983048700956806L;
+ /**
+ *
+ * 字段名:分账接收方类型
+ * 是否必填:是
+ * 描述:
+ * 1、MERCHANT_ID:商户号
+ * 2、PERSONAL_OPENID:个人openid(由父商户APPID转换得到)
+ *
+ */
+ @SerializedName("type")
+ private String type;
+
+ /**
+ *
+ * 字段名:分账接收方帐号
+ * 是否必填:是
+ * 描述:
+ * 1、分账接收方类型为MERCHANT_ID时,分账接收方账号为商户号
+ * 2、分账接收方类型为PERSONAL_OPENID时,分账接收方账号为个人openid
+ *
+ */
+ @SerializedName("account")
+ private String account;
+
+ /**
+ *
+ * 字段名:分账金额
+ * 是否必填:是
+ * 描述: 分账金额,单位为分,只能为整数,不能超过原订单支付金额及最大分账比例金额
+ *
+ */
+ @SerializedName("amount")
+ private Long amount;
+
+ /**
+ *
+ * 字段名:分账描述
+ * 是否必填:是
+ * 描述: 分账的原因描述,分账账单中需要体现
+ *
+ */
+ @SerializedName("description")
+ private String description;
+
+ /**
+ *
+ * 字段名:分账结果
+ * 是否必填:是
+ * 描述:
+ * 1、PENDING:待分账
+ * 2、SUCCESS:分账成功
+ * 3、CLOSED:已关闭
+ *
+ */
+ @SerializedName("result")
+ private String result;
+
+ /**
+ *
+ * 字段名:分账失败原因
+ * 是否必填:是
+ * 描述:枚举值:
+ * 1、PENDING:待分账
+ * 2、SUCCESS:分账成功
+ * 3、CLOSED:已关闭
+ *
+ */
+ @SerializedName("fail_reason")
+ private String failReason;
+
+ /**
+ *
+ * 字段名:分账创建时间
+ * 是否必填:是
+ * 描述:遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,
+ * YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,
+ * HH:mm:ss.sss表示时分秒毫秒,
+ * TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。
+ * 例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ *
+ */
+ @SerializedName("create_time")
+ private String createTime;
+ /**
+ *
+ * 字段名:分账完成时间
+ * 是否必填:是
+ * 描述:遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,
+ * YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,
+ * HH:mm:ss.sss表示时分秒毫秒,
+ * TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。
+ * 例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ *
+ */
+ @SerializedName("finish_time")
+ private String finishTime;
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnsplitResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnsplitResult.java
new file mode 100644
index 0000000000..2cec40d2be
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharingV3/ProfitSharingUnsplitResult.java
@@ -0,0 +1,39 @@
+package com.github.binarywang.wxpay.bean.profitsharingV3;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 微信V3接口
+ * 查询剩余待分金额API返回实体
+ *
+ * @author pg
+ * @date 2021-6-25
+ */
+@Data
+public class ProfitSharingUnsplitResult implements Serializable {
+
+ private static final long serialVersionUID = -7025255772409082288L;
+ /**
+ *
+ * 字段名:微信订单号
+ * 是否必填:是
+ * 描述:微信支付订单号
+ *
+ */
+ @SerializedName("transaction_id")
+ private String transactionId;
+
+ /**
+ *
+ * 字段名:订单剩余待分金额
+ * 是否必填:是
+ * 描述:订单剩余待分金额,整数,单元为分
+ *
+ */
+ @SerializedName("unsplit_amount")
+ private String unsplitAmount;
+
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingV3Service.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingV3Service.java
new file mode 100644
index 0000000000..fcb87063a9
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ProfitSharingV3Service.java
@@ -0,0 +1,164 @@
+package com.github.binarywang.wxpay.service;
+
+import com.github.binarywang.wxpay.bean.profitsharingV3.*;
+import com.github.binarywang.wxpay.exception.WxPayException;
+
+/**
+ * 微信支付V3-资金应用-分账
+ *
+ * @author pg 2021-6-23
+ * @date 2021-6-23
+ */
+public interface ProfitSharingV3Service {
+ /**
+ *
+ * 请求分账API
+ *
+ * 微信订单支付成功后,商户发起分账请求,将结算后的资金分到分账接收方
+ * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_1.shtml
+ * 接口链接: https://api.mch.weixin.qq.com/v3/profitsharing/orders
+ *
+ * 注意:
+ * 对同一笔订单最多能发起20次分账请求,每次请求最多分给50个接收方
+ * 此接口采用异步处理模式,即在接收到商户请求后,优先受理请求再异步处理,最终的分账结果可以通过查询分账接口获取
+ *
+ *
+ * @param request {@link ProfitSharingRequest} 针对某一笔支付订单的分账方法
+ * @return {@link ProfitSharingResult} 微信返回的分账结果
+ * @throws WxPayException the wx pay exception
+ * @see 微信文档
+ */
+ ProfitSharingResult profitSharing(ProfitSharingRequest request) throws WxPayException;
+
+ /**
+ *
+ * 查询分账结果API
+ *
+ * 发起分账请求后,可调用此接口查询分账结果
+ * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_2.shtml
+ * 接口链接:https://api.mch.weixin.qq.com/v3/profitsharing/orders/{out_order_no}
+ *
+ * 注意:
+ * • 发起解冻剩余资金请求后,可调用此接口查询解冻剩余资金的结果
+ *
+ *
+ * @param outOrderNo 商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@ 。
+ * @param transactionId 微信支付订单号
+ * @return {@link ProfitSharingResult} 微信返回的分账结果
+ * @throws WxPayException the wx pay exception
+ * @see 微信文档
+ */
+ ProfitSharingResult getProfitSharingResult(String outOrderNo, String transactionId) throws WxPayException;
+
+ /**
+ *
+ * 请求分账回退API
+ *
+ * 如果订单已经分账,在退款时,可以先调此接口,将已分账的资金从分账接收方的账户回退给分账方,再发起退款
+ * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_3.shtml
+ * 接口链接: https://api.mch.weixin.qq.com/v3/profitsharing/return-orders
+ *
+ * 注意:
+ * • 分账回退以原分账单为依据,支持多次回退,申请回退总金额不能超过原分账单分给该接收方的金额
+ * • 此接口采用同步处理模式,即在接收到商户请求后,会实时返回处理结果
+ * • 对同一笔分账单最多能发起20次分账回退请求
+ * • 退款和分账回退没有耦合,分账回退可以先于退款请求,也可以后于退款请求
+ * • 此功能需要接收方在商户平台-交易中心-分账-分账接收设置下,开启同意分账回退后,才能使用
+ *
+ *
+ * @param request {@link ProfitSharingReturnRequest} 针对某一笔支付订单的分账方法
+ * @return {@link ProfitSharingReturnResult} 微信返回的分账回退结果
+ * @throws WxPayException the wx pay exception
+ * @see 微信文档
+ */
+ ProfitSharingReturnResult profitSharingReturn(ProfitSharingReturnRequest request) throws WxPayException;
+
+ /**
+ *
+ * 查询分账回退结果API
+ *
+ * 商户需要核实回退结果,可调用此接口查询回退结果
+ * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_4.shtml
+ * 接口链接:https://api.mch.weixin.qq.com/v3/profitsharing/return-orders/{out_return_no}
+ *
+ * 注意:
+ * • 如果分账回退接口返回状态为处理中,可调用此接口查询回退结果
+ *
+ *
+ * @param outOrderNo 原发起分账请求时使用的商户系统内部的分账单号
+ * @param outReturnNo 调用回退接口提供的商户系统内部的回退单号
+ * @return {@link ProfitSharingReturnResult} 微信返回的分账回退结果
+ * @throws WxPayException the wx pay exception
+ * @see 微信文档
+ */
+ ProfitSharingReturnResult getProfitSharingReturnResult(String outOrderNo, String outReturnNo) throws WxPayException;
+
+ /**
+ *
+ * 解冻剩余资金API
+ *
+ * 不需要进行分账的订单,可直接调用本接口将订单的金额全部解冻给特约商户
+ * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_5.shtml
+ * 接口链接: https://api.mch.weixin.qq.com/v3/profitsharing/orders/unfreeze
+ *
+ * 注意:
+ * • 调用分账接口后,需要解冻剩余资金时,调用本接口将剩余的分账金额全部解冻给特约商户
+ * • 此接口采用异步处理模式,即在接收到商户请求后,优先受理请求再异步处理,最终的分账结果可以通过查询分账接口获取
+ *
+ *
+ * @param request 解冻剩余资金请求实体 {@link ProfitSharingUnfreezeRequest}
+ * @return {@link ProfitSharingReturnResult} 微信返回的解冻剩余资金结果
+ * @throws WxPayException the wx pay exception
+ * @see 微信文档
+ */
+ ProfitSharingUnfreezeResult profitSharingUnfreeze(ProfitSharingUnfreezeRequest request) throws WxPayException;
+
+ /**
+ *
+ * 查询剩余待分金额API
+ *
+ * 可调用此接口查询订单剩余待分金额
+ * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_6.shtml
+ * 接口链接: https://api.mch.weixin.qq.com/v3/profitsharing/transactions/{transaction_id}/amounts
+ *
+ *
+ * @param transactionId 微信订单号,微信支付订单号
+ * @return {@link ProfitSharingUnsplitResult} 微信返回的订单剩余待分金额结果
+ * @throws WxPayException the wx pay exception
+ * @see 微信文档
+ */
+ ProfitSharingUnsplitResult getProfitSharingUnsplitAmount(String transactionId) throws WxPayException;
+
+ /**
+ *
+ * 添加分账接收方API
+ *
+ * 商户发起添加分账接收方请求,建立分账接收方列表。后续可通过发起分账请求,将分账方商户结算后的资金,分到该分账接收方
+ * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_8.shtml
+ * 接口链接: https://api.mch.weixin.qq.com/v3/profitsharing/receivers/add
+ *
+ *
+ * @param receiver 分账接收方实体 {@link ProfitSharingReceiver}
+ * @return {@link ProfitSharingReceiver} 微信返回的分账接收方结果
+ * @throws WxPayException the wx pay exception
+ * @see 微信文档
+ */
+ ProfitSharingReceiver addProfitSharingReceiver(ProfitSharingReceiver receiver) throws WxPayException;
+
+ /**
+ *
+ * 删除分账接收方API
+ *
+ * 商户发起删除分账接收方请求。删除后,不支持将分账方商户结算后的资金,分到该分账接收方
+ * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_9.shtml
+ * 接口链接: https://api.mch.weixin.qq.com/v3/profitsharing/receivers/delete
+ *
+ *
+ * @param receiver 分账接收方实体 {@link ProfitSharingReceiver}
+ * @return {@link ProfitSharingReceiver} 微信返回的删除的分账接收方结果
+ * @throws WxPayException the wx pay exception
+ * @see 微信文档
+ */
+ ProfitSharingReceiver deleteProfitSharingReceiver(ProfitSharingReceiver receiver) 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 563cf1c529..9b418bcea9 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
@@ -189,11 +189,20 @@ public interface WxPayService {
/**
* 获取分账服务类.
+ *
+ * V3接口 {@link WxPayService#getProfitSharingV3Service()}
+ *
*
* @return the ent pay service
*/
ProfitSharingService getProfitSharingService();
+ /**
+ * 获取V3分账服务类.
+ *
+ * @return the ent pay service
+ */
+ ProfitSharingV3Service getProfitSharingV3Service();
/**
* 获取支付分服务类.
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 a369369f19..d39e22e7dd 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
@@ -64,6 +64,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
private EntPayService entPayService = new EntPayServiceImpl(this);
private final ProfitSharingService profitSharingService = new ProfitSharingServiceImpl(this);
+ private final ProfitSharingV3Service profitSharingV3Service = new ProfitSharingV3ServiceImpl(this);
private final RedpackService redpackService = new RedpackServiceImpl(this);
private final PayScoreService payScoreService = new PayScoreServiceImpl(this);
private final EcommerceService ecommerceService = new EcommerceServiceImpl(this);
@@ -85,6 +86,11 @@ public ProfitSharingService getProfitSharingService() {
return profitSharingService;
}
+ @Override
+ public ProfitSharingV3Service getProfitSharingV3Service() {
+ return profitSharingV3Service;
+ }
+
@Override
public PayScoreService getPayScoreService() {
return payScoreService;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingV3ServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingV3ServiceImpl.java
new file mode 100644
index 0000000000..539836de14
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingV3ServiceImpl.java
@@ -0,0 +1,85 @@
+package com.github.binarywang.wxpay.service.impl;
+
+import com.github.binarywang.wxpay.bean.profitsharingV3.*;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.ProfitSharingV3Service;
+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 lombok.extern.slf4j.Slf4j;
+
+/**
+ * 微信支付V3-资金应用-分账Service
+ *
+ * @author pg 2021-6-23
+ * @version 1.0
+ */
+@Slf4j
+@RequiredArgsConstructor
+public class ProfitSharingV3ServiceImpl implements ProfitSharingV3Service {
+ private static final Gson GSON = new GsonBuilder().create();
+ private final WxPayService payService;
+
+ @Override
+ public ProfitSharingResult profitSharing(ProfitSharingRequest request) throws WxPayException {
+ String url = String.format("%s/v3/profitsharing/orders", this.payService.getPayBaseUrl());
+ RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
+ String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
+ return GSON.fromJson(result, ProfitSharingResult.class);
+ }
+
+ @Override
+ public ProfitSharingResult getProfitSharingResult(String outOrderNo, String transactionId) throws WxPayException {
+ String url = String.format("%s/v3/profitsharing/orders/%s?transaction_id=%s", this.payService.getPayBaseUrl(), outOrderNo, transactionId);
+ String result = this.payService.getV3(url);
+ return GSON.fromJson(result, ProfitSharingResult.class);
+ }
+
+ @Override
+ public ProfitSharingReturnResult profitSharingReturn(ProfitSharingReturnRequest request) throws WxPayException {
+ String url = String.format("%s/v3/profitsharing/return-orders", this.payService.getPayBaseUrl());
+ RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
+ String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
+ return GSON.fromJson(result, ProfitSharingReturnResult.class);
+ }
+
+ @Override
+ public ProfitSharingReturnResult getProfitSharingReturnResult(String outOrderNo, String outReturnNo) throws WxPayException {
+ String url = String.format("%s/v3/profitsharing/return-orders/%s?out_order_no=%s", this.payService.getPayBaseUrl(), outReturnNo, outOrderNo);
+ String result = this.payService.getV3(url);
+ return GSON.fromJson(result, ProfitSharingReturnResult.class);
+ }
+
+ @Override
+ public ProfitSharingUnfreezeResult profitSharingUnfreeze(ProfitSharingUnfreezeRequest request) throws WxPayException {
+ String url = String.format("%s/v3/profitsharing/orders/unfreeze", this.payService.getPayBaseUrl());
+ RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
+ String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
+ return GSON.fromJson(result, ProfitSharingUnfreezeResult.class);
+ }
+
+ @Override
+ public ProfitSharingUnsplitResult getProfitSharingUnsplitAmount(String transactionId) throws WxPayException {
+ String url = String.format("%s/v3/profitsharing/transactions/%s/amounts", this.payService.getPayBaseUrl(), transactionId);
+ String result = this.payService.getV3(url);
+ return GSON.fromJson(result, ProfitSharingUnsplitResult.class);
+ }
+
+ @Override
+ public ProfitSharingReceiver addProfitSharingReceiver(ProfitSharingReceiver request) throws WxPayException {
+ String url = String.format("%s/v3/profitsharing/receivers/add", this.payService.getPayBaseUrl());
+ RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
+ String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
+ return GSON.fromJson(result, ProfitSharingReceiver.class);
+ }
+
+ @Override
+ public ProfitSharingReceiver deleteProfitSharingReceiver(ProfitSharingReceiver request) throws WxPayException {
+ String url = String.format("%s/v3/profitsharing/receivers/delete", this.payService.getPayBaseUrl());
+ RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
+ String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
+ return GSON.fromJson(result, ProfitSharingReceiver.class);
+ }
+}
From fedab8f28a97135821b2096a4706b03aa8d3e0f1 Mon Sep 17 00:00:00 2001
From: TomLiu
Date: Thu, 1 Jul 2021 16:47:48 +0800
Subject: [PATCH 0018/1235] =?UTF-8?q?:new:=20#2185=20=E3=80=90=E5=BC=80?=
=?UTF-8?q?=E6=94=BE=E5=B9=B3=E5=8F=B0=E3=80=91=E5=A2=9E=E5=8A=A0=E5=B0=86?=
=?UTF-8?q?=E8=8D=89=E7=A8=BF=E6=B7=BB=E5=8A=A0=E5=88=B0=E4=BB=A3=E7=A0=81?=
=?UTF-8?q?=E6=A0=87=E5=87=86=E6=A8=A1=E6=9D=BF=E5=BA=93=E7=9A=84=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/open/api/WxOpenComponentService.java | 13 +++++++++++++
.../open/api/impl/WxOpenComponentServiceImpl.java | 8 ++++++++
2 files changed, 21 insertions(+)
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index 4c7f5b0911..5dca7f1503 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -401,14 +401,27 @@ public interface WxOpenComponentService {
List getTemplateList() throws WxErrorException;
/**
+ * 请参考并使用 {@link #addToTemplate(long,int)}.
* 将草稿箱的草稿选为小程序代码模版.
*
* @param draftId 草稿ID,本字段可通过“获取草稿箱内的所有临时代码草稿”接口获得
* @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档
* @see #getTemplateDraftList #getTemplateDraftList
*/
+ @Deprecated
void addToTemplate(long draftId) throws WxErrorException;
+ /**
+ * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/code_template/addtotemplate.html
+ * 将草稿添加到代码模板库.
+ *
+ * @param draftId 草稿ID,本字段可通过“获取草稿箱内的所有临时代码草稿”接口获得
+ * @param templateType 代码模版类型,【普通模板:0, 标准模板:1】
+ * @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档
+ * @see #getTemplateDraftList #getTemplateDraftList
+ */
+ void addToTemplate(long draftId, int templateType) throws WxErrorException;
+
/**
* 删除指定小程序代码模版.
*
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
index bc194aef71..2d0cd828a6 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
@@ -484,6 +484,14 @@ public void addToTemplate(long draftId) throws WxErrorException {
post(ADD_TO_TEMPLATE_URL, param.toString(), "access_token");
}
+ @Override
+ public void addToTemplate(long draftId,int templateType) throws WxErrorException {
+ JsonObject param = new JsonObject();
+ param.addProperty("draft_id", draftId);
+ param.addProperty("template_type", templateType);
+ post(ADD_TO_TEMPLATE_URL, param.toString(), "access_token");
+ }
+
@Override
public void deleteTemplate(long templateId) throws WxErrorException {
JsonObject param = new JsonObject();
From 568d02c25ee22f80cc8021d29df7fe784602881d Mon Sep 17 00:00:00 2001
From: wrinkle
Date: Fri, 2 Jul 2021 09:52:38 +0800
Subject: [PATCH 0019/1235] =?UTF-8?q?:new:=20#2181=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=A2=9E=E5=8A=A0=E6=94=AF?=
=?UTF-8?q?=E6=8C=81=E4=BC=A0=E5=85=A5groupId=E5=8F=82=E6=95=B0=E7=9A=84?=
=?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BC=81=E4=B8=9A=E6=A0=87=E7=AD=BE=E5=BA=93?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/api/WxCpExternalContactService.java | 14 ++++++++++++++
.../api/impl/WxCpExternalContactServiceImpl.java | 14 ++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
index cd65ad3771..cd37f9a947 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
@@ -455,6 +455,20 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
*/
WxCpUserExternalTagGroupList getCorpTagList(String[] tagId) throws WxErrorException;
+ /**
+ *
+ * 企业可通过此接口获取企业客户标签详情。
+ * 若tag_id和group_id均为空,则返回所有标签。
+ * 同时传递tag_id和group_id时,忽略tag_id,仅以group_id作为过滤条件。
+ *
+ *
+ * @param tagId the tag id
+ * @param groupId the tagGroup id
+ * @return corp tag list
+ * @throws WxErrorException the wx error exception
+ */
+ WxCpUserExternalTagGroupList getCorpTagList(String[] tagId, String[] groupId) throws WxErrorException;
+
/**
*
* 企业可通过此接口向客户标签库中添加新的标签组和标签,每个企业最多可配置3000个企业标签。
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
index 8065d21980..c14a7c5c12 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
@@ -334,6 +334,20 @@ public WxCpUserExternalTagGroupList getCorpTagList(String[] tagId) throws WxErro
return WxCpUserExternalTagGroupList.fromJson(result);
}
+ @Override
+ public WxCpUserExternalTagGroupList getCorpTagList(String[] tagId, String[] groupId) throws WxErrorException {
+ JsonObject json = new JsonObject();
+ if (ArrayUtils.isNotEmpty(tagId)) {
+ json.add("tag_id", new Gson().toJsonTree(tagId).getAsJsonArray());
+ }
+ if (ArrayUtils.isNotEmpty(groupId)) {
+ json.add("group_id", new Gson().toJsonTree(groupId).getAsJsonArray());
+ }
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CORP_TAG_LIST);
+ final String result = this.mainService.post(url, json.toString());
+ return WxCpUserExternalTagGroupList.fromJson(result);
+ }
+
@Override
public WxCpUserExternalTagGroupInfo addCorpTag(WxCpUserExternalTagGroupInfo tagGroup) throws WxErrorException {
From 65921f572fb9a2a8aa5da7ebaec7714bd7a6f43f Mon Sep 17 00:00:00 2001
From: pg
Date: Sat, 3 Jul 2021 20:45:42 +0800
Subject: [PATCH 0020/1235] =?UTF-8?q?:art:=20#2178=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E6=9B=B4=E6=96=B0=E8=8E=B7?=
=?UTF-8?q?=E5=8F=96=E5=AE=A2=E6=88=B7=E7=BE=A4=E5=88=97=E8=A1=A8=E7=9A=84?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/api/WxCpExternalContactService.java | 19 ++
.../impl/WxCpExternalContactServiceImpl.java | 18 ++
.../WxCpUserExternalGroupChatList.java | 4 +
.../WxCpExternalContactServiceImplTest.java | 7 +
.../WxPayApplyment4SubCreateRequest.java | 174 ++++++++++++++++++
.../applyment/enums/MicroBizTypeEnum.java | 20 ++
.../bean/applyment/enums/SubjectTypeEnum.java | 4 +
7 files changed, 246 insertions(+)
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/MicroBizTypeEnum.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
index cd37f9a947..c4fe3b9942 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
@@ -321,6 +321,7 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* 微信文档:https://work.weixin.qq.com/api/doc/90000/90135/92119
*
*
+ * @deprecated 请使用 {@link WxCpExternalContactService#listGroupChat(Integer, String, int, String[])}
* @param pageIndex the page index
* @param pageSize the page size
* @param status the status
@@ -329,8 +330,26 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* @return the wx cp user external group chat list
* @throws WxErrorException the wx error exception
*/
+ @Deprecated
WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pageSize, int status, String[] userIds, String[] partyIds) throws WxErrorException;
+ /**
+ *
+ * 该接口用于获取配置过客户群管理的客户群列表。
+ * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
+ * 暂不支持第三方调用。
+ * 微信文档:https://work.weixin.qq.com/api/doc/90000/90135/92119
+ *
+ *
+ * @param limit 分页,预期请求的数据量,取值范围 1 ~ 1000
+ * @param cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填
+ * @param status 客户群跟进状态过滤。0 - 所有列表(即不过滤) 1 - 离职待继承 2 - 离职继承中 3 - 离职继承完成 默认为0
+ * @param userIds 群主过滤。如果不填,表示获取应用可见范围内全部群主的数据(但是不建议这么用,如果可见范围人数超过1000人,为了防止数据包过大,会报错 81017);用户ID列表。最多100个
+ * @return the wx cp user external group chat list
+ * @throws WxErrorException the wx error exception
+ */
+ WxCpUserExternalGroupChatList listGroupChat(Integer limit, String cursor, int status, String[] userIds) throws WxErrorException;
+
/**
*
* 通过客户群ID,获取详情。包括群名、群成员列表、群成员入群时间、入群方式。(客户群是由具有客户群使用权限的成员创建的外部群)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
index c14a7c5c12..eec72ef916 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
@@ -248,6 +248,24 @@ public WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pa
return WxCpUserExternalGroupChatList.fromJson(result);
}
+ @Override
+ public WxCpUserExternalGroupChatList listGroupChat(Integer limit, String cursor, int status, String[] userIds) throws WxErrorException {
+ JsonObject json = new JsonObject();
+ json.addProperty("cursor", cursor == null ? "" : cursor);
+ json.addProperty("limit", limit == null ? 100 : limit);
+ json.addProperty("status_filter", status);
+ if (ArrayUtils.isNotEmpty(userIds)) {
+ JsonObject ownerFilter = new JsonObject();
+ if (ArrayUtils.isNotEmpty(userIds)) {
+ ownerFilter.add("userid_list", new Gson().toJsonTree(userIds).getAsJsonArray());
+ }
+ json.add("owner_filter", ownerFilter);
+ }
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GROUP_CHAT_LIST);
+ final String result = this.mainService.post(url, json.toString());
+ return WxCpUserExternalGroupChatList.fromJson(result);
+ }
+
@Override
public WxCpUserExternalGroupChatInfo getGroupChat(String chatId) throws WxErrorException {
JsonObject json = new JsonObject();
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatList.java
index 07ac8f69dc..a9a9e6b48e 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatList.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatList.java
@@ -16,10 +16,14 @@
@Getter
@Setter
public class WxCpUserExternalGroupChatList extends WxCpBaseResp {
+ private static final long serialVersionUID = 1907272035492110236L;
@SerializedName("group_chat_list")
private List groupChatList;
+ @SerializedName("next_cursor")
+ private String nextCursor;
+
@Getter
@Setter
public static class ChatStatus implements Serializable {
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
index 8869a6a02b..accd8f2701 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
@@ -241,6 +241,13 @@ public void testListGroupChat() throws WxErrorException {
assertNotNull(result);
}
+ @Test
+ public void testListGroupChatV3() throws WxErrorException {
+ WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(100, "" ,0,new String[1]);
+ System.out.println(result);
+ assertNotNull(result);
+ }
+
@Test
public void testGetGroupChat() {
}
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 8fa1aa0caa..bf84d17b05 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
@@ -177,6 +177,11 @@ public static class SubjectInfo implements Serializable {
@SpecEncrypt
private UboInfo uboInfo;
+ /**
+ * 小微辅助证明材料(subjectType为小微商户时必填)
+ */
+ @SerializedName("micro_biz_info")
+ private MicroBizInfo microBizInfo;
@Data
@Builder
@@ -468,6 +473,175 @@ public static class UboInfo implements Serializable {
private String idPeriodEnd;
}
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Accessors(chain = true)
+ public static class MicroBizInfo implements Serializable{
+ private static final long serialVersionUID = -5679477993681265764L;
+ /**
+ * 小微经营类型
+ */
+ @SerializedName("micro_biz_type")
+ private MicroBizTypeEnum microBizType;
+
+ /**
+ * 门店场所---经营类型为“门店场所”时填写
+ */
+ @SerializedName("micro_store_info")
+ private MicroStoreInfo microStoreInfo;
+
+ /**
+ * 经营类型为“流动经营/便民服务”时填写
+ */
+ @SerializedName("micro_mobile_info")
+ private MicroMobileInfo microMobileInfo;
+
+ /**
+ * 经营类型为“线上商品/服务交易”时填写
+ */
+ @SerializedName("micro_online_info")
+ private MicroOnlineInfo microOnlineInfo;
+
+ /**
+ * 门店场所
+ */
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Accessors(chain = true)
+ public static class MicroStoreInfo implements Serializable{
+ private static final long serialVersionUID = 5277440587305558389L;
+ /**
+ * 门店名称
+ */
+ @SerializedName("micro_name")
+ private String microName;
+ /**
+ * 门店省市编码 填写门店省市编码,只能由数字组成,详细参见《微信支付提供的省市对照表》
+ * @see 下载微信支付提供的省市对照表
+ */
+ @SerializedName("micro_address_code")
+ private String microAddressCode;
+ /**
+ * 门店地址(填写店铺详细地址,具体区/县及街道门牌号或大厦楼层)
+ */
+ @SerializedName("micro_address")
+ private String microAddress;
+ /**
+ * 门店门头照片
+ *
+ * 1、提交门店门口照片,要求招牌清晰可见
+ * 2、可上传1张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
+ *
+ *
+ * @see 图片上传API
+ */
+ @SerializedName("store_entrance_pic")
+ private String storeEntrancePic;
+ /**
+ * 店内环境照片
+ *
+ * 1、提交店内环境照片
+ * 2、可上传1张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
+ *
+ *
+ * @see 图片上传API
+ */
+ @SerializedName("micro_indoor_copy")
+ private String microIndoorCopy;
+ /**
+ * 门店经度
+ */
+ @SerializedName("store_longitude")
+ private String storeLongitude;
+ /**
+ * 门店纬度
+ */
+ @SerializedName("store_latitude")
+ private String storeLatitude;
+ }
+
+ /**
+ * 流动经营/便民服务
+ */
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Accessors(chain = true)
+ public static class MicroMobileInfo implements Serializable{
+ private static final long serialVersionUID = -1308090894511066935L;
+ /**
+ * 经营/服务名称
+ */
+ @SerializedName("micro_mobile_name")
+ private String microMobileName;
+ /**
+ * 经营/服务所在地省市
+ */
+ @SerializedName("micro_mobile_city")
+ private String microMobileCity;
+ /**
+ * 经营/服务所在地(不含省市) 填写“无"
+ */
+ @SerializedName("micro_mobile_address")
+ private String microMobileAddress;
+ /**
+ * 经营/服务现场照片
+ *
+ * 1、提交经营/服务现场照片
+ * 2、可上传多张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
+ *
+ * @see 图片上传API
+ */
+ @SerializedName("micro_mobile_pics")
+ private String micro_mobile_pics;
+ }
+
+ /**
+ * 线上商品/服务交易
+ */
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Accessors(chain = true)
+ public static class MicroOnlineInfo implements Serializable{
+ private static final long serialVersionUID = 9029168841403055743L;
+ /**
+ * 线上店铺名称
+ */
+ @SerializedName("micro_online_store")
+ private String microOnlineStore;
+ /**
+ * 电商平台名称
+ */
+ @SerializedName("micro_ec_name")
+ private String microEcName;
+ /**
+ * 店铺二维码
+ *
+ * 1、店铺二维码或店铺链接二选一必填
+ * 2、可上传多张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
+ *
+ * @see 图片上传API
+ */
+ @SerializedName("micro_qrcode")
+ private String microQrcode;
+ /**
+ * 店铺二维码
+ *
+ * 1、店铺二维码或店铺链接二选一必填
+ * 2、请填写店铺主页链接,需符合网站规范
+ *
+ */
+ @SerializedName("micro_link")
+ private String microLink;
+ }
+ }
}
/**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/MicroBizTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/MicroBizTypeEnum.java
new file mode 100644
index 0000000000..100f83268c
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/MicroBizTypeEnum.java
@@ -0,0 +1,20 @@
+package com.github.binarywang.wxpay.bean.applyment.enums;
+
+/**
+ * 小微经营类型
+ */
+public enum MicroBizTypeEnum {
+ /**
+ * 门店场所
+ */
+ MICRO_TYPE_STORE,
+ /**
+ * 流动经营/便民服务
+ */
+ MICRO_TYPE_MOBILE,
+ /**
+ * 线上商品/服务交易
+ */
+ MICRO_TYPE_ONLINE,
+ ;
+}
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 7845c052c2..4a6c9d29e4 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
@@ -25,6 +25,10 @@ public enum SubjectTypeEnum {
* (其他组织):不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。
*/
SUBJECT_TYPE_OTHERS,
+ /**
+ * (小微):无营业执照、免办理工商注册登记的实体商户
+ */
+ SUBJECT_TYPE_MICRO,
;
}
From b2eaa59cb329c8f7bf48abf266e75c7dc2435aba Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sat, 3 Jul 2021 20:51:39 +0800
Subject: [PATCH 0021/1235] =?UTF-8?q?:art:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=B9=B6=E8=A7=84=E8=8C=83=E5=8F=98?=
=?UTF-8?q?=E9=87=8F=E5=91=BD=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../WxPayApplyment4SubCreateRequest.java | 21 +++++++++++--------
1 file changed, 12 insertions(+), 9 deletions(-)
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 bf84d17b05..fe956af236 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
@@ -478,7 +478,7 @@ public static class UboInfo implements Serializable {
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
- public static class MicroBizInfo implements Serializable{
+ public static class MicroBizInfo implements Serializable {
private static final long serialVersionUID = -5679477993681265764L;
/**
* 小微经营类型
@@ -512,7 +512,7 @@ public static class MicroBizInfo implements Serializable{
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
- public static class MicroStoreInfo implements Serializable{
+ public static class MicroStoreInfo implements Serializable {
private static final long serialVersionUID = 5277440587305558389L;
/**
* 门店名称
@@ -521,6 +521,7 @@ public static class MicroStoreInfo implements Serializable{
private String microName;
/**
* 门店省市编码 填写门店省市编码,只能由数字组成,详细参见《微信支付提供的省市对照表》
+ *
* @see 下载微信支付提供的省市对照表
*/
@SerializedName("micro_address_code")
@@ -533,8 +534,8 @@ public static class MicroStoreInfo implements Serializable{
/**
* 门店门头照片
*
- * 1、提交门店门口照片,要求招牌清晰可见
- * 2、可上传1张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
+ * 1、提交门店门口照片,要求招牌清晰可见
+ * 2、可上传1张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
*
*
* @see 图片上传API
@@ -544,8 +545,8 @@ public static class MicroStoreInfo implements Serializable{
/**
* 店内环境照片
*
- * 1、提交店内环境照片
- * 2、可上传1张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
+ * 1、提交店内环境照片
+ * 2、可上传1张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
*
*
* @see 图片上传API
@@ -572,7 +573,7 @@ public static class MicroStoreInfo implements Serializable{
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
- public static class MicroMobileInfo implements Serializable{
+ public static class MicroMobileInfo implements Serializable {
private static final long serialVersionUID = -1308090894511066935L;
/**
* 经营/服务名称
@@ -595,10 +596,11 @@ public static class MicroMobileInfo implements Serializable{
* 1、提交经营/服务现场照片
* 2、可上传多张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
*
+ *
* @see 图片上传API
*/
@SerializedName("micro_mobile_pics")
- private String micro_mobile_pics;
+ private String microMobilePics;
}
/**
@@ -609,7 +611,7 @@ public static class MicroMobileInfo implements Serializable{
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
- public static class MicroOnlineInfo implements Serializable{
+ public static class MicroOnlineInfo implements Serializable {
private static final long serialVersionUID = 9029168841403055743L;
/**
* 线上店铺名称
@@ -627,6 +629,7 @@ public static class MicroOnlineInfo implements Serializable{
* 1、店铺二维码或店铺链接二选一必填
* 2、可上传多张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID
*
+ *
* @see 图片上传API
*/
@SerializedName("micro_qrcode")
From dc7bcc01e2eead12f8962dffbef5a5718a55fc32 Mon Sep 17 00:00:00 2001
From: mrning
Date: Sat, 3 Jul 2021 20:57:32 +0800
Subject: [PATCH 0022/1235] =?UTF-8?q?:art:=20ApplymentsStatusResult?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0signState=E7=AD=BE=E7=BA=A6=E7=8A=B6=E6=80=81?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bean/ecommerce/ApplymentsStatusResult.java | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
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 a12c3d4a8d..bfd034dcbb 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
@@ -65,6 +65,22 @@ public class ApplymentsStatusResult implements Serializable {
@SerializedName(value = "sign_url")
private String signUrl;
+ /**
+ *
+ * 字段名:签约状态
+ * 变量名:sign_state
+ * 是否必填:否
+ * 类型:string(16)
+ * 描述:
+ * 1、UNSIGNED:未签约。该状态下,电商平台可查询获取签约链接,引导二级商户的超级管理员完成签约;
+ * 2、SIGNED :已签约。指二级商户的超级管理员已完成签约。注意:若申请单被驳回,商户修改了商户主体名称、法人名称、超级管理员信息、主体类型等信息,则需重新签约。
+ * 3、NOT_SIGNABLE:不可签约。该状态下,暂不支持超级管理员签约。一般为申请单处于已驳回、已冻结、机器校验中状态,无法签约。
+ * 示例值:https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec
+ *
+ */
+ @SerializedName(value = "sign_state")
+ private String signState;
+
/**
*
* 字段名:电商平台二级商户号
From fb0460e1a1502032d024597f4c1d6c2071fc9788 Mon Sep 17 00:00:00 2001
From: thinsstar <43289204+thinsstar@users.noreply.github.com>
Date: Sat, 3 Jul 2021 20:59:38 +0800
Subject: [PATCH 0023/1235] =?UTF-8?q?:new:=20#2188=20=E3=80=90=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E3=80=91=E5=A2=9E=E5=8A=A0v3?=
=?UTF-8?q?=E5=90=88=E5=8D=95=E6=94=AF=E4=BB=98=E5=92=8C=E8=B4=A6=E5=8D=95?=
=?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bean/notify/CombineNotifyResult.java | 576 ++++++++++++++++++
.../notify/WxPayRefundNotifyV3Result.java | 3 +-
.../bean/request/CombineCloseRequest.java | 91 +++
.../request/CombineTransactionsRequest.java | 429 +++++++++++++
.../WxPayApplyFundFlowBillV3Request.java | 66 ++
.../request/WxPayApplyTradeBillV3Request.java | 66 ++
.../wxpay/bean/result/CombineQueryResult.java | 558 +++++++++++++++++
.../result/CombineTransactionsResult.java | 120 ++++
.../bean/result/WxPayApplyBillV3Result.java | 59 ++
.../bean/result/WxPayRefundQueryV3Result.java | 129 ++--
.../bean/result/WxPayRefundV3Result.java | 137 +++--
.../bean/result/enums/TradeTypeEnum.java | 13 +-
.../wxpay/service/BasePayV3Service.java | 24 -
.../wxpay/service/WxPayService.java | 127 ++++
.../service/impl/BaseWxPayServiceImpl.java | 85 +++
15 files changed, 2370 insertions(+), 113 deletions(-)
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/CombineNotifyResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/CombineCloseRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/CombineTransactionsRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayApplyFundFlowBillV3Request.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayApplyTradeBillV3Request.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineQueryResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineTransactionsResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayApplyBillV3Result.java
delete mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/BasePayV3Service.java
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/CombineNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/CombineNotifyResult.java
new file mode 100644
index 0000000000..111deedb19
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/CombineNotifyResult.java
@@ -0,0 +1,576 @@
+package com.github.binarywang.wxpay.bean.notify;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * 微信支付通过支付通知接口将用户支付成功消息通知给商户
+ * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_13.shtml
+ *
+ *
+ * @author thinsstar
+ */
+@Data
+@NoArgsConstructor
+public class CombineNotifyResult implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ * 源数据
+ */
+ private OriginNotifyResponse rawData;
+ /**
+ * 解密后的数据
+ */
+ private DecryptNotifyResult result;
+
+ @Data
+ @NoArgsConstructor
+ public static class DecryptNotifyResult implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:合单商户appid
+ * 变量名:combine_appid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单发起方的appid。
+ * 示例值:wxd678efh567hg6787
+ *
+ */
+ @SerializedName(value = "combine_appid")
+ private String combineAppid;
+ /**
+ *
+ * 字段名:合单商户号
+ * 变量名:combine_mchid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单发起方商户号。
+ * 示例值:1900000109
+ *
+ */
+ @SerializedName(value = "combine_mchid")
+ private String combineMchid;
+ /**
+ *
+ * 字段名:合单商户订单号
+ * 变量名:combine_out_trade_no
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+ * 示例值:P20150806125346
+ *
+ */
+ @SerializedName(value = "combine_out_trade_no")
+ private String combineOutTradeNo;
+ /**
+ *
+ * 字段名:场景信息
+ * 变量名:scene_info
+ * 是否必填:否
+ * 类型:object
+ * 描述:
+ * 支付场景信息描述
+ *
+ */
+ @SerializedName(value = "scene_info")
+ private SceneInfo sceneInfo;
+
+ /**
+ *
+ * 字段名:子单信息
+ * 变量名:sub_orders
+ * 是否必填:是
+ * 类型:array
+ * 描述:
+ * 最多支持子单条数:10
+ *
+ */
+ @SerializedName(value = "sub_orders")
+ private List subOrders;
+
+ /**
+ *
+ * 字段名:支付者
+ * 变量名:combine_payer_info
+ * 是否必填:否
+ * 类型:object
+ * 描述:
+ * 示例值:见请求示例
+ *
+ */
+ @SerializedName(value = "combine_payer_info")
+ private CombinePayerInfo combinePayerInfo;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class SceneInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:商户端设备号
+ * 变量名:device_id
+ * 是否必填:否
+ * 类型:string[7,16]
+ * 描述:
+ * 终端设备号(门店号或收银设备ID)。
+ * 特殊规则:长度最小7个字节
+ * 示例值:POS1:1
+ *
+ */
+ @SerializedName(value = "device_id")
+ private String deviceId;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class SubOrders implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:子单商户号
+ * 变量名:mchid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 子单发起方商户号,必须与发起方Appid有绑定关系。
+ * 示例值:1900000109
+ *
+ */
+ @SerializedName(value = "mchid")
+ private String mchid;
+ /**
+ *
+ * 字段名:交易类型
+ * 变量名:trade_type
+ * 是否必填:是
+ * 类型:string[1,16]
+ * 描述:
+ * 枚举值:
+ * NATIVE:扫码支付
+ * JSAPI:公众号支付
+ * APP:APP支付
+ * MWEB:H5支付
+ * 示例值: JSAPI
+ *
+ */
+ @SerializedName(value = "trade_type")
+ private String tradeType;
+ /**
+ *
+ * 字段名:交易状态
+ * 变量名:trade_state
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 枚举值:
+ * SUCCESS:支付成功
+ * REFUND:转入退款
+ * NOTPAY:未支付
+ * CLOSED:已关闭
+ * USERPAYING:用户支付中
+ * PAYERROR:支付失败(其他原因,如银行返回失败)
+ * 示例值: SUCCESS
+ *
+ */
+ @SerializedName(value = "trade_state")
+ private String tradeState;
+ /**
+ *
+ * 字段名:付款银行
+ * 变量名:bank_type
+ * 是否必填:否
+ * 类型:string[1,16]
+ * 描述:
+ * 银行类型,采用字符串类型的银行标识。银行标识请参考《银行类型对照表》https://pay.weixin.qq.com/wiki/doc/apiv3/terms_definition/chapter1_1_3.shtml#part-6
+ * 示例值:CMC
+ *
+ */
+ @SerializedName(value = "bank_type")
+ private String bankType;
+ /**
+ *
+ * 字段名:附加信息
+ * 变量名:attach
+ * 是否必填:是
+ * 类型:string[1,128]
+ * 描述:
+ * 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。
+ * 示例值:深圳分店
+ *
+ */
+ @SerializedName(value = "attach")
+ private String attach;
+ /**
+ *
+ * 字段名:支付完成时间
+ * 变量名:success_time
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 订单支付时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss:sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss:sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ * 示例值:2015-05-20T13:29:35.120+08:00
+ *
+ */
+ @SerializedName(value = "success_time")
+ private String successTime;
+ /**
+ *
+ * 字段名:微信订单号
+ * 变量名:transaction_id
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 微信支付订单号。
+ * 示例值: 1009660380201506130728806387
+ *
+ */
+ @SerializedName(value = "transaction_id")
+ private String transactionId;
+ /**
+ *
+ * 字段名:子单商户订单号
+ * 变量名:out_trade_no
+ * 是否必填:是
+ * 类型:string[6,32]
+ * 描述:
+ * 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+ * 特殊规则:最小字符长度为6
+ * 示例值:20150806125346
+ *
+ */
+ @SerializedName(value = "out_trade_no")
+ private String outTradeNo;
+ /**
+ *
+ * 字段名:订单金额
+ * 变量名:amount
+ * 是否必填:是
+ * 类型:object
+ * 描述:
+ * 订单金额信息
+ *
+ */
+ @SerializedName(value = "amount")
+ private Amount amount;
+ /**
+ *
+ * 字段名:优惠功能
+ * 变量名:promotion_detail
+ * 是否必填:是
+ * 类型:array
+ * 描述:
+ * 优惠功能,子单有核销优惠券时有返回
+ *
+ */
+ @SerializedName(value = "promotion_detail")
+ private List promotionDetail;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class CombinePayerInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:用户标识
+ * 变量名:openid
+ * 是否必填:是
+ * 类型:string[1,128]
+ * 描述:
+ * 使用合单appid获取的对应用户openid。是用户在商户appid下的唯一标识。
+ * 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
+ *
+ */
+ @SerializedName(value = "openid")
+ private String openid;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class Amount implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:标价金额
+ * 变量名:total_amount
+ * 是否必填:是
+ * 类型:int64
+ * 描述:
+ * 子单金额,单位为分。
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "total_amount")
+ private Integer totalAmount;
+ /**
+ *
+ * 字段名:标价币种
+ * 变量名:currency
+ * 是否必填:是
+ * 类型:string[1,8]
+ * 描述:
+ * 符合ISO 4217标准的三位字母代码,人民币:CNY。
+ * 示例值:CNY
+ *
+ */
+ @SerializedName(value = "currency")
+ private String currency;
+ /**
+ *
+ * 字段名:现金支付金额
+ * 变量名:payer_amount
+ * 是否必填:是
+ * 类型:int64
+ * 描述:
+ * 订单现金支付金额。
+ * 示例值:10
+ *
+ */
+ @SerializedName(value = "payer_amount")
+ private Integer payerAmount;
+ /**
+ *
+ * 字段名:现金支付币种
+ * 变量名:payer_currency
+ * 是否必填:是
+ * 类型:string[1,8]
+ * 描述:
+ * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY。
+ * 示例值: CNY
+ *
+ */
+ @SerializedName(value = "payer_currency")
+ private String payerCurrency;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class PromotionDetail implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:券ID
+ * 变量名:coupon_id
+ * 是否必填:是
+ * 类型:string[1, 32]
+ * 描述:
+ * 券ID
+ * 示例值:109519
+ *
+ */
+ @SerializedName(value = "coupon_id")
+ private String couponId;
+ /**
+ *
+ * 字段名:优惠名称
+ * 变量名:name
+ * 是否必填:否
+ * 类型:string[1, 64]
+ * 描述:
+ * 优惠名称
+ * 示例值:单品惠-6
+ *
+ */
+ @SerializedName(value = "name")
+ private String name;
+ /**
+ *
+ * 字段名:优惠范围
+ * 变量名:scope
+ * 是否必填:否
+ * 类型:string[1, 32]
+ * 描述:
+ * GLOBAL:全场代金券
+ * SINGLE:单品优惠
+ * 示例值:GLOBALSINGLE
+ *
+ */
+ @SerializedName(value = "scope")
+ private String scope;
+ /**
+ *
+ * 字段名:优惠类型
+ * 变量名:type
+ * 是否必填:否
+ * 类型:string[1,8]
+ * 描述:
+ * CASH:充值;
+ * NOCASH:预充值。
+ * 示例值:CASH
+ *
+ */
+ @SerializedName(value = "type")
+ private String type;
+ /**
+ *
+ * 字段名:优惠券面额
+ * 变量名:amount
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 当前子单中享受的优惠券金额
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "amount")
+ private Integer amount;
+ /**
+ *
+ * 字段名:活动ID
+ * 变量名:stock_id
+ * 是否必填:否
+ * 类型:string[1, 32]
+ * 描述:
+ * 活动ID,批次ID
+ * 示例值:931386
+ *
+ */
+ @SerializedName(value = "stock_id")
+ private String stockId;
+ /**
+ *
+ * 字段名:微信出资
+ * 变量名:wechatpay_contribute
+ * 是否必填:否
+ * 类型:int
+ * 描述:
+ * 单位为分
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "wechatpay_contribute")
+ private Integer wechatpayContribute;
+ /**
+ *
+ * 字段名:商户出资
+ * 变量名:merchant_contribute
+ * 是否必填:否
+ * 类型:int
+ * 描述:
+ * 单位为分
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "merchant_contribute")
+ private Integer merchantContribute;
+ /**
+ *
+ * 字段名:其他出资
+ * 变量名:other_contribute
+ * 是否必填:否
+ * 类型:int
+ * 描述:
+ * 单位为分
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "other_contribute")
+ private Integer otherContribute;
+ /**
+ *
+ * 字段名:优惠币种
+ * 变量名:currency
+ * 是否必填:否
+ * 类型:string[1,16]
+ * 描述:
+ * CNY:人民币,境内商户号仅支持人民币。
+ * 示例值:CNY
+ *
+ */
+ @SerializedName(value = "currency")
+ private String currency;
+ /**
+ *
+ * 字段名:单品列表
+ * 变量名:goods_detail
+ * 是否必填:否
+ * 类型:array
+ * 描述:
+ * 单品列表信息
+ *
+ */
+ @SerializedName(value = "goods_detail")
+ private List goodsDetail;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class GoodsDetail implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:商品编码
+ * 变量名:goods_id
+ * 是否必填:是
+ * 类型:string[1, 32]
+ * 描述:
+ * 商品编码
+ * 示例值:M1006
+ *
+ */
+ @SerializedName(value = "goods_id")
+ private String goodsId;
+ /**
+ *
+ * 字段名:商品数量
+ * 变量名:quantity
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 商品数量
+ * 示例值:1
+ *
+ */
+ @SerializedName(value = "quantity")
+ private Integer quantity;
+ /**
+ *
+ * 字段名:商品单价
+ * 变量名:unit_price
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 商品价格
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "unit_price")
+ private Integer unitPrice;
+ /**
+ *
+ * 字段名:商品优惠金额
+ * 变量名:discount_amount
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 商品优惠金额
+ * 示例值:1
+ *
+ */
+ @SerializedName(value = "discount_amount")
+ private Integer discountAmount;
+ /**
+ *
+ * 字段名:商品备注
+ * 变量名:goods_remark
+ * 是否必填:否
+ * 类型:string[1, 128]
+ * 描述:
+ * 商品备注
+ * 示例值:商品备注信息
+ *
+ */
+ @SerializedName(value = "goods_remark")
+ private String goodsRemark;
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyV3Result.java
index 39aafe364b..961dbaa116 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyV3Result.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyV3Result.java
@@ -105,7 +105,7 @@ public static class DecryptNotifyResult implements Serializable {
* SUCCESS:退款成功
* CLOSE:退款关闭
* ABNORMAL:退款异常,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往【商户平台—>交易中心】,手动处理此笔退款
- * 示例值:SUCCESS
+ * 示例值:SUCCESS
*
*/
@SerializedName(value = "refund_status")
@@ -158,6 +158,7 @@ public static class DecryptNotifyResult implements Serializable {
@Data
@NoArgsConstructor
public static class Amount implements Serializable {
+ private static final long serialVersionUID = 1L;
/**
*
* 字段名:订单金额
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/CombineCloseRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/CombineCloseRequest.java
new file mode 100644
index 0000000000..b397f0f1c0
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/CombineCloseRequest.java
@@ -0,0 +1,91 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * 合单支付订单只能使用此合单关单api完成关单。
+ * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_12.shtml
+ *
+ *
+ * @author thinsstar
+ */
+@Data
+@NoArgsConstructor
+public class CombineCloseRequest implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:合单商户appid
+ * 变量名:combine_appid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单发起方的appid。
+ * 示例值:wxd678efh567hg6787
+ *
+ */
+ @SerializedName(value = "combine_appid")
+ private String combineAppid;
+ /**
+ *
+ * 字段名:合单商户订单号
+ * 变量名:combine_out_trade_no
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+ * 示例值:P20150806125346
+ *
+ */
+ private transient String combineOutTradeNo;
+ /**
+ *
+ * 字段名:子单信息
+ * 变量名:sub_orders
+ * 是否必填:是
+ * 类型:array
+ * 描述:
+ * 最多支持子单条数:10
+ *
+ */
+ @SerializedName(value = "sub_orders")
+ private List subOrders;
+
+ @Data
+ @NoArgsConstructor
+ public static class SubOrders implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:子单商户号
+ * 变量名:mchid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 子单发起方商户号,必须与发起方appid有绑定关系。
+ * 示例值:1900000109
+ *
+ */
+ @SerializedName(value = "mchid")
+ private String mchid;
+ /**
+ *
+ * 字段名:子单商户订单号
+ * 变量名:out_trade_no
+ * 是否必填:是
+ * 类型:string[6,32]
+ * 描述:
+ * 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+ * 示例值:20150806125346
+ *
+ */
+ @SerializedName(value = "out_trade_no")
+ private String outTradeNo;
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/CombineTransactionsRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/CombineTransactionsRequest.java
new file mode 100644
index 0000000000..036cfe9872
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/CombineTransactionsRequest.java
@@ -0,0 +1,429 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * 使用合单支付接口,用户只输入一次密码,即可完成多个订单的支付。目前最多一次可支持50笔订单进行合单支付。
+ * 参考文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_1.shtml
+ * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_2.shtml
+ * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_3.shtml
+ * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_4.shtml
+ * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_5.shtml
+ *
+ *
+ * @author thinsstar
+ */
+@Data
+@NoArgsConstructor
+public class CombineTransactionsRequest implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:合单商户appid
+ * 变量名:combine_appid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单发起方的appid。
+ * 示例值:wxd678efh567hg6787
+ *
+ */
+ @SerializedName(value = "combine_appid")
+ private String combineAppid;
+ /**
+ *
+ * 字段名:合单商户号
+ * 变量名:combine_mchid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单发起方商户号。
+ * 示例值:1900000109
+ *
+ */
+ @SerializedName(value = "combine_mchid")
+ private String combineMchid;
+ /**
+ *
+ * 字段名:合单商户订单号
+ * 变量名:combine_out_trade_no
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
+ * 示例值:P20150806125346
+ *
+ */
+ @SerializedName(value = "combine_out_trade_no")
+ private String combineOutTradeNo;
+ /**
+ *
+ * 字段名:场景信息
+ * 变量名:scene_info
+ * 是否必填:否
+ * 类型:object
+ * 描述:
+ * 支付场景信息描述
+ *
+ */
+ @SerializedName(value = "scene_info")
+ private SceneInfo sceneInfo;
+ /**
+ *
+ * 字段名:子单信息
+ * 变量名:sub_orders
+ * 是否必填:是
+ * 类型:array
+ * 描述:
+ * 最多支持子单条数:10
+ *
+ */
+ @SerializedName(value = "sub_orders")
+ private List subOrders;
+ /**
+ *
+ * 字段名:支付者
+ * 变量名:combine_payer_info
+ * 是否必填:否(JSAPI必填)
+ * 类型:object
+ * 描述:
+ * 支付者信息
+ *
+ */
+ @SerializedName(value = "combine_payer_info")
+ private CombinePayerInfo combinePayerInfo;
+ /**
+ *
+ * 字段名:交易起始时间
+ * 变量名:time_start
+ * 是否必填:否
+ * 类型:string[1,32]
+ * 描述:
+ * 订单生成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ * 示例值:2019-12-31T15:59:59+08:00
+ *
+ */
+ @SerializedName(value = "time_start")
+ private String timeStart;
+ /**
+ *
+ * 字段名:交易结束时间
+ * 变量名:time_expire
+ * 是否必填:否
+ * 类型:string[1,32]
+ * 描述:
+ * 订单失效时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ * 示例值:2019-12-31T15:59:59+08:00
+ *
+ */
+ @SerializedName(value = "time_expire")
+ private String timeExpire;
+ /**
+ *
+ * 字段名:通知地址
+ * 变量名:notify_url
+ * 是否必填:是
+ * 类型:string[1,256]
+ * 描述:
+ * 接收微信支付异步通知回调地址,通知url必须为直接可访问的URL,不能携带参数。
+ * 格式: URL
+ * 示例值:https://yourapp.com/notify
+ *
+ */
+ @SerializedName(value = "notify_url")
+ private String notifyUrl;
+
+ @Data
+ @NoArgsConstructor
+ public static class SceneInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:商户端设备号
+ * 变量名:device_id
+ * 是否必填:否
+ * 类型:string[7,16]
+ * 描述:
+ * 终端设备号(门店号或收银设备ID)。
+ * 示例值:POS1:123
+ *
+ */
+ @SerializedName(value = "device_id")
+ private String deviceId;
+ /**
+ *
+ * 字段名:用户终端IP
+ * 变量名:payer_client_ip
+ * 是否必填:是
+ * 类型:string[1,45]
+ * 描述:
+ * 用户的客户端IP,支持IPv4和IPv6两种格式的IP地址。
+ * 格式: ip(ipv4+ipv6)
+ * 示例值:14.17.22.32
+ *
+ */
+ @SerializedName(value = "payer_client_ip")
+ private String payerClientIp;
+ /**
+ *
+ * 字段名:H5场景信息
+ * 变量名:h5_info
+ * 是否必填:否(H5支付必填)
+ * 类型:object
+ * 描述:
+ * H5场景信息
+ *
+ */
+ @SerializedName(value = "h5_info")
+ private H5Info h5Info;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class SubOrders implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:子单商户号
+ * 变量名:mchid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 子单发起方商户号,必须与发起方appid有绑定关系。
+ * 示例值:1900000109
+ *
+ */
+ @SerializedName(value = "mchid")
+ private String mchid;
+ /**
+ *
+ * 字段名:附加信息
+ * 变量名:attach
+ * 是否必填:是
+ * 类型:string[1,128]
+ * 描述:
+ * 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。
+ * 示例值:深圳分店
+ *
+ */
+ @SerializedName(value = "attach")
+ private String attach;
+ /**
+ *
+ * 字段名:订单金额
+ * 变量名:amount
+ * 是否必填:是
+ * 类型:object
+ * 描述:
+ * 订单金额信息
+ *
+ */
+ @SerializedName(value = "amount")
+ private Amount amount;
+ /**
+ *
+ * 字段名:子单商户订单号
+ * 变量名:out_trade_no
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+ * 特殊规则:最小字符长度为6
+ * 示例值:20150806125346
+ *
+ */
+ @SerializedName(value = "out_trade_no")
+ private String outTradeNo;
+ /**
+ *
+ * 字段名:商品描述
+ * 变量名:description
+ * 是否必填:是
+ * 类型:string[1,127]
+ * 描述:
+ * 商品简单描述。需传入应用市场上的APP名字-实际商品名称,例如:天天爱消除-游戏充值。
+ * 示例值:腾讯充值中心-QQ会员充值
+ *
+ */
+ @SerializedName(value = "description")
+ private String description;
+ /**
+ *
+ * 字段名:结算信息
+ * 变量名:settle_info
+ * 是否必填:否
+ * 类型:Object
+ * 描述:结算信息
+ *
+ */
+ @SerializedName(value = "settle_info")
+ private SettleInfo settleInfo;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class CombinePayerInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:用户标识
+ * 变量名:openid
+ * 是否必填:是
+ * 类型:string[1,128]
+ * 描述:
+ * 使用合单appid获取的对应用户openid。是用户在商户appid下的唯一标识。
+ * 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
+ *
+ */
+ @SerializedName(value = "openid")
+ private String openid;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class Amount implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:标价金额
+ * 变量名:total_amount
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 子单金额,单位为分
+ * 境外场景下,标价金额要超过商户结算币种的最小单位金额,例如结算币种为美元,则标价金额必须大于1美分
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "total_amount")
+ private Integer totalAmount;
+ /**
+ *
+ * 字段名:标价币种
+ * 变量名:currency
+ * 是否必填:是
+ * 类型:string[1,8]
+ * 描述:
+ * 符合ISO 4217标准的三位字母代码,人民币:CNY 。
+ * 示例值:CNY
+ *
+ */
+ @SerializedName(value = "currency")
+ private String currency;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class SettleInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:是否指定分账
+ * 变量名:profit_sharing
+ * 是否必填:否
+ * 类型:bool
+ * 描述:
+ * 是否指定分账,枚举值
+ * true:是
+ * false:否
+ * 示例值:true
+ *
+ */
+ @SerializedName(value = "profit_sharing")
+ private Boolean profitSharing;
+ /**
+ *
+ * 字段名:补差金额
+ * 变量名:subsidy_amount
+ * 是否必填:否
+ * 类型:int64
+ * 描述:
+ * SettleInfo.profit_sharing为true时,该金额才生效。
+ * 注意:单笔订单最高补差金额为5000元
+ * 示例值:10
+ *
+ */
+ @SerializedName(value = "subsidy_amount")
+ private Integer subsidyAmount;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class H5Info implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:场景类型
+ * 变量名:type
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 场景类型,枚举值:
+ * iOS:IOS移动应用;
+ * Android:安卓移动应用;
+ * Wap:WAP网站应用;
+ * 示例值:iOS
+ *
+ */
+ @SerializedName(value = "type")
+ private String type;
+ /**
+ *
+ * 字段名:应用名称
+ * 变量名:app_name
+ * 是否必填:否
+ * 类型:string[1,64]
+ * 描述:
+ * 应用名称
+ * 示例值:王者荣耀
+ *
+ */
+ @SerializedName(value = "app_name")
+ private String appName;
+ /**
+ *
+ * 字段名:网站URL
+ * 变量名:app_url
+ * 是否必填:否
+ * 类型:string[1,128]
+ * 描述:
+ * 网站URL
+ * 示例值:https://pay.qq.com
+ *
+ */
+ @SerializedName(value = "app_url")
+ private String appUrl;
+ /**
+ *
+ * 字段名:iOS平台BundleID
+ * 变量名:bundle_id
+ * 是否必填:否
+ * 类型:string[1,128]
+ * 描述:
+ * iOS平台BundleID
+ * 示例值:com.tencent.wzryiOS
+ *
+ */
+ @SerializedName(value = "bundle_id")
+ private String bundleId;
+ /**
+ *
+ * 字段名:Android平台PackageName
+ * 变量名:package_name
+ * 是否必填:否
+ * 类型:string[1,128]
+ * 描述:
+ * Android平台PackageName
+ * 示例值:com.tencent.tmgp.sgame
+ *
+ */
+ @SerializedName(value = "package_name")
+ private String packageName;
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayApplyFundFlowBillV3Request.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayApplyFundFlowBillV3Request.java
new file mode 100644
index 0000000000..251465e72e
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayApplyFundFlowBillV3Request.java
@@ -0,0 +1,66 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 微信支付-申请账单入参
+ *
+ *
+ * @author thinsstar
+ */
+@Data
+@NoArgsConstructor
+public class WxPayApplyFundFlowBillV3Request implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:账单日期
+ * 变量名:bill_date
+ * 是否必填:是
+ * 类型:string[1,10]
+ * 描述:
+ * 格式YYYY-MM-DD
+ * 仅支持三个月内的账单下载申请。
+ * 示例值:2019-06-11
+ *
+ */
+ @SerializedName(value = "bill_date")
+ private String billDate;
+ /**
+ *
+ * 字段名:资金账户类型
+ * 变量名:account_type
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 不填则默认是BASIC
+ * 枚举值:
+ * BASIC:基本账户
+ * OPERATION:运营账户
+ * FEES:手续费账户
+ * 示例值:BASIC
+ *
+ */
+ @SerializedName(value = "account_type")
+ private String accountType;
+ /**
+ *
+ * 字段名:压缩类型
+ * 变量名:tar_type
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 不填则默认是数据流
+ * 枚举值:
+ * GZIP:返回格式为.gzip的压缩包账单
+ * 示例值:GZIP
+ *
+ */
+ @SerializedName(value = "tar_type")
+ private String tarType;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayApplyTradeBillV3Request.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayApplyTradeBillV3Request.java
new file mode 100644
index 0000000000..612dbeaab3
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayApplyTradeBillV3Request.java
@@ -0,0 +1,66 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 微信支付-申请账单入参
+ *
+ *
+ * @author thinsstar
+ */
+@Data
+@NoArgsConstructor
+public class WxPayApplyTradeBillV3Request implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:账单日期
+ * 变量名:bill_date
+ * 是否必填:是
+ * 类型:string[1,10]
+ * 描述:
+ * 格式YYYY-MM-DD
+ * 仅支持三个月内的账单下载申请。
+ * 示例值:2019-06-11
+ *
+ */
+ @SerializedName(value = "bill_date")
+ private String billDate;
+ /**
+ *
+ * 字段名:账单类型
+ * 变量名:bill_type
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 不填则默认是ALL
+ * 枚举值:
+ * ALL:返回当日所有订单信息(不含充值退款订单)
+ * SUCCESS:返回当日成功支付的订单(不含充值退款订单)
+ * REFUND:返回当日退款订单(不含充值退款订单)
+ * 示例值:ALL
+ *
+ */
+ @SerializedName(value = "bill_type")
+ private String billType;
+ /**
+ *
+ * 字段名:压缩类型
+ * 变量名:tar_type
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 不填则默认是数据流
+ * 枚举值:
+ * GZIP:返回格式为.gzip的压缩包账单
+ * 示例值:GZIP
+ *
+ */
+ @SerializedName(value = "tar_type")
+ private String tarType;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineQueryResult.java
new file mode 100644
index 0000000000..a04033031c
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineQueryResult.java
@@ -0,0 +1,558 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * 商户通过合单查询订单API查询订单状态,完成下一步的业务逻辑。
+ * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_11.shtml
+ *
+ *
+ * @author thinsstar
+ */
+@Data
+@NoArgsConstructor
+public class CombineQueryResult implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:合单商户appid
+ * 变量名:combine_appid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单发起方的appid。
+ * 示例值:wxd678efh567hg6787
+ *
+ */
+ @SerializedName(value = "combine_appid")
+ private String combineAppid;
+ /**
+ *
+ * 字段名:合单商户号
+ * 变量名:combine_mchid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单发起方商户号。
+ * 示例值:1900000109
+ *
+ */
+ @SerializedName(value = "combine_mchid")
+ private String combineMchid;
+ /**
+ *
+ * 字段名:合单商户订单号
+ * 变量名:combine_out_trade_no
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+ * 示例值:P20150806125346
+ *
+ */
+ @SerializedName(value = "combine_out_trade_no")
+ private String combineOutTradeNo;
+ /**
+ *
+ * 字段名:场景信息
+ * 变量名:scene_info
+ * 是否必填:否
+ * 类型:object
+ * 描述:支付场景信息描述
+ *
+ */
+ @SerializedName(value = "scene_info")
+ private SceneInfo sceneInfo;
+ /**
+ *
+ * 字段名:子单信息
+ * 变量名:sub_orders
+ * 是否必填:是
+ * 类型:array
+ * 描述:
+ * 最多支持子单条数:10
+ *
+ */
+ @SerializedName(value = "sub_orders")
+ private List subOrders;
+ /**
+ *
+ * 字段名:支付者
+ * 变量名:combine_payer_info
+ * 是否必填:否
+ * 类型:object
+ * 描述:
+ * 示例值:见请求示例
+ *
+ */
+ @SerializedName(value = "combine_payer_info")
+ private CombinePayerInfo combinePayerInfo;
+
+ @Data
+ @NoArgsConstructor
+ public static class SceneInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:商户端设备号
+ * 变量名:device_id
+ * 是否必填:否
+ * 类型:string[7,16]
+ * 描述:
+ * 终端设备号(门店号或收银设备ID)。
+ * 示例值:POS1:1
+ *
+ */
+ @SerializedName(value = "device_id")
+ private String deviceId;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class SubOrders implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:子单商户号
+ * 变量名:mchid
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 子单发起方商户号,必须与发起方Appid有绑定关系。
+ * 示例值:1900000109
+ *
+ */
+ @SerializedName(value = "mchid")
+ private String mchid;
+ /**
+ *
+ * 字段名:交易类型
+ * 变量名:trade_type
+ * 是否必填:是
+ * 类型:string[1,16]
+ * 描述:
+ * 枚举值:
+ * NATIVE:扫码支付
+ * JSAPI:公众号支付
+ * APP:APP支付
+ * MWEB:H5支付
+ * 示例值: JSAPI
+ *
+ */
+ @SerializedName(value = "trade_type")
+ private String tradeType;
+ /**
+ *
+ * 字段名:交易状态
+ * 变量名:trade_state
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 枚举值:
+ * SUCCESS:支付成功
+ * REFUND:转入退款
+ * NOTPAY:未支付
+ * CLOSED:已关闭
+ * USERPAYING:用户支付中
+ * PAYERROR:支付失败(其他原因,如银行返回失败)
+ * ACCEPT:已接收,等待扣款
+ * 示例值: SUCCESS
+ *
+ */
+ @SerializedName(value = "trade_state")
+ private String tradeState;
+ /**
+ *
+ * 字段名:付款银行
+ * 变量名:bank_type
+ * 是否必填:否
+ * 类型:string[1,16]
+ * 描述:
+ * 银行类型,采用字符串类型的银行标识。
+ * 示例值:CMC
+ *
+ */
+ @SerializedName(value = "bank_type")
+ private String bankType;
+ /**
+ *
+ * 字段名:附加信息
+ * 变量名:attach
+ * 是否必填:是
+ * 类型:string[1,128]
+ * 描述:
+ * 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。
+ * 示例值:深圳分店
+ *
+ */
+ @SerializedName(value = "attach")
+ private String attach;
+ /**
+ *
+ * 字段名:支付完成时间
+ * 变量名:success_time
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 订单支付时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒。
+ * 示例值: 2015-05-20T13:29:35.120+08:00
+ *
+ */
+ @SerializedName(value = "success_time")
+ private String successTime;
+ /**
+ *
+ * 字段名:微信订单号
+ * 变量名:transaction_id
+ * 是否必填:是
+ * 类型:string[1,32]
+ * 描述:
+ * 微信支付订单号。
+ * 示例值:1009660380201506130728806387
+ *
+ */
+ @SerializedName(value = "transaction_id")
+ private String transactionId;
+ /**
+ *
+ * 字段名:子单商户订单号
+ * 变量名:out_trade_no
+ * 是否必填:是
+ * 类型:string[6,32]
+ * 描述:
+ * 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+ * 示例值:20150806125346
+ *
+ */
+ @SerializedName(value = "out_trade_no")
+ private String outTradeNo;
+ /**
+ *
+ * 字段名:订单金额
+ * 变量名:amount
+ * 是否必填:是
+ * 类型:object
+ * 描述:
+ * 订单金额信息
+ *
+ */
+ @SerializedName(value = "amount")
+ private Amount amount;
+ /**
+ *
+ * 字段名:优惠功能
+ * 变量名:promotion_detail
+ * 是否必填:是
+ * 类型:array
+ * 描述:
+ * 优惠功能,子单有核销优惠券时有返回
+ *
+ */
+ @SerializedName(value = "promotion_detail")
+ private List promotionDetail;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class CombinePayerInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:用户标识
+ * 变量名:openid
+ * 是否必填:是
+ * 类型:string[1,128]
+ * 描述:
+ * 使用合单appid获取的对应用户openid。是用户在商户appid下的唯一标识。
+ * 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
+ *
+ */
+ @SerializedName(value = "openid")
+ private String openid;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class Amount implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:标价金额
+ * 变量名:total_amount
+ * 是否必填:是
+ * 类型:int64
+ * 描述:
+ * 子单金额,单位为分。
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "total_amount")
+ private Integer totalAmount;
+ /**
+ *
+ * 字段名:标价币种
+ * 变量名:currency
+ * 是否必填:是
+ * 类型:string[1,8]
+ * 描述:
+ * 符合ISO 4217标准的三位字母代码,人民币:CNY。
+ * 示例值:CNY
+ *
+ */
+ @SerializedName(value = "currency")
+ private String currency;
+ /**
+ *
+ * 字段名:现金支付金额
+ * 变量名:payer_amount
+ * 是否必填:是
+ * 类型:int64
+ * 描述:
+ * 订单现金支付金额。
+ * 示例值:10
+ *
+ */
+ @SerializedName(value = "payer_amount")
+ private Integer payerAmount;
+ /**
+ *
+ * 字段名:现金支付币种
+ * 变量名:payer_currency
+ * 是否必填:是
+ * 类型:string[1,8]
+ * 描述:
+ * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY。
+ * 示例值: CNY
+ *
+ */
+ @SerializedName(value = "payer_currency")
+ private String payerCurrency;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class PromotionDetail implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:券ID
+ * 变量名:coupon_id
+ * 是否必填:是
+ * 类型:string[1, 32]
+ * 描述:
+ * 券ID
+ * 示例值:109519
+ *
+ */
+ @SerializedName(value = "coupon_id")
+ private String couponId;
+ /**
+ *
+ * 字段名:优惠名称
+ * 变量名:name
+ * 是否必填:否
+ * 类型:string[1, 64]
+ * 描述:
+ * 优惠名称
+ * 示例值:单品惠-6
+ *
+ */
+ @SerializedName(value = "name")
+ private String name;
+ /**
+ *
+ * 字段名:优惠范围
+ * 变量名:scope
+ * 是否必填:否
+ * 类型:string[1, 32]
+ * 描述:
+ * GLOBAL:全场代金券
+ * SINGLE:单品优惠
+ * 示例值:GLOBALSINGLE
+ *
+ */
+ @SerializedName(value = "scope")
+ private String scope;
+ /**
+ *
+ * 字段名:优惠类型
+ * 变量名:type
+ * 是否必填:否
+ * 类型:string[1,8]
+ * 描述:
+ * CASH:充值;
+ * NOCASH:预充值。
+ * 示例值:CASH
+ *
+ */
+ @SerializedName(value = "type")
+ private String type;
+ /**
+ *
+ * 字段名:优惠券面额
+ * 变量名:amount
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 当前子单中享受的优惠券金额
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "amount")
+ private Integer amount;
+ /**
+ *
+ * 字段名:活动ID
+ * 变量名:stock_id
+ * 是否必填:否
+ * 类型:string[1, 32]
+ * 描述:
+ * 活动ID,批次ID
+ * 示例值:931386
+ *
+ */
+ @SerializedName(value = "stock_id")
+ private String stockId;
+ /**
+ *
+ * 字段名:微信出资
+ * 变量名:wechatpay_contribute
+ * 是否必填:否
+ * 类型:int
+ * 描述:
+ * 单位为分
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "wechatpay_contribute")
+ private Integer wechatpayContribute;
+ /**
+ *
+ * 字段名:商户出资
+ * 变量名:merchant_contribute
+ * 是否必填:否
+ * 类型:int
+ * 描述:
+ * 单位为分
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "merchant_contribute")
+ private Integer merchantContribute;
+ /**
+ *
+ * 字段名:其他出资
+ * 变量名:other_contribute
+ * 是否必填:否
+ * 类型:int
+ * 描述:
+ * 单位为分
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "other_contribute")
+ private Integer otherContribute;
+ /**
+ *
+ * 字段名:优惠币种
+ * 变量名:currency
+ * 是否必填:否
+ * 类型:string[1,16]
+ * 描述:
+ * CNY:人民币,境内商户号仅支持人民币。
+ * 示例值:CNY
+ *
+ */
+ @SerializedName(value = "currency")
+ private String currency;
+ /**
+ *
+ * 字段名:单品列表
+ * 变量名:goods_detail
+ * 是否必填:否
+ * 类型:array
+ * 描述:
+ * 单品列表信息
+ *
+ */
+ @SerializedName(value = "goods_detail")
+ private List goodsDetail;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class GoodsDetail implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:商品编码
+ * 变量名:goods_id
+ * 是否必填:是
+ * 类型:string[1, 32]
+ * 描述:
+ * 商品编码
+ * 示例值:M1006
+ *
+ */
+ @SerializedName(value = "goods_id")
+ private String goodsId;
+ /**
+ *
+ * 字段名:商品数量
+ * 变量名:quantity
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 商品数量
+ * 示例值:1
+ *
+ */
+ @SerializedName(value = "quantity")
+ private Integer quantity;
+ /**
+ *
+ * 字段名:商品单价
+ * 变量名:unit_price
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 商品价格
+ * 示例值:100
+ *
+ */
+ @SerializedName(value = "unit_price")
+ private Integer unitPrice;
+ /**
+ *
+ * 字段名:商品优惠金额
+ * 变量名:discount_amount
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 商品优惠金额
+ * 示例值:1
+ *
+ */
+ @SerializedName(value = "discount_amount")
+ private Integer discountAmount;
+ /**
+ *
+ * 字段名:商品备注
+ * 变量名:goods_remark
+ * 是否必填:否
+ * 类型:string[1, 128]
+ * 描述:
+ * 商品备注
+ * 示例值:商品备注信息
+ *
+ */
+ @SerializedName(value = "goods_remark")
+ private String goodsRemark;
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineTransactionsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineTransactionsResult.java
new file mode 100644
index 0000000000..2a073f6a4e
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineTransactionsResult.java
@@ -0,0 +1,120 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
+import com.github.binarywang.wxpay.v3.util.SignUtils;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.security.PrivateKey;
+
+/**
+ *
+ * 使用合单支付接口,用户只输入一次密码,即可完成多个订单的支付。目前最多一次可支持50笔订单进行合单支付。
+ * 参考文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_1.shtml
+ * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_2.shtml
+ * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_3.shtml
+ * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_4.shtml
+ * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_5.shtml
+ *
+ *
+ * @author thinsstar
+ */
+@Data
+@NoArgsConstructor
+public class CombineTransactionsResult implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:预支付交易会话标识(APP支付、JSAPI和小程序支付返回)
+ * 变量名:prepay_id
+ * 是否必填:是
+ * 类型:string[1,64]
+ * 描述:
+ * 数字和字母。微信生成的预支付会话标识,用于后续接口调用使用,该值有效期为2小时。
+ * 示例值:wx201410272009395522657a690389285100
+ *
+ */
+ @SerializedName("prepay_id")
+ private String prepayId;
+ /**
+ *
+ * 字段名:支付跳转链接(H5支付返回)
+ * 变量名:h5_url
+ * 是否必填:是
+ * 类型:string[1,512]
+ * 描述:
+ * 支付跳转链接,h5_url的有效期为5分钟
+ * 示例值:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2016121516420242444321ca0631331346&package=1405458241
+ *
+ */
+ @SerializedName("h5_url")
+ private String h5Url;
+ /**
+ *
+ * 字段名:二维码链接(NATIVE支付返回)
+ * 变量名:h5_url
+ * 是否必填:是
+ * 类型:string[1,512]
+ * 描述:
+ * 二维码链接
+ * 示例值:weixin://pay.weixin.qq.com/bizpayurl/up?pr=NwY5Mz9&groupid=00
+ *
+ */
+ @SerializedName("code_url")
+ private String codeUrl;
+
+ @Data
+ @Accessors(chain = true)
+ public static class JsapiResult implements Serializable {
+ private String appId;
+ private String timeStamp;
+ private String nonceStr;
+ private String packageValue;
+ private String signType;
+ private String paySign;
+
+ private String getSignStr() {
+ return String.format("%s\n%s\n%s\n%s\n", appId, timeStamp, nonceStr, packageValue);
+ }
+ }
+
+ @Data
+ @Accessors(chain = true)
+ public static class AppResult implements Serializable {
+ private String appid;
+ private String partnerid;
+ private String prepayid;
+ private String packageValue;
+ private String noncestr;
+ private String timestamp;
+ }
+
+ public T getPayInfo(TradeTypeEnum tradeType, String appId, String mchId, PrivateKey privateKey) {
+ String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+ String nonceStr = SignUtils.genRandomStr();
+ switch (tradeType) {
+ case JSAPI:
+ JsapiResult jsapiResult = new JsapiResult();
+ jsapiResult.setAppId(appId).setTimeStamp(timestamp)
+ .setPackageValue("prepay_id=" + this.prepayId).setNonceStr(nonceStr)
+ //签名类型,默认为RSA,仅支持RSA。
+ .setSignType("RSA").setPaySign(SignUtils.sign(jsapiResult.getSignStr(), privateKey));
+ return (T) jsapiResult;
+ case H5:
+ return (T) this.h5Url;
+ case APP:
+ AppResult appResult = new AppResult();
+ appResult.setAppid(appId).setPrepayid(this.prepayId).setPartnerid(mchId)
+ .setNoncestr(nonceStr).setTimestamp(timestamp)
+ //暂填写固定值Sign=WXPay
+ .setPackageValue("Sign=WXPay");
+ return (T) appResult;
+ case NATIVE:
+ return (T) this.codeUrl;
+ }
+ return null;
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayApplyBillV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayApplyBillV3Result.java
new file mode 100644
index 0000000000..f5fbf764c3
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayApplyBillV3Result.java
@@ -0,0 +1,59 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 微信支付-申请账单返回结果.
+ *
+ *
+ * @author thinsstar
+ */
+@Data
+@NoArgsConstructor
+public class WxPayApplyBillV3Result implements Serializable {
+ private static final long serialVersionUID = -1L;
+ /**
+ *
+ * 字段名:哈希类型
+ * 变量名:hash_type
+ * 是否必填:是
+ * 类型:string[1, 32]
+ * 描述:
+ * 原始账单(gzip需要解压缩)的摘要值,用于校验文件的完整性。
+ * 示例值:SHA1
+ *
+ */
+ @SerializedName(value = "hash_type")
+ private String hashType;
+ /**
+ *
+ * 字段名:哈希值
+ * 变量名:hash_value
+ * 是否必填:是
+ * 类型:string[1,1024]
+ * 描述:
+ * 原始账单(gzip需要解压缩)的摘要值,用于校验文件的完整性。
+ * 示例值:79bb0f45fc4c42234a918000b2668d689e2bde04
+ *
+ */
+ @SerializedName(value = "out_refund_no")
+ private String outRefundNo;
+ /**
+ *
+ * 字段名:账单下载地址
+ * 变量名:download_url
+ * 是否必填:是
+ * 类型:string[1,2048]
+ * 描述:
+ * 供下一步请求账单文件的下载地址,该地址30s内有效。
+ * 示例值:https://api.mch.weixin.qq.com/v3/billdownload/file?token=xxx
+ *
+ */
+ @SerializedName(value = "download_url")
+ private String downloadUrl;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryV3Result.java
index 7d60d9f28f..c203d75699 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryV3Result.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryV3Result.java
@@ -17,7 +17,6 @@
@Data
@NoArgsConstructor
public class WxPayRefundQueryV3Result implements Serializable {
- private static final long serialVersionUID = 1L;
/**
*
* 字段名:微信支付退款号
@@ -25,7 +24,7 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 微信支付退款号。
+ * 微信支付退款号
* 示例值:50000000382019052709732678859
*
*/
@@ -51,7 +50,7 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 微信支付交易订单号。
+ * 微信支付交易订单号
* 示例值:1217752501201407033233368018
*
*/
@@ -64,7 +63,7 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 原支付交易对应的商户订单号。
+ * 原支付交易对应的商户订单号
* 示例值:1217752501201407033233368018
*
*/
@@ -96,10 +95,10 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 描述:
* 取当前退款单的退款入账方,有以下几种情况:
* 1)退回银行卡:{银行名称}{卡类型}{卡尾号}
- * 2)退回支付用户零钱:支付用户零钱
- * 3)退还商户:商户基本账户商户结算银行账户
- * 4)退回支付用户零钱通:支付用户零钱通。
- * 示例值:招商银行信用卡0403
+ * 2)退回支付用户零钱:支付用户零钱
+ * 3)退还商户:商户基本账户商户结算银行账户
+ * 4)退回支付用户零钱通:支付用户零钱通
+ * 示例值:招商银行信用卡0403
*
*/
@SerializedName(value = "user_received_account")
@@ -111,7 +110,7 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 是否必填:否
* 类型:string[1, 64]
* 描述:
- * 退款成功时间,当退款状态为退款成功时有返回。遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒。
+ * 退款成功时间,当退款状态为退款成功时有返回。
* 示例值:2020-12-01T16:18:12+08:00
*
*/
@@ -124,7 +123,7 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 64]
* 描述:
- * 退款受理时间。 遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒。
+ * 退款受理时间
* 示例值:2020-12-01T16:18:12+08:00
*
*/
@@ -137,7 +136,7 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台-交易中心,手动处理此笔退款。
+ * 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台(pay.weixin.qq.com)-交易中心,手动处理此笔退款。
* 枚举值:
* SUCCESS:退款成功
* CLOSED:退款关闭
@@ -155,11 +154,13 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 是否必填:否
* 类型:string[1, 32]
* 描述:
- * 退款所使用资金对应的资金账户类型。 枚举值:
+ * 退款所使用资金对应的资金账户类型
+ * 枚举值:
* UNSETTLED : 未结算资金
* AVAILABLE : 可用余额
* UNAVAILABLE : 不可用余额
* OPERATION : 运营户
+ * BASIC : 基本账户(含可用余额和不可用余额)
* 示例值:UNSETTLED
*
*/
@@ -172,7 +173,7 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 是否必填:是
* 类型:object
* 描述:
- * 金额详细信息。
+ * 金额详细信息
*
*/
@SerializedName(value = "amount")
@@ -184,10 +185,11 @@ public class WxPayRefundQueryV3Result implements Serializable {
* 是否必填:否
* 类型:array
* 描述:
- * 优惠退款信息。
+ * 优惠退款信息
*
*/
- public List promotionDetails;
+ @SerializedName(value = "promotion_detail")
+ public List promotionDetail;
@Data
@NoArgsConstructor
@@ -200,7 +202,7 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 订单总金额,单位为分。
+ * 订单总金额,单位为分
* 示例值:100
*
*/
@@ -213,12 +215,24 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 退款标价金额,单位为分,可以做部分退款。
+ * 退款标价金额,单位为分,可以做部分退款
* 示例值:100
*
*/
@SerializedName(value = "refund")
private Integer refund;
+ /**
+ *
+ * 字段名:退款出资账户及金额
+ * 变量名:from
+ * 是否必填:是
+ * 类型:array
+ * 描述:
+ * 退款出资的账户类型及金额信息
+ *
+ */
+ @SerializedName(value = "from")
+ private List from;
/**
*
* 字段名:用户支付金额
@@ -226,7 +240,7 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 现金支付金额,单位为分,只能为整数。
+ * 现金支付金额,单位为分,只能为整数
* 示例值:90
*
*/
@@ -239,7 +253,7 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 退款给用户的金额,不包含所有优惠券金额。
+ * 退款给用户的金额,不包含所有优惠券金额
* 示例值:90
*
*/
@@ -252,7 +266,7 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 去掉非充值代金券退款金额后的退款金额,单位为分,退款金额=申请退款金额-非充值代金券退款金额,退款金额<=申请退款金额。
+ * 去掉非充值代金券退款金额后的退款金额,单位为分,退款金额=申请退款金额-非充值代金券退款金额,退款金额<=申请退款金额
* 示例值:100
*
*/
@@ -260,12 +274,12 @@ public static class Amount implements Serializable {
private Integer settlementRefund;
/**
*
- * 字段名:用户退款金额
+ * 字段名:应结订单金额
* 变量名:settlement_total
* 是否必填:是
* 类型:int
* 描述:
- * 应结订单金额=订单金额-免充值代金券金额,应结订单金额<=订单金额,单位为分。
+ * 应结订单金额=订单金额-免充值代金券金额,应结订单金额<=订单金额,单位为分
* 示例值:100
*
*/
@@ -276,9 +290,9 @@ public static class Amount implements Serializable {
* 字段名:优惠退款金额
* 变量名:discount_refund
* 是否必填:否
- * 类型:int64
+ * 类型:int
* 描述:
- * 优惠退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠,单位为分。
+ * 优惠退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠,单位为分
* 示例值:10
*
*/
@@ -286,7 +300,7 @@ public static class Amount implements Serializable {
private Integer discountRefund;
/**
*
- * 字段名:币类型
+ * 字段名:退款币种
* 变量名:currency
* 是否必填:否
* 类型:string[1, 16]
@@ -310,7 +324,7 @@ public static class PromotionDetail implements Serializable {
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 券或者立减优惠id。
+ * 券或者立减优惠id
* 示例值:109519
*
*/
@@ -353,7 +367,7 @@ public static class PromotionDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 用户享受优惠的金额(优惠券面额=微信出资金额+商家出资金额+其他出资方金额 ),单位为分。
+ * 用户享受优惠的金额(优惠券面额=微信出资金额+商家出资金额+其他出资方金额 ),单位为分
* 示例值:5
*
*/
@@ -366,7 +380,7 @@ public static class PromotionDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 优惠退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为用户支付的现金,说明详见代金券或立减优惠,单位为分。
+ * 优惠退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为用户支付的现金,说明详见代金券或立减优惠,单位为分
* 示例值:100
*
*/
@@ -379,25 +393,60 @@ public static class PromotionDetail implements Serializable {
* 是否必填:否
* 类型:array
* 描述:
- * 优惠商品发生退款时返回商品信息。
+ * 优惠商品发生退款时返回商品信息
*
*/
@SerializedName(value = "goods_detail")
- private List goodsDetails;
+ private List goodsDetail;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class From implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:出资账户类型
+ * 变量名:account
+ * 是否必填:是
+ * 类型:string[1, 32]
+ * 描述:
+ * 下面枚举值多选一。
+ * 枚举值:
+ * AVAILABLE : 可用余额
+ * UNAVAILABLE : 不可用余额
+ * 示例值:AVAILABLE
+ *
+ */
+ @SerializedName(value = "account")
+ private String account;
+ /**
+ *
+ * 字段名:出资金额
+ * 变量名:amount
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 对应账户出资金额
+ * 示例值:444
+ *
+ */
+ @SerializedName(value = "amount")
+ private Integer amount;
}
@Data
@NoArgsConstructor
public static class GoodsDetail implements Serializable {
- private static final long serialVersionUID = -1L;
+ private static final long serialVersionUID = 1L;
/**
*
* 字段名:商户侧商品编码
* 变量名:merchant_goods_id
* 是否必填:是
- * 类型:string[1,32]
+ * 类型:string[1, 32]
* 描述:
- * 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成。
+ * 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成
* 示例值:1217752501201407033233368018
*
*/
@@ -408,9 +457,9 @@ public static class GoodsDetail implements Serializable {
* 字段名:微信侧商品编码
* 变量名:wechatpay_goods_id
* 是否必填:否
- * 类型:string[1,32]
+ * 类型:string[1, 32]
* 描述:
- * 微信支付定义的统一商品编号(没有可不传)。
+ * 微信支付定义的统一商品编号(没有可不传)
* 示例值:1001
*
*/
@@ -421,9 +470,9 @@ public static class GoodsDetail implements Serializable {
* 字段名:商品名称
* 变量名:goods_name
* 是否必填:否
- * 类型:string[1,256]
+ * 类型:string[1, 256]
* 描述:
- * 商品的实际名称。
+ * 商品的实际名称
* 示例值:iPhone6s 16G
*
*/
@@ -436,7 +485,7 @@ public static class GoodsDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 商品单价金额,单位为分。
+ * 商品单价金额,单位为分
* 示例值:528800
*
*/
@@ -449,7 +498,7 @@ public static class GoodsDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 商品退款金额,单位为分。
+ * 商品退款金额,单位为分
* 示例值:528800
*
*/
@@ -462,7 +511,7 @@ public static class GoodsDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 单品的退款数量。
+ * 单品的退款数量,单位为分
* 示例值:1
*
*/
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundV3Result.java
index a5712f0c6d..8930bac83c 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundV3Result.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundV3Result.java
@@ -21,12 +21,12 @@ public class WxPayRefundV3Result implements Serializable {
private static final long serialVersionUID = -1L;
/**
*
- * 字段名:微信退款单号
+ * 字段名:微信支付退款号
* 变量名:refund_id
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 微信支付退款号。
+ * 微信支付退款号
* 示例值:50000000382019052709732678859
*
*/
@@ -52,7 +52,7 @@ public class WxPayRefundV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 微信支付交易订单号。
+ * 微信支付交易订单号
* 示例值:1217752501201407033233368018
*
*/
@@ -65,7 +65,7 @@ public class WxPayRefundV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 原支付交易对应的商户订单号。
+ * 原支付交易对应的商户订单号
* 示例值:1217752501201407033233368018
*
*/
@@ -76,13 +76,13 @@ public class WxPayRefundV3Result implements Serializable {
* 字段名:退款渠道
* 变量名:channel
* 是否必填:是
- * 类型:string[1, 32]
+ * 类型:string[1, 16]
* 描述:
* 枚举值:
- * ORIGINAL:原路退款
- * BALANCE:退回到余额
- * OTHER_BALANCE:原账户异常退到其他余额账户
- * OTHER_BANKCARD:原银行卡异常退到其他银行卡
+ * ORIGINAL—原路退款
+ * BALANCE—退回到余额
+ * OTHER_BALANCE—原账户异常退到其他余额账户
+ * OTHER_BANKCARD—原银行卡异常退到其他银行卡
* 示例值:ORIGINAL
*
*/
@@ -97,9 +97,9 @@ public class WxPayRefundV3Result implements Serializable {
* 描述:
* 取当前退款单的退款入账方,有以下几种情况:
* 1)退回银行卡:{银行名称}{卡类型}{卡尾号}
- * 2)退回支付用户零钱:支付用户零钱
- * 3)退还商户:商户基本账户商户结算银行账户
- * 4)退回支付用户零钱通:支付用户零钱通。
+ * 2)退回支付用户零钱:支付用户零钱
+ * 3)退还商户:商户基本账户商户结算银行账户
+ * 4)退回支付用户零钱通:支付用户零钱通
* 示例值:招商银行信用卡0403
*
*/
@@ -112,7 +112,7 @@ public class WxPayRefundV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 64]
* 描述:
- * 退款成功时间,当退款状态为退款成功时有返回。遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒。
+ * 退款成功时间,当退款状态为退款成功时有返回。
* 示例值:2020-12-01T16:18:12+08:00
*
*/
@@ -125,7 +125,7 @@ public class WxPayRefundV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 64]
* 描述:
- * 退款受理时间。 遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒。
+ * 退款受理时间
* 示例值:2020-12-01T16:18:12+08:00
*
*/
@@ -138,7 +138,7 @@ public class WxPayRefundV3Result implements Serializable {
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台-交易中心,手动处理此笔退款。
+ * 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台(pay.weixin.qq.com)-交易中心,手动处理此笔退款。
* 枚举值:
* SUCCESS:退款成功
* CLOSED:退款关闭
@@ -153,14 +153,16 @@ public class WxPayRefundV3Result implements Serializable {
*
* 字段名:资金账户
* 变量名:funds_account
- * 是否必填:是
+ * 是否必填:否
* 类型:string[1, 32]
* 描述:
- * 退款所使用资金对应的资金账户类型。 枚举值:
+ * 退款所使用资金对应的资金账户类型
+ * 枚举值:
* UNSETTLED : 未结算资金
* AVAILABLE : 可用余额
* UNAVAILABLE : 不可用余额
* OPERATION : 运营户
+ * BASIC : 基本账户(含可用余额和不可用余额)
* 示例值:UNSETTLED
*
*/
@@ -173,7 +175,7 @@ public class WxPayRefundV3Result implements Serializable {
* 是否必填:是
* 类型:object
* 描述:
- * 金额详细信息。
+ * 金额详细信息
*
*/
@SerializedName(value = "amount")
@@ -185,7 +187,7 @@ public class WxPayRefundV3Result implements Serializable {
* 是否必填:否
* 类型:array
* 描述:
- * 优惠退款信息。
+ * 优惠退款信息
*
*/
@SerializedName(value = "promotion_detail")
@@ -202,7 +204,7 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 订单总金额,单位为分。
+ * 订单总金额,单位为分
* 示例值:100
*
*/
@@ -215,12 +217,24 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 退款标价金额,单位为分,可以做部分退款。
+ * 退款标价金额,单位为分,可以做部分退款
* 示例值:100
*
*/
@SerializedName(value = "refund")
private Integer refund;
+ /**
+ *
+ * 字段名:退款出资账户及金额
+ * 变量名:from
+ * 是否必填:否
+ * 类型:array
+ * 描述:
+ * 退款出资的账户类型及金额信息
+ *
+ */
+ @SerializedName(value = "from")
+ private List from;
/**
*
* 字段名:用户支付金额
@@ -228,7 +242,7 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 现金支付金额,单位为分,只能为整数。
+ * 现金支付金额,单位为分,只能为整数
* 示例值:90
*
*/
@@ -241,7 +255,7 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 退款给用户的金额,不包含所有优惠券金额。
+ * 退款给用户的金额,不包含所有优惠券金额
* 示例值:90
*
*/
@@ -254,7 +268,7 @@ public static class Amount implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 去掉非充值代金券退款金额后的退款金额,单位为分,退款金额=申请退款金额-非充值代金券退款金额,退款金额<=申请退款金额。
+ * 去掉非充值代金券退款金额后的退款金额,单位为分,退款金额=申请退款金额-非充值代金券退款金额,退款金额<=申请退款金额
* 示例值:100
*
*/
@@ -262,12 +276,12 @@ public static class Amount implements Serializable {
private Integer settlementRefund;
/**
*
- * 字段名:用户退款金额
+ * 字段名:应结订单金额
* 变量名:settlement_total
* 是否必填:是
* 类型:int
* 描述:
- * 应结订单金额=订单金额-免充值代金券金额,应结订单金额<=订单金额,单位为分。
+ * 应结订单金额=订单金额-免充值代金券金额,应结订单金额<=订单金额,单位为分
* 示例值:100
*
*/
@@ -278,9 +292,9 @@ public static class Amount implements Serializable {
* 字段名:优惠退款金额
* 变量名:discount_refund
* 是否必填:否
- * 类型:int64
+ * 类型:int
* 描述:
- * 优惠退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠,单位为分。
+ * 优惠退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠,单位为分
* 示例值:10
*
*/
@@ -290,7 +304,7 @@ public static class Amount implements Serializable {
*
* 字段名:币类型
* 变量名:currency
- * 是否必填:否
+ * 是否必填:是
* 类型:string[1, 16]
* 描述:
* 符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。
@@ -312,7 +326,7 @@ public static class PromotionDetail implements Serializable {
* 是否必填:是
* 类型:string[1, 32]
* 描述:
- * 券或者立减优惠id。
+ * 券或者立减优惠id
* 示例值:109519
*
*/
@@ -355,7 +369,7 @@ public static class PromotionDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 用户享受优惠的金额(优惠券面额=微信出资金额+商家出资金额+其他出资方金额 ),单位为分。
+ * 用户享受优惠的金额(优惠券面额=微信出资金额+商家出资金额+其他出资方金额 ),单位为分
* 示例值:5
*
*/
@@ -368,7 +382,7 @@ public static class PromotionDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 优惠退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为用户支付的现金,说明详见代金券或立减优惠,单位为分。
+ * 优惠退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为用户支付的现金,说明详见代金券或立减优惠,单位为分
* 示例值:100
*
*/
@@ -381,25 +395,60 @@ public static class PromotionDetail implements Serializable {
* 是否必填:否
* 类型:array
* 描述:
- * 优惠商品发生退款时返回商品信息。
+ * 优惠商品发生退款时返回商品信息
*
*/
@SerializedName(value = "goods_detail")
- private List goodsDetails;
+ private List goodsDetail;
+ }
+
+ @Data
+ @NoArgsConstructor
+ public static class From implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ * 字段名:出资账户类型
+ * 变量名:account
+ * 是否必填:是
+ * 类型:string[1, 32]
+ * 描述:
+ * 下面枚举值多选一。
+ * 枚举值:
+ * AVAILABLE : 可用余额
+ * UNAVAILABLE : 不可用余额
+ * 示例值:AVAILABLE
+ *
+ */
+ @SerializedName(value = "account")
+ private String account;
+ /**
+ *
+ * 字段名:出资金额
+ * 变量名:amount
+ * 是否必填:是
+ * 类型:int
+ * 描述:
+ * 对应账户出资金额
+ * 示例值:444
+ *
+ */
+ @SerializedName(value = "amount")
+ private Integer amount;
}
@Data
@NoArgsConstructor
public static class GoodsDetail implements Serializable {
- private static final long serialVersionUID = -1L;
+ private static final long serialVersionUID = 1L;
/**
*
* 字段名:商户侧商品编码
* 变量名:merchant_goods_id
* 是否必填:是
- * 类型:string[1,32]
+ * 类型:string[1, 32]
* 描述:
- * 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成。
+ * 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成
* 示例值:1217752501201407033233368018
*
*/
@@ -410,9 +459,9 @@ public static class GoodsDetail implements Serializable {
* 字段名:微信侧商品编码
* 变量名:wechatpay_goods_id
* 是否必填:否
- * 类型:string[1,32]
+ * 类型:string[1, 32]
* 描述:
- * 微信支付定义的统一商品编号(没有可不传)。
+ * 微信支付定义的统一商品编号(没有可不传)
* 示例值:1001
*
*/
@@ -423,9 +472,9 @@ public static class GoodsDetail implements Serializable {
* 字段名:商品名称
* 变量名:goods_name
* 是否必填:否
- * 类型:string[1,256]
+ * 类型:string[1, 256]
* 描述:
- * 商品的实际名称。
+ * 商品的实际名称
* 示例值:iPhone6s 16G
*
*/
@@ -438,7 +487,7 @@ public static class GoodsDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 商品单价金额,单位为分。
+ * 商品单价金额,单位为分
* 示例值:528800
*
*/
@@ -451,7 +500,7 @@ public static class GoodsDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 商品退款金额,单位为分。
+ * 商品退款金额,单位为分
* 示例值:528800
*
*/
@@ -464,7 +513,7 @@ public static class GoodsDetail implements Serializable {
* 是否必填:是
* 类型:int
* 描述:
- * 单品的退款数量。
+ * 单品的退款数量,单位为分
* 示例值:1
*
*/
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/enums/TradeTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/enums/TradeTypeEnum.java
index 44720d4be5..bdc5762b5a 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/enums/TradeTypeEnum.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/enums/TradeTypeEnum.java
@@ -12,22 +12,27 @@ public enum TradeTypeEnum {
/**
* APP
*/
- APP("/v3/pay/transactions/app"),
+ APP("/v3/pay/transactions/app", "/v3/combine-transactions/app"),
/**
* JSAPI 或 小程序
*/
- JSAPI("/v3/pay/transactions/jsapi"),
+ JSAPI("/v3/pay/transactions/jsapi", "/v3/combine-transactions/jsapi"),
/**
* NATIVE
*/
- NATIVE("/v3/pay/transactions/native"),
+ NATIVE("/v3/pay/transactions/native", "/v3/combine-transactions/native"),
/**
* H5
*/
- H5("/v3/pay/transactions/h5");
+ H5("/v3/pay/transactions/h5", "/v3/combine-transactions/h5");
/**
* 单独下单url
*/
private final String partnerUrl;
+
+ /**
+ * 合并下单url
+ */
+ private final String combineUrl;
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/BasePayV3Service.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/BasePayV3Service.java
deleted file mode 100644
index dbab9cc288..0000000000
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/BasePayV3Service.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.github.binarywang.wxpay.service;
-
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
-import com.github.binarywang.wxpay.exception.WxPayException;
-
-/**
- *
- * 微信基础支付v3相关服务类.
- *
- *
- * @author thinsstar
- */
-public interface BasePayV3Service {
-
- /**
- * 调用统一下单接口,并组装生成支付所需参数对象.
- *
- * @param 请使用{@link com.github.binarywang.wxpay.bean.order}包下的类
- * @param request 统一下单请求参数
- * @return 返回 {@link com.github.binarywang.wxpay.bean.order}包下的类对象
- * @throws WxPayException the wx pay exception
- */
- T createOrder(WxPayUnifiedOrderV3Request request) 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 9b418bcea9..e11f65c139 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
@@ -346,6 +346,19 @@ public interface WxPayService {
*/
WxPayOrderQueryV3Result queryOrderV3(WxPayOrderQueryV3Request request) throws WxPayException;
+ /**
+ *
+ * 合单查询订单API
+ * 请求URL: https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/{combine_out_trade_no}
+ * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_11.shtml
+ *
+ *
+ * @param combineOutTradeNo 合单商户订单号
+ * @return 合单支付订单信息
+ * @throws WxPayException the wx pay exception
+ */
+ CombineQueryResult queryCombine(String combineOutTradeNo) throws WxPayException;
+
/**
*
* 关闭订单.
@@ -416,6 +429,18 @@ public interface WxPayService {
*/
void closeOrderV3(WxPayOrderCloseV3Request request) throws WxPayException;
+ /**
+ *
+ * 合单关闭订单API
+ * 请求URL: https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/{combine_out_trade_no}/close
+ * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_12.shtml
+ *
+ *
+ * @param request 请求对象
+ * @throws WxPayException the wx pay exception
+ */
+ void closeCombine(CombineCloseRequest request) throws WxPayException;
+
/**
* 调用统一下单接口,并组装生成支付所需参数对象.
*
@@ -468,6 +493,42 @@ public interface WxPayService {
*/
WxPayUnifiedOrderV3Result unifiedOrderV3(TradeTypeEnum tradeType, WxPayUnifiedOrderV3Request request) throws WxPayException;
+ /**
+ *
+ * 合单支付API(APP支付、JSAPI支付、H5支付、NATIVE支付).
+ * 请求URL:
+ * https://api.mch.weixin.qq.com/v3/combine-transactions/app
+ * https://api.mch.weixin.qq.com/v3/combine-transactions/h5
+ * https://api.mch.weixin.qq.com/v3/combine-transactions/jsapi
+ * https://api.mch.weixin.qq.com/v3/combine-transactions/native
+ * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_9_3.shtml
+ *
+ *
+ * @param tradeType 支付方式
+ * @param request 请求对象
+ * @return 微信合单支付返回 combine transactions result
+ * @throws WxPayException the wx pay exception
+ */
+ CombineTransactionsResult combine(TradeTypeEnum tradeType, CombineTransactionsRequest request) throws WxPayException;
+
+ /**
+ *
+ * 合单支付API(APP支付、JSAPI支付、H5支付、NATIVE支付).
+ * 请求URL:
+ * https://api.mch.weixin.qq.com/v3/combine-transactions/app
+ * https://api.mch.weixin.qq.com/v3/combine-transactions/h5
+ * https://api.mch.weixin.qq.com/v3/combine-transactions/jsapi
+ * https://api.mch.weixin.qq.com/v3/combine-transactions/native
+ * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_9_3.shtml
+ *
+ *
+ * @param tradeType 支付方式
+ * @param request 请求对象
+ * @return 调起支付需要的参数 t
+ * @throws WxPayException the wx pay exception
+ */
+ T combineTransactions(TradeTypeEnum tradeType, CombineTransactionsRequest request) throws WxPayException;
+
/**
* 该接口调用“统一下单”接口,并拼装发起支付请求需要的参数.
* 详见https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
@@ -683,6 +744,19 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
*/
WxPayOrderNotifyV3Result parseOrderNotifyV3Result(String notifyData, SignatureHeader header) throws WxPayException;
+ /**
+ *
+ * 合单支付通知回调数据处理
+ * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_13.shtml
+ *
+ *
+ * @param notifyData 通知数据
+ * @param header 通知头部数据,不传则表示不校验头
+ * @return 解密后通知数据 combine transactions notify result
+ * @throws WxPayException the wx pay exception
+ */
+ CombineNotifyResult parseCombineNotifyResult(String notifyData, SignatureHeader header) throws WxPayException;
+
/**
* 解析退款结果通知
* 详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=9
@@ -906,6 +980,59 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
*/
WxPayFundFlowResult downloadFundFlow(WxPayDownloadFundFlowRequest request) throws WxPayException;
+ /**
+ *
+ * 申请交易账单API
+ * 微信支付按天提供交易账单文件,商户可以通过该接口获取账单文件的下载地址。文件内包含交易相关的金额、时间、营销等信息,供商户核对订单、退款、银行到账等情况。
+ * 注意:
+ * • 微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中,跟原支付单订单号一致;
+ * • 对账单中涉及金额的字段单位为“元”;
+ * • 对账单接口只能下载三个月以内的账单。
+ * 接口链接:https://api.mch.weixin.qq.com/v3/bill/tradebill
+ * 详情请见: 申请交易账单
+ *
+ *
+ * @param request 申请账单请求
+ * @return Result对象 apply trade bill result
+ * @throws WxPayException the wx pay exception
+ */
+ WxPayApplyBillV3Result applyTradeBill(WxPayApplyTradeBillV3Request request) throws WxPayException;
+
+ /**
+ *
+ * 申请资金账单API
+ * 微信支付按天提供微信支付账户的资金流水账单文件,商户可以通过该接口获取账单文件的下载地址。文件内包含该账户资金操作相关的业务单号、收支金额、记账时间等信息,供商户进行核对。
+ * 注意:
+ * • 资金账单中的数据反映的是商户微信支付账户资金变动情况;
+ * • 对账单中涉及金额的字段单位为“元”。
+ * 接口链接:https://api.mch.weixin.qq.com/v3/bill/fundflowbill
+ * 详情请见: 申请资金账单
+ *
+ *
+ * @param request 申请账单请求
+ * @return Result对象 apply fund flow bill result
+ * @throws WxPayException the wx pay exception
+ */
+ WxPayApplyBillV3Result applyFundFlowBill(WxPayApplyFundFlowBillV3Request request) throws WxPayException;
+
+ /**
+ *
+ * 下载账单API
+ * 下载账单API为通用接口,交易/资金账单都可以通过该接口获取到对应的账单。
+ * 注意:
+ * • 账单文件的下载地址的有效时间为30s。
+ * • 强烈建议商户将实际账单文件的哈希值和之前从接口获取到的哈希值进行比对,以确认数据的完整性。
+ * • 该接口响应的信息请求头中不包含微信接口响应的签名值,因此需要跳过验签的流程
+ * 接口链接:通过申请账单接口获取到“download_url”,URL有效期30s
+ * 详情请见: 下载账单
+ *
+ *
+ * @param url 微信返回的账单地址。
+ * @return 返回数据 return input stream
+ * @throws WxPayException the wx pay exception
+ */
+ InputStream downloadBill(String url) throws WxPayException;
+
/**
*
* 提交付款码支付.
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
index d39e22e7dd..95919ed254 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
@@ -34,6 +34,7 @@
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -378,6 +379,29 @@ public WxPayOrderNotifyV3Result parseOrderNotifyV3Result(String notifyData, Sign
}
}
+ @Override
+ public CombineNotifyResult parseCombineNotifyResult(String notifyData, SignatureHeader header) throws WxPayException {
+ if (Objects.nonNull(header) && !this.verifyNotifySign(header, notifyData)) {
+ throw new WxPayException("非法请求,头部信息验证失败");
+ }
+ OriginNotifyResponse response = GSON.fromJson(notifyData, OriginNotifyResponse.class);
+ OriginNotifyResponse.Resource resource = response.getResource();
+ String cipherText = resource.getCiphertext();
+ String associatedData = resource.getAssociatedData();
+ String nonce = resource.getNonce();
+ String apiV3Key = this.getConfig().getApiV3Key();
+ try {
+ String result = AesUtils.decryptToString(associatedData, nonce, cipherText, apiV3Key);
+ CombineNotifyResult.DecryptNotifyResult decryptNotifyResult = GSON.fromJson(result, CombineNotifyResult.DecryptNotifyResult.class);
+ CombineNotifyResult notifyResult = new CombineNotifyResult();
+ notifyResult.setRawData(response);
+ notifyResult.setResult(decryptNotifyResult);
+ return notifyResult;
+ } catch (GeneralSecurityException | IOException e) {
+ throw new WxPayException("解析报文异常!", e);
+ }
+ }
+
@Override
public WxPayRefundNotifyResult parseRefundNotifyResult(String xmlData) throws WxPayException {
try {
@@ -487,6 +511,13 @@ public WxPayOrderQueryV3Result queryOrderV3(WxPayOrderQueryV3Request request) th
return GSON.fromJson(response, WxPayOrderQueryV3Result.class);
}
+ @Override
+ public CombineQueryResult queryCombine(String combineOutTradeNo) throws WxPayException {
+ String url = String.format("%s/v3/combine-transactions/out-trade-no/%s", this.getPayBaseUrl(), combineOutTradeNo);
+ String response = this.getV3(url);
+ return GSON.fromJson(response, CombineQueryResult.class);
+ }
+
@Override
public WxPayOrderCloseResult closeOrder(String outTradeNo) throws WxPayException {
if (StringUtils.isBlank(outTradeNo)) {
@@ -530,6 +561,12 @@ public void closeOrderV3(WxPayOrderCloseV3Request request) throws WxPayException
this.postV3(url, GSON.toJson(request));
}
+ @Override
+ public void closeCombine(CombineCloseRequest request) throws WxPayException {
+ String url = String.format("%s/v3/combine-transactions/out-trade-no/%s/close", this.getPayBaseUrl(), request.getCombineOutTradeNo());
+ this.postV3(url, GSON.toJson(request));
+ }
+
@Override
public T createOrder(WxPayUnifiedOrderRequest request) throws WxPayException {
WxPayUnifiedOrderResult unifiedOrderResult = this.unifiedOrder(request);
@@ -653,6 +690,25 @@ public WxPayUnifiedOrderV3Result unifiedOrderV3(TradeTypeEnum tradeType, WxPayUn
return GSON.fromJson(response, WxPayUnifiedOrderV3Result.class);
}
+ @Override
+ public CombineTransactionsResult combine(TradeTypeEnum tradeType, CombineTransactionsRequest request) throws WxPayException {
+ if (StringUtils.isBlank(request.getCombineAppid())) {
+ request.setCombineAppid(this.getConfig().getAppId());
+ }
+ if (StringUtils.isBlank(request.getCombineMchid())) {
+ request.setCombineMchid(this.getConfig().getMchId());
+ }
+ String url = this.getPayBaseUrl() + tradeType.getCombineUrl();
+ String response = this.postV3(url, GSON.toJson(request));
+ return GSON.fromJson(response, CombineTransactionsResult.class);
+ }
+
+ @Override
+ public T combineTransactions(TradeTypeEnum tradeType, CombineTransactionsRequest request) throws WxPayException {
+ CombineTransactionsResult result = this.combine(tradeType, request);
+ return result.getPayInfo(tradeType, request.getCombineAppid(), request.getCombineAppid(), this.getConfig().getPrivateKey());
+ }
+
@Override
@Deprecated
public Map getPayInfo(WxPayUnifiedOrderRequest request) throws WxPayException {
@@ -949,6 +1005,35 @@ private WxPayFundFlowResult handleFundFlow(String responseContent) {
}
+ @Override
+ public WxPayApplyBillV3Result applyTradeBill(WxPayApplyTradeBillV3Request request) throws WxPayException {
+ String url;
+ if (StringUtils.isBlank(request.getTarType())) {
+ url = String.format("%s/v3/bill/tradebill?bill_date=%s&bill_type=%s", this.getPayBaseUrl(), request.getBillDate(), request.getBillType());
+ } else {
+ url = String.format("%s/v3/bill/tradebill?bill_date=%s&bill_type=%s&tar_type=%s", this.getPayBaseUrl(), request.getBillDate(), request.getBillType(), request.getTarType());
+ }
+ String response = this.getV3(url);
+ return GSON.fromJson(response, WxPayApplyBillV3Result.class);
+ }
+
+ @Override
+ public WxPayApplyBillV3Result applyFundFlowBill(WxPayApplyFundFlowBillV3Request request) throws WxPayException {
+ String url;
+ if (StringUtils.isBlank(request.getTarType())) {
+ url = String.format("%s/v3/bill/fundflowbill?bill_date=%s&bill_type=%s", this.getPayBaseUrl(), request.getBillDate(), request.getAccountType());
+ } else {
+ url = String.format("%s/v3/bill/fundflowbill?bill_date=%s&bill_type=%s&tar_type=%s", this.getPayBaseUrl(), request.getBillDate(), request.getAccountType(), request.getTarType());
+ }
+ String response = this.getV3(url);
+ return GSON.fromJson(response, WxPayApplyBillV3Result.class);
+ }
+
+ @Override
+ public InputStream downloadBill(String url) throws WxPayException {
+ return this.downloadV3(url);
+ }
+
@Override
public WxPayMicropayResult micropay(WxPayMicropayRequest request) throws WxPayException {
request.checkAndSign(this.getConfig());
From eaa517359a61a16d06f6c12bae7f7104e450e0fd Mon Sep 17 00:00:00 2001
From: kelvenlaw
Date: Sat, 3 Jul 2021 21:06:02 +0800
Subject: [PATCH 0024/1235] =?UTF-8?q?:new:=20#2048=20=E3=80=90=E5=BC=80?=
=?UTF-8?q?=E6=94=BE=E5=B9=B3=E5=8F=B0=E3=80=91=E5=AE=9E=E7=8E=B0=E5=B0=8F?=
=?UTF-8?q?=E5=95=86=E5=BA=97=E7=9A=84=E9=83=A8=E5=88=86=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../result/WxMinishopImageUploadResult.java | 40 ++
.../bean/result/WxMinishopPicFileResult.java | 11 +
.../http/MinishopUploadRequestExecutor.java | 37 ++
...cheMinishopMediaUploadRequestExecutor.java | 59 ++
...ttpMinishopMediaUploadRequestExecutor.java | 53 ++
...ttpMinishopMediaUploadRequestExecutor.java | 51 ++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 1 +
.../open/api/WxOpenComponentService.java | 418 ++++++++++++
.../weixin/open/api/WxOpenMaService.java | 20 +
.../open/api/WxOpenMinishopGoodsService.java | 120 ++++
.../open/api/WxOpenMinishopService.java | 57 ++
.../weixin/open/api/WxOpenService.java | 7 +
.../api/impl/WxOpenComponentServiceImpl.java | 605 ++++++++++++++++++
.../open/api/impl/WxOpenMaServiceImpl.java | 37 ++
.../impl/WxOpenMinishopGoodsServiceImpl.java | 37 ++
.../api/impl/WxOpenMinishopServiceImpl.java | 80 +++
.../WxOpenServiceApacheHttpClientImpl.java | 13 +-
.../weixin/open/bean/ma/WxMaScheme.java | 9 +
.../bean/minishop/MinishopAddressInfo.java | 75 +++
.../bean/minishop/MinishopAuditStatus.java | 63 ++
.../open/bean/minishop/MinishopBaseInfo.java | 71 ++
.../open/bean/minishop/MinishopBrand.java | 26 +
.../open/bean/minishop/MinishopBrandList.java | 15 +
.../bean/minishop/MinishopBusiLicense.java | 98 +++
.../bean/minishop/MinishopCategories.java | 15 +
.../open/bean/minishop/MinishopCategory.java | 14 +
.../minishop/MinishopDeliveryTemplate.java | 20 +
.../MinishopDeliveryTemplateResult.java | 21 +
.../bean/minishop/MinishopIdcardInfo.java | 88 +++
.../bean/minishop/MinishopMerchantinfo.java | 96 +++
.../open/bean/minishop/MinishopNameInfo.java | 59 ++
.../MinishopOrganizationCodeInfo.java | 62 ++
.../open/bean/minishop/MinishopPicFile.java | 22 +
.../bean/minishop/MinishopReturnInfo.java | 39 ++
.../open/bean/minishop/MinishopShopCat.java | 19 +
.../bean/minishop/MinishopShopCatList.java | 15 +
.../MinishopSuperAdministratorInfo.java | 71 ++
.../minishop/coupon/WxMinishopCoupon.java | 81 +++
.../WxMinishopCouponDiscountCondition.java | 35 +
.../coupon/WxMinishopCouponDiscountInfo.java | 28 +
.../coupon/WxMinishopCouponExtInfo.java | 33 +
.../coupon/WxMinishopCouponPromoteInfo.java | 25 +
.../coupon/WxMinishopCouponReceiveInfo.java | 34 +
.../coupon/WxMinishopCouponResponse.java | 23 +
.../coupon/WxMinishopCouponStock.java | 32 +
.../coupon/WxMinishopCouponStockInfo.java | 20 +
.../coupon/WxMinishopCouponValidInfo.java | 35 +
.../goods/WxMinishopAddGoodsSkuData.java | 12 +
.../goods/WxMinishopAddGoodsSpuData.java | 14 +
.../goods/WxMinishopAddGoodsSpuResult.java | 14 +
.../goods/WxMinishopDeliveryCompany.java | 12 +
.../goods/WxMinishopGoodsSkuAttr.java | 23 +
.../bean/minishop/goods/WxMinishopSku.java | 51 ++
.../bean/minishop/goods/WxMinishopSpu.java | 86 +++
.../limitdiscount/LimitDiscountGoods.java | 60 ++
.../limitdiscount/LimitDiscountSku.java | 36 ++
.../minishopGoods/AddMinishopGoodsSPU.java | 89 +++
.../weixin/open/bean/minishopGoods/Attr.java | 28 +
.../weixin/open/bean/minishopGoods/Cat.java | 28 +
.../open/bean/minishopGoods/DescInfo.java | 25 +
.../open/bean/minishopGoods/ExpressInfo.java | 23 +
.../open/bean/minishopGoods/GoodsCat.java | 31 +
.../open/bean/minishopGoods/GoodsCatList.java | 36 ++
.../open/bean/minishopGoods/ParentCatId.java | 15 +
.../weixin/open/bean/minishopGoods/Sku.java | 68 ++
65 files changed, 3538 insertions(+), 3 deletions(-)
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadResult.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopPicFileResult.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestExecutor.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestExecutor.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestExecutor.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestExecutor.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopGoodsService.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopService.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMinishopGoodsServiceImpl.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMinishopServiceImpl.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaScheme.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAddressInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAuditStatus.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBaseInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrand.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrandList.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBusiLicense.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategories.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategory.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplate.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplateResult.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopIdcardInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopMerchantinfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopNameInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopOrganizationCodeInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopPicFile.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopReturnInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCat.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCatList.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopSuperAdministratorInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCoupon.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountCondition.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponExtInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponPromoteInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponReceiveInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponResponse.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStock.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStockInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponValidInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSkuData.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuData.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuResult.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopDeliveryCompany.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopGoodsSkuAttr.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSku.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSpu.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountGoods.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountSku.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/AddMinishopGoodsSPU.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Attr.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Cat.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/DescInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/ExpressInfo.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/GoodsCat.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/GoodsCatList.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/ParentCatId.java
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Sku.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadResult.java
new file mode 100644
index 0000000000..9aa7a81e2f
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadResult.java
@@ -0,0 +1,40 @@
+package me.chanjar.weixin.common.bean.result;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+@Data
+public class WxMinishopImageUploadResult implements Serializable {
+ private static final long serialVersionUID = 330834334738622332L;
+
+ private String errcode;
+ private String errmsg;
+
+
+ private WxMinishopPicFileResult picFile;
+
+
+ public static WxMinishopImageUploadResult fromJson(String json) {
+ JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
+ WxMinishopImageUploadResult result = new WxMinishopImageUploadResult();
+ result.setErrcode(jsonObject.get("errcode").getAsNumber().toString());
+ if (result.getErrcode().equals("0")) {
+ WxMinishopPicFileResult picFileResult = new WxMinishopPicFileResult();
+ JsonObject picObject = jsonObject.get("pic_file").getAsJsonObject();
+ picFileResult.setMediaId(picObject.get("media_id").getAsString());
+ picFileResult.setPayMediaId(picObject.get("pay_media_id").getAsString());
+ result.setPicFile(picFileResult);
+
+ }
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopPicFileResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopPicFileResult.java
new file mode 100644
index 0000000000..1f77a1e6ab
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopPicFileResult.java
@@ -0,0 +1,11 @@
+package me.chanjar.weixin.common.bean.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxMinishopPicFileResult implements Serializable {
+ private String mediaId;
+ private String payMediaId;
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestExecutor.java
new file mode 100644
index 0000000000..ee4608edf3
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestExecutor.java
@@ -0,0 +1,37 @@
+package me.chanjar.weixin.common.util.http;
+
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
+import me.chanjar.weixin.common.enums.WxType;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.apache.ApacheMinishopMediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.jodd.JoddHttpMinishopMediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.okhttp.OkHttpMinishopMediaUploadRequestExecutor;
+
+import java.io.File;
+import java.io.IOException;
+
+public abstract class MinishopUploadRequestExecutor implements RequestExecutor {
+ protected RequestHttp requestHttp;
+
+ public MinishopUploadRequestExecutor(RequestHttp requestHttp) {
+ this.requestHttp = requestHttp;
+ }
+
+ @Override
+ public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
+ }
+
+ public static RequestExecutor create(RequestHttp requestHttp) {
+ switch (requestHttp.getRequestType()) {
+ case APACHE_HTTP:
+ return new ApacheMinishopMediaUploadRequestExecutor(requestHttp);
+ case JODD_HTTP:
+ return new JoddHttpMinishopMediaUploadRequestExecutor(requestHttp);
+ case OK_HTTP:
+ return new OkHttpMinishopMediaUploadRequestExecutor(requestHttp);
+ default:
+ return null;
+ }
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestExecutor.java
new file mode 100644
index 0000000000..7adc6a2cfa
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestExecutor.java
@@ -0,0 +1,59 @@
+package me.chanjar.weixin.common.util.http.apache;
+
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
+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.util.http.MediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.MinishopUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Created by ecoolper on 2017/5/5.
+ */
+@Slf4j
+public class ApacheMinishopMediaUploadRequestExecutor extends MinishopUploadRequestExecutor {
+ public ApacheMinishopMediaUploadRequestExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ @Override
+ public WxMinishopImageUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+ HttpPost httpPost = new HttpPost(uri);
+ if (requestHttp.getRequestHttpProxy() != null) {
+ RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
+ httpPost.setConfig(config);
+ }
+ if (file != null) {
+ HttpEntity entity = MultipartEntityBuilder
+ .create()
+ .addBinaryBody("media", file)
+ .setMode(HttpMultipartMode.RFC6532)
+ .build();
+ httpPost.setEntity(entity);
+ }
+ try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
+ String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
+ WxError error = WxError.fromJson(responseContent, wxType);
+ if (error.getErrorCode() != 0) {
+ throw new WxErrorException(error);
+ }
+ log.info("responseContent: " + responseContent);
+ return WxMinishopImageUploadResult.fromJson(responseContent);
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestExecutor.java
new file mode 100644
index 0000000000..769153c59f
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestExecutor.java
@@ -0,0 +1,53 @@
+package me.chanjar.weixin.common.util.http.jodd;
+
+import jodd.http.HttpConnectionProvider;
+import jodd.http.HttpRequest;
+import jodd.http.HttpResponse;
+import jodd.http.ProxyInfo;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
+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.util.http.MediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.MinishopUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/5
+ */
+@Slf4j
+public class JoddHttpMinishopMediaUploadRequestExecutor extends MinishopUploadRequestExecutor {
+ public JoddHttpMinishopMediaUploadRequestExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ @Override
+ public WxMinishopImageUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+ HttpRequest request = HttpRequest.post(uri);
+ if (requestHttp.getRequestHttpProxy() != null) {
+ requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
+ }
+ request.withConnectionProvider(requestHttp.getRequestHttpClient());
+ request.form("media", file);
+ HttpResponse response = request.send();
+ response.charset(StandardCharsets.UTF_8.name());
+
+ String responseContent = response.bodyText();
+ WxError error = WxError.fromJson(responseContent, wxType);
+ if (error.getErrorCode() != 0) {
+ throw new WxErrorException(error);
+ }
+ log.info("responseContent: " + responseContent);
+
+ return WxMinishopImageUploadResult.fromJson(responseContent);
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestExecutor.java
new file mode 100644
index 0000000000..d8fd66baef
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestExecutor.java
@@ -0,0 +1,51 @@
+package me.chanjar.weixin.common.util.http.okhttp;
+
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
+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.util.http.MediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.MinishopUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import okhttp3.*;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/5
+ */
+@Slf4j
+public class OkHttpMinishopMediaUploadRequestExecutor extends MinishopUploadRequestExecutor {
+ public OkHttpMinishopMediaUploadRequestExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ @Override
+ public WxMinishopImageUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+
+ RequestBody body = new MultipartBody.Builder()
+ .setType(MediaType.parse("multipart/form-data"))
+ .addFormDataPart("media",
+ file.getName(),
+ RequestBody.create(MediaType.parse("application/octet-stream"), file))
+ .build();
+ Request request = new Request.Builder().url(uri).post(body).build();
+
+ Response response = requestHttp.getRequestHttpClient().newCall(request).execute();
+ String responseContent = response.body().string();
+ WxError error = WxError.fromJson(responseContent, wxType);
+ if (error.getErrorCode() != 0) {
+ throw new WxErrorException(error);
+ }
+ log.info("responseContent: " + responseContent);
+
+ return WxMinishopImageUploadResult.fromJson(responseContent);
+ }
+
+}
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 600ce0d076..417f49801d 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
@@ -300,6 +300,7 @@ private T executeInternal(RequestExecutor executor, String uri, E d
* @throws WxErrorException 异常
*/
protected String extractAccessToken(String resultContent) throws WxErrorException {
+ log.info("resultContent: " + resultContent);
WxMaConfig config = this.getWxMaConfig();
WxError error = WxError.fromJson(resultContent, WxType.MiniApp);
if (error.getErrorCode() != 0) {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index 5dca7f1503..9c771c3924 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -1,6 +1,9 @@
package me.chanjar.weixin.open.api;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
+import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
@@ -8,8 +11,14 @@
import me.chanjar.weixin.open.bean.WxOpenGetResult;
import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
+import me.chanjar.weixin.open.bean.minishop.*;
+import me.chanjar.weixin.open.bean.minishop.coupon.WxMinishopCoupon;
+import me.chanjar.weixin.open.bean.minishop.coupon.WxMinishopCouponStock;
+import me.chanjar.weixin.open.bean.minishop.goods.*;
+import me.chanjar.weixin.open.bean.minishop.limitdiscount.LimitDiscountGoods;
import me.chanjar.weixin.open.bean.result.*;
+import java.io.File;
import java.util.List;
/**
@@ -127,6 +136,38 @@ public interface WxOpenComponentService {
*/
String DELETE_TEMPLATE_URL = "https://api.weixin.qq.com/wxa/deletetemplate";
+ String REGISTER_SHOP_URL = "https://api.weixin.qq.com/product/register/register_shop";
+
+ String CHECK_SHOP_AUDITSTATUS_URL = "https://api.weixin.qq.com/product/register/check_audit_status";
+
+ String SUBMIT_MERCHANTINFO_URL = "https://api.weixin.qq.com/product/register/submit_merchantinfo";
+
+ String SUBMIT_BASICINFO_URL = "https://api.weixin.qq.com/product/register/submit_basicinfo";
+
+ String UPLOAD_IMAGE_URL = "https://api.weixin.qq.com/product/img/upload";
+
+ String MINISHOP_CATEGORY_GET_URL = "https://api.weixin.qq.com/product/category/get";
+
+ String MINISHOP_BRAND_GET_URL = "https://api.weixin.qq.com/product/brand/get";
+
+ String MINISHOP_DELIVERY_TEMPLATE_GET_URL = "https://api.weixin.qq.com/product/delivery/get_freight_template";
+
+ String MINISHOP_SHOPCATEGORY_GET_URL = "https://api.weixin.qq.com/product/store/get_shopcat";
+
+ String MINISHOP_CREATE_COUPON_URL = "https://api.weixin.qq.com/product/coupon/create";
+
+ String MINISHOP_GET_COUPON_LIST = "https://api.weixin.qq.com/product/coupon/get_list";
+
+ String MINISHOP_PUSH_COUPON = "https://api.weixin.qq.com/product/coupon/push";
+
+ String MINISHOP_UPDATE_COUPON_URL = "https://api.weixin.qq.com/product/coupon/update";
+
+ String MINISHOP_UPDATE_COUPON_STATUS_URL = "https://api.weixin.qq.com/product/coupon/update_status";
+
+ String MINISHOP_GET_DELIVERY_COMPANY_URL = "https://api.weixin.qq.com/product/delivery/get_company_list";
+
+
+
/**
* Gets wx mp service by appid.
*
@@ -153,6 +194,15 @@ public interface WxOpenComponentService {
@Deprecated
WxOpenFastMaService getWxFastMaServiceByAppid(String appid);
+
+ /**
+ * 获取指定appid的小商店服务
+ *
+ * @param appid
+ * @return
+ */
+ WxOpenMinishopService getWxMinishopServiceByAppid(String appid);
+
/**
* Gets wx open config storage.
*
@@ -508,4 +558,372 @@ public interface WxOpenComponentService {
* @throws WxErrorException .
*/
WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWechat, String legalPersonaName) throws WxErrorException;
+
+
+ /**
+ * https://api.weixin.qq.com/product/register/register_shop?component_access_token=xxxxxxxxx
+ * 注册小商店账号
+ *
+ * @param wxName 微信号(必填)
+ * @param idCardName 身份证姓名(必填)
+ * @param idCardNumber 身份证号(必填)
+ * @param channelId 渠道号,服务商后台生成渠道信息。(选填)
+ * @param apiOpenstoreType 1-整店打包(开通小商店),2-组件开放(开通小程序,并且已经完整的嵌入电商功能)(必填)
+ * @param authPageUrl 授权url(选填)
+ * @return the wx open result
+ * @throws WxErrorException
+ */
+ WxOpenResult registerShop(String wxName, String idCardName, String idCardNumber, String channelId, Integer apiOpenstoreType, String authPageUrl) throws WxErrorException;
+
+
+ /**
+ * https://api.weixin.qq.com/product/register/check_audit_status
+ * 异步状态查询
+ * @param wxName 微信号
+ * @return
+ */
+ String checkAuditStatus(String wxName) throws WxErrorException;
+
+
+ /**
+ * 已经获取到小商店的appId,那么需要通过accesstoken来获取该小商店的状态
+ * @param appId
+ * @param wxName
+ * @return
+ * @throws WxErrorException
+ */
+ String checkAuditStatus(String appId, String wxName) throws WxErrorException;
+
+ /**
+ *
+ * @param appId
+ * @param subjectType
+ * @param busiLicense
+ * @param organizationCodeInfo
+ * @param idcardInfo
+ * @param superAdministratorInfo
+ * @param merchantShoprtName
+ * @return
+ */
+ WxOpenResult submitMerchantInfo(String appId, String subjectType, MinishopBusiLicense busiLicense, MinishopOrganizationCodeInfo organizationCodeInfo, MinishopIdcardInfo idcardInfo, MinishopSuperAdministratorInfo superAdministratorInfo, String merchantShoprtName) throws WxErrorException;
+
+ /**
+ *
+ * @param appId
+ * @param nameInfo
+ * @param returnInfo
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult submitBasicInfo(String appId, MinishopNameInfo nameInfo, MinishopReturnInfo returnInfo) throws WxErrorException;
+
+
+ /**
+ *
+ * @param height
+ * @param width
+ * @param file
+ * @return
+ * @throws WxErrorException
+ */
+ WxMinishopImageUploadResult uploadMinishopImagePicFile(String appId, Integer height, Integer width, File file) throws WxErrorException;
+
+
+ /**
+ * 获取小商店的类目详情
+ * @param appId:小商店APPID
+ * @param fCatId:父类目ID,可先填0获取根部类目
+ * @return 小商店类目信息列表
+ */
+ MinishopCategories getMinishopCategories(String appId, Integer fCatId) throws WxErrorException;
+
+
+ /**
+ * 获取小商店品牌信息
+ * @param appId:小商店appID
+ * @return
+ */
+ MinishopBrandList getMinishopBrands(String appId) throws WxErrorException;
+
+
+ /**
+ * 获取小商店运费模版信息
+ * @param appId:小商店appID
+ * @return
+ */
+ MinishopDeliveryTemplateResult getMinishopDeliveryTemplate(String appId) throws WxErrorException;
+
+
+ /**
+ * 获取小商店商品分类信息
+ * @param appId
+ * @return
+ */
+ MinishopShopCatList getMinishopCatList(String appId) throws WxErrorException;
+
+
+ /**
+ * 获取小商店的快递公司列表
+ * @param appId
+ * @return
+ * @throws WxErrorException
+ */
+ WxMinishopAddGoodsSpuResult> getMinishopDeliveryCompany(String appId) throws WxErrorException;
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ //小商店优惠券接口
+ /**
+ * 创建小商店优惠券
+ * @param appId:小商店的appId
+ * @param couponInfo: 优惠券信息
+ * @return couponId: 优惠券ID
+ * @throws WxErrorException
+ */
+ Integer minishopCreateCoupon(String appId, WxMinishopCoupon couponInfo) throws WxErrorException;
+
+
+ /**
+ * 与小商店对接,获取小商店的优惠券信息
+ * @param appId:小商店的appId
+ * @param startCreateTime:优惠券创建时间的搜索开始时间
+ * @param endCreateTime:优惠券创建时间的搜索结束时间
+ * @param status:优惠券状态
+ * @param page:第几页(最小填1)
+ * @param pageSize:每页数量(不超过10,000)
+ * @return
+ * @throws WxErrorException
+ */
+ WxMinishopCouponStock minishopGetCouponList(String appId, String startCreateTime, String endCreateTime, Integer status, Integer page, Integer pageSize) throws WxErrorException;
+
+
+ /**
+ * 与小商店对接,将优惠券发送给某人
+ * @param appid:小商店appId
+ * @param openId:优惠券接收人的openId
+ * @param couponId: 优惠券ID
+ * @return
+ */
+ WxOpenResult minishopPushCouponToUser(String appid, String openId, Integer couponId) throws WxErrorException;
+
+
+ /**
+ * 与小商店对接,更新商城优惠券
+ * @param appId
+ * @param couponInfo
+ * @return
+ * @throws WxErrorException
+ */
+ Integer minishopUpdateCoupon(String appId, WxMinishopCoupon couponInfo) throws WxErrorException;
+
+
+ /**
+ * 从优惠券创建后status=1,可流转到2,4,5, COUPON_STATUS_VALID = 2 ;//生效 COUPON_STATUS_INVALID = 4 ;//已作废 COUPON_STATUS_DEL = 5;//删除
+ * @param appId
+ * @param couponId
+ * @param status
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult minishopUpdateCouponStatus(String appId, Integer couponId, Integer status) throws WxErrorException;
+
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ //小商店spu接口
+ String MINISHOP_ADD_SPU_URL = "https://api.weixin.qq.com/product/spu/add";
+
+ String MINISHOP_DEL_SPU_URL = "https://api.weixin.qq.com/product/spu/del";
+
+ String MINISHOP_UPDATE_SPU_URL = "https://api.weixin.qq.com/product/spu/update";
+
+ String MINISHOP_LISTING_SPU_URL = "https://api.weixin.qq.com/product/spu/listing";
+
+ String MINISHOP_DELISTING_SPU_URL = "https://api.weixin.qq.com/product/spu/delisting";
+ /**
+ * 小商店添加商品接口,添加商品后只是添加到草稿箱,需要通过调用上架商品,并通过审核才能在商城中显示。
+ * @param appId
+ * @param spu
+ * @return
+ * @throws WxErrorException
+ */
+ WxMinishopAddGoodsSpuResult minishopGoodsAddSpu(String appId, WxMinishopSpu spu) throws WxErrorException;
+
+
+ /**
+ * 小商店删除商品接口,直接删除,不会存在小商店回收站里面。
+ * @param appId
+ * @param productId
+ * @param outProductId
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult minishopGoodsDelSpu(String appId, Long productId, Long outProductId) throws WxErrorException;
+
+
+ /**
+ * 小商店更新商品接口,不会直接影响上架商品的信息,而是存在草稿箱,需要调用上架商品接口,并通过审核才能在商城中显示。
+ * @param appId
+ * @param spu
+ * @return
+ * @throws WxErrorException
+ */
+ WxMinishopAddGoodsSpuResult minishopGoodsUpdateSpu(String appId, WxMinishopSpu spu) throws WxErrorException;
+
+
+ /**
+ * 上架商品。
+ * @param appId
+ * @param productId
+ * @param outProductId
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult minishopGoodsListingSpu(String appId, Long productId, Long outProductId) throws WxErrorException;
+
+
+ /**
+ * 下架商品
+ * @param appId
+ * @param productId
+ * @param outProductId
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult minishopGoodsDelistingSpu(String appId, Long productId, Long outProductId) throws WxErrorException;
+
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ //小商店sku接口
+ String MINISHOP_ADD_SKU_URL = "https://api.weixin.qq.com/product/sku/add";
+
+ String MINISHOP_BATCH_ADD_SKU_URL = "https://api.weixin.qq.com/product/sku/batch_add";
+
+ String MINISHOP_DEL_SKU_URL = "https://api.weixin.qq.com/product/sku/del";
+
+ String MINISHOP_UPDATE_SKU_URL = "https://api.weixin.qq.com/product/sku/update";
+
+ String MINISHOP_UPDATE_SKU_PRICE_URL = "https://api.weixin.qq.com/product/sku/update_price";
+
+ String MINISHOP_UPDATE_SKU_STOCK_URL = "https://api.weixin.qq.com/product/stock/update";
+
+ /**
+ * 小商店新增sku信息
+ * @param appId
+ * @param sku
+ * @return
+ * @throws WxErrorException
+ */
+ WxMinishopAddGoodsSpuResult minishiopGoodsAddSku(String appId, WxMinishopSku sku) throws WxErrorException;
+
+
+ /**
+ * 小商店批量新增sku信息
+ * @param appId
+ * @param skuList
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult minishopGoodsBatchAddSku(String appId, List skuList) throws WxErrorException;
+
+
+ /**
+ * 小商店删除sku消息
+ * @param appId
+ * @param productId
+ * @param outProductId
+ * @param outSkuId
+ * @param skuId
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult minishopGoodsDelSku(String appId, Long productId, Long outProductId, String outSkuId, Long skuId) throws WxErrorException;
+
+
+ /**
+ * 小商店更新sku
+ * @param appId
+ * @param sku
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult minishopGoodsUpdateSku(String appId, WxMinishopSku sku) throws WxErrorException;
+
+
+ /**
+ * 小商店更新sku价格
+ * @param appId
+ * @param productId
+ * @param outProductId
+ * @param outSkuId
+ * @param skuId
+ * @param salePrice
+ * @param marketPrice
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult minishopGoodsUpdateSkuPrice(String appId, Long productId, Long outProductId, String outSkuId, Long skuId, Long salePrice, Long marketPrice) throws WxErrorException;
+
+
+ /**
+ * 小商店更新sku库存
+ * @param appId
+ * @param productId
+ * @param outProductId
+ * @param outSkuId
+ * @param skuId
+ * @param type
+ * @param stockNum
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult minishopGoodsUpdateSkuStock(String appId, Long productId, Long outProductId, String outSkuId, Long skuId, Integer type, Integer stockNum) throws WxErrorException;
+
+
+ /**
+ * 小商店通用Post接口
+ * @param appId
+ * @param url
+ * @param requestParam
+ * @return
+ * @throws WxErrorException
+ */
+ String minishopCommonPost(String appId, String url, String requestParam) throws WxErrorException;
+
+
+
+ //////////////////////////////////////////////////////////////
+ //商品抢购任务-秒杀活动
+ String API_MINISHOP_ADD_LIMIT_DISCOUNT_URL = "https://api.weixin.qq.com/product/limiteddiscount/add/";
+
+ String API_MINISHOP_GET_LIMIT_DISCOUNT_URL = "https://api.weixin.qq.com/product/limiteddiscount/get_list/";
+
+ String API_MINISHOP_UPDATE_LIMIT_DICOUNT_STATUS_URL = "https://api.weixin.qq.com/product/limiteddiscount/update_status/";
+
+ /**
+ * 添加抢购任务
+ * 每个商品(SPU)同一时间只能有一个抢购任务。 如果当前有抢购任务没有结束,无论是否开始,都不允许创建第二个抢购任务 可以提前修改抢购任务状态为结束后,再创建新的任务。 每次创建抢购任务时,必须填充该SPU下 所有SKU的抢购信息
+ * @param appId
+ * @param limitDiscountGoods
+ * @return
+ * @throws WxErrorException
+ */
+ Integer addLimitDiscountGoods(String appId, LimitDiscountGoods limitDiscountGoods) throws WxErrorException;
+
+ /**
+ * status为0代表 还未结束的抢购任务,无论是否开始 status为1代表已经结束的 抢购任务 如果不填status,则两种都拉取
+ * @param appId
+ * @param status
+ * @return
+ */
+ List getLimitDiscountList(String appId, Integer status) throws WxErrorException;
+
+
+ /**
+ * 修改抢购任务状态
+ * 用于提前结束抢购任务,无论抢购任务是否在执行中,都可以关闭。 也可以直接删除抢购任务 注意:结束后不允许再开启,状态不可逆
+ * @param appId
+ * @param taskId
+ * @param status
+ * @return
+ */
+ WxOpenResult updateLimitDiscountStatus(String appId, Long taskId, Integer status) throws WxErrorException;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
index 9732e614ac..0f2df8e35f 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
@@ -3,6 +3,7 @@
import cn.binarywang.wx.miniapp.api.WxMaService;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
+import me.chanjar.weixin.open.bean.ma.WxMaScheme;
import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
import me.chanjar.weixin.open.bean.result.*;
@@ -220,6 +221,17 @@ public interface WxOpenMaService extends WxMaService {
*/
String API_SPEED_AUDIT = "https://api.weixin.qq.com/wxa/speedupaudit";
+
+ /**
+ * 获取小程序scheme码
+ */
+ String API_GENERATE_SCHEME = "https://api.weixin.qq.com/wxa/generatescheme";
+
+
+ /**
+ * 通过此接口开通自定义版交易组件,将同步返回接入结果,不再有异步事件回调。
+ */
+ String API_REGISTER_SHOP_COMPONENT = "https://api.weixin.qq.com/shop/register/apply";
/**
* 获得小程序的域名配置信息
*
@@ -594,6 +606,14 @@ WxOpenMaDomainResult modifyDomain(String action, List requestDomains, Li
*/
WxOpenResult publishQrcodeJump(String prefix) throws WxErrorException;
+ WxMaScheme generateMaScheme(String jumpWxaPath, String jumpWxaQuery, Boolean isExpire, Long expireTime) throws WxErrorException;
+
+ /**
+ * 为小程序开通小商店组件
+ * @return
+ */
+ WxOpenResult registerShopComponent() throws WxErrorException;
+
/**
* 小程序基础信息服务 (小程序名称、头像、描述、类目等信息设置)
*
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopGoodsService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopGoodsService.java
new file mode 100644
index 0000000000..ffd41bc030
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopGoodsService.java
@@ -0,0 +1,120 @@
+package me.chanjar.weixin.open.api;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.bean.minishopGoods.AddMinishopGoodsSPU;
+import me.chanjar.weixin.open.bean.minishopGoods.GoodsCatList;
+import me.chanjar.weixin.open.bean.minishopGoods.ParentCatId;
+import me.chanjar.weixin.open.bean.result.WxOpenResult;
+
+/**
+ * 微信小商城 商品
+ * @author xiaojintao
+ */
+public interface WxOpenMinishopGoodsService {
+ /**
+ * 获取类目详情 接入商品前必须接口
+ */
+ String getMinishopGoodsCatUrl = "https://api.weixin.qq.com/product/category/get";
+ /**
+ * SPU接口(修改需要重新上架商品) 添加商品 POST
+ */
+ String addMinishopGoodsSPUUrl = "https://api.weixin.qq.com/product/spu/add";
+ /**
+ * SPU接口(修改需要重新上架商品) 删除商品 POST
+ */
+ String delMinishopGoodsSPUUrl = "https://api.weixin.qq.com/product/spu/del";
+ /**
+ * SPU接口(修改需要重新上架商品) 获取商品 POST
+ */
+ String getMinishopGoodsSPUUrl = "https://api.weixin.qq.com/product/spu/get";
+ /**
+ * SPU接口(修改需要重新上架商品) 获取商品列表 POST
+ */
+ String getListMinishopGoodsSPUURL = "https://api.weixin.qq.com/product/spu/get_list";
+ /**
+ * SPU接口(修改需要重新上架商品) 搜索商品 POST
+ */
+ String searchMinishopGoodsSPUURL = "https://api.weixin.qq.com/product/spu/search";
+ /**
+ * SPU接口(修改需要重新上架商品) 更新商品 POST
+ */
+ String updateMinishopGoodsSPUUrl = "https://api.weixin.qq.com/product/spu/update";
+ /**
+ * SPU接口(修改需要重新上架商品) 上架商品 POST
+ */
+ String listingMinishopGoodsSPUUrl = "https://api.weixin.qq.com/product/spu/listing";
+ /**
+ * SPU接口(修改需要重新上架商品) 下架商品 POST
+ */
+ String delistingMinishopGoodsSPUUrl = "https://api.weixin.qq.com/product/spu/delisting";
+
+ /**
+ * SKU接口(修改后需重新上架商品) 添加SKU POST
+ */
+ String addMinishopGoodsSKUUrl = "https://api.weixin.qq.com/product/sku/add";
+ /**
+ * SKU接口(修改后需重新上架商品) 批量添加SKU POST
+ */
+ String batchAddMinishopGoodsSKUUrl = "https://api.weixin.qq.com/product/sku/batch_add";
+ /**
+ * SKU接口(修改后需重新上架商品) 批量添加SKU POST
+ */
+ String delMinishopGoodsSKUUrl = "https://api.weixin.qq.com/product/sku/del";
+ /**
+ * SKU接口(修改后需重新上架商品) 获取SKU信息 POST
+ */
+ String getMinishopGoodsSKUUrl = "https://api.weixin.qq.com/product/sku/get";
+ /**
+ * SKU接口(修改后需重新上架商品) 批量获取SKU信息 POST
+ */
+ String getListMinishopGoodsSKUUrl = "https://api.weixin.qq.com/product/sku/get_list";
+ /**
+ * SKU接口(修改后需重新上架商品) 批量获取SKU信息 POST
+ */
+ String updateMinishopGoodsSKUUrl = "https://api.weixin.qq.com/product/sku/update";
+ /**
+ * SKU接口(修改后需重新上架商品) 更新SKU价格 POST
+ */
+ String updatePriceMinishopGoodsSKUUrl = "https://api.weixin.qq.com/product/sku/update_price";
+ /**
+ * SKU接口(修改后需重新上架商品) 更新库存 POST
+ */
+ String updateStockMinishopGoodsSKUUrl = "https://api.weixin.qq.com/product/stock/update";
+ /**
+ * SKU接口(修改后需重新上架商品) 获取库存 POST
+ */
+ String getStockMinishopGoodsSKUUrl = "https://api.weixin.qq.com/product/stock/get";
+
+
+
+
+
+
+
+ /**
+ * 获取 商品类目
+ */
+ GoodsCatList getMinishopGoodsCat(ParentCatId fCatId) throws WxErrorException;
+
+ /**
+ * 新增商品SPU
+ * @param dto
+ * @return
+ */
+ WxOpenResult addMinishopGoodsSPU(AddMinishopGoodsSPU dto) throws WxErrorException;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopService.java
new file mode 100644
index 0000000000..1c1646f7c9
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopService.java
@@ -0,0 +1,57 @@
+package me.chanjar.weixin.open.api;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.bean.minishop.*;
+import me.chanjar.weixin.open.bean.result.WxOpenResult;
+
+import java.io.File;
+
+/**
+ * 微信小商店开店接口
+ * add by kelven 2021-01-29
+ */
+public interface WxOpenMinishopService {
+ String submitMerchantInfoUrl = "https://api.weixin.qq.com/product/register/submit_merchantinfo";
+
+ String submitBasicInfoUrl = "https://api.weixin.qq.com/product/register/submit_basicinfo";
+
+
+ public final static String UPLOAD_IMG_MINISHOP_FILE_URL = "https://api.weixin.qq.com/product/img/upload";
+
+ String getCategoryUrl = "https://api.weixin.qq.com/product/category/get";
+
+ String getBrandsUrl = "https://api.weixin.qq.com/product/brand/get";
+
+ String getDeliveryUrl = "https://api.weixin.qq.com/product/delivery/get_freight_template";
+
+ /**获取店铺的商品分类*/
+ String getShopCatUrl = "https://api.weixin.qq.com/product/store/get_shopcat";
+
+
+ /**
+ *
+ * @param appId
+ * @param subjectType
+ * @param busiLicense
+ * @param organizationCodeInfo
+ * @param idcardInfo
+ * @param superAdministratorInfo
+ * @param merchantShoprtName
+ * @return
+ */
+ WxOpenResult submitMerchantInfo(String appId, String subjectType, MinishopBusiLicense busiLicense, MinishopOrganizationCodeInfo organizationCodeInfo, MinishopIdcardInfo idcardInfo, MinishopSuperAdministratorInfo superAdministratorInfo, String merchantShoprtName) throws WxErrorException;
+
+
+ WxOpenResult submitBasicInfo(String appId, MinishopNameInfo nameInfo, MinishopReturnInfo returnInfo);
+
+ MinishopAuditStatus checkAuditStatus(String wxName) throws WxErrorException;
+
+ String uploadImagePicFile(Integer height, Integer width, File file) throws WxErrorException;
+
+ MinishopCategories getCategory(Integer fCatId);
+
+ MinishopBrandList getBrands();
+
+
+ MinishopShopCatList getShopCat();
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenService.java
index c2d00877aa..2305be311b 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenService.java
@@ -1,7 +1,11 @@
package me.chanjar.weixin.open.api;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
+import java.io.File;
+
/**
* The interface Wx open service.
*
@@ -49,4 +53,7 @@ public interface WxOpenService {
*/
String post(String url, String postData) throws WxErrorException;
+
+ WxMinishopImageUploadResult uploadMinishopMediaFile(String url, File file) throws WxErrorException;
+
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
index 2d0cd828a6..dd4b932e97 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
@@ -1,11 +1,16 @@
package me.chanjar.weixin.open.api.impl;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import com.fasterxml.jackson.databind.util.JSONPObject;
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
@@ -28,6 +33,13 @@
import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo;
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
+import me.chanjar.weixin.open.bean.minishop.*;
+import me.chanjar.weixin.open.bean.minishop.coupon.WxMinishopCoupon;
+import me.chanjar.weixin.open.bean.minishop.coupon.WxMinishopCouponStock;
+import me.chanjar.weixin.open.bean.minishop.goods.*;
+import me.chanjar.weixin.open.bean.minishop.limitdiscount.LimitDiscountGoods;
+import me.chanjar.weixin.open.bean.minishop.limitdiscount.LimitDiscountSku;
+import me.chanjar.weixin.open.bean.result.*;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerListResult;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult;
@@ -36,6 +48,10 @@
import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
import org.apache.commons.lang3.StringUtils;
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -53,6 +69,8 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
private static final Map WX_OPEN_MP_SERVICE_MAP = new ConcurrentHashMap<>();
private static final Map WX_OPEN_FAST_MA_SERVICE_MAP = new ConcurrentHashMap<>();
+ private static final Map WX_OPEN_MINISHOP_SERVICE_MAP = new ConcurrentHashMap<>();
+
private final WxOpenService wxOpenService;
@Override
@@ -112,6 +130,22 @@ public WxOpenFastMaService getWxFastMaServiceByAppid(String appId) {
return fastMaService;
}
+ @Override
+ public WxOpenMinishopService getWxMinishopServiceByAppid(String appId) {
+ WxOpenMinishopService minishopService = WX_OPEN_MINISHOP_SERVICE_MAP.get(appId);
+ if (minishopService == null) {
+ synchronized (WX_OPEN_MINISHOP_SERVICE_MAP) {
+ minishopService = WX_OPEN_MINISHOP_SERVICE_MAP.get(appId);
+ if (minishopService == null) {
+ minishopService = new WxOpenMinishopServiceImpl(this, appId, getWxOpenConfigStorage().getWxMaConfig(appId));
+ WX_OPEN_MINISHOP_SERVICE_MAP.put(appId, minishopService);
+ }
+ }
+ }
+
+ return minishopService;
+ }
+
public WxOpenService getWxOpenService() {
return wxOpenService;
}
@@ -590,4 +624,575 @@ public WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWech
String response = post(FAST_REGISTER_WEAPP_SEARCH_URL, jsonObject.toString(), "component_access_token");
return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
}
+
+ @Override
+ public WxOpenResult registerShop(String wxName, String idCardName, String idCardNumber, String channelId, Integer apiOpenstoreType, String authPageUrl) throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("wx_name", wxName);
+ jsonObject.addProperty("id_card_name", idCardName);
+ jsonObject.addProperty("id_card_number", idCardNumber);
+ if (channelId != null && !channelId.isEmpty()) {
+ jsonObject.addProperty("channel_id", channelId);
+ }
+ jsonObject.addProperty("api_openstore_type", apiOpenstoreType);
+ if (authPageUrl != null && !authPageUrl.isEmpty()) {
+ jsonObject.addProperty("auth_page_url", authPageUrl);
+ }
+
+ String response = post(REGISTER_SHOP_URL, jsonObject.toString(), "component_access_token");
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public String checkAuditStatus(String wxName) throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("wx_name", wxName);
+ String url = CHECK_SHOP_AUDITSTATUS_URL + "?access_token=" + getComponentAccessToken(false);
+ String response = post(url, jsonObject.toString());
+ log.info("CHECK_SHOP_AUDITSTATUS_URL: " + response);
+ return response;
+ }
+
+ @Override
+ public String checkAuditStatus(String appId, String wxName) throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("wx_name", wxName);
+ String url = CHECK_SHOP_AUDITSTATUS_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
+ String response = post(url, jsonObject.toString());
+ log.info("CHECK_SHOP_AUDITSTATUS_URL: " + response);
+ return response;
+ }
+
+ @Override
+ public WxOpenResult submitMerchantInfo(String appId, String subjectType, MinishopBusiLicense busiLicense, MinishopOrganizationCodeInfo organizationCodeInfo, MinishopIdcardInfo idcardInfo, MinishopSuperAdministratorInfo superAdministratorInfo, String merchantShoprtName) throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("app_id", appId);
+ jsonObject.addProperty("subject_type", subjectType);
+ jsonObject.add("busi_license", busiLicense.toJsonObject());
+ if (organizationCodeInfo != null) {
+ jsonObject.add("organization_code_info", organizationCodeInfo.toJsonObject());
+ }
+ if (idcardInfo != null) {
+ jsonObject.add("id_card_info", idcardInfo.toJsonObject());
+ }
+ if (superAdministratorInfo != null) {
+ jsonObject.add("super_administrator_info", superAdministratorInfo.toJsonObject());
+ }
+
+ if (merchantShoprtName != null) {
+ jsonObject.addProperty("merchant_shortname", merchantShoprtName);
+ }
+ String url = SUBMIT_MERCHANTINFO_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult submitBasicInfo(String appId, MinishopNameInfo nameInfo, MinishopReturnInfo returnInfo) throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("appid", appId);
+ jsonObject.add("name_info", nameInfo.toJsonObject());
+ jsonObject.add("return_info", returnInfo.toJsonObject());
+ String url = SUBMIT_BASICINFO_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxMinishopImageUploadResult uploadMinishopImagePicFile(String appId, Integer height, Integer width, File file) throws WxErrorException {
+ String url = WxOpenMinishopService.UPLOAD_IMG_MINISHOP_FILE_URL + "?access_token="+getAuthorizerAccessToken(appId, false)+"&height="+height+"&width="+width;
+ log.info("upload url: " + url);
+// String response = (url, file);
+ WxMinishopImageUploadResult result = getWxOpenService().uploadMinishopMediaFile(url, file);
+
+ return result;
+ }
+
+ @Override
+ public MinishopCategories getMinishopCategories(String appId, Integer fCatId) throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("f_cat_id", fCatId);
+ String url = MINISHOP_CATEGORY_GET_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ log.info("response: " + response);
+ JsonObject respJson = GsonParser.parse(response);
+ MinishopCategories categories = new MinishopCategories();
+ categories.setErrcode(respJson.get("errcode").getAsInt());
+ if (categories.getErrcode() == 0) {
+ JsonArray catListJson = respJson.getAsJsonArray("cat_list");
+ if (catListJson != null || catListJson.size() > 0) {
+ List categoryList = new ArrayList<>();
+ for (int i = 0; i < catListJson.size(); i++) {
+ JsonObject catJson = catListJson.get(i).getAsJsonObject();
+ MinishopCategory cate = new MinishopCategory();
+ cate.setCatId(catJson.get("cat_id").getAsInt());
+ cate.setFCatId(catJson.get("f_cat_id").getAsInt());
+ cate.setName(catJson.get("name").getAsString());
+ categoryList.add(cate);
+ }
+
+ categories.setCatList(categoryList);
+ }
+ } else {
+ categories.setErrmsg(respJson.get("errmsg").getAsString());
+ }
+ return categories;
+ }
+
+ @Override
+ public MinishopBrandList getMinishopBrands(String appId) throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ String url = MINISHOP_BRAND_GET_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ JsonObject respJson = GsonParser.parse(response);
+ MinishopBrandList brandList = new MinishopBrandList();
+ brandList.setErrcode(respJson.get("errcode").getAsInt());
+ if (brandList.getErrcode() == 0) {
+ JsonArray brandArrayJson = respJson.get("brands").getAsJsonArray();
+ if (brandArrayJson.size() > 0) {
+ List brands = new ArrayList<>();
+ for (int i = 0; i < brandArrayJson.size(); i++) {
+ JsonObject brandJson = brandArrayJson.get(i).getAsJsonObject();
+ MinishopBrand brand = new MinishopBrand();
+ brand.setFirstCatId(brandJson.get("first_cat_id").getAsInt());
+ brand.setSecondCatId(brandJson.get("second_cat_id").getAsInt());
+ brand.setThirdCatId(brandJson.get("third_cat_id").getAsInt());
+ MinishopBrand.MinishopBrandInfo brandInfo = new MinishopBrand.MinishopBrandInfo();
+ JsonObject brandInfoJson = brandJson.get("brand_info").getAsJsonObject();
+ brandInfo.setBrandId(brandInfoJson.get("brand_id").getAsInt());
+ brandInfo.setBrandName(brandInfoJson.get("brand_name").getAsString());
+ brand.setBrandInfo(brandInfo);
+
+ brands.add(brand);
+
+ }
+
+ brandList.setBrands(brands);
+ }
+ } else {
+ brandList.setErrmsg(respJson.get("errmsg").getAsString());
+ }
+ return brandList;
+ }
+
+ @Override
+ public MinishopDeliveryTemplateResult getMinishopDeliveryTemplate(String appId) throws WxErrorException {
+ String url = MINISHOP_DELIVERY_TEMPLATE_GET_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
+ JsonObject jsonObject = new JsonObject();
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ JsonObject respJson = GsonParser.parse(response);
+ MinishopDeliveryTemplateResult templateResult = new MinishopDeliveryTemplateResult();
+ templateResult.setErrCode(respJson.get("errcode").getAsInt());
+ if (templateResult.getErrCode() == 0) {
+ JsonArray templateArrayJson = respJson.get("template_list").getAsJsonArray();
+ if (templateArrayJson.size() > 0) {
+ List templateList = new ArrayList<>();
+ for (int i = 0; i < templateArrayJson.size(); i++) {
+ JsonObject templateJson = templateArrayJson.get(i).getAsJsonObject();
+ MinishopDeliveryTemplate template = new MinishopDeliveryTemplate();
+ template.setTemplateId(templateJson.get("template_id").getAsInt());
+ template.setName(templateJson.get("name").getAsString());
+ template.setValuationType(templateJson.get("valuation_type").getAsInt() == 1 ? MinishopDeliveryTemplate.ValuationType.WEIGHT : MinishopDeliveryTemplate.ValuationType.PACKAGE);
+
+
+ templateList.add(template);
+
+ }
+
+ templateResult.setTemplateList(templateList);
+ }
+ } else {
+ templateResult.setErrMsg(respJson.get("errmsg").getAsString());
+ }
+ return templateResult;
+ }
+
+ @Override
+ public MinishopShopCatList getMinishopCatList(String appId) throws WxErrorException {
+ String url = MINISHOP_SHOPCATEGORY_GET_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
+ JsonObject jsonObject = new JsonObject();
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ JsonObject respJson = GsonParser.parse(response);
+ MinishopShopCatList shopCatList = new MinishopShopCatList();
+ shopCatList.setErrcode(respJson.get("errcode").getAsInt());
+ if (shopCatList.getErrcode() == 0) {
+ JsonArray shopcatArrayJson = respJson.get("shopcat_list").getAsJsonArray();
+ if (shopcatArrayJson.size() > 0) {
+ List shopCats = new ArrayList<>();
+ for (int i = 0; i < shopcatArrayJson.size(); i++) {
+ JsonObject shopCatJson = shopcatArrayJson.get(i).getAsJsonObject();
+ MinishopShopCat shopCat = new MinishopShopCat();
+ shopCat.setShopCatId(shopCatJson.get("shopcat_id").getAsInt());
+ shopCat.setShopCatName(shopCatJson.get("shopcat_name").getAsString());
+ shopCat.setFShopCatId(shopCatJson.get("f_shopcat_id").getAsInt());
+ shopCat.setCatLevel(shopCatJson.get("cat_level").getAsInt());
+
+ shopCats.add(shopCat);
+
+ }
+
+ shopCatList.setShopCatList(shopCats);
+ }
+ } else {
+ shopCatList.setErrmsg(respJson.get("errmsg").getAsString());
+ }
+ return shopCatList;
+ }
+
+ @Override
+ public WxMinishopAddGoodsSpuResult> getMinishopDeliveryCompany(String appId) throws WxErrorException {
+ String url = MINISHOP_GET_DELIVERY_COMPANY_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
+ JsonObject jsonObject = new JsonObject();
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ JsonObject respObj = GsonParser.parse(response);
+ WxMinishopAddGoodsSpuResult result = new WxMinishopAddGoodsSpuResult();
+ result.setErrcode(respObj.get("errcode").getAsInt());
+ if (result.getErrcode() == 0) {
+ JsonArray companyArray = respObj.get("company_list").getAsJsonArray();
+ List companies = new ArrayList<>();
+ for (int i = 0; i < companyArray.size(); i++) {
+ JsonObject company = companyArray.get(i).getAsJsonObject();
+ WxMinishopDeliveryCompany resultData = new WxMinishopDeliveryCompany();
+ resultData.setDeliveryId(company.get("delivery_id").getAsString());
+ resultData.setDeliveryName(company.get("delivery_name").getAsString());
+ companies.add(resultData);
+ }
+ result.setData(companies);
+ } else {
+ result.setErrmsg(respObj.get("errmsg").getAsString());
+ }
+ return result;
+ }
+
+ @Override
+ public Integer minishopCreateCoupon(String appId, WxMinishopCoupon couponInfo) throws WxErrorException {
+ String url = MINISHOP_CREATE_COUPON_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = couponInfo.toJsonObject();
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ JsonObject respJson = GsonParser.parse(response);
+ Integer couponId = -1;
+ if (respJson.get("errcode").getAsInt() == 0) {
+ JsonObject dataJson = respJson.get("data").getAsJsonObject();
+ couponId = dataJson.get("coupon_id").getAsInt();
+ }
+ return couponId;
+ }
+
+ @Override
+ public WxMinishopCouponStock minishopGetCouponList(String appId, String startCreateTime, String endCreateTime, Integer status, Integer page, Integer pageSize) throws WxErrorException {
+ String url = MINISHOP_GET_COUPON_LIST + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+ return null;
+ }
+
+ @Override
+ public WxOpenResult minishopPushCouponToUser(String appId, String openId, Integer couponId) throws WxErrorException {
+ String url = MINISHOP_PUSH_COUPON + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("openid", openId);
+ jsonObject.addProperty("coupon_id", couponId);
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public Integer minishopUpdateCoupon(String appId, WxMinishopCoupon couponInfo) throws WxErrorException {
+ String url = MINISHOP_UPDATE_COUPON_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = couponInfo.toJsonObject();
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ JsonObject respJson = GsonParser.parse(response);
+ Integer couponId = -1;
+ if (respJson.get("errcode").getAsInt() == 0) {
+ JsonObject dataJson = respJson.get("data").getAsJsonObject();
+ couponId = dataJson.get("coupon_id").getAsInt();
+ }
+ return couponId;
+ }
+
+ @Override
+ public WxOpenResult minishopUpdateCouponStatus(String appId, Integer couponId, Integer status) throws WxErrorException {
+ String url = MINISHOP_UPDATE_COUPON_STATUS_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("coupon_id", couponId);
+ jsonObject.addProperty("status", status);
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxMinishopAddGoodsSpuResult minishopGoodsAddSpu(String appId, WxMinishopSpu spu) throws WxErrorException {
+ String url = MINISHOP_ADD_SPU_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = spu.toJsonObject();
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ JsonObject respObj = GsonParser.parse(response);
+ WxMinishopAddGoodsSpuResult result = new WxMinishopAddGoodsSpuResult();
+ result.setErrcode(respObj.get("errcode").getAsInt());
+
+ if (result.getErrcode() == 0) {
+ JsonObject dataObj = respObj.get("data").getAsJsonObject();
+ WxMinishopAddGoodsSpuData resultData = new WxMinishopAddGoodsSpuData();
+ resultData.setProductId(dataObj.get("product_id").getAsLong());
+ resultData.setOutProductId(dataObj.get("out_product_id").getAsString());
+ resultData.setCreateTime(dataObj.get("create_time").getAsString());
+ result.setData(resultData);
+ } else {
+ result.setErrmsg(respObj.get("errmsg").getAsString());
+
+ }
+ return result;
+ }
+
+ @Override
+ public WxOpenResult minishopGoodsDelSpu(String appId, Long productId, Long outProductId) throws WxErrorException {
+ String url = MINISHOP_DEL_SPU_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("product_id", productId);
+ jsonObject.addProperty("out_product_id", outProductId.toString());
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxMinishopAddGoodsSpuResult minishopGoodsUpdateSpu(String appId, WxMinishopSpu spu) throws WxErrorException {
+ String url = MINISHOP_UPDATE_SPU_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = spu.toJsonObject();
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ JsonObject respObj = GsonParser.parse(response);
+ WxMinishopAddGoodsSpuResult result = new WxMinishopAddGoodsSpuResult();
+ result.setErrcode(respObj.get("errcode").getAsInt());
+ if (result.getErrcode() == 0) {
+ JsonObject dataObj = respObj.get("data").getAsJsonObject();
+ WxMinishopAddGoodsSpuData resultData = new WxMinishopAddGoodsSpuData();
+ resultData.setProductId(dataObj.get("product_id").getAsLong());
+ resultData.setOutProductId(dataObj.get("out_product_id").getAsString());
+ resultData.setCreateTime(dataObj.get("update_time").getAsString());
+ result.setData(resultData);
+ } else {
+ result.setErrmsg(respObj.get("errmsg").getAsString());
+ }
+
+ return result;
+ }
+
+ @Override
+ public WxOpenResult minishopGoodsListingSpu(String appId, Long productId, Long outProductId) throws WxErrorException {
+ String url = MINISHOP_LISTING_SPU_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("product_id", productId);
+ jsonObject.addProperty("out_product_id", outProductId.toString());
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult minishopGoodsDelistingSpu(String appId, Long productId, Long outProductId) throws WxErrorException {
+ String url = MINISHOP_DELISTING_SPU_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("product_id", productId);
+ jsonObject.addProperty("out_product_id", outProductId.toString());
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxMinishopAddGoodsSpuResult minishiopGoodsAddSku(String appId, WxMinishopSku sku) throws WxErrorException {
+ String url = MINISHOP_ADD_SKU_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = sku.toJsonObject();
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ JsonObject respObj = GsonParser.parse(response);
+ WxMinishopAddGoodsSpuResult result = new WxMinishopAddGoodsSpuResult();
+ result.setErrcode(respObj.get("errcode").getAsInt());
+ if (result.getErrcode() == 0) {
+ JsonObject dataObj = respObj.get("data").getAsJsonObject();
+ WxMinishopAddGoodsSkuData resultData = new WxMinishopAddGoodsSkuData();
+ resultData.setSkuId(dataObj.get("sku_id").getAsLong());
+ resultData.setCreateTime(dataObj.get("create_time").getAsString());
+ result.setData(resultData);
+ } else {
+ result.setErrmsg(respObj.get("errmsg").getAsString());
+ }
+
+ return result;
+ }
+
+ @Override
+ public WxOpenResult minishopGoodsBatchAddSku(String appId, List skuList) throws WxErrorException {
+ String url = MINISHOP_BATCH_ADD_SKU_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+ JsonArray jsonArray = new JsonArray();
+
+ for (WxMinishopSku sku : skuList) {
+ jsonArray.add(sku.toJsonObject());
+ }
+
+ jsonObject.add("skus", jsonArray);
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult minishopGoodsDelSku(String appId, Long productId, Long outProductId, String outSkuId, Long skuId) throws WxErrorException {
+ String url = MINISHOP_DEL_SKU_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("product_id", productId);
+ jsonObject.addProperty("out_product_id", outProductId);
+ jsonObject.addProperty("sku_id", skuId);
+ jsonObject.addProperty("out_sku_id", outSkuId);
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult minishopGoodsUpdateSku(String appId, WxMinishopSku sku) throws WxErrorException {
+ String url = MINISHOP_UPDATE_SKU_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = sku.toJsonObject();
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult minishopGoodsUpdateSkuPrice(String appId, Long productId, Long outProductId, String outSkuId, Long skuId, Long salePrice, Long marketPrice) throws WxErrorException {
+ String url = MINISHOP_UPDATE_SKU_PRICE_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("product_id", productId);
+ jsonObject.addProperty("out_product_id", outProductId);
+ jsonObject.addProperty("sku_id", skuId);
+ jsonObject.addProperty("out_sku_id", outSkuId);
+ jsonObject.addProperty("sale_price", outSkuId);
+ jsonObject.addProperty("market_price", outSkuId);
+
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult minishopGoodsUpdateSkuStock(String appId, Long productId, Long outProductId, String outSkuId, Long skuId, Integer type, Integer stockNum) throws WxErrorException {
+ String url = MINISHOP_UPDATE_SKU_STOCK_URL + "?access_token=" + getAuthorizerAccessToken(appId, true);
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("product_id", productId);
+ jsonObject.addProperty("out_product_id", outProductId);
+ jsonObject.addProperty("sku_id", skuId);
+ jsonObject.addProperty("out_sku_id", outSkuId);
+ jsonObject.addProperty("type", type);
+ jsonObject.addProperty("stock_num", stockNum);
+
+
+
+
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ @Override
+ public String minishopCommonPost(String appId, String url, String requestParam) throws WxErrorException {
+
+ return null;
+ }
+
+ @Override
+ public Integer addLimitDiscountGoods(String appId, LimitDiscountGoods limitDiscountGoods) throws WxErrorException {
+ String url = API_MINISHOP_ADD_LIMIT_DISCOUNT_URL + "access_token=" + getAuthorizerAccessToken(appId, false);
+ JsonObject jsonObject = limitDiscountGoods.toJsonObject();
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ JsonObject respObj = GsonParser.parse(response);
+ Integer taskId = 0;
+ if (respObj.get("errcode").getAsInt() == 0) {
+ taskId = respObj.get("task_id").getAsInt();
+ }
+ return taskId;
+ }
+
+ @Override
+ public List getLimitDiscountList(String appId, Integer status) throws WxErrorException {
+ String url = API_MINISHOP_GET_LIMIT_DISCOUNT_URL + "access_token=" + getAuthorizerAccessToken(appId, false);
+ JsonObject jsonObject = new JsonObject();
+ if (status != null) {
+ jsonObject.addProperty("status", status);
+ }
+ String response = getWxOpenService().post(url, jsonObject.toString());
+ JsonObject respObj = GsonParser.parse(response);
+ List limitDiscountGoodsList = new ArrayList<>();
+ if (respObj.get("errcode").getAsInt() == 0) {
+ //成功获取到秒杀活动列表
+
+ JsonArray jsonArray = respObj.get("limited_discount_list").getAsJsonArray();
+ if (jsonArray != null && jsonArray.size() > 0) {
+ for (int i = 0; i < jsonArray.size(); i ++) {
+ JsonObject goodsObj = jsonArray.get(i).getAsJsonObject();
+ LimitDiscountGoods discountGoods = new LimitDiscountGoods();
+ discountGoods.setTaskId(goodsObj.get("task_id").getAsLong());
+ discountGoods.setStatus(goodsObj.get("status").getAsInt());
+ discountGoods.setStartTime(new Date(goodsObj.get("start_time").getAsLong()*1000));
+ discountGoods.setEndTime(new Date(goodsObj.get("end_time").getAsLong()*1000));
+
+ List skuList = new ArrayList<>();
+ JsonArray skuArray = goodsObj.get("limited_discount_sku_list").getAsJsonArray();
+ if (skuArray != null && skuArray.size() > 0) {
+ for (int j = 0; j < skuArray.size(); j ++) {
+ JsonObject skuObj = skuArray.get(i).getAsJsonObject();
+ LimitDiscountSku sku = new LimitDiscountSku();
+ sku.setSkuId(skuObj.get("sku_id").getAsLong());
+ sku.setSalePrice(new BigDecimal(skuObj.get("sale_price").getAsDouble() / 100));
+ sku.setSaleStock(skuObj.get("sale_stock").getAsInt());
+ skuList.add(sku);
+ }
+
+ discountGoods.setLimitDiscountSkuList(skuList);
+ }
+
+ limitDiscountGoodsList.add(discountGoods);
+ }
+ }
+ }
+ return limitDiscountGoodsList;
+ }
+
+ @Override
+ public WxOpenResult updateLimitDiscountStatus(String appId, Long taskId, Integer status) throws WxErrorException {
+ String url = API_MINISHOP_UPDATE_LIMIT_DICOUNT_STATUS_URL + "access_token=" + getAuthorizerAccessToken(appId, false);
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("task_id", taskId);
+ jsonObject.addProperty("status", status);
+ String response = getWxOpenService().post(url, jsonObject.toString());
+
+ return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
index 9febf639f4..590f703e4c 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
@@ -5,6 +5,8 @@
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.config.WxMaConfig;
import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import lombok.Getter;
@@ -14,6 +16,7 @@
import me.chanjar.weixin.open.api.WxOpenMaService;
import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
import me.chanjar.weixin.open.bean.ma.WxMaQrcodeParam;
+import me.chanjar.weixin.open.bean.ma.WxMaScheme;
import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
import me.chanjar.weixin.open.bean.result.*;
import me.chanjar.weixin.open.executor.MaQrCodeRequestExecutor;
@@ -359,6 +362,40 @@ public WxOpenResult publishQrcodeJump(String prefix) throws WxErrorException {
return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
}
+ @Override
+ public WxMaScheme generateMaScheme(String jumpWxaPath, String jumpWxaQuery, Boolean isExpire, Long expireTime) throws WxErrorException {
+ JsonObject jumpWxa = null;
+ if (jumpWxaPath != null && jumpWxaQuery != null) {
+ jumpWxa = new JsonObject();
+ jumpWxa.addProperty("path", jumpWxaPath);
+ jumpWxa.addProperty("query", jumpWxaQuery);
+ }
+
+ JsonObject params = new JsonObject();
+ if (jumpWxa != null) {
+ params.add("jump_wxa", jumpWxa);
+ }
+ if (isExpire != null) {
+ params.addProperty("is_expire", isExpire);
+ }
+ if (expireTime != null) {
+ params.addProperty("expire_time", expireTime);
+ }
+
+ Gson gson = new GsonBuilder().disableHtmlEscaping().create();
+
+ String response = post(API_GENERATE_SCHEME, gson.toJson(params));
+
+ return WxMaGsonBuilder.create().fromJson(response, WxMaScheme.class);
+ }
+
+ @Override
+ public WxOpenResult registerShopComponent() throws WxErrorException {
+ JsonObject params = new JsonObject();
+ String response = post(API_REGISTER_SHOP_COMPONENT, GSON.toJson(params));
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
private JsonArray toJsonArray(List strList) {
JsonArray jsonArray = new JsonArray();
if (strList != null && !strList.isEmpty()) {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMinishopGoodsServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMinishopGoodsServiceImpl.java
new file mode 100644
index 0000000000..1e792e04e9
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMinishopGoodsServiceImpl.java
@@ -0,0 +1,37 @@
+package me.chanjar.weixin.open.api.impl;
+
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.api.WxOpenMinishopGoodsService;
+import me.chanjar.weixin.open.bean.minishopGoods.AddMinishopGoodsSPU;
+import me.chanjar.weixin.open.bean.minishopGoods.GoodsCatList;
+import me.chanjar.weixin.open.bean.minishopGoods.ParentCatId;
+import me.chanjar.weixin.open.bean.result.WxOpenResult;
+
+@Slf4j
+public class WxOpenMinishopGoodsServiceImpl extends WxMaServiceImpl implements WxOpenMinishopGoodsService {
+
+ @Override
+ public GoodsCatList getMinishopGoodsCat(ParentCatId dto) throws WxErrorException {
+ String response = post(getMinishopGoodsCatUrl, dto.toJsonObject().toString());
+ log.info(response);
+ return null;
+ }
+
+ @Override
+ public WxOpenResult addMinishopGoodsSPU(AddMinishopGoodsSPU dto) throws WxErrorException {
+ String response = post(addMinishopGoodsSPUUrl, dto.toJsonObject().toString());
+ return null;
+ }
+
+
+
+
+
+
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMinishopServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMinishopServiceImpl.java
new file mode 100644
index 0000000000..c6934d58d4
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMinishopServiceImpl.java
@@ -0,0 +1,80 @@
+package me.chanjar.weixin.open.api.impl;
+
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.api.WxOpenComponentService;
+import me.chanjar.weixin.open.api.WxOpenMinishopService;
+import me.chanjar.weixin.open.api.WxOpenService;
+import me.chanjar.weixin.open.bean.minishop.*;
+import me.chanjar.weixin.open.bean.result.WxOpenResult;
+
+import java.io.File;
+
+@Slf4j
+public class WxOpenMinishopServiceImpl extends WxMaServiceImpl implements WxOpenMinishopService {
+ private final WxOpenComponentService wxOpenComponentService;
+ private final WxMaConfig wxMaConfig;
+ private final String appId;
+
+ public WxOpenMinishopServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) {
+ this.wxOpenComponentService = wxOpenComponentService;
+ this.appId = appId;
+ this.wxMaConfig = wxMaConfig;
+ log.info("appId: " + appId);
+ if (wxMaConfig == null) {
+ log.error("WxMaConfig is null");
+ }
+ this.addConfig(appId, wxMaConfig);
+ initHttp();
+ }
+
+ @Override
+ public WxOpenResult submitMerchantInfo(String appId, String subjectType, MinishopBusiLicense busiLicense, MinishopOrganizationCodeInfo organizationCodeInfo, MinishopIdcardInfo idcardInfo, MinishopSuperAdministratorInfo superAdministratorInfo, String merchantShoprtName) throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("app_id", appId);
+ jsonObject.addProperty("subject_type", subjectType);
+ jsonObject.add("busi_license", busiLicense.toJsonObject());
+ jsonObject.add("organization_code_info", organizationCodeInfo.toJsonObject());
+ jsonObject.add("id_card_info", idcardInfo.toJsonObject());
+ jsonObject.add("super_administrator_info", superAdministratorInfo.toJsonObject());
+ String response = post(submitMerchantInfoUrl, jsonObject.toString());
+ return null;
+ }
+
+ @Override
+ public WxOpenResult submitBasicInfo(String appId, MinishopNameInfo nameInfo, MinishopReturnInfo returnInfo) {
+ return null;
+ }
+
+ @Override
+ public MinishopAuditStatus checkAuditStatus(String wxName) throws WxErrorException {
+ return null;
+ }
+
+ @Override
+ public String uploadImagePicFile(Integer height, Integer width, File file) throws WxErrorException {
+ String url = UPLOAD_IMG_MINISHOP_FILE_URL + "?access_token="+getAccessToken(true)+"&height="+height+"&width="+width;
+ log.info("upload url: " + url);
+ String response = post(url, file);
+ return response;
+ }
+
+ @Override
+ public MinishopCategories getCategory(Integer fCatId) {
+ return null;
+ }
+
+ @Override
+ public MinishopBrandList getBrands() {
+ return null;
+ }
+
+ @Override
+ public MinishopShopCatList getShopCat() {
+ return null;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceApacheHttpClientImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceApacheHttpClientImpl.java
index 24ee39cc30..2cf3b8adbf 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceApacheHttpClientImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceApacheHttpClientImpl.java
@@ -1,15 +1,17 @@
package me.chanjar.weixin.open.api.impl;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.util.http.HttpType;
-import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
-import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
+import me.chanjar.weixin.common.util.http.*;
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder;
import me.chanjar.weixin.open.api.WxOpenConfigStorage;
import org.apache.http.HttpHost;
import org.apache.http.impl.client.CloseableHttpClient;
+import java.io.File;
+
/**
* apache-http方式实现
*
@@ -64,4 +66,9 @@ public String get(String url, String queryParam) throws WxErrorException {
public String post(String url, String postData) throws WxErrorException {
return execute(SimplePostRequestExecutor.create(this), url, postData);
}
+
+ @Override
+ public WxMinishopImageUploadResult uploadMinishopMediaFile(String url, File file) throws WxErrorException {
+ return execute(MinishopUploadRequestExecutor.create(this), url, file);
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaScheme.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaScheme.java
new file mode 100644
index 0000000000..faa56bec34
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaScheme.java
@@ -0,0 +1,9 @@
+package me.chanjar.weixin.open.bean.ma;
+
+import lombok.Data;
+import me.chanjar.weixin.open.bean.result.WxOpenResult;
+
+@Data
+public class WxMaScheme extends WxOpenResult {
+ private String openlink;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAddressInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAddressInfo.java
new file mode 100644
index 0000000000..985e378c27
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAddressInfo.java
@@ -0,0 +1,75 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("小商店地址信息")
+public class MinishopAddressInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 收货人姓名
+ */
+ @ApiModelProperty("收货人姓名 必填")
+ private String userName;
+
+ /**
+ * 邮政编码
+ */
+ @ApiModelProperty("邮政编码 必填")
+ private String postalCode;
+
+ /**
+ * 省份,格式:广东省 北京市
+ */
+ @ApiModelProperty("省份,格式:广东省 北京市 必填")
+ private String province;
+
+ /**
+ * 城市,格式:广州市
+ */
+ @ApiModelProperty("城市,格式:广州市 必填")
+ private String cityName;
+
+ /**
+ * 区,格式:海珠区
+ */
+ @ApiModelProperty("区,格式:海珠区 必填")
+ private String countyName;
+
+ /**
+ * 详细地址
+ */
+ @ApiModelProperty("详细地址,必填")
+ private String detailInfo;
+
+ /**
+ * 国家码
+ */
+ @ApiModelProperty("国家码,选填")
+ private String nationalCode;
+
+ /**
+ * 电话号码
+ */
+ @ApiModelProperty("电话号码")
+ private String telNumber;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("user_name", userName);
+ jsonObject.addProperty("postal_code", postalCode);
+ jsonObject.addProperty("province_name", province);
+ jsonObject.addProperty("city_name", cityName);
+ jsonObject.addProperty("county_name", countyName);
+ jsonObject.addProperty("detail_info", detailInfo);
+ jsonObject.addProperty("national_code", nationalCode);
+ jsonObject.addProperty("tel_number", telNumber);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAuditStatus.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAuditStatus.java
new file mode 100644
index 0000000000..9f93aee7ae
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAuditStatus.java
@@ -0,0 +1,63 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import lombok.Data;
+import me.chanjar.weixin.common.error.WxError;
+
+import java.io.Serializable;
+
+@Data
+public class MinishopAuditStatus implements Serializable {
+
+ private WxError wxError;
+
+ /**
+ * 注册状态 0:成功 1:已发送协议还未签约 2: 未发送协议或协议已过期,需发送协议,当register_status为0时以下字段有意义
+ */
+ private Integer registerStatus;
+
+ /**
+ * 商家信息状态, 具体含义查看状态枚举值
+ */
+ private Integer merchantInfoStatus;
+
+ /**
+ * 账户验证状态, 具体含义查看状态枚举值
+ */
+ private Integer acctVerifyStatus;
+
+
+ /**
+ * 基础信息状态, 具体含义查看状态枚举值
+ */
+ private Integer basicInfoStatus;
+
+ /**
+ * 支付签约状态, 具体含义查看状态枚举值
+ */
+ private Integer paySignStatus;
+
+ /**
+ * 基础信息驳回原因
+ */
+ private String auditRejectReason;
+
+ /**
+ * 法人验证链接
+ */
+ private String legalValidationUrl;
+
+ /**
+ * 参数名
+ */
+ private String payAuditDetailParamName;
+
+ /**
+ * 支付资质驳回原因
+ */
+ private String payAuditDetailRejectReason;
+
+ /**
+ * 注册的appid
+ */
+ private String registeredAppId;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBaseInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBaseInfo.java
new file mode 100644
index 0000000000..5d974405ad
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBaseInfo.java
@@ -0,0 +1,71 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author luowentao
+ * @since 2021-01-27
+ */
+@Data
+public class MinishopBaseInfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 微信小商店ID(自定)
+ */
+ private Long miniShopId;
+
+ /**
+ * 小程序ID
+ */
+ private String appId;
+
+ /**
+ * 1)小程序名称可以由中文、数字、英文、空格及部分特殊符号(“空格”、“-”、“+”、“&”、“.”)组成。长度在4-30个字符之间,一个中文字等于2个字符。
+2)公众号、小程序在微信公众平台上的名称是唯一的,且属于同一主体下,可以重名。
+3)不得与不同主体的公众号名称重名。
+ */
+ private String nickName;
+
+ /**
+ * 1)小程序简称可以从小程序名称中按顺序截取字符创建。长度在4-10个字符之间,一个中文字等于2个字符。
+2)小程序简称在微信公众平台是不唯一的,可以重名。但对于仿冒、侵权等恶意情况,平台仍会做出相关处罚。开发者也可通过侵权投诉维护自己的正当权益。
+3)小程序简称设置后,将在客户端任务栏向用户展示。开发者可以凭借此功能,更好地实现产品品牌价值和展示。目前暂不支持名称的其他功能。
+ */
+ private String abbr;
+
+ /**
+ * 介绍。请确认介绍内容不含国家相关法律法规禁止内容,介绍字数为4-120个字符,一个中文占2个字符。一个月内可申请5次修改。请提供可支持命名的材料
+ */
+ private String introduction;
+
+ /**
+ * 补充材料,传media id数组,当返回210047时必填
+ */
+ private String namingOtherStuff;
+
+ /**
+ * 邮箱
+ */
+ private String mail;
+
+ /**
+ * 退货地址
+ */
+ private Integer returnAddressId;
+
+ /**
+ * 公司地址
+ */
+ private Integer companyAddressId;
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrand.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrand.java
new file mode 100644
index 0000000000..0128b2b776
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrand.java
@@ -0,0 +1,26 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+@Data
+public class MinishopBrand implements Serializable {
+ private Integer firstCatId;
+
+ private Integer secondCatId;
+
+ private Integer thirdCatId;
+
+ @Data
+ @Getter
+ @Setter
+ public static class MinishopBrandInfo implements Serializable {
+ private Integer brandId;
+ private String brandName;
+ }
+
+ private MinishopBrandInfo brandInfo;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrandList.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrandList.java
new file mode 100644
index 0000000000..d4fdffd0c0
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrandList.java
@@ -0,0 +1,15 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class MinishopBrandList implements Serializable {
+ private Integer errcode;
+
+ private String errmsg;
+
+ private List brands;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBusiLicense.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBusiLicense.java
new file mode 100644
index 0000000000..3f8c4df0c0
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBusiLicense.java
@@ -0,0 +1,98 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 企业上传的营业执照信息
+ *
+ *
+ * @author luowentao
+ * @since 2021-01-27
+ */
+@Data
+@Accessors(chain = true)
+public class MinishopBusiLicense implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 营业执照相关信息
+ */
+ private Integer busiLicenseId;
+
+ /**
+ * 营业执照类型 1:三证合一 2: 普通营业执照
+ */
+ private Integer licenseType;
+
+ /**
+ * 营业执照图片
+ */
+ private MinishopPicFile picFile;
+
+
+ /**
+ * 营业执照图片url
+ */
+ private String picFileUrl;
+
+ /**
+ * 请填写营业执照上的注册号/统一社会信用代码,
+须为15位数字或18位数字大写字母。
+示例值:123456789012345678 特殊规则:长度最小15个字节
+ */
+ private String registrationNum;
+
+ /**
+ * 1、请填写营业执照/登记证书的商家名称,2~110个字符,支持括号
+2、个体工商户/党政、机关及事业单位,不能以“公司”结尾。
+3、个体工商户,若营业执照上商户名称为空或为“无”,请填写"个体户+经营者姓名",
+如“个体户张三” 。示例值:腾讯科技有限公司
+ */
+ private String merchantName;
+
+ /**
+ * 请填写证件的经营者/法定代表人姓名。示例值:张三
+ */
+ private String legalRepresentative;
+
+ /**
+ * 注册地址
+ */
+ private String registeredAddrs;
+
+ /**
+ * 注册日期,格式:2014-01-01
+ */
+ private String startDate;
+
+ /**
+ * 结束有效期,格式:2014-01-01
+1、若证件有效期为长期,请填写:长期。
+2、结束时间需大于开始时间。
+3、有效期必须大于60天,即结束时间距当前时间需超过60天。
+ */
+ private String endDate;
+
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("license_type", this.licenseType);
+ jsonObject.add("pic_file", picFile.toJsonObject());
+ jsonObject.addProperty("registration_num", registrationNum);
+ jsonObject.addProperty("merchant_name", merchantName);
+ jsonObject.addProperty("legal_representative", legalRepresentative);
+ if (registeredAddrs != null) {
+ jsonObject.addProperty("registered_addrs", registeredAddrs);
+ }
+ jsonObject.addProperty("start_date", startDate);
+ jsonObject.addProperty("end_date", endDate);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategories.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategories.java
new file mode 100644
index 0000000000..62dabd383d
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategories.java
@@ -0,0 +1,15 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class MinishopCategories implements Serializable {
+ private Integer errcode;
+
+ private String errmsg;
+
+ private List catList;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategory.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategory.java
new file mode 100644
index 0000000000..ceef3b89a8
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategory.java
@@ -0,0 +1,14 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class MinishopCategory implements Serializable {
+ private Integer catId;
+
+ private Integer fCatId;
+
+ private String name;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplate.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplate.java
new file mode 100644
index 0000000000..c0acfc7ea4
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplate.java
@@ -0,0 +1,20 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class MinishopDeliveryTemplate implements Serializable {
+
+ public enum ValuationType {
+ PACKAGE,
+ WEIGHT
+ }
+
+ private Integer templateId;
+
+ private String name;
+
+ private ValuationType valuationType;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplateResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplateResult.java
new file mode 100644
index 0000000000..dbcada8f0a
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplateResult.java
@@ -0,0 +1,21 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel("小商店运费模版信息")
+public class MinishopDeliveryTemplateResult implements Serializable {
+ @ApiModelProperty(value = "错误码")
+ private Integer errCode;
+
+ @ApiModelProperty(value = "错误信息")
+ private String errMsg;
+
+ @ApiModelProperty(value = "运费模版列表")
+ private List templateList;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopIdcardInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopIdcardInfo.java
new file mode 100644
index 0000000000..eaac80498b
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopIdcardInfo.java
@@ -0,0 +1,88 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author luowentao
+ * @since 2021-01-27
+ */
+@Data
+@Accessors(chain = true)
+public class MinishopIdcardInfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 身份证信息Id
+ */
+ private Integer idCardInfoId;
+
+ /**
+ * 小程序ID
+ */
+ private String appId;
+
+ /**
+ * 人像面照片media_id
+ */
+ private MinishopPicFile portraitPicFile;
+
+ /**
+ * 人像面照片url
+ */
+ private String protraitPicFileUrl;
+
+ /**
+ * 国徽面照片
+ */
+ private MinishopPicFile nationPicFile;
+
+ /**
+ * 国徽面照片url
+ */
+ private String nationPicFileUrl;
+
+ /**
+ * 请填写经营者/法定代表人对应身份证的姓名,2~30个中文字符、英文字符、符号。
+ */
+ private String idCardName;
+
+ /**
+ * 请填写经营者/法定代表人对应身份证的号码
+ */
+ private String idCardNumber;
+
+ /**
+ * 注册日期,格式:2014-01-01
+ */
+ private String startDate;
+
+ /**
+ * 结束有效期,格式:2014-01-01
+1、若证件有效期为长期,请填写:长期。
+2、结束时间需大于开始时间。
+3、有效期必须大于60天,即结束时间距当前时间需超过60天。
+ */
+ private String endDate;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.add("portrait_pic_file", portraitPicFile.toJsonObject());
+ jsonObject.add("nation_pic_file", nationPicFile.toJsonObject());
+ jsonObject.addProperty("id_card_name", idCardName);
+ jsonObject.addProperty("id_card_number", idCardNumber);
+ jsonObject.addProperty("start_date", startDate);
+ jsonObject.addProperty("end_date", endDate);
+ return jsonObject;
+ }
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopMerchantinfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopMerchantinfo.java
new file mode 100644
index 0000000000..e7eac7e064
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopMerchantinfo.java
@@ -0,0 +1,96 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ *
+ *
+ *
+ * @author luowentao
+ * @since 2021-01-27
+ */
+@Data
+@Accessors(chain = true)
+public class MinishopMerchantinfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 小商店认证ID
+ */
+ private Long merchantId;
+
+ /**
+ * 小商店APPID
+ */
+ private String appId;
+
+ /**
+ * 主体类型
+"4":个体工商户,营业执照上的主体类型一般为个体户、个体工商户、个体经营。
+"2":企业,营业执照上的主体类型一般为有限公司、有限责任公司。
+ */
+ private String subjectType;
+
+ /**
+ * 商户简称 UTF-8格式,中文占3个字节,即最多16个汉字长度。
+将在支付完成页向买家展示,需与商家的实际售卖商品相符 。示例值:腾讯
+ */
+ private String merchantShortname;
+
+ /**
+ * 补充描述
+ */
+ private String supplementaryDesc;
+
+ /**
+ * 营业执照/登记证书信息
+ */
+ private Integer busiLicenseId;
+
+ /**
+ * 组织机构代码证信息(非必填)
+ */
+ private Integer organizationCodeInfo;
+
+ /**
+ * 身份证信息
+ */
+ private Integer idCardInfo;
+
+ /**
+ * 超级管理员信息 请填写店铺的超级管理员信息。超级管理员需在开户后进行签约,
+并可接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。
+ */
+ private Integer superAdministratorInfoId;
+
+ /**
+ * 特殊资质 1、根据商户经营业务要求提供相关资质,详情查看《行业对应特殊资质》。
+2、请提供为“申请商家主体”所属的特殊资质,可授权使用总公司/分公司的特殊资 质;
+3、最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+ */
+ private Integer specialQualificationId;
+
+ /**
+ * 补充材料
+ */
+ private Integer supplementaryMaterialId;
+
+ /**
+ * 状态:0为审核中,1为已通过,-1为审批驳回
+ */
+ private Integer status;
+
+ /**
+ * 提交时间
+ */
+ private Date submitTime;
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopNameInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopNameInfo.java
new file mode 100644
index 0000000000..1e12dc16ff
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopNameInfo.java
@@ -0,0 +1,59 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel("小商店名称信息")
+public class MinishopNameInfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+
+ /**
+ * 1)小程序名称可以由中文、数字、英文、空格及部分特殊符号(“空格”、“-”、“+”、“&”、“.”)组成。长度在4-30个字符之间,一个中文字等于2个字符。
+ * 2)公众号、小程序在微信公众平台上的名称是唯一的,且属于同一主体下,可以重名。
+ * 3)不得与不同主体的公众号名称重名。
+ */
+ @ApiModelProperty(value = "1)小程序名称可以由中文、数字、英文、空格及部分特殊符号(“空格”、“-”、“+”、“&”、“.”)组成。长度在4-30个字符之间,一个中文字等于2个字符。\n" +
+ " * 2)公众号、小程序在微信公众平台上的名称是唯一的,且属于同一主体下,可以重名。\n" +
+ " * 3)不得与不同主体的公众号名称重名。", required = true)
+ private String nickName;
+
+
+ /**
+ * 1)小程序简称可以从小程序名称中按顺序截取字符创建。长度在4-10个字符之间,一个中文字等于2个字符。
+ * 2)小程序简称在微信公众平台是不唯一的,可以重名。但对于仿冒、侵权等恶意情况,平台仍会做出相关处罚。开发者也可通过侵权投诉维护自己的正当权益。
+ * 3)小程序简称设置后,将在客户端任务栏向用户展示。开发者可以凭借此功能,更好地实现产品品牌价值和展示。目前暂不支持名称的其他功能。
+ */
+ @ApiModelProperty(value = " * 1)小程序简称可以从小程序名称中按顺序截取字符创建。长度在4-10个字符之间,一个中文字等于2个字符。\n" +
+ " * 2)小程序简称在微信公众平台是不唯一的,可以重名。但对于仿冒、侵权等恶意情况,平台仍会做出相关处罚。开发者也可通过侵权投诉维护自己的正当权益。\n" +
+ " * 3)小程序简称设置后,将在客户端任务栏向用户展示。开发者可以凭借此功能,更好地实现产品品牌价值和展示。目前暂不支持名称的其他功能。", required = true)
+ private String abbr;
+
+
+ /**
+ * 请确认介绍内容不含国家相关法律法规禁止内容,介绍字数为4-120个字符,一个中文占2个字符。一个月内可申请5次修改。请提供可支持命名的材料
+ */
+ @ApiModelProperty(value = "请确认介绍内容不含国家相关法律法规禁止内容,介绍字数为4-120个字符,一个中文占2个字符。一个月内可申请5次修改。请提供可支持命名的材料", required = true)
+ private String introduction;
+
+ /**
+ * 补充材料,传media id数组,当返回210047时必填
+ */
+ @ApiModelProperty(value = "补充材料,传media id数组,当返回210047时必填", required = false)
+ private List namingOtherStuff;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("nickname", nickName);
+ jsonObject.addProperty("abbr", abbr);
+ jsonObject.addProperty("introduction", introduction);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopOrganizationCodeInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopOrganizationCodeInfo.java
new file mode 100644
index 0000000000..fc34429f4d
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopOrganizationCodeInfo.java
@@ -0,0 +1,62 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author luowentao
+ * @since 2021-01-27
+ */
+@Data
+public class MinishopOrganizationCodeInfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private Integer organizationCodeInfoId;
+
+ /**
+ * 小程序ID
+ */
+ private String appId;
+
+ /**
+ * 组织机构代码证图片
+ */
+ private MinishopPicFile picFile;
+
+ /**
+ * 1、请填写组织机构代码证上的组织机构代码。
+2、可填写9或10位 数字\字母\连字符。示例值:12345679-A
+ */
+ private String organizationCode;
+
+ /**
+ * 注册日期,格式:2014-01-01
+ */
+ private String startDate;
+
+ /**
+ * 结束有效期,格式:2014-01-01
+1、若证件有效期为长期,请填写:长期。
+2、结束时间需大于开始时间。
+3、有效期必须大于60天,即结束时间距当前时间需超过60天。
+ */
+ private String endDate;
+
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.add("pic_file", picFile.toJsonObject());
+ jsonObject.addProperty("organization_code", organizationCode);
+ jsonObject.addProperty("start_date", startDate);
+ jsonObject.addProperty("end_date", endDate);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopPicFile.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopPicFile.java
new file mode 100644
index 0000000000..4a3bda54a2
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopPicFile.java
@@ -0,0 +1,22 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class MinishopPicFile implements Serializable {
+
+
+ private String mediaId;
+
+ private String payMediaId;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("media_id", mediaId);
+ jsonObject.addProperty("pay_media_id", payMediaId);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopReturnInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopReturnInfo.java
new file mode 100644
index 0000000000..33144111b4
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopReturnInfo.java
@@ -0,0 +1,39 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("小商店退货信息")
+public class MinishopReturnInfo implements Serializable {
+
+ /**
+ * 退货地址
+ */
+ @ApiModelProperty(value = "退货地址 必填", required = true)
+ private MinishopAddressInfo addressInfo;
+
+ /**
+ * 邮箱
+ */
+ @ApiModelProperty(value = "邮箱 必填", required = true)
+ private String email;
+
+ /**
+ * 公司地址
+ */
+ @ApiModelProperty(value = "公司地址信息 必填", required = true)
+ private MinishopAddressInfo companyAddress;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.add("address_info", addressInfo.toJsonObject());
+ jsonObject.addProperty("mail", email);
+ jsonObject.add("company_address", companyAddress.toJsonObject());
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCat.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCat.java
new file mode 100644
index 0000000000..250272dda8
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCat.java
@@ -0,0 +1,19 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 店铺的商品分类
+ */
+@Data
+public class MinishopShopCat implements Serializable {
+ private Integer shopCatId;
+
+ private String shopCatName;
+
+ private Integer fShopCatId;
+
+ private Integer catLevel;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCatList.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCatList.java
new file mode 100644
index 0000000000..e0d9fcbc4c
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCatList.java
@@ -0,0 +1,15 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class MinishopShopCatList implements Serializable {
+ private Integer errcode;
+
+ private String errmsg;
+
+ private List shopCatList;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopSuperAdministratorInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopSuperAdministratorInfo.java
new file mode 100644
index 0000000000..55f111f017
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopSuperAdministratorInfo.java
@@ -0,0 +1,71 @@
+package me.chanjar.weixin.open.bean.minishop;
+
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author luowentao
+ * @since 2021-01-27
+ */
+@Data
+@Accessors(chain = true)
+public class MinishopSuperAdministratorInfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 店铺管理员ID
+ */
+ private Integer superAdminInfoId;
+
+ /**
+ * 个体工商户/企业/党政、机关及事业单位/其他组织,可选择:65-法人/经营者、66- 负责人。
+(负责人:经商户授权办理微信支付业务的人员,授权范围包括但不限于签约,入驻过程需完成账户验证)。
+示例值:65
+ */
+ private String type;
+
+ /**
+ * 1、若管理员类型为“法人”,则该姓名需与法人身份证姓名一致。
+2、若管理员类型为“经办人”,则可填写实际经办人的姓名。
+ */
+ private String name;
+
+ /**
+ * 1、若管理员类型为法人,则该身份证号码需与法人身份证号码一致。若管理员类型为经办人,
+则可填写实际经办人的身份证号码。
+2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。
+3、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。
+ */
+ private String idCardNumber;
+
+ /**
+ * 请填写管理员的手机号,11位数字, 用于接收微信支付的重要管理信息及日常操作验证码 。
+ */
+ private String phone;
+
+ /**
+ * 1、用于接收微信支付的开户邮件及日常业务通知。
+2、需要带@,遵循邮箱格式校验 。
+ */
+ private String mail;
+
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("type", type);
+ jsonObject.addProperty("name", name);
+ jsonObject.addProperty("id_card_number", idCardNumber);
+ jsonObject.addProperty("phone", phone);
+ jsonObject.addProperty("mail", mail);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCoupon.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCoupon.java
new file mode 100644
index 0000000000..d99429063f
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCoupon.java
@@ -0,0 +1,81 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("小商店优惠券信息")
+public class WxMinishopCoupon implements Serializable {
+
+ //新增完成之后可以看到这个couponId
+ private Integer couponId;
+
+ //优惠券状态
+ private Integer status;
+
+ @ApiModelProperty(value = "优惠券类型: 1 商品条件折券, discount_condition.product_ids, discount_condition.product_cnt, discount_info.discount_num 必填" +
+ "2 商品满减券, discount_condition.product_ids, discount_condition.product_price, discount_info.discount_fee 必填" +
+ "3 商品统一折扣券, discount_condition.product_ids, discount_info.discount_num必填" +
+ "4 商品直减券, 如果小于可用的商品中的最小价格会提醒(没有商品时超过50w提醒), discount_condition.product_ids, discount_fee 必填" +
+ "101 店铺条件折扣券, discount_condition.product_cnt, discount_info.discount_num必填" +
+ "102 店铺满减券, discount_condition.product_price, discount_info.discount_fee 必填" +
+ "103 店铺统一折扣券, discount_info.discount_num 必填" +
+ "104 店铺直减券, 如果小于可用的商品中的最小价格会提醒(没有商品时超过50w提醒), discount_fee 必填", required = true)
+ private Integer type;
+
+ @ApiModelProperty(value = "优惠券名称", required = true)
+ private String name;
+
+ @ApiModelProperty(value = "商品折扣券信息")
+ private WxMinishopCouponDiscountInfo discountInfo;
+
+ @ApiModelProperty(value = "优惠券额外信息")
+ private WxMinishopCouponExtInfo extInfo;
+
+ @ApiModelProperty(value = "推广渠道信息",required = true)
+ private WxMinishopCouponPromoteInfo promoteInfo;
+
+ @ApiModelProperty(value = "优惠券领取信息", required = true)
+ private WxMinishopCouponReceiveInfo receiveInfo;
+
+ @ApiModelProperty(value = "优惠券有效期信息", required = true)
+ private WxMinishopCouponValidInfo validInfo;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ if (couponId != null) {
+ jsonObject.addProperty("coupon_id", couponId);
+ }
+
+ if (status != null) {
+ jsonObject.addProperty("status", status);
+ }
+ jsonObject.addProperty("type", type);
+ jsonObject.addProperty("name", name);
+ if (discountInfo != null) {
+ jsonObject.add("discount_info", discountInfo.toJsonObject());
+ }
+
+ if (extInfo != null) {
+ jsonObject.add("ext_info", extInfo.toJsonObject());
+ }
+
+ if(promoteInfo != null) {
+ jsonObject.add("promote_info", promoteInfo.toJsonObject());
+ }
+
+ if (receiveInfo != null) {
+ jsonObject.add("receive_info", receiveInfo.toJsonObject());
+ }
+
+ if (validInfo != null) {
+ jsonObject.add("valid_info", validInfo.toJsonObject());
+ }
+
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountCondition.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountCondition.java
new file mode 100644
index 0000000000..8131799003
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountCondition.java
@@ -0,0 +1,35 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("小商店商品折扣券详细信息")
+public class WxMinishopCouponDiscountCondition {
+ @ApiModelProperty(value = "商品折扣券打折金额", required = false)
+ private Integer productCnt;
+
+ @ApiModelProperty(value = "商品id,商品折扣券需填写", required = false)
+ private List productIds;
+
+
+ @ApiModelProperty(value = "商品价格,满减券需填写", required = false)
+ private Integer productPrice;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ Gson gson = new GsonBuilder().setPrettyPrinting().create();
+
+ jsonObject.addProperty("product_cnt", productCnt);
+ jsonObject.add("product_ids", gson.toJsonTree(productIds));
+ jsonObject.addProperty("product_price", productPrice);
+
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountInfo.java
new file mode 100644
index 0000000000..b36d340215
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountInfo.java
@@ -0,0 +1,28 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("小商店商品折扣券信息")
+public class WxMinishopCouponDiscountInfo {
+
+ @ApiModelProperty(value = "小商店商品折扣详情")
+ private WxMinishopCouponDiscountCondition discountCondition;
+
+ @ApiModelProperty(value = "满减金额", required = true)
+ private Integer discountFee;
+
+ @ApiModelProperty(value = "打折商品数量,满减券需填写")
+ private Integer discountNum;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.add("discount_condition", discountCondition.toJsonObject());
+ jsonObject.addProperty("discount_fee", discountFee);
+ jsonObject.addProperty("discount_num", discountNum);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponExtInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponExtInfo.java
new file mode 100644
index 0000000000..cba445f8ae
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponExtInfo.java
@@ -0,0 +1,33 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("小商店优惠券的扩展信息")
+public class WxMinishopCouponExtInfo implements Serializable {
+ @ApiModelProperty("备注信息")
+ private String notes;
+
+ @ApiModelProperty(value = "优惠券有效时间, valid_type=0时与valid_info.start_time一致, valid_type=1时商家自己填一个绝对开始时间", required = true)
+ private Long validTime;
+
+ @ApiModelProperty(value = "优惠券失效时间, valid_type=0时与valid_info.end_time一致, valid_type=1时商家自己填一个绝对结束时间", required = true)
+ private Long invalidTime;
+
+ @ApiModelProperty(value = "商品券可以填,领取后跳转")
+ private Long jumpProductId;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("jump_product_id", jumpProductId);
+ jsonObject.addProperty("notes", notes);
+ jsonObject.addProperty("valid_time", validTime);
+ jsonObject.addProperty("invalid_time", invalidTime);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponPromoteInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponPromoteInfo.java
new file mode 100644
index 0000000000..c6fc05c72c
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponPromoteInfo.java
@@ -0,0 +1,25 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("小商店优惠券推广渠道")
+public class WxMinishopCouponPromoteInfo implements Serializable {
+ @ApiModelProperty(value = "用户自定义推广渠道", required = true)
+ private String customizeChannel;
+
+ @ApiModelProperty(value = "推广类型, 1:店铺内推广,2:自定义推广渠道", required = true)
+ private Integer promotionType;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("customize_channel", customizeChannel);
+ jsonObject.addProperty("promote_type", promotionType);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponReceiveInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponReceiveInfo.java
new file mode 100644
index 0000000000..53f17e7632
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponReceiveInfo.java
@@ -0,0 +1,34 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("小商店优惠券领取信息")
+public class WxMinishopCouponReceiveInfo implements Serializable {
+ @ApiModelProperty(value = "优惠券领用结束时间", required = true)
+ private Long endTime;
+
+ @ApiModelProperty(value = "是否限制一人使用", required = true)
+ private Integer limitNumOnePerson;
+
+ @ApiModelProperty(value = "优惠券领用开始时间",required = true)
+ private Long startTime;
+
+ @ApiModelProperty(value = "优惠券领用总数", required = true)
+ private Integer totalNum;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("start_time", startTime);
+ jsonObject.addProperty("end_time", endTime);
+ jsonObject.addProperty("limit_num_one_person", limitNumOnePerson);
+ jsonObject.addProperty("total_num", totalNum);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponResponse.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponResponse.java
new file mode 100644
index 0000000000..1354fef763
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponResponse.java
@@ -0,0 +1,23 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel("小商店优惠券请求回复数据信息")
+public class WxMinishopCouponResponse implements Serializable {
+ @ApiModelProperty("错误码")
+ private Integer errcode;
+
+ @ApiModelProperty("错误信息")
+ private String errmsg;
+
+ @ApiModelProperty("优惠券信息")
+ private List coupons;
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStock.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStock.java
new file mode 100644
index 0000000000..e3504a28ef
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStock.java
@@ -0,0 +1,32 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel("小商店优惠券返回信息")
+@Data
+public class WxMinishopCouponStock implements Serializable {
+ @ApiModelProperty("优惠券ID")
+ private Integer couponId;
+
+ @ApiModelProperty("优惠券类型")
+ private Integer type;
+
+ @ApiModelProperty("优惠券状态")
+ private Integer status;
+
+ @ApiModelProperty("优惠券创建时间")
+ private String createTime;
+
+ @ApiModelProperty("优惠券更新时间")
+ private String updateTime;
+
+ @ApiModelProperty("优惠券详情信息")
+ private WxMinishopCoupon couponInfo;
+
+ @ApiModelProperty("优惠券使用信息")
+ private WxMinishopCouponStockInfo stockInfo;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStockInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStockInfo.java
new file mode 100644
index 0000000000..0ced38f78a
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStockInfo.java
@@ -0,0 +1,20 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("小商店优惠券消耗信息")
+public class WxMinishopCouponStockInfo implements Serializable {
+ @ApiModelProperty(value = "优惠券发放量")
+ private Integer issuedNum;
+
+ @ApiModelProperty(value = "优惠券领用量")
+ private Integer receiveNum;
+
+ @ApiModelProperty(value = "优惠券已用量")
+ private Integer usedNum;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponValidInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponValidInfo.java
new file mode 100644
index 0000000000..98309050a0
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponValidInfo.java
@@ -0,0 +1,35 @@
+package me.chanjar.weixin.open.bean.minishop.coupon;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("小商店优惠券有效信息设置")
+public class WxMinishopCouponValidInfo implements Serializable {
+ @ApiModelProperty(value = "优惠券有效期结束时间,若填了start必填")
+ private Long endTime;
+
+ @ApiModelProperty(value = "优惠券有效期开始时间,和valid_day_num二选一")
+ private Long startTime;
+
+ @ApiModelProperty(value = "优惠券有效期天数,和start_time二选一", required = true)
+ private Integer validDayNum;
+
+ @ApiModelProperty(value = "优惠券有效期类型, 0: 指定时间范围生效; 1: 生效天数", required = true)
+ private Integer validType;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("start_time", startTime);
+ jsonObject.addProperty("end_time", endTime);
+ jsonObject.addProperty("valid_day_num", validDayNum);
+ jsonObject.addProperty("valid_type", validType);
+
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSkuData.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSkuData.java
new file mode 100644
index 0000000000..0266b9e03b
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSkuData.java
@@ -0,0 +1,12 @@
+package me.chanjar.weixin.open.bean.minishop.goods;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxMinishopAddGoodsSkuData implements Serializable {
+ private Long skuId;
+
+ private String createTime;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuData.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuData.java
new file mode 100644
index 0000000000..5250d22417
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuData.java
@@ -0,0 +1,14 @@
+package me.chanjar.weixin.open.bean.minishop.goods;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxMinishopAddGoodsSpuData implements Serializable {
+ private Long productId;
+
+ private String outProductId;
+
+ private String createTime;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuResult.java
new file mode 100644
index 0000000000..64daa04634
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuResult.java
@@ -0,0 +1,14 @@
+package me.chanjar.weixin.open.bean.minishop.goods;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxMinishopAddGoodsSpuResult implements Serializable {
+ private Integer errcode;
+
+ private String errmsg;
+
+ private T data;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopDeliveryCompany.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopDeliveryCompany.java
new file mode 100644
index 0000000000..88c4081a7f
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopDeliveryCompany.java
@@ -0,0 +1,12 @@
+package me.chanjar.weixin.open.bean.minishop.goods;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxMinishopDeliveryCompany implements Serializable {
+ private String deliveryId;
+
+ private String deliveryName;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopGoodsSkuAttr.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopGoodsSkuAttr.java
new file mode 100644
index 0000000000..c108f66c7d
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopGoodsSkuAttr.java
@@ -0,0 +1,23 @@
+package me.chanjar.weixin.open.bean.minishop.goods;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxMinishopGoodsSkuAttr implements Serializable {
+ private String attrKey;
+
+ private String attrValue;
+
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("attr_key", attrKey);
+ jsonObject.addProperty("attr_value", attrValue);
+
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSku.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSku.java
new file mode 100644
index 0000000000..c9fb54c703
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSku.java
@@ -0,0 +1,51 @@
+package me.chanjar.weixin.open.bean.minishop.goods;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class WxMinishopSku implements Serializable {
+ private Long productId;
+
+ private String outProductId;
+
+ private String outSkuId;
+
+ private String thumbImg;
+
+ private Integer salePrice;
+
+ private Integer marketPrice;
+
+ private Integer stockNum;
+
+ private String skuCode;
+
+ private String barCode;
+
+ private List skuAttrs;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("product_id", productId);
+ jsonObject.addProperty("out_product_id", outProductId);
+ jsonObject.addProperty("out_sku_id", outSkuId);
+ jsonObject.addProperty("thumb_img", thumbImg);
+ jsonObject.addProperty("sale_price", salePrice);
+ jsonObject.addProperty("market_price", marketPrice);
+ jsonObject.addProperty("stock_num", stockNum);
+ jsonObject.addProperty("sku_code", skuCode);
+ jsonObject.addProperty("barcode", barCode);
+ JsonArray jsonArray = new JsonArray();
+ for (WxMinishopGoodsSkuAttr attr : skuAttrs) {
+ jsonArray.add(attr.toJsonObject());
+ }
+ jsonObject.add("sku_attrs", jsonArray);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSpu.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSpu.java
new file mode 100644
index 0000000000..a8b09833b9
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSpu.java
@@ -0,0 +1,86 @@
+package me.chanjar.weixin.open.bean.minishop.goods;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import lombok.Data;
+import me.chanjar.weixin.open.bean.minishop.MinishopShopCat;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class WxMinishopSpu implements Serializable {
+
+
+ private String outProductId;
+
+ private String title;
+
+ private String subTitle;
+
+ private List headImgs;
+
+ private List descInfoImgs;
+
+ private Long brandId;
+
+ private List shopCats;
+
+ private List attrs;
+
+ private String model;
+
+ private Long expressTemplateId;
+
+ private List skus;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("out_product_id", outProductId);
+ jsonObject.addProperty("title", title);
+ jsonObject.addProperty("sub_title", subTitle);
+ JsonArray imgArray = new JsonArray();
+ for (String img : headImgs) {
+ imgArray.add(img);
+ }
+ jsonObject.add("head_img", imgArray);
+
+ JsonArray descImgArray = new JsonArray();
+ for (String img : descInfoImgs) {
+ descImgArray.add(img);
+ }
+ JsonObject descInfo = new JsonObject();
+ descInfo.add("imgs", descImgArray);
+ jsonObject.add("desc_info", descInfo);
+
+ jsonObject.addProperty("brand_id", brandId);
+ JsonArray catArray = new JsonArray();
+ for (MinishopShopCat cat : shopCats) {
+ JsonObject catObj = new JsonObject();
+ catObj.addProperty("cat_id", cat.getShopCatId());
+ catObj.addProperty("level", cat.getCatLevel());
+ catArray.add(catObj);
+ }
+ jsonObject.add("cats", catArray);
+
+ JsonArray attrArray = new JsonArray();
+ for (WxMinishopGoodsSkuAttr attr : attrs) {
+ attrArray.add(attr.toJsonObject());
+ }
+ jsonObject.add("attrs", attrArray);
+
+
+ jsonObject.addProperty("model", model);
+
+ JsonObject expressObj = new JsonObject();
+ expressObj.addProperty("template_id", expressTemplateId);
+ jsonObject.add("express_info", expressObj);
+
+ JsonArray skuArray = new JsonArray();
+ for (WxMinishopSku sku : skus) {
+ skuArray.add(sku.toJsonObject());
+ }
+ jsonObject.add("skus", skuArray);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountGoods.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountGoods.java
new file mode 100644
index 0000000000..06b05a0212
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountGoods.java
@@ -0,0 +1,60 @@
+package me.chanjar.weixin.open.bean.minishop.limitdiscount;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 小商店商品秒杀活动
+ */
+@Data
+@ApiModel("小商店商品秒杀")
+public class LimitDiscountGoods implements Serializable {
+ @ApiModelProperty("小商店秒杀任务ID")
+ private Long taskId;
+
+ @ApiModelProperty("秒杀任务状态")
+ private Integer status;
+
+ @ApiModelProperty("小商店商品ID,需要检查该商品在小商店的状态,如果不是上线状态可以提示客户需要先上架到小商店再进行处理")
+ private Long productId;
+
+ @ApiModelProperty("开始时间,发给小商店的时候需要转换为getTime")
+ private Date startTime;
+
+ @ApiModelProperty("结束时间,发给小商店的时候需要转换为getTime")
+ private Date endTime;
+
+ @ApiModelProperty("商品sku列表")
+ private List limitDiscountSkuList;
+
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ if (taskId != null) {
+ jsonObject.addProperty("task_id", taskId);
+ }
+ if (status != null) {
+ jsonObject.addProperty("status", status);
+ }
+
+ jsonObject.addProperty("product_id", productId);
+ jsonObject.addProperty("start_time", startTime.getTime());
+ jsonObject.addProperty("end_time", endTime.getTime());
+
+ JsonArray jsonArray = new JsonArray();
+ for (LimitDiscountSku sku : limitDiscountSkuList) {
+ jsonArray.add(sku.toJsonObject());
+ }
+
+ jsonObject.add("limited_discount_sku_list", jsonArray);
+
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountSku.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountSku.java
new file mode 100644
index 0000000000..d77e476049
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountSku.java
@@ -0,0 +1,36 @@
+package me.chanjar.weixin.open.bean.minishop.limitdiscount;
+
+import com.google.gson.JsonObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 商品抢购活动sku信息
+ */
+@Data
+@ApiModel("商品抢购活动sku")
+public class LimitDiscountSku implements Serializable {
+
+ @ApiModelProperty("商品skuID")
+ private Long skuId;
+
+ @ApiModelProperty("秒杀价格")
+ private BigDecimal salePrice;
+
+ @ApiModelProperty("商品秒杀库存")
+ private Integer saleStock;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("sku_id", skuId);
+ //需要将saleprice转换为以分为单位
+ jsonObject.addProperty("sale_price", salePrice.multiply(new BigDecimal(100)).longValue());
+ jsonObject.addProperty("sale_stock", saleStock);
+ return jsonObject;
+ }
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/AddMinishopGoodsSPU.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/AddMinishopGoodsSPU.java
new file mode 100644
index 0000000000..586605d2ce
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/AddMinishopGoodsSPU.java
@@ -0,0 +1,89 @@
+package me.chanjar.weixin.open.bean.minishopGoods;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 属性后面的 true 代表必传 false 代表非必传
+ */
+@Data
+@Accessors(chain = true)
+public class AddMinishopGoodsSPU {
+
+ /**
+ * 商家自定义商品ID,与product_id二选一 true
+ */
+ private String outProductId;
+ /**
+ * 标题 true
+ */
+ private String title;
+ /**
+ * 副标题 false
+ */
+ private String subTitle;
+ /**
+ * 主图,多张,列表 true
+ */
+ private List headImg;
+ /**
+ * 商品详情,图文(目前只支持图片) true
+ */
+ private DescInfo descInfo;
+ /**
+ * 品牌ID,商家需要申请品牌并通过获取品牌接口brand/get获取,如果是无品牌请填2100000000 true
+ */
+ private Integer brandId = 2100000000;
+ /**
+ * 类目 true
+ */
+ private List cats;
+ /**
+ * 属性 true
+ */
+ private List attrs;
+ /**
+ * 商品型号 false
+ */
+ private String model;
+ /**
+ * 运费模板 true
+ */
+ private ExpressInfo expressInfo;
+ /**
+ * SKU false
+ */
+ private List skus;
+
+ public JsonObject toJsonObject() {
+ Gson gson = new Gson();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("out_product_id", outProductId);
+ jsonObject.addProperty("title",title);
+ jsonObject.addProperty("sub_title",subTitle);
+ jsonObject.addProperty("head_img",gson.toJson(headImg));
+ jsonObject.addProperty("desc_info",gson.toJson(descInfo));
+ jsonObject.addProperty("brand_id",brandId.toString());
+ jsonObject.addProperty("cats",gson.toJson(cats));
+ jsonObject.addProperty("attrs",gson.toJson(attrs));
+ jsonObject.addProperty("model",model);
+ jsonObject.addProperty("expressInfo",gson.toJson(expressInfo));
+ jsonObject.addProperty("skus",gson.toJson(skus));
+ return jsonObject;
+ }
+
+ public static void main(String[] args) {
+ GoodsCatList goodsCatList = new GoodsCatList();
+ goodsCatList.setErrcode(1).setErrmsg("正常").setCatList(Arrays.asList(new GoodsCat().setCatId(1).setFCatId(0).setName("服饰"),
+ new GoodsCat().setCatId(2).setFCatId(0).setName("鞋包") ));
+ System.out.println(goodsCatList.toString());
+ System.out.println(goodsCatList.toJsonObject());
+ }
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Attr.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Attr.java
new file mode 100644
index 0000000000..44a671fa67
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Attr.java
@@ -0,0 +1,28 @@
+package me.chanjar.weixin.open.bean.minishopGoods;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class Attr {
+ /**
+ * 属性键key(属性自定义用)
+ */
+ private String attrKey;
+ /**
+ * 属性值(属性自定义用)
+ */
+ private String attrValue;
+
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("attr_key", attrKey);
+ jsonObject.addProperty("attr_value", attrValue);
+ return jsonObject;
+ }
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Cat.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Cat.java
new file mode 100644
index 0000000000..dc72a998a3
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Cat.java
@@ -0,0 +1,28 @@
+package me.chanjar.weixin.open.bean.minishopGoods;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class Cat {
+ /**
+ * 类目ID,如果brand_id=2100000000,需要先通过获取类目接口category/get拿到可用的cat_id;
+ * 如果brand_id!=2100000000,则这里的cat_id需要与获取品牌接口brand/get中的1,2,3级类目一一对应
+ */
+ private Integer catId;
+ /**
+ * 类目层级
+ */
+ private Integer level;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("cat_id", catId);
+ jsonObject.addProperty("level", level);
+ return jsonObject;
+ }
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/DescInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/DescInfo.java
new file mode 100644
index 0000000000..eacb9767e7
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/DescInfo.java
@@ -0,0 +1,25 @@
+package me.chanjar.weixin.open.bean.minishopGoods;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+public class DescInfo {
+ /**
+ * 商品详情,图文(目前只支持图片) true
+ */
+ private List imgs;
+
+ public JsonObject toJsonObject() {
+ Gson gson = new Gson();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("imgs", gson.toJson(imgs));
+ return jsonObject;
+ }
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/ExpressInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/ExpressInfo.java
new file mode 100644
index 0000000000..c2b34c2aae
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/ExpressInfo.java
@@ -0,0 +1,23 @@
+package me.chanjar.weixin.open.bean.minishopGoods;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class ExpressInfo {
+ /**
+ * 运费模板ID(先通过获取运费模板接口delivery/get_freight_template拿到)
+ */
+ private Integer templateId;
+
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("template_id", templateId);
+ return jsonObject;
+ }
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/GoodsCat.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/GoodsCat.java
new file mode 100644
index 0000000000..6869c17a7f
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/GoodsCat.java
@@ -0,0 +1,31 @@
+package me.chanjar.weixin.open.bean.minishopGoods;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class GoodsCat {
+ /**
+ * 类目id
+ */
+ private Integer catId;
+ /**
+ * 类目父id
+ */
+ private Integer fCatId;
+ /**
+ * 类目名称
+ */
+ private String name;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("cat_id", catId);
+ jsonObject.addProperty("f_cat_id", fCatId);
+ jsonObject.addProperty("name", name);
+ return jsonObject;
+ }
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/GoodsCatList.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/GoodsCatList.java
new file mode 100644
index 0000000000..50d618bc2e
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/GoodsCatList.java
@@ -0,0 +1,36 @@
+package me.chanjar.weixin.open.bean.minishopGoods;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+public class GoodsCatList {
+ /**
+ * 错误码信息
+ */
+ private Integer errcode;
+ /**
+ * 错误信息
+ */
+ private String errmsg;
+ /**
+ * 类目数组
+ */
+ private List catList;
+
+ public JsonObject toJsonObject() {
+ Gson gson = new Gson();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("errcode", errcode);
+ jsonObject.addProperty("errmsg", errmsg);
+ jsonObject.addProperty("cat_list", gson.toJson(catList));
+ return jsonObject;
+ }
+
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/ParentCatId.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/ParentCatId.java
new file mode 100644
index 0000000000..5a04debd25
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/ParentCatId.java
@@ -0,0 +1,15 @@
+package me.chanjar.weixin.open.bean.minishopGoods;
+
+import com.google.gson.JsonObject;
+import lombok.Data;
+
+@Data
+public class ParentCatId {
+ private Integer fCatId;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("f_cat_id", fCatId);
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Sku.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Sku.java
new file mode 100644
index 0000000000..aefcabaa55
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishopGoods/Sku.java
@@ -0,0 +1,68 @@
+package me.chanjar.weixin.open.bean.minishopGoods;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+public class Sku {
+ /**
+ * 商家自定义商品ID skus非空时必填
+ */
+ private String outProductId;
+ /**
+ * 商家自定义skuID skus非空时必填
+ */
+ private String outSkuId;
+ /**
+ * sku小图 skus非空时必填
+ */
+ private String thumbImg;
+ /**
+ * 售卖价格,以分为单位 skus非空时必填
+ */
+ private Integer salePrice;
+ /**
+ * 市场价格,以分为单位 skus非空时必填
+ */
+ private Integer marketPrice;
+ /**
+ * 库存 skus非空时必填
+ */
+ private Integer stockNum;
+ /**
+ * 条形码 false
+ */
+ private String barcode;
+ /**
+ *商品编码 false
+ */
+ private String skuCode;
+ /**
+ * sku属性
+ */
+ private List skuAttr;
+
+ public JsonObject toJsonObject() {
+ Gson gson = new Gson();
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("out_product_id", outProductId);
+ jsonObject.addProperty("out_sku_id", outSkuId);
+ jsonObject.addProperty("thumb_img", thumbImg);
+ jsonObject.addProperty("sale_price", salePrice);
+ jsonObject.addProperty("market_price", marketPrice);
+ jsonObject.addProperty("stock_num", stockNum);
+ jsonObject.addProperty("barcode", barcode);
+ jsonObject.addProperty("sku_code", skuCode);
+ jsonObject.addProperty("sku_attr",gson.toJson(skuAttr));
+
+ return jsonObject;
+ }
+
+
+}
From 3d6185914f2d1e5a5405377bdc23599d585c9f70 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sat, 3 Jul 2021 21:14:32 +0800
Subject: [PATCH 0025/1235] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=EF=BC=8C=E5=8E=BB=E6=8E=89jodd=E7=9B=B8=E5=85=B3?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=BC=95=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../binarywang/wxpay/config/WxPayConfig.java | 17 +--
.../binarywang/wxpay/util/ResourcesUtils.java | 120 ++++++++++++++++++
2 files changed, 127 insertions(+), 10 deletions(-)
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/ResourcesUtils.java
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/WxPayConfig.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/WxPayConfig.java
index 29c27fecd6..a9092e2fda 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/WxPayConfig.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/WxPayConfig.java
@@ -1,14 +1,11 @@
package com.github.binarywang.wxpay.config;
import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.util.ResourcesUtils;
import com.github.binarywang.wxpay.v3.WxPayV3HttpClientBuilder;
import com.github.binarywang.wxpay.v3.auth.*;
import com.github.binarywang.wxpay.v3.util.PemUtils;
-import jodd.util.ResourcesUtil;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.SneakyThrows;
-import lombok.ToString;
+import lombok.*;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.StringUtils;
@@ -239,10 +236,10 @@ public SSLContext initSSLContext() throws WxPayException {
* @author doger.wang
**/
public CloseableHttpClient initApiV3HttpClient() throws WxPayException {
- String privateKeyPath = this.getPrivateKeyPath();
- String privateCertPath = this.getPrivateCertPath();
- String serialNo = this.getCertSerialNo();
- String apiV3Key = this.getApiV3Key();
+ val privateKeyPath = this.getPrivateKeyPath();
+ val privateCertPath = this.getPrivateCertPath();
+ val serialNo = this.getCertSerialNo();
+ val apiV3Key = this.getApiV3Key();
if (StringUtils.isBlank(privateKeyPath)) {
throw new WxPayException("请确保privateKeyPath已设置");
}
@@ -301,7 +298,7 @@ private InputStream loadConfigInputStream(String configPath) throws WxPayExcepti
path = "/" + path;
}
try {
- inputStream = ResourcesUtil.getResourceAsStream(path);
+ inputStream = ResourcesUtils.getResourceAsStream(path);
if (inputStream == null) {
throw new WxPayException(fileNotFoundMsg);
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/ResourcesUtils.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/ResourcesUtils.java
new file mode 100644
index 0000000000..3a9e788551
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/ResourcesUtils.java
@@ -0,0 +1,120 @@
+package com.github.binarywang.wxpay.util;
+
+import jodd.io.IOUtil;
+import jodd.util.ClassUtil;
+import lombok.val;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+
+/**
+ * 基于jodd.util.ResourcesUtil改造实现
+ * @author jodd
+ */
+public class ResourcesUtils {
+
+ /**
+ * Retrieves given resource as URL.
+ * @see #getResourceUrl(String, ClassLoader)
+ */
+ public static URL getResourceUrl(final String resourceName) {
+ return getResourceUrl(resourceName, null);
+ }
+
+ /**
+ * Retrieves given resource as URL. Resource is always absolute and may
+ * starts with a slash character.
+ *
+ * Resource will be loaded using class loaders in the following order:
+ *
+ * - {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
+ * - {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
+ * - if
callingClass is provided: {@link Class#getClassLoader() callingClass.getClassLoader()}
+ *
+ */
+ public static URL getResourceUrl(String resourceName, final ClassLoader classLoader) {
+
+ if (resourceName.startsWith("/")) {
+ resourceName = resourceName.substring(1);
+ }
+
+ URL resourceUrl;
+
+ // try #1 - using provided class loader
+ if (classLoader != null) {
+ resourceUrl = classLoader.getResource(resourceName);
+ if (resourceUrl != null) {
+ return resourceUrl;
+ }
+ }
+
+ // try #2 - using thread class loader
+ final ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
+ if ((currentThreadClassLoader != null) && (currentThreadClassLoader != classLoader)) {
+ resourceUrl = currentThreadClassLoader.getResource(resourceName);
+ if (resourceUrl != null) {
+ return resourceUrl;
+ }
+ }
+
+ // try #3 - using caller classloader, similar as Class.forName()
+ val callerClass = ClassUtil.getCallerClass(2);
+ val callerClassLoader = callerClass.getClassLoader();
+
+ if ((callerClassLoader != classLoader) && (callerClassLoader != currentThreadClassLoader)) {
+ resourceUrl = callerClassLoader.getResource(resourceName);
+ return resourceUrl;
+ }
+
+ return null;
+ }
+
+ public static String getResourceAsString(final String resourceName) throws IOException {
+ final InputStream inputStream = getResourceAsStream(resourceName);
+ try {
+ final char[] data = IOUtil.readChars(inputStream);
+ return new String(data);
+ }
+ finally {
+ IOUtil.close(inputStream);
+ }
+ }
+
+ /**
+ * Opens a resource of the specified name for reading.
+ * @see #getResourceAsStream(String, ClassLoader)
+ */
+ public static InputStream getResourceAsStream(final String resourceName) throws IOException {
+ return getResourceAsStream(resourceName, null);
+ }
+
+ /**
+ * Opens a resource of the specified name for reading.
+ * @see #getResourceUrl(String, ClassLoader)
+ */
+ public static InputStream getResourceAsStream(final String resourceName, final ClassLoader callingClass) throws IOException {
+ final URL url = getResourceUrl(resourceName, callingClass);
+ if (url != null) {
+ return url.openStream();
+ }
+ return null;
+ }
+
+ /**
+ * Opens a resource of the specified name for reading. Controls caching,
+ * that is important when the same jar is reloaded using custom classloader.
+ */
+ public static InputStream getResourceAsStream(final String resourceName, final ClassLoader callingClass,
+ final boolean useCache) throws IOException {
+ final URL url = getResourceUrl(resourceName, callingClass);
+ if (url != null) {
+ final URLConnection urlConnection = url.openConnection();
+ urlConnection.setUseCaches(useCache);
+ return urlConnection.getInputStream();
+ }
+ return null;
+ }
+
+}
From d29d18028a2571ce1adaba2a2cd87dec93bac3eb Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sat, 3 Jul 2021 21:31:21 +0800
Subject: [PATCH 0026/1235] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8DGsonHelper?=
=?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/me/chanjar/weixin/common/util/json/GsonHelper.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java
index ee330b03e2..b41467f21c 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java
@@ -198,7 +198,7 @@ public static void put(JsonObject jsonObject, Object... keyOrValue) {
((List>) value).forEach(a -> array.add(a.toString()));
jsonObject.add(key.toString(), array);
} else {
- jsonObject.addProperty(key.toString(), value.toString());
+ jsonObject.add(key.toString(), WxGsonBuilder.create().toJsonTree(value));
}
}
From 982ad86bab2b0bcbc927f206f15c833f7519b2bb Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 4 Jul 2021 23:13:48 +0800
Subject: [PATCH 0027/1235] =?UTF-8?q?:art:=20=E5=B0=8F=E5=95=86=E5=BA=97?=
=?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=E4=BF=AE=E5=A4=8D=E4=BC=98?=
=?UTF-8?q?=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../open/api/WxOpenMinishopService.java | 12 +-
.../api/impl/WxOpenComponentServiceImpl.java | 41 ++---
.../bean/minishop/MinishopAddressInfo.java | 14 +-
.../bean/minishop/MinishopAuditStatus.java | 1 +
.../open/bean/minishop/MinishopBaseInfo.java | 106 ++++++-------
.../open/bean/minishop/MinishopBrand.java | 8 +-
.../open/bean/minishop/MinishopBrandList.java | 2 +
.../bean/minishop/MinishopBusiLicense.java | 129 ++++++++-------
.../bean/minishop/MinishopCategories.java | 2 +
.../open/bean/minishop/MinishopCategory.java | 2 +
.../minishop/MinishopDeliveryTemplate.java | 1 +
.../MinishopDeliveryTemplateResult.java | 21 ++-
.../bean/minishop/MinishopIdcardInfo.java | 103 ++++++------
.../bean/minishop/MinishopMerchantinfo.java | 149 +++++++++---------
.../open/bean/minishop/MinishopNameInfo.java | 17 +-
.../MinishopOrganizationCodeInfo.java | 89 +++++------
.../open/bean/minishop/MinishopPicFile.java | 2 +-
.../bean/minishop/MinishopReturnInfo.java | 10 +-
.../open/bean/minishop/MinishopShopCat.java | 2 +
.../bean/minishop/MinishopShopCatList.java | 2 +
.../MinishopSuperAdministratorInfo.java | 83 +++++-----
.../minishop/coupon/WxMinishopCoupon.java | 57 ++++---
.../WxMinishopCouponDiscountCondition.java | 24 ++-
.../coupon/WxMinishopCouponDiscountInfo.java | 23 ++-
.../coupon/WxMinishopCouponExtInfo.java | 24 ++-
.../coupon/WxMinishopCouponPromoteInfo.java | 16 +-
.../coupon/WxMinishopCouponReceiveInfo.java | 24 ++-
.../coupon/WxMinishopCouponResponse.java | 20 ++-
.../coupon/WxMinishopCouponStock.java | 36 +++--
.../coupon/WxMinishopCouponStockInfo.java | 20 ++-
.../coupon/WxMinishopCouponValidInfo.java | 24 ++-
.../goods/WxMinishopAddGoodsSkuData.java | 1 +
.../goods/WxMinishopAddGoodsSpuData.java | 1 +
.../goods/WxMinishopAddGoodsSpuResult.java | 1 +
.../goods/WxMinishopDeliveryCompany.java | 1 +
.../goods/WxMinishopGoodsSkuAttr.java | 4 +-
.../bean/minishop/goods/WxMinishopSku.java | 3 +-
.../bean/minishop/goods/WxMinishopSpu.java | 2 +-
.../limitdiscount/LimitDiscountGoods.java | 28 ++--
.../limitdiscount/LimitDiscountSku.java | 10 +-
40 files changed, 594 insertions(+), 521 deletions(-)
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopService.java
index 1c1646f7c9..0e5cd9f49c 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMinishopService.java
@@ -11,12 +11,11 @@
* add by kelven 2021-01-29
*/
public interface WxOpenMinishopService {
- String submitMerchantInfoUrl = "https://api.weixin.qq.com/product/register/submit_merchantinfo";
+ String submitMerchantInfoUrl = "https://api.weixin.qq.com/product/register/submit_merchantinfo";
- String submitBasicInfoUrl = "https://api.weixin.qq.com/product/register/submit_basicinfo";
+ String submitBasicInfoUrl = "https://api.weixin.qq.com/product/register/submit_basicinfo";
-
- public final static String UPLOAD_IMG_MINISHOP_FILE_URL = "https://api.weixin.qq.com/product/img/upload";
+ String UPLOAD_IMG_MINISHOP_FILE_URL = "https://api.weixin.qq.com/product/img/upload";
String getCategoryUrl = "https://api.weixin.qq.com/product/category/get";
@@ -24,12 +23,13 @@ public interface WxOpenMinishopService {
String getDeliveryUrl = "https://api.weixin.qq.com/product/delivery/get_freight_template";
- /**获取店铺的商品分类*/
+ /**
+ * 获取店铺的商品分类
+ */
String getShopCatUrl = "https://api.weixin.qq.com/product/store/get_shopcat";
/**
- *
* @param appId
* @param subjectType
* @param busiLicense
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 dd4b932e97..e745b493a6 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
@@ -1,17 +1,14 @@
package me.chanjar.weixin.open.api.impl;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import com.fasterxml.jackson.databind.util.JSONPObject;
-import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
-import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
-import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.error.WxRuntimeException;
@@ -20,17 +17,8 @@
import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.open.api.WxOpenComponentService;
-import me.chanjar.weixin.open.api.WxOpenConfigStorage;
-import me.chanjar.weixin.open.api.WxOpenFastMaService;
-import me.chanjar.weixin.open.api.WxOpenMaService;
-import me.chanjar.weixin.open.api.WxOpenMpService;
-import me.chanjar.weixin.open.api.WxOpenService;
-import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken;
-import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken;
-import me.chanjar.weixin.open.bean.WxOpenCreateResult;
-import me.chanjar.weixin.open.bean.WxOpenGetResult;
-import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
+import me.chanjar.weixin.open.api.*;
+import me.chanjar.weixin.open.bean.*;
import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo;
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
import me.chanjar.weixin.open.bean.minishop.*;
@@ -40,11 +28,6 @@
import me.chanjar.weixin.open.bean.minishop.limitdiscount.LimitDiscountGoods;
import me.chanjar.weixin.open.bean.minishop.limitdiscount.LimitDiscountSku;
import me.chanjar.weixin.open.bean.result.*;
-import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult;
-import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerListResult;
-import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult;
-import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult;
-import me.chanjar.weixin.open.bean.result.WxOpenResult;
import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
import org.apache.commons.lang3.StringUtils;
@@ -519,7 +502,7 @@ public void addToTemplate(long draftId) throws WxErrorException {
}
@Override
- public void addToTemplate(long draftId,int templateType) throws WxErrorException {
+ public void addToTemplate(long draftId, int templateType) throws WxErrorException {
JsonObject param = new JsonObject();
param.addProperty("draft_id", draftId);
param.addProperty("template_type", templateType);
@@ -657,7 +640,7 @@ public String checkAuditStatus(String wxName) throws WxErrorException {
public String checkAuditStatus(String appId, String wxName) throws WxErrorException {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("wx_name", wxName);
- String url = CHECK_SHOP_AUDITSTATUS_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
+ String url = CHECK_SHOP_AUDITSTATUS_URL + "?access_token=" + getAuthorizerAccessToken(appId, false);
String response = post(url, jsonObject.toString());
log.info("CHECK_SHOP_AUDITSTATUS_URL: " + response);
return response;
@@ -700,7 +683,7 @@ public WxOpenResult submitBasicInfo(String appId, MinishopNameInfo nameInfo, Min
@Override
public WxMinishopImageUploadResult uploadMinishopImagePicFile(String appId, Integer height, Integer width, File file) throws WxErrorException {
- String url = WxOpenMinishopService.UPLOAD_IMG_MINISHOP_FILE_URL + "?access_token="+getAuthorizerAccessToken(appId, false)+"&height="+height+"&width="+width;
+ String url = WxOpenMinishopService.UPLOAD_IMG_MINISHOP_FILE_URL + "?access_token=" + getAuthorizerAccessToken(appId, false) + "&height=" + height + "&width=" + width;
log.info("upload url: " + url);
// String response = (url, file);
WxMinishopImageUploadResult result = getWxOpenService().uploadMinishopMediaFile(url, file);
@@ -1114,8 +1097,6 @@ public WxOpenResult minishopGoodsUpdateSkuStock(String appId, Long productId, Lo
jsonObject.addProperty("stock_num", stockNum);
-
-
String response = getWxOpenService().post(url, jsonObject.toString());
return WxOpenGsonBuilder.create().fromJson(response, WxOpenResult.class);
@@ -1155,18 +1136,18 @@ public List getLimitDiscountList(String appId, Integer statu
JsonArray jsonArray = respObj.get("limited_discount_list").getAsJsonArray();
if (jsonArray != null && jsonArray.size() > 0) {
- for (int i = 0; i < jsonArray.size(); i ++) {
+ for (int i = 0; i < jsonArray.size(); i++) {
JsonObject goodsObj = jsonArray.get(i).getAsJsonObject();
LimitDiscountGoods discountGoods = new LimitDiscountGoods();
discountGoods.setTaskId(goodsObj.get("task_id").getAsLong());
discountGoods.setStatus(goodsObj.get("status").getAsInt());
- discountGoods.setStartTime(new Date(goodsObj.get("start_time").getAsLong()*1000));
- discountGoods.setEndTime(new Date(goodsObj.get("end_time").getAsLong()*1000));
+ discountGoods.setStartTime(new Date(goodsObj.get("start_time").getAsLong() * 1000));
+ discountGoods.setEndTime(new Date(goodsObj.get("end_time").getAsLong() * 1000));
List skuList = new ArrayList<>();
JsonArray skuArray = goodsObj.get("limited_discount_sku_list").getAsJsonArray();
if (skuArray != null && skuArray.size() > 0) {
- for (int j = 0; j < skuArray.size(); j ++) {
+ for (int j = 0; j < skuArray.size(); j++) {
JsonObject skuObj = skuArray.get(i).getAsJsonObject();
LimitDiscountSku sku = new LimitDiscountSku();
sku.setSkuId(skuObj.get("sku_id").getAsLong());
@@ -1186,7 +1167,7 @@ public List getLimitDiscountList(String appId, Integer statu
}
@Override
- public WxOpenResult updateLimitDiscountStatus(String appId, Long taskId, Integer status) throws WxErrorException {
+ public WxOpenResult updateLimitDiscountStatus(String appId, Long taskId, Integer status) throws WxErrorException {
String url = API_MINISHOP_UPDATE_LIMIT_DICOUNT_STATUS_URL + "access_token=" + getAuthorizerAccessToken(appId, false);
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("task_id", taskId);
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAddressInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAddressInfo.java
index 985e378c27..7f5418c156 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAddressInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAddressInfo.java
@@ -1,63 +1,55 @@
package me.chanjar.weixin.open.bean.minishop;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
+/**
+ * 小商店地址信息
+ */
@Data
-@ApiModel("小商店地址信息")
public class MinishopAddressInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 收货人姓名
*/
- @ApiModelProperty("收货人姓名 必填")
private String userName;
/**
* 邮政编码
*/
- @ApiModelProperty("邮政编码 必填")
private String postalCode;
/**
* 省份,格式:广东省 北京市
*/
- @ApiModelProperty("省份,格式:广东省 北京市 必填")
private String province;
/**
* 城市,格式:广州市
*/
- @ApiModelProperty("城市,格式:广州市 必填")
private String cityName;
/**
* 区,格式:海珠区
*/
- @ApiModelProperty("区,格式:海珠区 必填")
private String countyName;
/**
* 详细地址
*/
- @ApiModelProperty("详细地址,必填")
private String detailInfo;
/**
* 国家码
*/
- @ApiModelProperty("国家码,选填")
private String nationalCode;
/**
* 电话号码
*/
- @ApiModelProperty("电话号码")
private String telNumber;
public JsonObject toJsonObject() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAuditStatus.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAuditStatus.java
index 9f93aee7ae..2ed0116cd2 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAuditStatus.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopAuditStatus.java
@@ -7,6 +7,7 @@
@Data
public class MinishopAuditStatus implements Serializable {
+ private static final long serialVersionUID = 106594659951047198L;
private WxError wxError;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBaseInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBaseInfo.java
index 5d974405ad..b9c81dc6fe 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBaseInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBaseInfo.java
@@ -6,66 +6,60 @@
import java.io.Serializable;
/**
- *
- *
- *
- *
* @author luowentao
* @since 2021-01-27
*/
@Data
public class MinishopBaseInfo implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * 微信小商店ID(自定)
- */
- private Long miniShopId;
-
- /**
- * 小程序ID
- */
- private String appId;
-
- /**
- * 1)小程序名称可以由中文、数字、英文、空格及部分特殊符号(“空格”、“-”、“+”、“&”、“.”)组成。长度在4-30个字符之间,一个中文字等于2个字符。
-2)公众号、小程序在微信公众平台上的名称是唯一的,且属于同一主体下,可以重名。
-3)不得与不同主体的公众号名称重名。
- */
- private String nickName;
-
- /**
- * 1)小程序简称可以从小程序名称中按顺序截取字符创建。长度在4-10个字符之间,一个中文字等于2个字符。
-2)小程序简称在微信公众平台是不唯一的,可以重名。但对于仿冒、侵权等恶意情况,平台仍会做出相关处罚。开发者也可通过侵权投诉维护自己的正当权益。
-3)小程序简称设置后,将在客户端任务栏向用户展示。开发者可以凭借此功能,更好地实现产品品牌价值和展示。目前暂不支持名称的其他功能。
- */
- private String abbr;
-
- /**
- * 介绍。请确认介绍内容不含国家相关法律法规禁止内容,介绍字数为4-120个字符,一个中文占2个字符。一个月内可申请5次修改。请提供可支持命名的材料
- */
- private String introduction;
-
- /**
- * 补充材料,传media id数组,当返回210047时必填
- */
- private String namingOtherStuff;
-
- /**
- * 邮箱
- */
- private String mail;
-
- /**
- * 退货地址
- */
- private Integer returnAddressId;
-
- /**
- * 公司地址
- */
- private Integer companyAddressId;
-
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 微信小商店ID(自定)
+ */
+ private Long miniShopId;
+
+ /**
+ * 小程序ID
+ */
+ private String appId;
+
+ /**
+ * 1)小程序名称可以由中文、数字、英文、空格及部分特殊符号(“空格”、“-”、“+”、“&”、“.”)组成。长度在4-30个字符之间,一个中文字等于2个字符。
+ * 2)公众号、小程序在微信公众平台上的名称是唯一的,且属于同一主体下,可以重名。
+ * 3)不得与不同主体的公众号名称重名。
+ */
+ private String nickName;
+
+ /**
+ * 1)小程序简称可以从小程序名称中按顺序截取字符创建。长度在4-10个字符之间,一个中文字等于2个字符。
+ * 2)小程序简称在微信公众平台是不唯一的,可以重名。但对于仿冒、侵权等恶意情况,平台仍会做出相关处罚。开发者也可通过侵权投诉维护自己的正当权益。
+ * 3)小程序简称设置后,将在客户端任务栏向用户展示。开发者可以凭借此功能,更好地实现产品品牌价值和展示。目前暂不支持名称的其他功能。
+ */
+ private String abbr;
+
+ /**
+ * 介绍。请确认介绍内容不含国家相关法律法规禁止内容,介绍字数为4-120个字符,一个中文占2个字符。一个月内可申请5次修改。请提供可支持命名的材料
+ */
+ private String introduction;
+
+ /**
+ * 补充材料,传media id数组,当返回210047时必填
+ */
+ private String namingOtherStuff;
+
+ /**
+ * 邮箱
+ */
+ private String mail;
+
+ /**
+ * 退货地址
+ */
+ private Integer returnAddressId;
+
+ /**
+ * 公司地址
+ */
+ private Integer companyAddressId;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrand.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrand.java
index 0128b2b776..8a02d8b34b 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrand.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrand.java
@@ -1,13 +1,13 @@
package me.chanjar.weixin.open.bean.minishop;
import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
import java.io.Serializable;
@Data
public class MinishopBrand implements Serializable {
+ private static final long serialVersionUID = -112023091374421283L;
+
private Integer firstCatId;
private Integer secondCatId;
@@ -15,9 +15,9 @@ public class MinishopBrand implements Serializable {
private Integer thirdCatId;
@Data
- @Getter
- @Setter
public static class MinishopBrandInfo implements Serializable {
+ private static final long serialVersionUID = 5727133059972671186L;
+
private Integer brandId;
private String brandName;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrandList.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrandList.java
index d4fdffd0c0..c4fa2b75a1 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrandList.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBrandList.java
@@ -7,6 +7,8 @@
@Data
public class MinishopBrandList implements Serializable {
+ private static final long serialVersionUID = -8508031421949817741L;
+
private Integer errcode;
private String errmsg;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBusiLicense.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBusiLicense.java
index 3f8c4df0c0..578c58812b 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBusiLicense.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopBusiLicense.java
@@ -18,81 +18,80 @@
@Data
@Accessors(chain = true)
public class MinishopBusiLicense implements Serializable {
+ private static final long serialVersionUID = 1L;
- private static final long serialVersionUID = 1L;
-
- /**
- * 营业执照相关信息
- */
- private Integer busiLicenseId;
+ /**
+ * 营业执照相关信息
+ */
+ private Integer busiLicenseId;
- /**
- * 营业执照类型 1:三证合一 2: 普通营业执照
- */
- private Integer licenseType;
+ /**
+ * 营业执照类型 1:三证合一 2: 普通营业执照
+ */
+ private Integer licenseType;
- /**
- * 营业执照图片
- */
- private MinishopPicFile picFile;
+ /**
+ * 营业执照图片
+ */
+ private MinishopPicFile picFile;
/**
* 营业执照图片url
*/
- private String picFileUrl;
+ private String picFileUrl;
/**
* 请填写营业执照上的注册号/统一社会信用代码,
-须为15位数字或18位数字大写字母。
-示例值:123456789012345678 特殊规则:长度最小15个字节
- */
- private String registrationNum;
-
- /**
- * 1、请填写营业执照/登记证书的商家名称,2~110个字符,支持括号
-2、个体工商户/党政、机关及事业单位,不能以“公司”结尾。
-3、个体工商户,若营业执照上商户名称为空或为“无”,请填写"个体户+经营者姓名",
-如“个体户张三” 。示例值:腾讯科技有限公司
- */
- private String merchantName;
-
- /**
- * 请填写证件的经营者/法定代表人姓名。示例值:张三
- */
- private String legalRepresentative;
-
- /**
- * 注册地址
- */
- private String registeredAddrs;
-
- /**
- * 注册日期,格式:2014-01-01
- */
- private String startDate;
-
- /**
- * 结束有效期,格式:2014-01-01
-1、若证件有效期为长期,请填写:长期。
-2、结束时间需大于开始时间。
-3、有效期必须大于60天,即结束时间距当前时间需超过60天。
- */
- private String endDate;
-
-
- public JsonObject toJsonObject() {
- JsonObject jsonObject = new JsonObject();
- jsonObject.addProperty("license_type", this.licenseType);
- jsonObject.add("pic_file", picFile.toJsonObject());
- jsonObject.addProperty("registration_num", registrationNum);
- jsonObject.addProperty("merchant_name", merchantName);
- jsonObject.addProperty("legal_representative", legalRepresentative);
- if (registeredAddrs != null) {
- jsonObject.addProperty("registered_addrs", registeredAddrs);
- }
- jsonObject.addProperty("start_date", startDate);
- jsonObject.addProperty("end_date", endDate);
- return jsonObject;
+ * 须为15位数字或18位数字大写字母。
+ * 示例值:123456789012345678 特殊规则:长度最小15个字节
+ */
+ private String registrationNum;
+
+ /**
+ * 1、请填写营业执照/登记证书的商家名称,2~110个字符,支持括号
+ * 2、个体工商户/党政、机关及事业单位,不能以“公司”结尾。
+ * 3、个体工商户,若营业执照上商户名称为空或为“无”,请填写"个体户+经营者姓名",
+ * 如“个体户张三” 。示例值:腾讯科技有限公司
+ */
+ private String merchantName;
+
+ /**
+ * 请填写证件的经营者/法定代表人姓名。示例值:张三
+ */
+ private String legalRepresentative;
+
+ /**
+ * 注册地址
+ */
+ private String registeredAddrs;
+
+ /**
+ * 注册日期,格式:2014-01-01
+ */
+ private String startDate;
+
+ /**
+ * 结束有效期,格式:2014-01-01
+ * 1、若证件有效期为长期,请填写:长期。
+ * 2、结束时间需大于开始时间。
+ * 3、有效期必须大于60天,即结束时间距当前时间需超过60天。
+ */
+ private String endDate;
+
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("license_type", this.licenseType);
+ jsonObject.add("pic_file", picFile.toJsonObject());
+ jsonObject.addProperty("registration_num", registrationNum);
+ jsonObject.addProperty("merchant_name", merchantName);
+ jsonObject.addProperty("legal_representative", legalRepresentative);
+ if (registeredAddrs != null) {
+ jsonObject.addProperty("registered_addrs", registeredAddrs);
}
+ jsonObject.addProperty("start_date", startDate);
+ jsonObject.addProperty("end_date", endDate);
+ return jsonObject;
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategories.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategories.java
index 62dabd383d..2a7fcab35d 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategories.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategories.java
@@ -7,6 +7,8 @@
@Data
public class MinishopCategories implements Serializable {
+ private static final long serialVersionUID = 7273326128218540329L;
+
private Integer errcode;
private String errmsg;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategory.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategory.java
index ceef3b89a8..619f1fa68b 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategory.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopCategory.java
@@ -6,6 +6,8 @@
@Data
public class MinishopCategory implements Serializable {
+ private static final long serialVersionUID = -4843799448671123177L;
+
private Integer catId;
private Integer fCatId;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplate.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplate.java
index c0acfc7ea4..863782f9fc 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplate.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplate.java
@@ -6,6 +6,7 @@
@Data
public class MinishopDeliveryTemplate implements Serializable {
+ private static final long serialVersionUID = 6408833494371482534L;
public enum ValuationType {
PACKAGE,
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplateResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplateResult.java
index dbcada8f0a..be8afcb386 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplateResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopDeliveryTemplateResult.java
@@ -1,21 +1,30 @@
package me.chanjar.weixin.open.bean.minishop;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
+/**
+ * 小商店运费模版信息
+ *
+ * @author kelven.law@gmail.com
+ */
@Data
-@ApiModel("小商店运费模版信息")
public class MinishopDeliveryTemplateResult implements Serializable {
- @ApiModelProperty(value = "错误码")
+ private static final long serialVersionUID = -3330428091957969299L;
+ /**
+ * 错误码
+ */
private Integer errCode;
- @ApiModelProperty(value = "错误信息")
+ /**
+ * 错误信息
+ */
private String errMsg;
- @ApiModelProperty(value = "运费模版列表")
+ /**
+ * 运费模版列表
+ */
private List templateList;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopIdcardInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopIdcardInfo.java
index eaac80498b..f9c27b8235 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopIdcardInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopIdcardInfo.java
@@ -8,43 +8,38 @@
import java.io.Serializable;
/**
- *
- *
- *
- *
* @author luowentao
* @since 2021-01-27
*/
@Data
@Accessors(chain = true)
public class MinishopIdcardInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
- private static final long serialVersionUID = 1L;
-
- /**
- * 身份证信息Id
- */
- private Integer idCardInfoId;
+ /**
+ * 身份证信息Id
+ */
+ private Integer idCardInfoId;
- /**
- * 小程序ID
- */
- private String appId;
+ /**
+ * 小程序ID
+ */
+ private String appId;
- /**
- * 人像面照片media_id
- */
- private MinishopPicFile portraitPicFile;
+ /**
+ * 人像面照片media_id
+ */
+ private MinishopPicFile portraitPicFile;
/**
* 人像面照片url
*/
- private String protraitPicFileUrl;
+ private String protraitPicFileUrl;
/**
- * 国徽面照片
- */
- private MinishopPicFile nationPicFile;
+ * 国徽面照片
+ */
+ private MinishopPicFile nationPicFile;
/**
* 国徽面照片url
@@ -52,37 +47,37 @@ public class MinishopIdcardInfo implements Serializable {
private String nationPicFileUrl;
/**
- * 请填写经营者/法定代表人对应身份证的姓名,2~30个中文字符、英文字符、符号。
- */
- private String idCardName;
-
- /**
- * 请填写经营者/法定代表人对应身份证的号码
- */
- private String idCardNumber;
-
- /**
- * 注册日期,格式:2014-01-01
- */
- private String startDate;
-
- /**
- * 结束有效期,格式:2014-01-01
-1、若证件有效期为长期,请填写:长期。
-2、结束时间需大于开始时间。
-3、有效期必须大于60天,即结束时间距当前时间需超过60天。
- */
- private String endDate;
-
- public JsonObject toJsonObject() {
- JsonObject jsonObject = new JsonObject();
- jsonObject.add("portrait_pic_file", portraitPicFile.toJsonObject());
- jsonObject.add("nation_pic_file", nationPicFile.toJsonObject());
- jsonObject.addProperty("id_card_name", idCardName);
- jsonObject.addProperty("id_card_number", idCardNumber);
- jsonObject.addProperty("start_date", startDate);
- jsonObject.addProperty("end_date", endDate);
- return jsonObject;
- }
+ * 请填写经营者/法定代表人对应身份证的姓名,2~30个中文字符、英文字符、符号。
+ */
+ private String idCardName;
+
+ /**
+ * 请填写经营者/法定代表人对应身份证的号码
+ */
+ private String idCardNumber;
+
+ /**
+ * 注册日期,格式:2014-01-01
+ */
+ private String startDate;
+
+ /**
+ * 结束有效期,格式:2014-01-01
+ * 1、若证件有效期为长期,请填写:长期。
+ * 2、结束时间需大于开始时间。
+ * 3、有效期必须大于60天,即结束时间距当前时间需超过60天。
+ */
+ private String endDate;
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.add("portrait_pic_file", portraitPicFile.toJsonObject());
+ jsonObject.add("nation_pic_file", nationPicFile.toJsonObject());
+ jsonObject.addProperty("id_card_name", idCardName);
+ jsonObject.addProperty("id_card_number", idCardNumber);
+ jsonObject.addProperty("start_date", startDate);
+ jsonObject.addProperty("end_date", endDate);
+ return jsonObject;
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopMerchantinfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopMerchantinfo.java
index e7eac7e064..a64d6883d6 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopMerchantinfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopMerchantinfo.java
@@ -8,89 +8,84 @@
import java.util.Date;
/**
- *
- *
- *
- *
* @author luowentao
* @since 2021-01-27
*/
@Data
@Accessors(chain = true)
public class MinishopMerchantinfo implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * 小商店认证ID
- */
- private Long merchantId;
-
- /**
- * 小商店APPID
- */
- private String appId;
-
- /**
- * 主体类型
-"4":个体工商户,营业执照上的主体类型一般为个体户、个体工商户、个体经营。
-"2":企业,营业执照上的主体类型一般为有限公司、有限责任公司。
- */
- private String subjectType;
-
- /**
- * 商户简称 UTF-8格式,中文占3个字节,即最多16个汉字长度。
-将在支付完成页向买家展示,需与商家的实际售卖商品相符 。示例值:腾讯
- */
- private String merchantShortname;
-
- /**
- * 补充描述
- */
- private String supplementaryDesc;
-
- /**
- * 营业执照/登记证书信息
- */
- private Integer busiLicenseId;
-
- /**
- * 组织机构代码证信息(非必填)
- */
- private Integer organizationCodeInfo;
-
- /**
- * 身份证信息
- */
- private Integer idCardInfo;
-
- /**
- * 超级管理员信息 请填写店铺的超级管理员信息。超级管理员需在开户后进行签约,
-并可接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。
- */
- private Integer superAdministratorInfoId;
-
- /**
- * 特殊资质 1、根据商户经营业务要求提供相关资质,详情查看《行业对应特殊资质》。
-2、请提供为“申请商家主体”所属的特殊资质,可授权使用总公司/分公司的特殊资 质;
-3、最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
- */
- private Integer specialQualificationId;
-
- /**
- * 补充材料
- */
- private Integer supplementaryMaterialId;
-
- /**
- * 状态:0为审核中,1为已通过,-1为审批驳回
- */
- private Integer status;
-
- /**
- * 提交时间
- */
- private Date submitTime;
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 小商店认证ID
+ */
+ private Long merchantId;
+
+ /**
+ * 小商店APPID
+ */
+ private String appId;
+
+ /**
+ * 主体类型
+ * "4":个体工商户,营业执照上的主体类型一般为个体户、个体工商户、个体经营。
+ * "2":企业,营业执照上的主体类型一般为有限公司、有限责任公司。
+ */
+ private String subjectType;
+
+ /**
+ * 商户简称 UTF-8格式,中文占3个字节,即最多16个汉字长度。
+ * 将在支付完成页向买家展示,需与商家的实际售卖商品相符 。示例值:腾讯
+ */
+ private String merchantShortname;
+
+ /**
+ * 补充描述
+ */
+ private String supplementaryDesc;
+
+ /**
+ * 营业执照/登记证书信息
+ */
+ private Integer busiLicenseId;
+
+ /**
+ * 组织机构代码证信息(非必填)
+ */
+ private Integer organizationCodeInfo;
+
+ /**
+ * 身份证信息
+ */
+ private Integer idCardInfo;
+
+ /**
+ * 超级管理员信息 请填写店铺的超级管理员信息。超级管理员需在开户后进行签约,
+ * 并可接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。
+ */
+ private Integer superAdministratorInfoId;
+
+ /**
+ * 特殊资质 1、根据商户经营业务要求提供相关资质,详情查看《行业对应特殊资质》。
+ * 2、请提供为“申请商家主体”所属的特殊资质,可授权使用总公司/分公司的特殊资 质;
+ * 3、最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
+ */
+ private Integer specialQualificationId;
+
+ /**
+ * 补充材料
+ */
+ private Integer supplementaryMaterialId;
+
+ /**
+ * 状态:0为审核中,1为已通过,-1为审批驳回
+ */
+ private Integer status;
+
+ /**
+ * 提交时间
+ */
+ private Date submitTime;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopNameInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopNameInfo.java
index 1e12dc16ff..2f9e845337 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopNameInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopNameInfo.java
@@ -1,28 +1,23 @@
package me.chanjar.weixin.open.bean.minishop;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
+/**
+ * 小商店名称信息
+ */
@Data
-@ApiModel("小商店名称信息")
public class MinishopNameInfo implements Serializable {
-
private static final long serialVersionUID = 1L;
-
/**
* 1)小程序名称可以由中文、数字、英文、空格及部分特殊符号(“空格”、“-”、“+”、“&”、“.”)组成。长度在4-30个字符之间,一个中文字等于2个字符。
* 2)公众号、小程序在微信公众平台上的名称是唯一的,且属于同一主体下,可以重名。
* 3)不得与不同主体的公众号名称重名。
*/
- @ApiModelProperty(value = "1)小程序名称可以由中文、数字、英文、空格及部分特殊符号(“空格”、“-”、“+”、“&”、“.”)组成。长度在4-30个字符之间,一个中文字等于2个字符。\n" +
- " * 2)公众号、小程序在微信公众平台上的名称是唯一的,且属于同一主体下,可以重名。\n" +
- " * 3)不得与不同主体的公众号名称重名。", required = true)
private String nickName;
@@ -31,22 +26,16 @@ public class MinishopNameInfo implements Serializable {
* 2)小程序简称在微信公众平台是不唯一的,可以重名。但对于仿冒、侵权等恶意情况,平台仍会做出相关处罚。开发者也可通过侵权投诉维护自己的正当权益。
* 3)小程序简称设置后,将在客户端任务栏向用户展示。开发者可以凭借此功能,更好地实现产品品牌价值和展示。目前暂不支持名称的其他功能。
*/
- @ApiModelProperty(value = " * 1)小程序简称可以从小程序名称中按顺序截取字符创建。长度在4-10个字符之间,一个中文字等于2个字符。\n" +
- " * 2)小程序简称在微信公众平台是不唯一的,可以重名。但对于仿冒、侵权等恶意情况,平台仍会做出相关处罚。开发者也可通过侵权投诉维护自己的正当权益。\n" +
- " * 3)小程序简称设置后,将在客户端任务栏向用户展示。开发者可以凭借此功能,更好地实现产品品牌价值和展示。目前暂不支持名称的其他功能。", required = true)
private String abbr;
-
/**
* 请确认介绍内容不含国家相关法律法规禁止内容,介绍字数为4-120个字符,一个中文占2个字符。一个月内可申请5次修改。请提供可支持命名的材料
*/
- @ApiModelProperty(value = "请确认介绍内容不含国家相关法律法规禁止内容,介绍字数为4-120个字符,一个中文占2个字符。一个月内可申请5次修改。请提供可支持命名的材料", required = true)
private String introduction;
/**
* 补充材料,传media id数组,当返回210047时必填
*/
- @ApiModelProperty(value = "补充材料,传media id数组,当返回210047时必填", required = false)
private List namingOtherStuff;
public JsonObject toJsonObject() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopOrganizationCodeInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopOrganizationCodeInfo.java
index fc34429f4d..c73d33e2a0 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopOrganizationCodeInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopOrganizationCodeInfo.java
@@ -2,61 +2,56 @@
import com.google.gson.JsonObject;
import lombok.Data;
-import lombok.experimental.Accessors;
import java.io.Serializable;
/**
- *
- *
- *
- *
* @author luowentao
* @since 2021-01-27
*/
@Data
public class MinishopOrganizationCodeInfo implements Serializable {
- private static final long serialVersionUID = 1L;
-
- private Integer organizationCodeInfoId;
-
- /**
- * 小程序ID
- */
- private String appId;
-
- /**
- * 组织机构代码证图片
- */
- private MinishopPicFile picFile;
-
- /**
- * 1、请填写组织机构代码证上的组织机构代码。
-2、可填写9或10位 数字\字母\连字符。示例值:12345679-A
- */
- private String organizationCode;
-
- /**
- * 注册日期,格式:2014-01-01
- */
- private String startDate;
-
- /**
- * 结束有效期,格式:2014-01-01
-1、若证件有效期为长期,请填写:长期。
-2、结束时间需大于开始时间。
-3、有效期必须大于60天,即结束时间距当前时间需超过60天。
- */
- private String endDate;
-
-
- public JsonObject toJsonObject() {
- JsonObject jsonObject = new JsonObject();
- jsonObject.add("pic_file", picFile.toJsonObject());
- jsonObject.addProperty("organization_code", organizationCode);
- jsonObject.addProperty("start_date", startDate);
- jsonObject.addProperty("end_date", endDate);
- return jsonObject;
- }
+ private static final long serialVersionUID = 1L;
+
+ private Integer organizationCodeInfoId;
+
+ /**
+ * 小程序ID
+ */
+ private String appId;
+
+ /**
+ * 组织机构代码证图片
+ */
+ private MinishopPicFile picFile;
+
+ /**
+ * 1、请填写组织机构代码证上的组织机构代码。
+ * 2、可填写9或10位 数字\字母\连字符。示例值:12345679-A
+ */
+ private String organizationCode;
+
+ /**
+ * 注册日期,格式:2014-01-01
+ */
+ private String startDate;
+
+ /**
+ * 结束有效期,格式:2014-01-01
+ * 1、若证件有效期为长期,请填写:长期。
+ * 2、结束时间需大于开始时间。
+ * 3、有效期必须大于60天,即结束时间距当前时间需超过60天。
+ */
+ private String endDate;
+
+
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.add("pic_file", picFile.toJsonObject());
+ jsonObject.addProperty("organization_code", organizationCode);
+ jsonObject.addProperty("start_date", startDate);
+ jsonObject.addProperty("end_date", endDate);
+ return jsonObject;
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopPicFile.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopPicFile.java
index 4a3bda54a2..54ec169b1e 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopPicFile.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopPicFile.java
@@ -7,7 +7,7 @@
@Data
public class MinishopPicFile implements Serializable {
-
+ private static final long serialVersionUID = 6406252666763442010L;
private String mediaId;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopReturnInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopReturnInfo.java
index 33144111b4..1c6079ae76 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopReturnInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopReturnInfo.java
@@ -1,32 +1,30 @@
package me.chanjar.weixin.open.bean.minishop;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
+/**
+ * 小商店退货信息
+ */
@Data
-@ApiModel("小商店退货信息")
public class MinishopReturnInfo implements Serializable {
+ private static final long serialVersionUID = -540507163550915549L;
/**
* 退货地址
*/
- @ApiModelProperty(value = "退货地址 必填", required = true)
private MinishopAddressInfo addressInfo;
/**
* 邮箱
*/
- @ApiModelProperty(value = "邮箱 必填", required = true)
private String email;
/**
* 公司地址
*/
- @ApiModelProperty(value = "公司地址信息 必填", required = true)
private MinishopAddressInfo companyAddress;
public JsonObject toJsonObject() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCat.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCat.java
index 250272dda8..dd208a11aa 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCat.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCat.java
@@ -9,6 +9,8 @@
*/
@Data
public class MinishopShopCat implements Serializable {
+ private static final long serialVersionUID = 4179473856929659641L;
+
private Integer shopCatId;
private String shopCatName;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCatList.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCatList.java
index e0d9fcbc4c..55e7cef4f7 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCatList.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopShopCatList.java
@@ -7,6 +7,8 @@
@Data
public class MinishopShopCatList implements Serializable {
+ private static final long serialVersionUID = 8718853679902050471L;
+
private Integer errcode;
private String errmsg;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopSuperAdministratorInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopSuperAdministratorInfo.java
index 55f111f017..2c416cd37d 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopSuperAdministratorInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/MinishopSuperAdministratorInfo.java
@@ -18,54 +18,53 @@
@Data
@Accessors(chain = true)
public class MinishopSuperAdministratorInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
- private static final long serialVersionUID = 1L;
+ /**
+ * 店铺管理员ID
+ */
+ private Integer superAdminInfoId;
- /**
- * 店铺管理员ID
- */
- private Integer superAdminInfoId;
+ /**
+ * 个体工商户/企业/党政、机关及事业单位/其他组织,可选择:65-法人/经营者、66- 负责人。
+ * (负责人:经商户授权办理微信支付业务的人员,授权范围包括但不限于签约,入驻过程需完成账户验证)。
+ * 示例值:65
+ */
+ private String type;
- /**
- * 个体工商户/企业/党政、机关及事业单位/其他组织,可选择:65-法人/经营者、66- 负责人。
-(负责人:经商户授权办理微信支付业务的人员,授权范围包括但不限于签约,入驻过程需完成账户验证)。
-示例值:65
- */
- private String type;
+ /**
+ * 1、若管理员类型为“法人”,则该姓名需与法人身份证姓名一致。
+ * 2、若管理员类型为“经办人”,则可填写实际经办人的姓名。
+ */
+ private String name;
- /**
- * 1、若管理员类型为“法人”,则该姓名需与法人身份证姓名一致。
-2、若管理员类型为“经办人”,则可填写实际经办人的姓名。
- */
- private String name;
+ /**
+ * 1、若管理员类型为法人,则该身份证号码需与法人身份证号码一致。若管理员类型为经办人,
+ * 则可填写实际经办人的身份证号码。
+ * 2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。
+ * 3、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。
+ */
+ private String idCardNumber;
- /**
- * 1、若管理员类型为法人,则该身份证号码需与法人身份证号码一致。若管理员类型为经办人,
-则可填写实际经办人的身份证号码。
-2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。
-3、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。
- */
- private String idCardNumber;
+ /**
+ * 请填写管理员的手机号,11位数字, 用于接收微信支付的重要管理信息及日常操作验证码 。
+ */
+ private String phone;
- /**
- * 请填写管理员的手机号,11位数字, 用于接收微信支付的重要管理信息及日常操作验证码 。
- */
- private String phone;
+ /**
+ * 1、用于接收微信支付的开户邮件及日常业务通知。
+ * 2、需要带@,遵循邮箱格式校验 。
+ */
+ private String mail;
- /**
- * 1、用于接收微信支付的开户邮件及日常业务通知。
-2、需要带@,遵循邮箱格式校验 。
- */
- private String mail;
-
- public JsonObject toJsonObject() {
- JsonObject jsonObject = new JsonObject();
- jsonObject.addProperty("type", type);
- jsonObject.addProperty("name", name);
- jsonObject.addProperty("id_card_number", idCardNumber);
- jsonObject.addProperty("phone", phone);
- jsonObject.addProperty("mail", mail);
- return jsonObject;
- }
+ public JsonObject toJsonObject() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("type", type);
+ jsonObject.addProperty("name", name);
+ jsonObject.addProperty("id_card_number", idCardNumber);
+ jsonObject.addProperty("phone", phone);
+ jsonObject.addProperty("mail", mail);
+ return jsonObject;
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCoupon.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCoupon.java
index d99429063f..d8cb2c5068 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCoupon.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCoupon.java
@@ -1,48 +1,65 @@
package me.chanjar.weixin.open.bean.minishop.coupon;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
-@ApiModel("小商店优惠券信息")
public class WxMinishopCoupon implements Serializable {
+ private static final long serialVersionUID = -6195756716727405785L;
- //新增完成之后可以看到这个couponId
+ /**
+ * 新增完成之后可以看到这个couponId
+ */
private Integer couponId;
- //优惠券状态
+ /**
+ * 优惠券状态
+ */
private Integer status;
- @ApiModelProperty(value = "优惠券类型: 1 商品条件折券, discount_condition.product_ids, discount_condition.product_cnt, discount_info.discount_num 必填" +
- "2 商品满减券, discount_condition.product_ids, discount_condition.product_price, discount_info.discount_fee 必填" +
- "3 商品统一折扣券, discount_condition.product_ids, discount_info.discount_num必填" +
- "4 商品直减券, 如果小于可用的商品中的最小价格会提醒(没有商品时超过50w提醒), discount_condition.product_ids, discount_fee 必填" +
- "101 店铺条件折扣券, discount_condition.product_cnt, discount_info.discount_num必填" +
- "102 店铺满减券, discount_condition.product_price, discount_info.discount_fee 必填" +
- "103 店铺统一折扣券, discount_info.discount_num 必填" +
- "104 店铺直减券, 如果小于可用的商品中的最小价格会提醒(没有商品时超过50w提醒), discount_fee 必填", required = true)
+ /**
+ * 优惠券类型:
+ * 1 商品条件折券, discount_condition.product_ids, discount_condition.product_cnt, discount_info.discount_num 必填;
+ * 2 商品满减券, discount_condition.product_ids, discount_condition.product_price, discount_info.discount_fee 必填;
+ * 3 商品统一折扣券, discount_condition.product_ids, discount_info.discount_num必填;
+ * 4 商品直减券, 如果小于可用的商品中的最小价格会提醒(没有商品时超过50w提醒), discount_condition.product_ids, discount_fee 必填;
+ * 101 店铺条件折扣券, discount_condition.product_cnt, discount_info.discount_num必填;
+ * 102 店铺满减券, discount_condition.product_price, discount_info.discount_fee 必填;
+ * 103 店铺统一折扣券, discount_info.discount_num 必填;
+ * 104 店铺直减券, 如果小于可用的商品中的最小价格会提醒(没有商品时超过50w提醒), discount_fee 必填
+ */
private Integer type;
- @ApiModelProperty(value = "优惠券名称", required = true)
+ /**
+ * 优惠券名称
+ */
private String name;
- @ApiModelProperty(value = "商品折扣券信息")
+ /**
+ * 商品折扣券信息
+ */
private WxMinishopCouponDiscountInfo discountInfo;
- @ApiModelProperty(value = "优惠券额外信息")
+ /**
+ * 优惠券额外信息
+ */
private WxMinishopCouponExtInfo extInfo;
- @ApiModelProperty(value = "推广渠道信息",required = true)
+ /**
+ * 推广渠道信息
+ */
private WxMinishopCouponPromoteInfo promoteInfo;
- @ApiModelProperty(value = "优惠券领取信息", required = true)
+ /**
+ * 优惠券领取信息
+ */
private WxMinishopCouponReceiveInfo receiveInfo;
- @ApiModelProperty(value = "优惠券有效期信息", required = true)
+ /**
+ * 优惠券有效期信息
+ */
private WxMinishopCouponValidInfo validInfo;
public JsonObject toJsonObject() {
@@ -64,7 +81,7 @@ public JsonObject toJsonObject() {
jsonObject.add("ext_info", extInfo.toJsonObject());
}
- if(promoteInfo != null) {
+ if (promoteInfo != null) {
jsonObject.add("promote_info", promoteInfo.toJsonObject());
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountCondition.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountCondition.java
index 8131799003..c676144db6 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountCondition.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountCondition.java
@@ -3,23 +3,31 @@
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import java.io.Serializable;
import java.util.List;
+/**
+ * 小商店商品折扣券详细信息
+ */
@Data
-@ApiModel("小商店商品折扣券详细信息")
-public class WxMinishopCouponDiscountCondition {
- @ApiModelProperty(value = "商品折扣券打折金额", required = false)
+public class WxMinishopCouponDiscountCondition implements Serializable {
+ private static final long serialVersionUID = 7020614663289497294L;
+
+ /**
+ * 商品折扣券打折金额
+ */
private Integer productCnt;
- @ApiModelProperty(value = "商品id,商品折扣券需填写", required = false)
+ /**
+ * 商品id,商品折扣券需填写
+ */
private List productIds;
-
- @ApiModelProperty(value = "商品价格,满减券需填写", required = false)
+ /**
+ * 商品价格,满减券需填写
+ */
private Integer productPrice;
public JsonObject toJsonObject() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountInfo.java
index b36d340215..83a4ead038 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponDiscountInfo.java
@@ -1,21 +1,30 @@
package me.chanjar.weixin.open.bean.minishop.coupon;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 小商店商品折扣券信息
+ */
@Data
-@ApiModel("小商店商品折扣券信息")
-public class WxMinishopCouponDiscountInfo {
+public class WxMinishopCouponDiscountInfo implements Serializable {
+ private static final long serialVersionUID = -2290048692838721473L;
- @ApiModelProperty(value = "小商店商品折扣详情")
+ /**
+ * 小商店商品折扣详情
+ */
private WxMinishopCouponDiscountCondition discountCondition;
- @ApiModelProperty(value = "满减金额", required = true)
+ /**
+ * 满减金额
+ */
private Integer discountFee;
- @ApiModelProperty(value = "打折商品数量,满减券需填写")
+ /**
+ * 打折商品数量,满减券需填写
+ */
private Integer discountNum;
public JsonObject toJsonObject() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponExtInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponExtInfo.java
index cba445f8ae..311f457ec9 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponExtInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponExtInfo.java
@@ -1,25 +1,35 @@
package me.chanjar.weixin.open.bean.minishop.coupon;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
+/**
+ * 小商店优惠券的扩展信息
+ */
@Data
-@ApiModel("小商店优惠券的扩展信息")
public class WxMinishopCouponExtInfo implements Serializable {
- @ApiModelProperty("备注信息")
+ private static final long serialVersionUID = 1923872821677126519L;
+
+ /**
+ * 备注信息
+ */
private String notes;
- @ApiModelProperty(value = "优惠券有效时间, valid_type=0时与valid_info.start_time一致, valid_type=1时商家自己填一个绝对开始时间", required = true)
+ /**
+ * 优惠券有效时间, valid_type=0时与valid_info.start_time一致, valid_type=1时商家自己填一个绝对开始时间
+ */
private Long validTime;
- @ApiModelProperty(value = "优惠券失效时间, valid_type=0时与valid_info.end_time一致, valid_type=1时商家自己填一个绝对结束时间", required = true)
+ /**
+ * 优惠券失效时间, valid_type=0时与valid_info.end_time一致, valid_type=1时商家自己填一个绝对结束时间
+ */
private Long invalidTime;
- @ApiModelProperty(value = "商品券可以填,领取后跳转")
+ /**
+ * 商品券可以填,领取后跳转
+ */
private Long jumpProductId;
public JsonObject toJsonObject() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponPromoteInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponPromoteInfo.java
index c6fc05c72c..fa1376d473 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponPromoteInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponPromoteInfo.java
@@ -1,19 +1,25 @@
package me.chanjar.weixin.open.bean.minishop.coupon;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
+/**
+ * 小商店优惠券推广渠道
+ */
@Data
-@ApiModel("小商店优惠券推广渠道")
public class WxMinishopCouponPromoteInfo implements Serializable {
- @ApiModelProperty(value = "用户自定义推广渠道", required = true)
+ private static final long serialVersionUID = 1928131284657756435L;
+
+ /**
+ * 用户自定义推广渠道
+ */
private String customizeChannel;
- @ApiModelProperty(value = "推广类型, 1:店铺内推广,2:自定义推广渠道", required = true)
+ /**
+ * 推广类型, 1:店铺内推广,2:自定义推广渠道
+ */
private Integer promotionType;
public JsonObject toJsonObject() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponReceiveInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponReceiveInfo.java
index 53f17e7632..effa8b4f97 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponReceiveInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponReceiveInfo.java
@@ -1,25 +1,35 @@
package me.chanjar.weixin.open.bean.minishop.coupon;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
+/**
+ * 小商店优惠券领取信息
+ */
@Data
-@ApiModel("小商店优惠券领取信息")
public class WxMinishopCouponReceiveInfo implements Serializable {
- @ApiModelProperty(value = "优惠券领用结束时间", required = true)
+ private static final long serialVersionUID = -3168216738144299136L;
+
+ /**
+ * 优惠券领用结束时间
+ */
private Long endTime;
- @ApiModelProperty(value = "是否限制一人使用", required = true)
+ /**
+ * 是否限制一人使用
+ */
private Integer limitNumOnePerson;
- @ApiModelProperty(value = "优惠券领用开始时间",required = true)
+ /**
+ * 优惠券领用开始时间
+ */
private Long startTime;
- @ApiModelProperty(value = "优惠券领用总数", required = true)
+ /**
+ * 优惠券领用总数
+ */
private Integer totalNum;
public JsonObject toJsonObject() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponResponse.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponResponse.java
index 1354fef763..77a886f96b 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponResponse.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponResponse.java
@@ -1,22 +1,30 @@
package me.chanjar.weixin.open.bean.minishop.coupon;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
+/**
+ * 小商店优惠券请求回复数据信息
+ */
@Data
-@ApiModel("小商店优惠券请求回复数据信息")
public class WxMinishopCouponResponse implements Serializable {
- @ApiModelProperty("错误码")
+ private static final long serialVersionUID = 1579611003616556089L;
+
+ /**
+ * 错误码
+ */
private Integer errcode;
- @ApiModelProperty("错误信息")
+ /**
+ * 错误信息
+ */
private String errmsg;
- @ApiModelProperty("优惠券信息")
+ /**
+ * 优惠券信息
+ */
private List coupons;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStock.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStock.java
index e3504a28ef..61a97aec9b 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStock.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStock.java
@@ -1,32 +1,48 @@
package me.chanjar.weixin.open.bean.minishop.coupon;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
-@ApiModel("小商店优惠券返回信息")
+/**
+ * 小商店优惠券返回信息
+ */
@Data
public class WxMinishopCouponStock implements Serializable {
- @ApiModelProperty("优惠券ID")
+ private static final long serialVersionUID = -2022165905204478132L;
+
+ /**
+ * 优惠券ID
+ */
private Integer couponId;
- @ApiModelProperty("优惠券类型")
+ /**
+ * 优惠券类型
+ */
private Integer type;
- @ApiModelProperty("优惠券状态")
+ /**
+ * 优惠券状态
+ */
private Integer status;
- @ApiModelProperty("优惠券创建时间")
+ /**
+ * 优惠券创建时间
+ */
private String createTime;
- @ApiModelProperty("优惠券更新时间")
+ /**
+ * 优惠券更新时间
+ */
private String updateTime;
- @ApiModelProperty("优惠券详情信息")
+ /**
+ * 优惠券详情信息
+ */
private WxMinishopCoupon couponInfo;
- @ApiModelProperty("优惠券使用信息")
+ /**
+ * 优惠券使用信息
+ */
private WxMinishopCouponStockInfo stockInfo;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStockInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStockInfo.java
index 0ced38f78a..2bcfc2c52e 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStockInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponStockInfo.java
@@ -1,20 +1,28 @@
package me.chanjar.weixin.open.bean.minishop.coupon;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
+/**
+ * 小商店优惠券消耗信息
+ */
@Data
-@ApiModel("小商店优惠券消耗信息")
public class WxMinishopCouponStockInfo implements Serializable {
- @ApiModelProperty(value = "优惠券发放量")
+ private static final long serialVersionUID = 7690057714224606954L;
+
+ /**
+ * 优惠券发放量
+ */
private Integer issuedNum;
- @ApiModelProperty(value = "优惠券领用量")
+ /**
+ * 优惠券领用量
+ */
private Integer receiveNum;
- @ApiModelProperty(value = "优惠券已用量")
+ /**
+ * 优惠券已用量
+ */
private Integer usedNum;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponValidInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponValidInfo.java
index 98309050a0..f403d7548b 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponValidInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/coupon/WxMinishopCouponValidInfo.java
@@ -1,25 +1,35 @@
package me.chanjar.weixin.open.bean.minishop.coupon;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
+/**
+ * 小商店优惠券有效信息设置
+ */
@Data
-@ApiModel("小商店优惠券有效信息设置")
public class WxMinishopCouponValidInfo implements Serializable {
- @ApiModelProperty(value = "优惠券有效期结束时间,若填了start必填")
+ private static final long serialVersionUID = -5228007620440565868L;
+
+ /**
+ * 优惠券有效期结束时间,若填了start必填
+ */
private Long endTime;
- @ApiModelProperty(value = "优惠券有效期开始时间,和valid_day_num二选一")
+ /**
+ * 优惠券有效期开始时间,和valid_day_num二选一
+ */
private Long startTime;
- @ApiModelProperty(value = "优惠券有效期天数,和start_time二选一", required = true)
+ /**
+ * 优惠券有效期天数,和start_time二选一
+ */
private Integer validDayNum;
- @ApiModelProperty(value = "优惠券有效期类型, 0: 指定时间范围生效; 1: 生效天数", required = true)
+ /**
+ * 优惠券有效期类型, 0: 指定时间范围生效; 1: 生效天数
+ */
private Integer validType;
public JsonObject toJsonObject() {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSkuData.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSkuData.java
index 0266b9e03b..afe665be3f 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSkuData.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSkuData.java
@@ -6,6 +6,7 @@
@Data
public class WxMinishopAddGoodsSkuData implements Serializable {
+ private static final long serialVersionUID = -2596988603027040989L;
private Long skuId;
private String createTime;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuData.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuData.java
index 5250d22417..6cdc237b2e 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuData.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuData.java
@@ -6,6 +6,7 @@
@Data
public class WxMinishopAddGoodsSpuData implements Serializable {
+ private static final long serialVersionUID = 2023708625713948192L;
private Long productId;
private String outProductId;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuResult.java
index 64daa04634..16113c1767 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopAddGoodsSpuResult.java
@@ -6,6 +6,7 @@
@Data
public class WxMinishopAddGoodsSpuResult implements Serializable {
+ private static final long serialVersionUID = 4323118714581265968L;
private Integer errcode;
private String errmsg;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopDeliveryCompany.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopDeliveryCompany.java
index 88c4081a7f..6743519cd0 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopDeliveryCompany.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopDeliveryCompany.java
@@ -6,6 +6,7 @@
@Data
public class WxMinishopDeliveryCompany implements Serializable {
+ private static final long serialVersionUID = 3736970376549639779L;
private String deliveryId;
private String deliveryName;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopGoodsSkuAttr.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopGoodsSkuAttr.java
index c108f66c7d..1673a2eb46 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopGoodsSkuAttr.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopGoodsSkuAttr.java
@@ -1,18 +1,18 @@
package me.chanjar.weixin.open.bean.minishop.goods;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
@Data
public class WxMinishopGoodsSkuAttr implements Serializable {
+ private static final long serialVersionUID = -7274443170526394680L;
+
private String attrKey;
private String attrValue;
-
public JsonObject toJsonObject() {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("attr_key", attrKey);
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSku.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSku.java
index c9fb54c703..fe47ab2307 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSku.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSku.java
@@ -5,11 +5,12 @@
import lombok.Data;
import java.io.Serializable;
-import java.math.BigDecimal;
import java.util.List;
@Data
public class WxMinishopSku implements Serializable {
+ private static final long serialVersionUID = 12373392723136246L;
+
private Long productId;
private String outProductId;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSpu.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSpu.java
index a8b09833b9..7d4c391a87 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSpu.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/goods/WxMinishopSpu.java
@@ -10,7 +10,7 @@
@Data
public class WxMinishopSpu implements Serializable {
-
+ private static final long serialVersionUID = 6689040014027161007L;
private String outProductId;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountGoods.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountGoods.java
index 06b05a0212..24dda605d6 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountGoods.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountGoods.java
@@ -2,8 +2,6 @@
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@@ -14,24 +12,36 @@
* 小商店商品秒杀活动
*/
@Data
-@ApiModel("小商店商品秒杀")
public class LimitDiscountGoods implements Serializable {
- @ApiModelProperty("小商店秒杀任务ID")
+ private static final long serialVersionUID = 718311474429148501L;
+ /**
+ * 小商店秒杀任务ID
+ */
private Long taskId;
- @ApiModelProperty("秒杀任务状态")
+ /**
+ * 秒杀任务状态
+ */
private Integer status;
- @ApiModelProperty("小商店商品ID,需要检查该商品在小商店的状态,如果不是上线状态可以提示客户需要先上架到小商店再进行处理")
+ /**
+ * 小商店商品ID,需要检查该商品在小商店的状态,如果不是上线状态可以提示客户需要先上架到小商店再进行处理
+ */
private Long productId;
- @ApiModelProperty("开始时间,发给小商店的时候需要转换为getTime")
+ /**
+ * 开始时间,发给小商店的时候需要转换为getTime
+ */
private Date startTime;
- @ApiModelProperty("结束时间,发给小商店的时候需要转换为getTime")
+ /**
+ * 结束时间,发给小商店的时候需要转换为getTime
+ */
private Date endTime;
- @ApiModelProperty("商品sku列表")
+ /**
+ * 商品sku列表
+ */
private List limitDiscountSkuList;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountSku.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountSku.java
index d77e476049..a57569d4b6 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountSku.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/minishop/limitdiscount/LimitDiscountSku.java
@@ -1,8 +1,6 @@
package me.chanjar.weixin.open.bean.minishop.limitdiscount;
import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@@ -12,16 +10,16 @@
* 商品抢购活动sku信息
*/
@Data
-@ApiModel("商品抢购活动sku")
+// 商品抢购活动sku
public class LimitDiscountSku implements Serializable {
- @ApiModelProperty("商品skuID")
+ // 商品skuID
private Long skuId;
- @ApiModelProperty("秒杀价格")
+ // 秒杀价格
private BigDecimal salePrice;
- @ApiModelProperty("商品秒杀库存")
+ // 商品秒杀库存
private Integer saleStock;
public JsonObject toJsonObject() {
From b4abd5143dc947d3f4eaf1c0709c3153bedee410 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 4 Jul 2021 23:58:00 +0800
Subject: [PATCH 0028/1235] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.1.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index 9c230a0b66..196efe8c16 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index c41084ce69..8407cffce1 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 4261b26b1d..749bf5d9e4 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.0
+ 4.1.1.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index 66b0c40fe7..a0220c2771 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.0
+ 4.1.1.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index e94b40eedf..c97c33e9b4 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.0
+ 4.1.1.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 6c8b0172cc..8a05f0bbdf 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.0
+ 4.1.1.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 61deeda8d9..fe26c39676 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.0
+ 4.1.1.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index f8199a3f1f..333b99be57 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index 2f0f13f115..c4d73071fe 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 1468b279c0..e5f54e9dfc 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 31fbddb2df..dd5e3f97e2 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 7156f7806d..7056b1c34c 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index 1077f9a193..12c9fba726 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index d385b5aaaf..a0f0a2172f 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index c99caff4ea..64a5ef95a1 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.0
+ 4.1.1.B
weixin-java-qidian
From b8e2d5850576adce1914cda556a29c02696b0e7c Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Thu, 8 Jul 2021 11:12:29 +0800
Subject: [PATCH 0029/1235] Create stale.yml
---
.github/stale.yml | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
create mode 100644 .github/stale.yml
diff --git a/.github/stale.yml b/.github/stale.yml
new file mode 100644
index 0000000000..dc90e5a1c3
--- /dev/null
+++ b/.github/stale.yml
@@ -0,0 +1,17 @@
+# Number of days of inactivity before an issue becomes stale
+daysUntilStale: 60
+# Number of days of inactivity before a stale issue is closed
+daysUntilClose: 7
+# Issues with these labels will never be considered stale
+exemptLabels:
+ - pinned
+ - security
+# Label to use when marking an issue as stale
+staleLabel: wontfix
+# Comment to post when marking an issue as stale. Set to `false` to disable
+markComment: >
+ This issue has been automatically marked as stale because it has not had
+ recent activity. It will be closed if no further activity occurs. Thank you
+ for your contributions.
+# Comment to post when closing a stale issue. Set to `false` to disable
+closeComment: false
From 44e8f229ee0b4a0d31871eedf96f57dd21382bee Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Thu, 8 Jul 2021 11:45:58 +0800
Subject: [PATCH 0030/1235] Update stale.yml
---
.github/stale.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/stale.yml b/.github/stale.yml
index dc90e5a1c3..e556fa9854 100644
--- a/.github/stale.yml
+++ b/.github/stale.yml
@@ -7,7 +7,7 @@ exemptLabels:
- pinned
- security
# Label to use when marking an issue as stale
-staleLabel: wontfix
+staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
From 69b9ec00683dfd290af52b33189dfbd5db99ffd4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=88=98=E5=B0=8F=E7=8B=BC=E7=8B=88?= <258392906@qq.com>
Date: Mon, 12 Jul 2021 12:17:16 +0800
Subject: [PATCH 0031/1235] =?UTF-8?q?:art:=20#2199=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91WxMaUserInfo=E7=B1=BB=E8=A1=A5?=
=?UTF-8?q?=E5=85=85openId=E5=92=8CunionId=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/binarywang/wx/miniapp/bean/WxMaUserInfo.java | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaUserInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaUserInfo.java
index 1e03e12bfd..e2f67a7718 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaUserInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaUserInfo.java
@@ -12,6 +12,7 @@
public class WxMaUserInfo implements Serializable {
private static final long serialVersionUID = 6719822331555402137L;
+ private String openId;
private String nickName;
private String gender;
private String language;
@@ -19,6 +20,10 @@ public class WxMaUserInfo implements Serializable {
private String province;
private String country;
private String avatarUrl;
+ /**
+ * 不绑定开放平台不会返回这个字段
+ */
+ private String unionId;
private Watermark watermark;
public static WxMaUserInfo fromJson(String json) {
From 2d2cf39f1cb0093bef4c45b8e4d8964937027b55 Mon Sep 17 00:00:00 2001
From: longliveh <35585613+longliveh@users.noreply.github.com>
Date: Tue, 13 Jul 2021 09:59:31 +0800
Subject: [PATCH 0032/1235] =?UTF-8?q?:new:=20#2201=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=20=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=89=93=E5=8D=A1=E8=AE=B0=E5=BD=95=E6=97=A5?=
=?UTF-8?q?=E6=8A=A5=E3=80=81=E8=8E=B7=E5=8F=96=E6=89=93=E5=8D=A1=E8=AE=B0?=
=?UTF-8?q?=E5=BD=95=E6=9C=88=E6=8A=A5=E3=80=81=E8=8E=B7=E5=8F=96=E6=89=93?=
=?UTF-8?q?=E5=8D=A1=E4=BA=BA=E5=91=98=E6=8E=92=E7=8F=AD=E4=BF=A1=E6=81=AF?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/cp/api/WxCpOaService.java | 54 ++-
.../weixin/cp/api/impl/WxCpOaServiceImpl.java | 111 ++++++
.../weixin/cp/bean/oa/WxCpCheckinDayData.java | 352 ++++++++++++++++++
.../cp/bean/oa/WxCpCheckinMonthData.java | 226 +++++++++++
.../cp/bean/oa/WxCpCheckinSchedule.java | 144 +++++++
.../weixin/cp/constant/WxCpApiPathConsts.java | 3 +
.../cp/api/impl/WxCpOaServiceImplTest.java | 46 +++
7 files changed, 927 insertions(+), 9 deletions(-)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinDayData.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinMonthData.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
index 1e9c6dd5e9..cf7dfc1f0e 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
@@ -26,7 +26,7 @@ public interface WxCpOaService {
*
*
* @param request 请求
- * @return 表单提交成功后,返回的表单编号
+ * @return 表单提交成功后 ,返回的表单编号
* @throws WxErrorException .
*/
String apply(WxCpOaApplyEventRequest request) throws WxErrorException;
@@ -41,7 +41,7 @@ public interface WxCpOaService {
* @param startTime 获取打卡记录的开始时间
* @param endTime 获取打卡记录的结束时间
* @param userIdList 需要获取打卡记录的用户列表
- * @return 打卡数据列表
+ * @return 打卡数据列表 checkin data
* @throws WxErrorException 异常
*/
List getCheckinData(Integer openCheckinDataType, Date startTime, Date endTime,
@@ -55,7 +55,7 @@ List getCheckinData(Integer openCheckinDataType, Date startTime
*
* @param datetime 需要获取规则的当天日期
* @param userIdList 需要获取打卡规则的用户列表
- * @return 打卡规则列表
+ * @return 打卡规则列表 checkin option
* @throws WxErrorException .
*/
List getCheckinOption(Date datetime, List userIdList) throws WxErrorException;
@@ -78,7 +78,7 @@ List getCheckinData(Integer openCheckinDataType, Date startTime
* @param cursor 分页查询游标,默认为0,后续使用返回的next_cursor进行分页拉取
* @param size 一次请求拉取审批单数量,默认值为100,上限值为100
* @param filters 筛选条件,可对批量拉取的审批申请设置约束条件,支持设置多个条件,nullable
- * @return WxCpApprovalInfo
+ * @return WxCpApprovalInfo approval info
* @throws WxErrorException .
*/
WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime, Integer cursor, Integer size,
@@ -89,9 +89,9 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
*
* @param startTime 开始时间
* @param endTime 结束时间
- * @return WxCpApprovalInfo
+ * @return WxCpApprovalInfo approval info
* @throws WxErrorException .
- * @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalInfo
+ * @see me.chanjar.weixin.cp.api.WxCpOaService#getApprovalInfo me.chanjar.weixin.cp.api.WxCpOaService#getApprovalInfo
*/
WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime) throws WxErrorException;
@@ -105,7 +105,7 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
*
*
* @param spNo 审批单编号。
- * @return WxCpApprovaldetail
+ * @return WxCpApprovaldetail approval detail
* @throws WxErrorException .
*/
WxCpApprovalDetailResult getApprovalDetail(@NonNull String spNo) throws WxErrorException;
@@ -117,7 +117,7 @@ WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
* @param endTime 查询的结束时间戳
* @param offset 分页查询的偏移量
* @param limit 分页查询的每页大小,默认为100条,如该参数大于100则按100处理
- * @return .
+ * @return . dial record
* @throws WxErrorException .
*/
List getDialRecord(Date startTime, Date endTime, Integer offset,
@@ -127,9 +127,45 @@ List getDialRecord(Date startTime, Date endTime, Integer offset,
* 获取审批模板详情
*
* @param templateId 模板ID
- * @return .
+ * @return . template detail
* @throws WxErrorException .
*/
WxCpTemplateResult getTemplateDetail(@NonNull String templateId) throws WxErrorException;
+
+ /**
+ * 获取打卡日报数据
+ *
+ * @param startTime 获取日报的开始时间
+ * @param endTime 获取日报的结束时间
+ * @param userIdList 获取日报的userid列表
+ * @return 日报数据列表 checkin day data
+ * @throws WxErrorException the wx error exception
+ */
+ List getCheckinDayData(Date startTime, Date endTime, List userIdList) throws WxErrorException;
+
+
+ /**
+ * 获取打卡月报数据
+ *
+ * @param startTime 获取月报的开始时间
+ * @param endTime 获取月报的结束时间
+ * @param userIdList 获取月报的userid列表
+ * @return 月报数据列表
+ * @throws WxErrorException the wx error exception
+ */
+ List getCheckinMonthData(Date startTime, Date endTime, List userIdList) throws WxErrorException;
+
+ /**
+ * 获取打卡人员排班信息
+ *
+ * @param startTime 获取排班信息的开始时间。Unix时间戳
+ * @param endTime 获取排班信息的结束时间。Unix时间戳(与starttime跨度不超过一个月)
+ * @param userIdList 需要获取排班信息的用户列表(不超过100个)
+ * @return 排班表信息
+ * @throws WxErrorException the wx error exception
+ */
+ WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException;
+
+
}
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 c5dc8faf34..94d5d27f75 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
@@ -212,4 +212,115 @@ public WxCpTemplateResult getTemplateDetail(@NonNull String templateId) throws W
String responseContent = this.mainService.post(url, jsonObject.toString());
return WxCpGsonBuilder.create().fromJson(responseContent, WxCpTemplateResult.class);
}
+
+ @Override
+ public List getCheckinDayData(Date startTime, Date endTime, List userIdList) throws WxErrorException {
+
+ if (startTime == null || endTime == null) {
+ throw new WxRuntimeException("starttime and endtime can't be null");
+ }
+
+ if (userIdList == null || userIdList.size() > USER_IDS_LIMIT) {
+ throw new WxRuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
+ }
+
+ long endTimestamp = endTime.getTime() / 1000L;
+ long startTimestamp = startTime.getTime() / 1000L;
+
+ JsonObject jsonObject = new JsonObject();
+ JsonArray jsonArray = new JsonArray();
+
+ jsonObject.addProperty("starttime", startTimestamp);
+ jsonObject.addProperty("endtime", endTimestamp);
+
+ for (String userid : userIdList) {
+ jsonArray.add(userid);
+ }
+ jsonObject.add("useridlist", jsonArray);
+
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_DAY_DATA);
+ String responseContent = this.mainService.post(url, jsonObject.toString());
+ JsonObject tmpJson = GsonParser.parse(responseContent);
+ return WxCpGsonBuilder.create()
+ .fromJson(
+ tmpJson.get("datas"),
+ new TypeToken>() {
+ }.getType()
+ );
+ }
+
+ @Override
+ public List getCheckinMonthData(Date startTime, Date endTime, List userIdList) throws WxErrorException {
+ if (startTime == null || endTime == null) {
+ throw new WxRuntimeException("starttime and endtime can't be null");
+ }
+
+ if (userIdList == null || userIdList.size() > USER_IDS_LIMIT) {
+ throw new WxRuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
+ }
+
+ long endTimestamp = endTime.getTime() / 1000L;
+ long startTimestamp = startTime.getTime() / 1000L;
+
+ JsonObject jsonObject = new JsonObject();
+ JsonArray jsonArray = new JsonArray();
+
+ jsonObject.addProperty("starttime", startTimestamp);
+ jsonObject.addProperty("endtime", endTimestamp);
+
+ for (String userid : userIdList) {
+ jsonArray.add(userid);
+ }
+ jsonObject.add("useridlist", jsonArray);
+
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_MONTH_DATA);
+ String responseContent = this.mainService.post(url, jsonObject.toString());
+ JsonObject tmpJson = GsonParser.parse(responseContent);
+ return WxCpGsonBuilder.create()
+ .fromJson(
+ tmpJson.get("datas"),
+ new TypeToken>() {
+ }.getType()
+ );
+ }
+
+ @Override
+ public WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException {
+ if (startTime == null || endTime == null) {
+ throw new WxRuntimeException("starttime and endtime can't be null");
+ }
+
+ if (userIdList == null || userIdList.size() > USER_IDS_LIMIT) {
+ throw new WxRuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
+ }
+
+
+ long endTimestamp = endTime.getTime() / 1000L;
+ long startTimestamp = startTime.getTime() / 1000L;
+
+ if (endTimestamp - startTimestamp < 0 || endTimestamp - startTimestamp >= MONTH_SECONDS) {
+ throw new WxRuntimeException("获取记录时间跨度不超过一个月");
+ }
+
+ JsonObject jsonObject = new JsonObject();
+ JsonArray jsonArray = new JsonArray();
+
+ jsonObject.addProperty("starttime", startTimestamp);
+ jsonObject.addProperty("endtime", endTimestamp);
+
+ for (String userid : userIdList) {
+ jsonArray.add(userid);
+ }
+ jsonObject.add("useridlist", jsonArray);
+
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_SCHEDULE_DATA);
+ String responseContent = this.mainService.post(url, jsonObject.toString());
+ JsonObject tmpJson = GsonParser.parse(responseContent);
+ return WxCpGsonBuilder.create()
+ .fromJson(
+ tmpJson,
+ new TypeToken() {
+ }.getType()
+ );
+ }
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinDayData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinDayData.java
new file mode 100644
index 0000000000..0c0bd8a07e
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinDayData.java
@@ -0,0 +1,352 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 企业微信打卡日报数据
+ *
+ */
+@Data
+public class WxCpCheckinDayData implements Serializable {
+
+ private static final long serialVersionUID = 5950483201268226746L;
+
+ /**
+ * base_info 基础信息
+ */
+ @SerializedName("base_info")
+ private BaseInfo baseInfo;
+
+ @Data
+ public class BaseInfo implements Serializable{
+
+
+ private static final long serialVersionUID = 3679745559788648438L;
+ /**
+ * date 日报日期 时间戳
+ */
+ @SerializedName("date")
+ private Integer date;
+
+ /**
+ * record_type 记录类型:1-固定上下班;2-外出(此报表中不会出现外出打卡数据);3-按班次上下班;4-自由签到;5-加班;7-无规则
+ */
+ @SerializedName("record_type")
+ private Integer recordType;
+
+ /**
+ * name 打卡人员姓名
+ */
+ @SerializedName("name")
+ private String name;
+
+ /**
+ * name_ex 打卡人员姓名
+ */
+ @SerializedName("name_ex")
+ private String nameEx;
+
+ /**
+ * departs_name 打卡人员所在部门,会显示所有所在部门
+ */
+ @SerializedName("departs_name")
+ private String departsName;
+
+ /**
+ * acctid 打卡人员帐号,即userid
+ */
+ @SerializedName("acctid")
+ private String acctId;
+
+ /**
+ * rule_info 打卡人员所属规则信息
+ */
+ @SerializedName("rule_info")
+ private RuleInfo ruleInfo;
+
+ @Data
+ public class RuleInfo implements Serializable {
+ private static final long serialVersionUID = -5512479811648914189L;
+ /**
+ * groupid 所属规则的id
+ */
+ @SerializedName("groupid")
+ private Integer groupId;
+
+ /**
+ * groupname 打卡规则名
+ */
+ @SerializedName("groupname")
+ private String groupName;
+
+ /**
+ * scheduleid 当日所属班次id,仅按班次上下班才有值,显示在打卡日报-班次列
+ */
+ @SerializedName("scheduleid")
+ private Integer scheduleId;
+
+ /**
+ * schedulename 当日所属班次名称,仅按班次上下班才有值,显示在打卡日报-班次列
+ */
+ @SerializedName("schedulename")
+ private String scheduleName;
+
+ /**
+ * checkintime 当日打卡时间,仅固定上下班规则有值,显示在打卡日报-班次列
+ */
+ @SerializedName("checkintime")
+ private List checkinTime;
+
+ @Data
+ public class CheckinTime implements Serializable{
+ private static final long serialVersionUID = 1582835435812966332L;
+ /**
+ * work_sec 上班时间,为距离0点的时间差
+ */
+ @SerializedName("work_sec")
+ private Integer workSec;
+
+ /**
+ * off_work_sec 下班时间,为距离0点的时间差
+ */
+ @SerializedName("off_work_sec")
+ private Integer offWorkSec;
+ }
+ }
+ /**
+ * day_type 日报类型:0-工作日日报;1-休息日日报
+ */
+ @SerializedName("day_type")
+ private Integer dayType;
+ }
+
+ /**
+ * summary_info 汇总信息
+ */
+ @SerializedName("summary_info")
+ private SummaryInfo summaryInfo;
+
+ @Data
+ public class SummaryInfo implements Serializable{
+ private static final long serialVersionUID = 3428576099259666595L;
+ /**
+ * checkin_count 当日打卡次数
+ */
+ @SerializedName("checkin_count")
+ private Integer checkinCount;
+
+ /**
+ * regular_work_sec 当日实际工作时长,单位:秒
+ */
+ @SerializedName("regular_work_sec")
+ private Integer regularWorkSec;
+
+ /**
+ * standard_work_sec 当日标准工作时长,单位:秒
+ */
+ @SerializedName("standard_work_sec")
+ private Integer standardWorkSec;
+
+ /**
+ * earliest_time 当日最早打卡时间
+ */
+ @SerializedName("earliest_time")
+ private Integer earliestTime;
+
+ /**
+ * lastest_time 当日最晚打卡时间
+ */
+ @SerializedName("lastest_time")
+ private Integer lastestTime;
+ }
+
+ /**
+ * holiday_infos 假勤相关信息
+ */
+ @SerializedName("holiday_infos")
+ private List holidayInfos;
+
+ @Data
+ public class HolidayInfos implements Serializable{
+ private static final long serialVersionUID = -6671577072585561527L;
+ /**
+ * sp_number 假勤相关信息
+ */
+ @SerializedName("sp_number")
+ private String spNumber;
+
+ /**
+ * sp_title 假勤信息摘要-标题信息
+ */
+ @SerializedName("sp_title")
+ private SpTitle spTitle;
+
+ @Data
+ public class SpTitle implements Serializable {
+ private static final long serialVersionUID = 2148815417115384998L;
+ /**
+ * data 多种语言描述,目前只有中文一种
+ */
+ @SerializedName("data")
+ private List data;
+
+ @lombok.Data
+ public class Data implements Serializable{
+ private static final long serialVersionUID = -1672692024530543180L;
+ /**
+ * text 假勤信息摘要-标题文本
+ */
+ @SerializedName("text")
+ private String text;
+
+ /**
+ * lang 语言类型:”zh_CN”
+ */
+ @SerializedName("lang")
+ private String lang;
+ }
+ }
+
+ /**
+ * sp_description 假勤信息摘要-描述信息
+ */
+ @SerializedName("sp_description")
+ private SpDescription spDescription;
+
+ @Data
+ public class SpDescription implements Serializable{
+
+ private static final long serialVersionUID = 77680581771933449L;
+ /**
+ * data 多种语言描述,目前只有中文一种
+ */
+ @SerializedName("data")
+ private List data;
+
+ @lombok.Data
+ public class Data implements Serializable{
+ private static final long serialVersionUID = 3555479101375365805L;
+ /**
+ * text 假勤信息摘要-标题文本
+ */
+ @SerializedName("text")
+ private String text;
+
+ /**
+ * lang 语言类型:”zh_CN”
+ */
+ @SerializedName("lang")
+ private String lang;
+ }
+ }
+ }
+
+ /**
+ * exception_infos 校准状态信息
+ */
+ @SerializedName("exception_infos")
+ private List exceptionInfos;
+
+ @Data
+ public class ExceptionInfos implements Serializable{
+ private static final long serialVersionUID = -5987438373762518299L;
+ /**
+ * exception 校准状态类型:1-迟到;2-早退;3-缺卡;4-旷工;5-地点异常;6-设备异常
+ */
+ @SerializedName("exception")
+ private Integer exception;
+
+ /**
+ * count 当日此异常的次数
+ */
+ @SerializedName("count")
+ private Integer count;
+
+ /**
+ * duration 当日此异常的时长(迟到/早退/旷工才有值)
+ */
+ @SerializedName("duration")
+ private Integer duration;
+ }
+
+ /**
+ * ot_info 加班信息
+ */
+ @SerializedName("ot_info")
+ private OtInfo otInfo;
+
+ @Data
+ public class OtInfo implements Serializable{
+ private static final long serialVersionUID = -6557759801572150175L;
+ /**
+ * ot_status 状态:0-无加班;1-正常;2-缺时长
+ */
+ @SerializedName("ot_status")
+ private Integer otStatus;
+
+ /**
+ * ot_duration 加班时长
+ */
+ @SerializedName("ot_duration")
+ private Integer otDuration;
+
+ /**
+ * exception_duration ot_status为2下,加班不足的时长
+ */
+ @SerializedName("exception_duration")
+ private List exceptionDuration;
+ }
+
+ /**
+ * sp_items 假勤统计信息
+ */
+ @SerializedName("sp_items")
+ private List spItems;
+
+ @Data
+ public class SpItem implements Serializable{
+ private static final long serialVersionUID = 2423158264958352024L;
+ /**
+ * type 类型:1-请假;2-补卡;3-出差;4-外出;100-外勤
+ */
+ @SerializedName("type")
+ private Integer type;
+
+ /**
+ * vacation_id 具体请假类型,当type为1请假时,具体的请假类型id,可通过审批相关接口获取假期详情
+ */
+ @SerializedName("vacation_id")
+ private Integer vacationId;
+
+ /**
+ * count 当日假勤次数
+ */
+ @SerializedName("count")
+ private Integer count;
+
+ /**
+ * duration 当日假勤时长秒数,时长单位为天直接除以86400即为天数,单位为小时直接除以3600即为小时数
+ */
+ @SerializedName("duration")
+ private Integer duration;
+
+ /**
+ * time_type 时长单位:0-按天 1-按小时
+ */
+ @SerializedName("time_type")
+ private Integer timeType;
+
+ /**
+ * name 统计项名称
+ */
+ @SerializedName("name")
+ private String name;
+
+
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinMonthData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinMonthData.java
new file mode 100644
index 0000000000..003c68d2e2
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinMonthData.java
@@ -0,0 +1,226 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 企业微信打卡月报数据
+ */
+
+@Data
+public class WxCpCheckinMonthData implements Serializable {
+ private static final long serialVersionUID = -3062328201807894236L;
+
+ /**
+ * baseInfo 基础信息
+ */
+ @SerializedName("base_info")
+ private BaseInfo baseInfo;
+
+ @Data
+ public class BaseInfo implements Serializable {
+ private static final long serialVersionUID = -5368331890851903885L;
+ /**
+ * record_type 记录类型:1-固定上下班;2-外出(此报表中不会出现外出打卡数据);3-按班次上下班;4-自由签到;5-加班;7-无规则
+ */
+ @SerializedName("record_type")
+ private Integer recordType;
+
+ /**
+ * name 打卡人员姓名
+ */
+ @SerializedName("name")
+ private String name;
+
+ /**
+ * name_ex 打卡人员别名
+ */
+ @SerializedName("name_ex")
+ private String nameEx;
+
+ /**
+ * departs_name 打卡人员所在部门,会显示所有所在部门
+ */
+ @SerializedName("departs_name")
+ private String departsName;
+
+ /**
+ * acctid 打卡人员帐号,即userid
+ */
+ @SerializedName("acctid")
+ private String acctId;
+
+ /**
+ * rule_info 打卡人员所属规则信息
+ */
+ @SerializedName("rule_info")
+ private RuleInfo ruleInfo;
+
+ @Data
+ public class RuleInfo implements Serializable {
+ private static final long serialVersionUID = 9152263355916880710L;
+ /**
+ * groupid 所属规则Id
+ */
+ @SerializedName("groupid")
+ private Integer groupId;
+
+ /**
+ * groupname 所属规则Id
+ */
+ @SerializedName("groupname")
+ private String groupName;
+ }
+ }
+
+
+
+
+
+ /**
+ * summary_info 打卡人员所属规则信息
+ */
+ @SerializedName("summary_info")
+ private SummaryInfo summaryInfo;
+
+ @Data
+ public class SummaryInfo implements Serializable {
+ private static final long serialVersionUID = -1956770107240513983L;
+ /**
+ * work_days 应打卡天数
+ */
+ @SerializedName("work_days")
+ private Integer workDays;
+
+ /**
+ * regular_days 正常天数
+ */
+ @SerializedName("regular_days")
+ private Integer regularDays;
+
+ /**
+ * except_days 异常天数
+ */
+ @SerializedName("except_days")
+ private Integer exceptDays;
+
+ /**
+ * regular_work_sec 实际工作时长,为统计周期每日实际工作时长之和
+ */
+ @SerializedName("regular_work_sec")
+ private Integer regularWorkSec;
+
+ /**
+ * standard_work_sec 正常天数
+ */
+ @SerializedName("standard_work_sec")
+ private Integer standardWorkSec;
+
+ }
+
+ /**
+ * exception_infos 异常状态统计信息
+ */
+ @SerializedName("exception_infos")
+ private List exceptionInfos;
+
+ @Data
+ public class ExceptionInfo implements Serializable {
+ private static final long serialVersionUID = -4855850255704089359L;
+ /**
+ * exception 异常类型:1-迟到;2-早退;3-缺卡;4-旷工;5-地点异常;6-设备异常
+ */
+ @SerializedName("exception")
+ private Integer exception;
+
+ /**
+ * count 异常次数,为统计周期内每日此异常次数之和
+ */
+ @SerializedName("count")
+ private Integer count;
+
+ /**
+ * duration 异常时长(迟到/早退/旷工才有值),为统计周期内每日此异常时长之和
+ */
+ @SerializedName("duration")
+ private Integer duration;
+ }
+
+ /**
+ * sp_items 假勤统计信息
+ */
+ @SerializedName("sp_items")
+ private List spItems;
+
+ @Data
+ public class SpItem implements Serializable {
+
+ private static final long serialVersionUID = 224472626753597080L;
+ /**
+ * type 假勤类型:1-请假;2-补卡;3-出差;4-外出;100-外勤
+ */
+ @SerializedName("type")
+ private Integer type;
+
+ /**
+ * vacation_id 具体请假类型,当type为1请假时,具体的请假类型id,可通过审批相关接口获取假期详情
+ */
+ @SerializedName("vacation_id")
+ private Integer vacationId;
+
+ /**
+ * count 假勤次数,为统计周期内每日此假勤发生次数之和
+ */
+ @SerializedName("count")
+ private Integer count;
+
+ /**
+ * duration 假勤时长,为统计周期内每日此假勤发生时长之和,时长单位为天直接除以86400即为天数,单位为小时直接除以3600即为小时数
+ */
+ @SerializedName("duration")
+ private Integer duration;
+
+ /**
+ * time_type 时长单位:0-按天 1-按小时
+ */
+ @SerializedName("time_type")
+ private Integer timeType;
+
+ /**
+ * name 统计项名称
+ */
+ @SerializedName("name")
+ private String name;
+ }
+
+ /**
+ * overwork_info 加班情况
+ */
+ @SerializedName("overwork_info")
+ private OverWorkInfo overworkInfo;
+
+ @Data
+ public class OverWorkInfo implements Serializable {
+ private static final long serialVersionUID = -9149524232645899305L;
+ /**
+ * workday_over_sec 工作日加班时长
+ */
+ @SerializedName("workday_over_sec")
+ private Integer workdayOverSec;
+
+ /**
+ * holidays_over_sec 节假日加班时长
+ */
+ @SerializedName("holidays_over_sec")
+ private Integer holidaysOverSec;
+
+ /**
+ * restdays_over_sec 休息日加班时长
+ */
+ @SerializedName("restdays_over_sec")
+ private Integer restdaysOverSec;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java
new file mode 100644
index 0000000000..02b55f974f
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java
@@ -0,0 +1,144 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 打卡人员排班信息
+ */
+@Data
+public class WxCpCheckinSchedule implements Serializable {
+
+ private static final long serialVersionUID = 5399197385827384108L;
+
+ /**
+ * schedule_list 排班表信息
+ */
+ @SerializedName("schedule_list")
+ private List scheduleList;
+
+ @Data
+ public class UserScheduleInfo implements Serializable {
+ private static final long serialVersionUID = 5515056962298169806L;
+ /**
+ * userid 打卡人员userid
+ */
+ @SerializedName("userid")
+ private String userid;
+
+ /**
+ * yearmonth 排班表月份,格式为年月,如202011
+ */
+ @SerializedName("yearmonth")
+ private Integer yearmonth;
+
+ /**
+ * groupid 打卡规则id
+ */
+ @SerializedName("groupid")
+ private Integer groupid;
+
+ /**
+ * groupname 打卡规则名
+ */
+ @SerializedName("groupname")
+ private String groupName;
+
+ /**
+ * schedule 个人排班信息
+ */
+ @SerializedName("schedule")
+ private UserSchedule schedule;
+
+ @Data
+ public class UserSchedule implements Serializable {
+ private static final long serialVersionUID = 9138985222324576857L;
+ /**
+ * scheduleList 个人排班表信息
+ */
+ @SerializedName("scheduleList")
+ private List scheduleList;
+
+ @Data
+ public class Schedule implements Serializable{
+
+ private static final long serialVersionUID = 8344153237512495728L;
+
+ /**
+ * day 排班日期,为表示当月第几天的数字
+ */
+ @SerializedName("day")
+ private Integer day;
+
+ /**
+ * schedule_info 排班日期,为表示当月第几天的数字
+ */
+ @SerializedName("schedule_info")
+ private ScheduleInfo scheduleInfo;
+
+ @Data
+ public class ScheduleInfo implements Serializable {
+ private static final long serialVersionUID = 1317096341116256963L;
+ /**
+ * schedule_id 当日安排班次id,班次id也可在打卡规则中查询获得
+ */
+ @SerializedName("schedule_id")
+ private Integer scheduleId;
+
+ /**
+ * schedule_name 排班日期,为表示当月第几天的数字
+ */
+ @SerializedName("schedule_name")
+ private String scheduleName;
+
+ /**
+ * time_section 排班日期,为表示当月第几天的数字
+ */
+ @SerializedName("time_section")
+ private List timeSection;
+
+
+ @Data
+ public class TimeSection implements Serializable {
+ private static final long serialVersionUID = -3447467962751285748L;
+ /**
+ * id 时段id,为班次中某一堆上下班时间组合的id
+ */
+ @SerializedName("id")
+ private Integer id;
+
+ /**
+ * work_sec 上班时间。距当天00:00的秒数
+ */
+ @SerializedName("work_sec")
+ private Integer workSec;
+
+ /**
+ * off_work_sec 下班时间。距当天00:00的秒数
+ */
+ @SerializedName("off_work_sec")
+ private Integer offWorkSec;
+
+ /**
+ * remind_work_sec 上班提醒时间。距当天00:00的秒数
+ */
+ @SerializedName("remind_work_sec")
+ private Integer remindWorkSec;
+
+ /**
+ * remind_off_work_sec 下班提醒时间。距当天00:00的秒数
+ */
+ @SerializedName("remind_off_work_sec")
+ private Integer remindOffWorkSec;
+ }
+ }
+ }
+
+
+ }
+ }
+}
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 c60a1bddbd..7ca857476b 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
@@ -93,6 +93,9 @@ interface Menu {
interface Oa {
String GET_CHECKIN_DATA = "/cgi-bin/checkin/getcheckindata";
String GET_CHECKIN_OPTION = "/cgi-bin/checkin/getcheckinoption";
+ String GET_CHECKIN_DAY_DATA = "/cgi-bin/checkin/getcheckin_daydata";
+ String GET_CHECKIN_MONTH_DATA = "/cgi-bin/checkin/getcheckin_monthdata";
+ String GET_CHECKIN_SCHEDULE_DATA = "/cgi-bin/checkin/getcheckinschedulist";
String GET_APPROVAL_INFO = "/cgi-bin/oa/getapprovalinfo";
String GET_APPROVAL_DETAIL = "/cgi-bin/oa/getapprovaldetail";
String GET_DIAL_RECORD = "/cgi-bin/dial/get_dial_record";
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
index 758f77970e..968109f591 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
@@ -1,11 +1,15 @@
package me.chanjar.weixin.cp.api.impl;
import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
import com.google.inject.Inject;
import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.cp.api.ApiTestModule;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.oa.*;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
@@ -47,6 +51,48 @@ public void testGetCheckinData() throws ParseException, WxErrorException {
}
+ @Test
+ public void testGetCheckinDayData() throws ParseException, WxErrorException {
+ Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-01");
+ Date endTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-31");
+
+ List results = wxService.getOaService()
+ .getCheckinDayData(startTime, endTime, Lists.newArrayList("12003648"));
+
+ assertThat(results).isNotNull();
+
+
+ System.out.println("results ");
+ System.out.println(gson.toJson(results));
+
+ }
+
+ @Test
+ public void testGetCheckinMonthData() throws ParseException, WxErrorException {
+ Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-01");
+ Date endTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-31");
+
+ List results = wxService.getOaService()
+ .getCheckinMonthData(startTime, endTime, Lists.newArrayList("12003648"));
+
+ assertThat(results).isNotNull();
+ System.out.println("results ");
+ System.out.println(gson.toJson(results));
+ }
+
+ @Test
+ public void testGetCheckinScheduleData() throws ParseException, WxErrorException {
+ Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-01");
+ Date endTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-31");
+
+ WxCpCheckinSchedule results = wxService.getOaService()
+ .getCheckinScheduleList(startTime, endTime, Lists.newArrayList("12003648"));
+
+ assertThat(results).isNotNull();
+ System.out.println("results ");
+ System.out.println(gson.toJson(results));
+ }
+
@Test
public void testGetCheckinOption() throws WxErrorException {
From 737d75964b2c31ab2164eaad728357c6b1a9a0c3 Mon Sep 17 00:00:00 2001
From: tangliu
Date: Tue, 13 Jul 2021 10:00:26 +0800
Subject: [PATCH 0033/1235] =?UTF-8?q?:bug:=20=20#2200=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E4=BF=AE=E5=A4=8D=E8=8E=B7=E5=8F=96?=
=?UTF-8?q?AccessToken=E6=97=B6ApiHostUrl=E6=9C=AA=E7=94=9F=E6=95=88?=
=?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/impl/WxMaServiceHttpClientImpl.java | 8 +++++++-
.../wx/miniapp/api/impl/WxMaServiceJoddHttpImpl.java | 7 ++++++-
.../wx/miniapp/api/impl/WxMaServiceOkHttpImpl.java | 7 ++++++-
3 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceHttpClientImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceHttpClientImpl.java
index c69772a5d8..6914977861 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceHttpClientImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceHttpClientImpl.java
@@ -6,6 +6,7 @@
import me.chanjar.weixin.common.util.http.HttpType;
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder;
+import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
@@ -60,7 +61,12 @@ public HttpType getRequestType() {
@Override
protected String doGetAccessTokenRequest() throws IOException {
- String url = String.format(WxMaService.GET_ACCESS_TOKEN_URL, this.getWxMaConfig().getAppid(), this.getWxMaConfig().getSecret());
+
+ String url = StringUtils.isNotEmpty(this.getWxMaConfig().getApiHostUrl()) ?
+ WxMaService.GET_ACCESS_TOKEN_URL.replace("https://api.weixin.qq.com", this.getWxMaConfig().getApiHostUrl()) :
+ WxMaService.GET_ACCESS_TOKEN_URL;
+
+ url = String.format(url, this.getWxMaConfig().getAppid(), this.getWxMaConfig().getSecret());
HttpGet httpGet = null;
CloseableHttpResponse response = null;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceJoddHttpImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceJoddHttpImpl.java
index 984d0d3fe6..90ee6516ae 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceJoddHttpImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceJoddHttpImpl.java
@@ -7,6 +7,7 @@
import jodd.http.ProxyInfo;
import jodd.http.net.SocketHttpConnectionProvider;
import me.chanjar.weixin.common.util.http.HttpType;
+import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
@@ -45,7 +46,11 @@ public HttpType getRequestType() {
@Override
protected String doGetAccessTokenRequest() throws IOException {
- String url = String.format(WxMaService.GET_ACCESS_TOKEN_URL, this.getWxMaConfig().getAppid(), this.getWxMaConfig().getSecret());
+ String url = StringUtils.isNotEmpty(this.getWxMaConfig().getApiHostUrl()) ?
+ WxMaService.GET_ACCESS_TOKEN_URL.replace("https://api.weixin.qq.com", this.getWxMaConfig().getApiHostUrl()) :
+ WxMaService.GET_ACCESS_TOKEN_URL;
+
+ url = String.format(url, this.getWxMaConfig().getAppid(), this.getWxMaConfig().getSecret());
HttpRequest request = HttpRequest.get(url);
if (this.getRequestHttpProxy() != null) {
SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider();
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceOkHttpImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceOkHttpImpl.java
index a36444d97a..0fa49d9d07 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceOkHttpImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceOkHttpImpl.java
@@ -5,6 +5,7 @@
import me.chanjar.weixin.common.util.http.HttpType;
import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
import okhttp3.*;
+import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.Objects;
@@ -63,7 +64,11 @@ public HttpType getRequestType() {
@Override
protected String doGetAccessTokenRequest() throws IOException {
- String url = String.format(WxMaService.GET_ACCESS_TOKEN_URL, this.getWxMaConfig().getAppid(), this.getWxMaConfig().getSecret());
+ String url = StringUtils.isNotEmpty(this.getWxMaConfig().getApiHostUrl()) ?
+ WxMaService.GET_ACCESS_TOKEN_URL.replace("https://api.weixin.qq.com", this.getWxMaConfig().getApiHostUrl()) :
+ WxMaService.GET_ACCESS_TOKEN_URL;
+
+ url = String.format(url, this.getWxMaConfig().getAppid(), this.getWxMaConfig().getSecret());
Request request = new Request.Builder().url(url).get().build();
try (Response response = getRequestHttpClient().newCall(request).execute()) {
return Objects.requireNonNull(response.body()).string();
From 72205bbf16c169d791d6d4dc04be1447a969bd28 Mon Sep 17 00:00:00 2001
From: Leeway
Date: Sun, 18 Jul 2021 23:02:00 +0800
Subject: [PATCH 0034/1235] =?UTF-8?q?:art:=20#2209=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E8=8E=B7=E5=8F=96=E5=AE=A2?=
=?UTF-8?q?=E6=88=B7=E7=BE=A4=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E7=BE=A4=E6=98=B5=E7=A7=B0=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/api/WxCpExternalContactService.java | 20 ++++++++++++++--
.../impl/WxCpExternalContactServiceImpl.java | 23 +++++++++++++++++--
.../WxCpUserExternalGroupChatInfo.java | 14 +++++++++++
3 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
index c4fe3b9942..0f06a9adba 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
@@ -3,7 +3,23 @@
import lombok.NonNull;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
-import me.chanjar.weixin.cp.bean.external.*;
+import me.chanjar.weixin.cp.bean.external.WxCpContactWayInfo;
+import me.chanjar.weixin.cp.bean.external.WxCpContactWayResult;
+import me.chanjar.weixin.cp.bean.external.WxCpMsgTemplate;
+import me.chanjar.weixin.cp.bean.external.WxCpMsgTemplateAddResult;
+import me.chanjar.weixin.cp.bean.external.WxCpUpdateRemarkRequest;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalGroupChatInfo;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalGroupChatList;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalGroupChatStatistic;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalGroupChatTransferResp;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalTagGroupInfo;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalTagGroupList;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalUnassignList;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalUserBehaviorStatistic;
+import me.chanjar.weixin.cp.bean.external.WxCpUserTransferCustomerReq;
+import me.chanjar.weixin.cp.bean.external.WxCpUserTransferCustomerResp;
+import me.chanjar.weixin.cp.bean.external.WxCpUserTransferResultResp;
+import me.chanjar.weixin.cp.bean.external.WxCpWelcomeMsg;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactBatchInfo;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactInfo;
import org.jetbrains.annotations.NotNull;
@@ -362,7 +378,7 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* @return group chat
* @throws WxErrorException the wx error exception
*/
- WxCpUserExternalGroupChatInfo getGroupChat(String chatId) throws WxErrorException;
+ WxCpUserExternalGroupChatInfo getGroupChat(String chatId, Integer needName) throws WxErrorException;
/**
*
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
index eec72ef916..60c7c068ba 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
@@ -12,7 +12,25 @@
import me.chanjar.weixin.cp.api.WxCpExternalContactService;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
-import me.chanjar.weixin.cp.bean.external.*;
+import me.chanjar.weixin.cp.bean.external.WxCpContactWayInfo;
+import me.chanjar.weixin.cp.bean.external.WxCpContactWayResult;
+import me.chanjar.weixin.cp.bean.external.WxCpMsgTemplate;
+import me.chanjar.weixin.cp.bean.external.WxCpMsgTemplateAddResult;
+import me.chanjar.weixin.cp.bean.external.WxCpUpdateRemarkRequest;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalContactList;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalGroupChatInfo;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalGroupChatList;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalGroupChatStatistic;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalGroupChatTransferResp;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalTagGroupInfo;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalTagGroupList;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalUnassignList;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalUserBehaviorStatistic;
+import me.chanjar.weixin.cp.bean.external.WxCpUserTransferCustomerReq;
+import me.chanjar.weixin.cp.bean.external.WxCpUserTransferCustomerResp;
+import me.chanjar.weixin.cp.bean.external.WxCpUserTransferResultResp;
+import me.chanjar.weixin.cp.bean.external.WxCpUserWithExternalPermission;
+import me.chanjar.weixin.cp.bean.external.WxCpWelcomeMsg;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactBatchInfo;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactInfo;
import org.apache.commons.lang3.ArrayUtils;
@@ -267,9 +285,10 @@ public WxCpUserExternalGroupChatList listGroupChat(Integer limit, String cursor,
}
@Override
- public WxCpUserExternalGroupChatInfo getGroupChat(String chatId) throws WxErrorException {
+ public WxCpUserExternalGroupChatInfo getGroupChat(String chatId, Integer needName) throws WxErrorException {
JsonObject json = new JsonObject();
json.addProperty("chat_id", chatId);
+ json.addProperty("need_name", needName);
final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GROUP_CHAT_INFO);
final String result = this.mainService.post(url, json.toString());
return WxCpUserExternalGroupChatInfo.fromJson(result);
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java
index 2982f6d426..335c2e5c5a 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java
@@ -83,6 +83,20 @@ public static class GroupMember implements Serializable {
@SerializedName("join_scene")
private int joinScene;
+ /**
+ * 在群里的昵称
+ */
+ @SerializedName("group_nickname")
+ private String groupNickname;
+
+ /**
+ * 名字。仅当 need_name = 1 时返回
+ * 如果是微信用户,则返回其在微信中设置的名字
+ * 如果是企业微信联系人,则返回其设置对外展示的别名或实名
+ */
+ @SerializedName("name")
+ private String name;
+
/**
* 邀请者。目前仅当是由本企业内部成员邀请入群时会返回该值
*/
From d3730b361d504cf91848d7b1801d137a9d3ebc82 Mon Sep 17 00:00:00 2001
From: longliveh <35585613+longliveh@users.noreply.github.com>
Date: Sun, 18 Jul 2021 23:03:55 +0800
Subject: [PATCH 0035/1235] =?UTF-8?q?:bug:=20#2208=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=20=E8=8E=B7=E5=8F=96?=
=?UTF-8?q?=E6=89=93=E5=8D=A1=E4=BA=BA=E5=91=98=E6=8E=92=E7=8F=AD=E4=BF=A1?=
=?UTF-8?q?=E6=81=AF=E6=8E=A5=E5=8F=A3=E4=BF=AE=E5=A4=8D=E8=BF=94=E5=9B=9E?=
=?UTF-8?q?=E7=BB=93=E6=9E=9C=E7=B1=BB=E7=BB=93=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/cp/api/WxCpOaService.java | 2 +-
.../weixin/cp/api/impl/WxCpOaServiceImpl.java | 9 +-
.../cp/bean/oa/WxCpCheckinSchedule.java | 172 +++++++++---------
.../cp/api/impl/WxCpOaServiceImplTest.java | 2 +-
4 files changed, 86 insertions(+), 99 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
index cf7dfc1f0e..1dc7550597 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
@@ -165,7 +165,7 @@ List getDialRecord(Date startTime, Date endTime, Integer offset,
* @return 排班表信息
* @throws WxErrorException the wx error exception
*/
- WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException;
+ List getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException;
}
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 94d5d27f75..adb558ded6 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
@@ -285,7 +285,7 @@ public List getCheckinMonthData(Date startTime, Date endTi
}
@Override
- public WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException {
+ public List getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException {
if (startTime == null || endTime == null) {
throw new WxRuntimeException("starttime and endtime can't be null");
}
@@ -298,9 +298,6 @@ public WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime,
long endTimestamp = endTime.getTime() / 1000L;
long startTimestamp = startTime.getTime() / 1000L;
- if (endTimestamp - startTimestamp < 0 || endTimestamp - startTimestamp >= MONTH_SECONDS) {
- throw new WxRuntimeException("获取记录时间跨度不超过一个月");
- }
JsonObject jsonObject = new JsonObject();
JsonArray jsonArray = new JsonArray();
@@ -318,8 +315,8 @@ public WxCpCheckinSchedule getCheckinScheduleList(Date startTime, Date endTime,
JsonObject tmpJson = GsonParser.parse(responseContent);
return WxCpGsonBuilder.create()
.fromJson(
- tmpJson,
- new TypeToken() {
+ tmpJson.get("schedule_list"),
+ new TypeToken>() {
}.getType()
);
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java
index 02b55f974f..9517a64d4d 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinSchedule.java
@@ -13,132 +13,122 @@
@Data
public class WxCpCheckinSchedule implements Serializable {
- private static final long serialVersionUID = 5399197385827384108L;
+ private static final long serialVersionUID = 5515056962298169806L;
/**
- * schedule_list 排班表信息
+ * userid 打卡人员userid
*/
- @SerializedName("schedule_list")
- private List scheduleList;
+ @SerializedName("userid")
+ private String userid;
- @Data
- public class UserScheduleInfo implements Serializable {
- private static final long serialVersionUID = 5515056962298169806L;
- /**
- * userid 打卡人员userid
- */
- @SerializedName("userid")
- private String userid;
+ /**
+ * yearmonth 排班表月份,格式为年月,如202011
+ */
+ @SerializedName("yearmonth")
+ private Integer yearmonth;
- /**
- * yearmonth 排班表月份,格式为年月,如202011
- */
- @SerializedName("yearmonth")
- private Integer yearmonth;
+ /**
+ * groupid 打卡规则id
+ */
+ @SerializedName("groupid")
+ private Integer groupid;
- /**
- * groupid 打卡规则id
- */
- @SerializedName("groupid")
- private Integer groupid;
+ /**
+ * groupname 打卡规则名
+ */
+ @SerializedName("groupname")
+ private String groupName;
- /**
- * groupname 打卡规则名
- */
- @SerializedName("groupname")
- private String groupName;
+ /**
+ * schedule 个人排班信息
+ */
+ @SerializedName("schedule")
+ private UserSchedule schedule;
+ @Data
+ public class UserSchedule implements Serializable {
+ private static final long serialVersionUID = 9138985222324576857L;
/**
- * schedule 个人排班信息
+ * scheduleList 个人排班表信息
*/
- @SerializedName("schedule")
- private UserSchedule schedule;
+ @SerializedName("scheduleList")
+ private List scheduleList;
@Data
- public class UserSchedule implements Serializable {
- private static final long serialVersionUID = 9138985222324576857L;
+ public class Schedule implements Serializable {
+
+ private static final long serialVersionUID = 8344153237512495728L;
+
/**
- * scheduleList 个人排班表信息
+ * day 排班日期,为表示当月第几天的数字
*/
- @SerializedName("scheduleList")
- private List scheduleList;
+ @SerializedName("day")
+ private Integer day;
- @Data
- public class Schedule implements Serializable{
+ /**
+ * schedule_info 排班日期,为表示当月第几天的数字
+ */
+ @SerializedName("schedule_info")
+ private ScheduleInfo scheduleInfo;
- private static final long serialVersionUID = 8344153237512495728L;
+ @Data
+ public class ScheduleInfo implements Serializable {
+ private static final long serialVersionUID = 1317096341116256963L;
+ /**
+ * schedule_id 当日安排班次id,班次id也可在打卡规则中查询获得
+ */
+ @SerializedName("schedule_id")
+ private Integer scheduleId;
/**
- * day 排班日期,为表示当月第几天的数字
+ * schedule_name 排班日期,为表示当月第几天的数字
*/
- @SerializedName("day")
- private Integer day;
+ @SerializedName("schedule_name")
+ private String scheduleName;
/**
- * schedule_info 排班日期,为表示当月第几天的数字
+ * time_section 排班日期,为表示当月第几天的数字
*/
- @SerializedName("schedule_info")
- private ScheduleInfo scheduleInfo;
+ @SerializedName("time_section")
+ private List timeSection;
+
@Data
- public class ScheduleInfo implements Serializable {
- private static final long serialVersionUID = 1317096341116256963L;
+ public class TimeSection implements Serializable {
+ private static final long serialVersionUID = -3447467962751285748L;
/**
- * schedule_id 当日安排班次id,班次id也可在打卡规则中查询获得
+ * id 时段id,为班次中某一堆上下班时间组合的id
*/
- @SerializedName("schedule_id")
- private Integer scheduleId;
+ @SerializedName("id")
+ private Integer id;
/**
- * schedule_name 排班日期,为表示当月第几天的数字
+ * work_sec 上班时间。距当天00:00的秒数
*/
- @SerializedName("schedule_name")
- private String scheduleName;
+ @SerializedName("work_sec")
+ private Integer workSec;
/**
- * time_section 排班日期,为表示当月第几天的数字
+ * off_work_sec 下班时间。距当天00:00的秒数
*/
- @SerializedName("time_section")
- private List timeSection;
-
-
- @Data
- public class TimeSection implements Serializable {
- private static final long serialVersionUID = -3447467962751285748L;
- /**
- * id 时段id,为班次中某一堆上下班时间组合的id
- */
- @SerializedName("id")
- private Integer id;
-
- /**
- * work_sec 上班时间。距当天00:00的秒数
- */
- @SerializedName("work_sec")
- private Integer workSec;
-
- /**
- * off_work_sec 下班时间。距当天00:00的秒数
- */
- @SerializedName("off_work_sec")
- private Integer offWorkSec;
-
- /**
- * remind_work_sec 上班提醒时间。距当天00:00的秒数
- */
- @SerializedName("remind_work_sec")
- private Integer remindWorkSec;
-
- /**
- * remind_off_work_sec 下班提醒时间。距当天00:00的秒数
- */
- @SerializedName("remind_off_work_sec")
- private Integer remindOffWorkSec;
- }
+ @SerializedName("off_work_sec")
+ private Integer offWorkSec;
+
+ /**
+ * remind_work_sec 上班提醒时间。距当天00:00的秒数
+ */
+ @SerializedName("remind_work_sec")
+ private Integer remindWorkSec;
+
+ /**
+ * remind_off_work_sec 下班提醒时间。距当天00:00的秒数
+ */
+ @SerializedName("remind_off_work_sec")
+ private Integer remindOffWorkSec;
}
}
+ }
- }
}
}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
index 968109f591..55c773305d 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
@@ -85,7 +85,7 @@ public void testGetCheckinScheduleData() throws ParseException, WxErrorException
Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-01");
Date endTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-31");
- WxCpCheckinSchedule results = wxService.getOaService()
+ List results = wxService.getOaService()
.getCheckinScheduleList(startTime, endTime, Lists.newArrayList("12003648"));
assertThat(results).isNotNull();
From 9e3f256032a0ba5cdc356c5d88417bd3b57ae9d0 Mon Sep 17 00:00:00 2001
From: hywr <33077958+hywr@users.noreply.github.com>
Date: Sun, 18 Jul 2021 23:04:48 +0800
Subject: [PATCH 0036/1235] =?UTF-8?q?:new:=20#2206=20=E3=80=90=E5=BC=80?=
=?UTF-8?q?=E6=94=BE=E5=B9=B3=E5=8F=B0=E3=80=91=E5=A2=9E=E5=8A=A0=E7=AC=AC?=
=?UTF-8?q?=E4=B8=89=E6=96=B9=E5=B9=B3=E5=8F=B0=E5=90=AF=E5=8A=A8ticket?=
=?UTF-8?q?=E6=8E=A8=E9=80=81=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../open/api/WxOpenComponentService.java | 15 +-
.../api/impl/WxOpenComponentServiceImpl.java | 11 +
.../impl/WxOpenComponentServiceImplTest.java | 236 ++++++++++--------
.../weixin/open/test/ApiTestModule.java | 2 +
4 files changed, 150 insertions(+), 114 deletions(-)
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index 9c771c3924..48f727ac3b 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -1,10 +1,8 @@
package me.chanjar.weixin.open.api;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
-import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
-import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.open.bean.WxOpenCreateResult;
@@ -31,6 +29,10 @@ public interface WxOpenComponentService {
* The constant API_COMPONENT_TOKEN_URL.
*/
String API_COMPONENT_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/component/api_component_token";
+ /**
+ * 启动ticket推送服务
+ */
+ String API_START_PUSH_TICKET = "https://api.weixin.qq.com/cgi-bin/component/api_start_push_ticket";
/**
* The constant API_CREATE_PREAUTHCODE_URL.
*/
@@ -220,6 +222,13 @@ public interface WxOpenComponentService {
*/
boolean checkSignature(String timestamp, String nonce, String signature);
+ /**
+ * 启动ticket推送服务 该 API 用于启动ticket推送服务
+ *
+ * @throws WxErrorException 如果调用失败返回此异常
+ */
+ void startPushTicket() throws WxErrorException;
+
/**
* Gets component access token.
*
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 e745b493a6..f3ca14696a 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
@@ -149,6 +149,17 @@ public boolean checkSignature(String timestamp, String nonce, String signature)
}
}
+ @Override
+ public void startPushTicket() throws WxErrorException {
+ WxOpenConfigStorage config = getWxOpenConfigStorage();
+
+ JsonObject json = new JsonObject();
+ json.addProperty("component_appid", config.getComponentAppId());
+ json.addProperty("component_secret", config.getComponentAppSecret());
+
+ getWxOpenService().post(API_START_PUSH_TICKET, json.toString());
+ }
+
@Override
public String getComponentAccessToken(boolean forceRefresh) throws WxErrorException {
final WxOpenConfigStorage config = this.getWxOpenConfigStorage();
diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java
index 47a5069f24..c9fefec022 100644
--- a/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java
+++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java
@@ -1,5 +1,10 @@
package me.chanjar.weixin.open.api.impl;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.api.WxOpenComponentService;
+import me.chanjar.weixin.open.test.ApiTestModule;
+import org.testng.annotations.Guice;
import org.testng.annotations.Test;
/**
@@ -8,153 +13,162 @@
* @author Binary Wang
* @date 2020-06-06
*/
+@Guice(modules = ApiTestModule.class)
public class WxOpenComponentServiceImplTest {
- @Test
- public void testGetWxMpServiceByAppid() {
- }
+ @Inject
+ WxOpenComponentService wxOpenComponentService;
- @Test
- public void testGetWxMaServiceByAppid() {
- }
+ @Test
+ public void testGetWxMpServiceByAppid() {
+ }
- @Test
- public void testGetWxFastMaServiceByAppid() {
- }
+ @Test
+ public void testGetWxMaServiceByAppid() {
+ }
- @Test
- public void testGetWxOpenService() {
- }
+ @Test
+ public void testGetWxFastMaServiceByAppid() {
+ }
- @Test
- public void testGetWxOpenConfigStorage() {
- }
+ @Test
+ public void testGetWxOpenService() {
+ }
- @Test
- public void testCheckSignature() {
- }
+ @Test
+ public void testGetWxOpenConfigStorage() {
+ }
- @Test
- public void testGetComponentAccessToken() {
- }
+ @Test
+ public void testCheckSignature() {
+ }
- @Test
- public void testPost() {
- }
+ @Test
+ public void testGetComponentAccessToken() {
+ }
- @Test
- public void testTestPost() {
- }
+ @Test
+ public void testPost() {
+ }
- @Test
- public void testGet() {
- }
+ @Test
+ public void testTestPost() {
+ }
- @Test
- public void testTestGet() {
- }
+ @Test
+ public void testGet() {
+ }
- @Test
- public void testGetPreAuthUrl() {
- }
+ @Test
+ public void testTestGet() {
+ }
- @Test
- public void testTestGetPreAuthUrl() {
- }
+ @Test
+ public void testGetPreAuthUrl() {
+ }
- @Test
- public void testGetMobilePreAuthUrl() {
- }
+ @Test
+ public void testTestGetPreAuthUrl() {
+ }
- @Test
- public void testTestGetMobilePreAuthUrl() {
- }
+ @Test
+ public void testGetMobilePreAuthUrl() {
+ }
- @Test
- public void testRoute() {
- }
+ @Test
+ public void testTestGetMobilePreAuthUrl() {
+ }
- @Test
- public void testGetQueryAuth() {
- }
+ @Test
+ public void testRoute() {
+ }
- @Test
- public void testGetAuthorizerInfo() {
- }
+ @Test
+ public void testGetQueryAuth() {
+ }
- @Test
- public void testGetAuthorizerList() {
- }
+ @Test
+ public void testGetAuthorizerInfo() {
+ }
- @Test
- public void testGetAuthorizerOption() {
- }
+ @Test
+ public void testGetAuthorizerList() {
+ }
- @Test
- public void testSetAuthorizerOption() {
- }
+ @Test
+ public void testGetAuthorizerOption() {
+ }
- @Test
- public void testGetAuthorizerAccessToken() {
- }
+ @Test
+ public void testSetAuthorizerOption() {
+ }
- @Test
- public void testOauth2getAccessToken() {
- }
+ @Test
+ public void testGetAuthorizerAccessToken() {
+ }
- @Test
- public void testTestCheckSignature() {
- }
+ @Test
+ public void testOauth2getAccessToken() {
+ }
- @Test
- public void testOauth2refreshAccessToken() {
- }
+ @Test
+ public void testTestCheckSignature() {
+ }
- @Test
- public void testOauth2buildAuthorizationUrl() {
- }
+ @Test
+ public void testOauth2refreshAccessToken() {
+ }
- @Test
- public void testMiniappJscode2Session() {
- }
+ @Test
+ public void testOauth2buildAuthorizationUrl() {
+ }
- @Test
- public void testGetTemplateDraftList() {
- }
+ @Test
+ public void testMiniappJscode2Session() {
+ }
- @Test
- public void testGetTemplateList() {
- }
+ @Test
+ public void testGetTemplateDraftList() {
+ }
- @Test
- public void testAddToTemplate() {
- }
+ @Test
+ public void testGetTemplateList() {
+ }
- @Test
- public void testDeleteTemplate() {
- }
+ @Test
+ public void testAddToTemplate() {
+ }
- @Test
- public void testCreateOpenAccount() {
- }
+ @Test
+ public void testDeleteTemplate() {
+ }
- @Test
- public void testBindOpenAccount() {
- }
+ @Test
+ public void testCreateOpenAccount() {
+ }
- @Test
- public void testUnbindOpenAccount() {
- }
+ @Test
+ public void testBindOpenAccount() {
+ }
- @Test
- public void testGetOpenAccount() {
- }
+ @Test
+ public void testUnbindOpenAccount() {
+ }
- @Test
- public void testFastRegisterWeapp() {
- }
+ @Test
+ public void testGetOpenAccount() {
+ }
- @Test
- public void testFastRegisterWeappSearch() {
- }
+ @Test
+ public void testFastRegisterWeapp() {
+ }
+
+ @Test
+ public void testFastRegisterWeappSearch() {
+ }
+
+ @Test
+ public void testStartPushTicket() throws WxErrorException {
+ wxOpenComponentService.startPushTicket();
+ }
}
diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/ApiTestModule.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/ApiTestModule.java
index 8a3c3b9461..e3abb4d9d4 100644
--- a/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/ApiTestModule.java
+++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/test/ApiTestModule.java
@@ -5,6 +5,7 @@
import com.thoughtworks.xstream.XStream;
import me.chanjar.weixin.common.error.WxRuntimeException;
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
+import me.chanjar.weixin.open.api.WxOpenComponentService;
import me.chanjar.weixin.open.api.WxOpenMaService;
import me.chanjar.weixin.open.api.WxOpenMpService;
import me.chanjar.weixin.open.api.WxOpenService;
@@ -33,6 +34,7 @@ public void configure(Binder binder) {
binder.bind(TestConfigStorage.class).toInstance(config);
binder.bind(WxOpenService.class).toInstance(service);
+ binder.bind(WxOpenComponentService.class).toInstance(service.getWxOpenComponentService());
if (config.getTestMpAppId() != null && !config.getTestMpAppId().isEmpty()) {
//如果配置了测试公众号,则构建公众号服务依赖
From 7bd9ef4dfd06624f3bde9693525bbc8ff47db2d4 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 18 Jul 2021 23:21:20 +0800
Subject: [PATCH 0037/1235] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E4=B8=A4?=
=?UTF-8?q?=E4=B8=AA=E5=8F=98=E9=87=8F=E7=B1=BB=E5=9E=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cn/binarywang/wx/miniapp/bean/live/WxMaLiveGoodInfo.java | 5 +++--
.../cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java | 5 +++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveGoodInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveGoodInfo.java
index 6566491244..4a63ff7a48 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveGoodInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveGoodInfo.java
@@ -3,6 +3,7 @@
import lombok.Data;
import java.io.Serializable;
+import java.math.BigDecimal;
/**
* 直播商品信息
@@ -14,8 +15,8 @@ public class WxMaLiveGoodInfo implements Serializable {
private String coverImgUrl;
private String url;
private Integer priceType;
- private String price;
- private String price2;
+ private BigDecimal price;
+ private BigDecimal price2;
private String name;
/**
* 1, 2:表示是为api添加商品,否则是在MP添加商品
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
index ddb7e6d57a..4078cd77e1 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
@@ -5,6 +5,7 @@
import lombok.Data;
import java.io.Serializable;
+import java.math.BigDecimal;
import java.util.List;
/**
@@ -66,8 +67,8 @@ public static class Goods implements Serializable {
*/
@SerializedName("audit_status")
private Integer auditStatus;
- private String price;
- private String price2;
+ private BigDecimal price;
+ private BigDecimal price2;
/**
* 1, 2:表示是为api添加商品,否则是在MP添加商品
*/
From 1b48399501c147f5d510ea4128b48d99da8850f0 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 18 Jul 2021 23:34:08 +0800
Subject: [PATCH 0038/1235] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.2.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index 196efe8c16..96493adf0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 8407cffce1..a9b56cb61d 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 749bf5d9e4..12a5a97f19 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.1.B
+ 4.1.2.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index a0220c2771..0e0226871d 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.1.B
+ 4.1.2.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index c97c33e9b4..c4bd57c499 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.1.B
+ 4.1.2.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 8a05f0bbdf..299f9f3220 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.1.B
+ 4.1.2.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index fe26c39676..03b7228d53 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.1.B
+ 4.1.2.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index 333b99be57..925e5eaf70 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index c4d73071fe..8a7dfc7e0c 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index e5f54e9dfc..75cd9bddb4 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index dd5e3f97e2..fa49f1c50b 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 7056b1c34c..8a23b444f9 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index 12c9fba726..4a5ce7c480 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index a0f0a2172f..6d9d42fcaa 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index 64a5ef95a1..44b46e466d 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.1.B
+ 4.1.2.B
weixin-java-qidian
From e53733b842dfd6de9fc17dc43ba81ca52f2246e9 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Tue, 20 Jul 2021 10:32:10 +0800
Subject: [PATCH 0039/1235] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=EF=BC=8C=E6=81=A2=E5=A4=8D=E8=AF=AF=E5=88=A0=E9=99=A4?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../common/util/crypto/WxCryptUtil.java | 23 ++++++++-----------
.../cp/tp/service/impl/WxCpTpServiceImpl.java | 12 ++++++++++
2 files changed, 22 insertions(+), 13 deletions(-)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceImpl.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
index aba5e26692..a73e01d0d5 100755
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
@@ -36,19 +36,16 @@ public class WxCryptUtil {
private static final Base64 BASE64 = new Base64();
private static final Charset CHARSET = StandardCharsets.UTF_8;
- private static final ThreadLocal BUILDER_LOCAL = new ThreadLocal() {
- @Override
- protected DocumentBuilder initialValue() {
- try {
- final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- factory.setExpandEntityReferences(false);
- factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
- return factory.newDocumentBuilder();
- } catch (ParserConfigurationException exc) {
- throw new IllegalArgumentException(exc);
- }
+ private static final ThreadLocal BUILDER_LOCAL = ThreadLocal.withInitial(() -> {
+ try {
+ final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setExpandEntityReferences(false);
+ factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+ return factory.newDocumentBuilder();
+ } catch (ParserConfigurationException exc) {
+ throw new IllegalArgumentException(exc);
}
- };
+ });
protected byte[] aesKey;
protected String token;
@@ -67,7 +64,7 @@ public WxCryptUtil() {
public WxCryptUtil(String token, String encodingAesKey, String appidOrCorpid) {
this.token = token;
this.appidOrCorpid = appidOrCorpid;
- this.aesKey = BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(encodingAesKey));
+ this.aesKey = Base64.decodeBase64(CharMatcher.whitespace().removeFrom(encodingAesKey));
}
private static String extractEncryptPart(String xml) {
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceImpl.java
new file mode 100644
index 0000000000..58fb09cf97
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpServiceImpl.java
@@ -0,0 +1,12 @@
+package me.chanjar.weixin.cp.tp.service.impl;
+
+/**
+ *
+ * 默认接口实现类,使用apache httpclient实现
+ * Created by zhenjun cai.
+ *
+ *
+ * @author zhenjun cai
+ */
+public class WxCpTpServiceImpl extends WxCpTpServiceApacheHttpClientImpl {
+}
From 497a0b70170ff320ac6a2ce875efec9de61263e4 Mon Sep 17 00:00:00 2001
From: longliveh <35585613+longliveh@users.noreply.github.com>
Date: Thu, 22 Jul 2021 13:54:15 +0800
Subject: [PATCH 0040/1235] =?UTF-8?q?:new:=20=20#2213=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=20=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BC=81=E4=B8=9A=E6=89=80=E6=9C=89=E6=89=93?=
=?UTF-8?q?=E5=8D=A1=E8=A7=84=E5=88=99=E7=9A=84=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/cp/api/WxCpOaService.java | 12 +
.../weixin/cp/api/impl/WxCpOaServiceImpl.java | 16 +
.../cp/bean/oa/WxCpCropCheckinOption.java | 803 ++++++++++++++++++
.../weixin/cp/constant/WxCpApiPathConsts.java | 1 +
.../cp/api/impl/WxCpOaServiceImplTest.java | 12 +-
5 files changed, 843 insertions(+), 1 deletion(-)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
index 1dc7550597..606155ec34 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
@@ -60,6 +60,18 @@ List getCheckinData(Integer openCheckinDataType, Date startTime
*/
List getCheckinOption(Date datetime, List userIdList) throws WxErrorException;
+
+ /**
+ *
+ * 获取企业所有打卡规则
+ * API doc : https://work.weixin.qq.com/api/doc/90000/90135/93384
+ *
+ *
+ * @return 打卡规则列表
+ * @throws WxErrorException the wx error exception
+ */
+ List getCropCheckinOption() throws WxErrorException;
+
/**
*
*
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 adb558ded6..3ba874401b 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
@@ -112,6 +112,22 @@ public List getCheckinOption(Date datetime, List user
);
}
+ @Override
+ public List getCropCheckinOption() throws WxErrorException {
+
+ JsonObject jsonObject = new JsonObject();
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CORP_CHECKIN_OPTION);
+ String responseContent = this.mainService.post(url, jsonObject.toString());
+ JsonObject tmpJson = GsonParser.parse(responseContent);
+
+ return WxCpGsonBuilder.create()
+ .fromJson(
+ tmpJson.get("group"),
+ new TypeToken>() {
+ }.getType()
+ );
+ }
+
@Override
public WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
Integer cursor, Integer size, List filters) throws WxErrorException {
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java
new file mode 100644
index 0000000000..c68741fcaf
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCropCheckinOption.java
@@ -0,0 +1,803 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 企业微信企业所有打卡规则.
+ *
+ * @author Liuwm
+ */
+@Data
+public class WxCpCropCheckinOption implements Serializable {
+ private static final long serialVersionUID = 1725954575430704232L;
+
+ /**
+ * 打卡规则类型,1:固定时间上下班;2:按班次上下班;3:自由上下班
+ */
+ @SerializedName("grouptype")
+ private Long groupType;
+
+ /**
+ * 打卡规则id
+ */
+ @SerializedName("groupid")
+ private Long groupId;
+
+ /**
+ * 打卡规则名称
+ */
+ @SerializedName("groupname")
+ private String groupName;
+
+ /**
+ * 打卡时间,当规则类型为排班时没有意义
+ */
+ @SerializedName("checkindate")
+ private List checkinDate;
+
+ /**
+ * 特殊日期-必须打卡日期信息,timestamp表示具体时间
+ */
+ @SerializedName("spe_workdays")
+ private List speWorkdays;
+
+ /**
+ * 特殊日期-不用打卡日期信息, timestamp表示具体时间
+ */
+ @SerializedName("spe_offdays")
+ private List speOffDays;
+
+ /**
+ * 是否同步法定节假日,true为同步,false为不同步,当前排班不支持
+ */
+ @SerializedName("sync_holidays")
+ private Boolean syncHolidays;
+
+ /**
+ * 是否打卡必须拍照,true为必须拍照,false为不必须拍照
+ */
+ @SerializedName("need_photo")
+ private Boolean needPhoto;
+
+ /**
+ * 是否备注时允许上传本地图片,true为允许,false为不允许
+ */
+ @SerializedName("note_can_use_local_pic")
+ private Boolean noteCanUseLocalPic;
+
+ /**
+ * 是否非工作日允许打卡,true为允许,false为不允许
+ */
+ @SerializedName("allow_checkin_offworkday")
+ private Boolean allowCheckinOffWorkDay;
+
+ /**
+ * 是否允许提交补卡申请,true为允许,false为不允许
+ */
+ @SerializedName("allow_apply_offworkday")
+ private Boolean allowApplyOffWorkDay;
+
+ /**
+ * 打卡地点-WiFi打卡信息
+ */
+ @SerializedName("wifimac_infos")
+ private List wifiMacInfos;
+
+ /**
+ * 打卡地点-WiFi打卡信息
+ */
+ @SerializedName("loc_infos")
+ private List locInfos;
+
+ /**
+ * 打卡人员信息
+ */
+ @SerializedName("range")
+ private Range range;
+
+ /**
+ * 创建打卡规则时间,为unix时间戳
+ */
+ @SerializedName("create_time")
+ private Long createTime;
+
+ /**
+ * 打卡人员白名单,即不需要打卡人员,需要有设置白名单才能查看
+ */
+ @SerializedName("white_users")
+ private List whiteUsers;
+
+ /**
+ * 打卡方式,0:手机;2:智慧考勤机;3:手机+智慧考勤机
+ */
+ @SerializedName("type")
+ private Integer type;
+
+ /**
+ * 打卡方式,0:手机;2:智慧考勤机;3:手机+智慧考勤机
+ */
+ @SerializedName("reporterinfo")
+ private ReporterInfo reporterInfo;
+
+ /**
+ * 加班信息,相关信息需要设置后才能显示
+ */
+ @SerializedName("ot_info")
+ private OtInfo otInfo;
+
+ /**
+ * 每月最多补卡次数,默认-1表示不限制
+ */
+ @SerializedName("allow_apply_bk_cnt")
+ private Integer allowApplyBkCnt;
+
+ /**
+ * 范围外打卡处理方式,0-视为范围外异常,默认值;1-视为正常外勤;2:不允许范围外打卡
+ */
+ @SerializedName("option_out_range")
+ private Integer optionOutRange;
+
+ /**
+ * 规则创建人userid
+ */
+ @SerializedName("create_userid")
+ private String createUserid;
+
+ /**
+ * 人脸识别打卡开关,true为启用,false为不启用
+ */
+ @SerializedName("use_face_detect")
+ private Boolean useFaceDetect;
+
+ /**
+ * 允许补卡时限,默认-1表示不限制。单位天
+ */
+ @SerializedName("allow_apply_bk_day_limit")
+ private Integer allowApplyBkDayLimit;
+
+ /**
+ * 规则最近编辑人userid
+ */
+ @SerializedName("update_userid")
+ private String updateUserid;
+
+ /**
+ * 加班信息,相关信息需要设置后才能显示
+ */
+ @SerializedName("schedulelist")
+ private List schedulelist;
+
+
+ /**
+ * 自由签到,上班打卡后xx秒可打下班卡
+ */
+ @SerializedName("offwork_interval_time")
+ private Integer offWorkIntervalTime;
+
+
+ @Data
+ public static class CheckinDate implements Serializable{
+ private static final long serialVersionUID = -8560643656775167406L;
+ /**
+ * 工作日。若为固定时间上下班或自由上下班,则1到6分别表示星期一到星期六,0表示星期日
+ */
+ @SerializedName("workdays")
+ private List workdays;
+
+ /**
+ * 工作日上下班打卡时间信息
+ */
+ @SerializedName("checkintime")
+ private List checkinTime;
+
+ /**
+ * 下班不需要打卡,true为下班不需要打卡,false为下班需要打卡
+ */
+ @SerializedName("noneed_offwork")
+ private Boolean noneedOffwork;
+
+ /**
+ * 打卡时间限制(毫秒)
+ */
+ @SerializedName("limit_aheadtime")
+ private Long limitAheadtime;
+
+ /**
+ * 允许迟到时间,单位ms
+ */
+ @SerializedName("flex_on_duty_time")
+ private Integer flexOnDutyTime;
+
+ /**
+ * 允许早退时间,单位ms
+ */
+ @SerializedName("flex_off_duty_time")
+ private Integer flexOffDutyTime;
+ }
+
+ @Data
+ public static class CheckinTime implements Serializable{
+
+ private static final long serialVersionUID = -5507709858609705279L;
+ /**
+ * 上班时间,表示为距离当天0点的秒数。
+ */
+ @SerializedName("work_sec")
+ private Integer workSec;
+
+ /**
+ * 下班时间,表示为距离当天0点的秒数。
+ */
+ @SerializedName("off_work_sec")
+ private Integer offWorkSec;
+
+ /**
+ * 上班提醒时间,表示为距离当天0点的秒数。。
+ */
+ @SerializedName("remind_work_sec")
+ private Integer remindWorkSec;
+
+ /**
+ * 下班提醒时间,表示为距离当天0点的秒数。
+ */
+ @SerializedName("remind_off_work_sec")
+ private Integer remindOffWorkSec;
+ }
+
+ @Data
+ public static class SpeWorkday implements Serializable{
+
+ private static final long serialVersionUID = -4620710297258742666L;
+ /**
+ * 特殊日期-必须打卡日期时间戳
+ */
+ @SerializedName("timestamp")
+ private Long timestamp;
+
+ /**
+ * 特殊日期备注
+ */
+ @SerializedName("notes")
+ private String notes;
+
+ /**
+ * 特殊日期-必须打卡日期-上下班打卡时间
+ */
+ @SerializedName("checkintime")
+ private List checkinTime;
+ }
+
+ @Data
+ public static class SpeOffDay implements Serializable{
+ private static final long serialVersionUID = 9214798931489490993L;
+ /**
+ * 特殊日期-不用打卡日期时间戳
+ */
+ @SerializedName("timestamp")
+ private Long timestamp;
+
+ /**
+ * 特殊日期备注
+ */
+ @SerializedName("notes")
+ private String notes;
+ }
+
+ @Data
+ public static class WifiMacInfo implements Serializable{
+
+ private static final long serialVersionUID = 6742659716677227089L;
+
+ /**
+ * WiFi打卡地点名称
+ */
+ @SerializedName("wifiname")
+ private String wifiname;
+
+ /**
+ * WiFi打卡地点MAC地址/bssid
+ */
+ @SerializedName("wifimac")
+ private String wifimac;
+ }
+
+ @Data
+ public static class LocInfo implements Serializable{
+
+ private static final long serialVersionUID = -5591379191341944101L;
+ /**
+ * 位置打卡地点纬度,是实际纬度的1000000倍,与腾讯地图一致采用GCJ-02坐标系统标准
+ */
+ @SerializedName("lat")
+ private Long lat;
+
+ /**
+ * 位置打卡地点经度,是实际经度的1000000倍,与腾讯地图一致采用GCJ-02坐标系统标准
+ */
+ @SerializedName("lng")
+ private Long lng;
+
+ /**
+ * 位置打卡地点名称
+ */
+ @SerializedName("loc_title")
+ private String locTitle;
+
+ /**
+ * 位置打卡地点详情
+ */
+ @SerializedName("loc_detail")
+ private String locDetail;
+
+ /**
+ * 允许打卡范围(米)
+ */
+ @SerializedName("distance")
+ private Integer distance;
+ }
+
+ @Data
+ public static class Range implements Serializable{
+
+ private static final long serialVersionUID = 8940086218556453088L;
+
+ /**
+ * 打卡人员中,单个打卡人员节点的userid
+ */
+ @SerializedName("party_id")
+ private List partyid;
+
+ /**
+ * 打卡人员中,部门节点的id
+ */
+ @SerializedName("userid")
+ private List userid;
+
+ /**
+ * 打卡人员中,标签节点的标签id
+ */
+ @SerializedName("tagid")
+ private List tagid;
+
+
+ }
+
+ @Data
+ public static class ReporterInfo implements Serializable{
+ private static final long serialVersionUID = 1132450350458936772L;
+ /**
+ * 汇报对象,每个汇报人用userid表示
+ */
+ @SerializedName("reporters")
+ private List reporters;
+
+ /**
+ * 汇报对象更新时间
+ */
+ @SerializedName("updatetime")
+ private long updateTime;
+ }
+
+ @Data
+ public static class Reporter implements Serializable {
+
+ private static final long serialVersionUID = 4925417850482005397L;
+
+ @SerializedName("userid")
+ private String userid;
+ }
+
+ @Data
+ public static class OtInfo implements Serializable{
+
+ private static final long serialVersionUID = 1610150484871066199L;
+
+ /**
+ * 加班类型
+ * 0:以加班申请核算打卡记录(根据打卡记录和加班申请核算),
+ * 1:以打卡时间为准(根据打卡时间计算),
+ * 2: 以加班申请审批为准(只根据加班申请计算)
+ */
+ @SerializedName("type")
+ private Integer type;
+
+ /**
+ * 允许工作日加班,true为允许,false为不允许
+ */
+ @SerializedName("allow_ot_workingday")
+ private Boolean allowOtWorkingDay;
+
+ /**
+ * 允许非工作日加班,true为允许,flase为不允许
+ */
+ @SerializedName("allow_ot_nonworkingday")
+ private Boolean allowOtNonworkingDay;
+
+ /**
+ * 允许非工作日加班,true为允许,flase为不允许
+ */
+ @SerializedName("otcheckinfo")
+ private OtCheckInfo otcheckinfo;
+
+ /**
+ * 更新时间
+ */
+ @SerializedName("uptime")
+ private Long uptime;
+
+ /**
+ * 允许非工作日加班,true为允许,flase为不允许
+ */
+ @SerializedName("otapplyinfo")
+ private OtApplyInfo otapplyinfo;
+ }
+
+ @Data
+ public static class OtCheckInfo implements Serializable {
+
+ private static final long serialVersionUID = -2363047492489556390L;
+
+ /**
+ * 允许工作日加班-加班开始时间:下班后xx秒开始计算加班,距离最晚下班时间的秒数,例如,1800(30分钟 乘以 60秒),默认值30分钟
+ */
+ @SerializedName("ot_workingday_time_start")
+ private Integer otWorkingDayTimeStart;
+
+ /**
+ * 允许工作日加班-最短加班时长:不足xx秒视为未加班,单位秒,默认值30分钟
+ */
+ @SerializedName("ot_workingday_time_min")
+ private Integer otWorkingDayTimeMin;
+
+ /**
+ * 允许工作日加班-最长加班时长:超过则视为加班xx秒,单位秒,默认值240分钟
+ */
+ @SerializedName("ot_workingday_time_max")
+ private Integer otWorkingDayTimeMax;
+
+ /**
+ * 允许非工作日加班-最短加班时长:不足xx秒视为未加班,单位秒,默认值30分钟
+ */
+ @SerializedName("ot_nonworkingday_time_min")
+ private Integer otNonworkingDayTimeMin;
+
+ /**
+ * 允许非工作日加班-最长加班时长:超过则视为加班xx秒 单位秒,默认值240分钟
+ */
+ @SerializedName("ot_nonworkingday_time_max")
+ private Integer otNonworkingDayTimeMax;
+
+ /**
+ * 非工作日加班,跨天时间,距离当天00:00的秒数
+ */
+ @SerializedName("ot_nonworkingday_spanday_time")
+ private Integer otNonworkingDaySpanDayTime;
+
+ /**
+ * 允许非工作日加班,true为允许,flase为不允许
+ */
+ @SerializedName("ot_workingday_restinfo")
+ private OtWorkingDayRestInfo otWorkingdayRestinfo;
+
+ /**
+ * 允许非工作日加班,true为允许,flase为不允许
+ */
+ @SerializedName("ot_nonworkingday_restinfo")
+ private OtNonworkingDayRestInfo otNonworkingdayRestinfo;
+ }
+
+ @Data
+ public static class OtWorkingDayRestInfo implements Serializable{
+
+ private static final long serialVersionUID = -4011047369711928306L;
+
+ /**
+ * 工作日加班-休息扣除类型:0-不开启扣除;1-指定休息时间扣除;2-按加班时长扣除休息时间
+ */
+ @SerializedName("type")
+ private Integer type;
+
+ /**
+ * 工作日加班-指定休息时间配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为1时有意义
+ */
+ @SerializedName("fix_time_rule")
+ private FixTimeRule fixTimeRule;
+
+ /**
+ * 工作日加班-按加班时长扣除配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为2时有意义
+ */
+ @SerializedName("cal_ottime_rule")
+ private CalOtTimeRule calOttimeRule;
+ }
+
+ @Data
+ public static class FixTimeRule implements Serializable{
+
+ private static final long serialVersionUID = 5709478500196619664L;
+
+ /**
+ * 工作日加班-指定休息时间的开始时间, 距离当天00:00的秒数
+ */
+ @SerializedName("fix_time_begin_sec")
+ private Integer fixTimeBeginSec;
+
+ /**
+ * 工作日加班-指定休息时间的结束时间, 距离当天00:00的秒数
+ */
+ @SerializedName("fix_time_end_sec")
+ private Integer fixTimeEndSec;
+ }
+
+ @Data
+ public static class CalOtTimeRule implements Serializable {
+
+ private static final long serialVersionUID = -2407839982631243413L;
+
+ /**
+ * 工作日加班-按加班时长扣除条件信息
+ */
+ @SerializedName("items")
+ private List- items;
+
+ }
+ @Data
+ public static class Item implements Serializable{
+
+ private static final long serialVersionUID = 5235770378506228461L;
+
+ /**
+ * 加班满-时长(秒)
+ */
+ @SerializedName("ot_time")
+ private Integer otTime;
+
+ /**
+ * 对应扣除-时长(秒)
+ */
+ @SerializedName("rest_time")
+ private Integer restTime;
+ }
+
+ @Data
+ public static class OtNonworkingDayRestInfo implements Serializable{
+
+ private static final long serialVersionUID = 3773846077049838088L;
+
+ /**
+ * 非工作日加班-休息扣除类型:0-不开启扣除;1-指定休息时间扣除;2-按加班时长扣除休息时间
+ */
+ @SerializedName("type")
+ private Integer type;
+
+ /**
+ * 非工作日加班-指定休息时间配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为1时有意义
+ */
+ @SerializedName("fix_time_rule")
+ private FixTimeRule fixTimeRule;
+
+ /**
+ * 非工作日加班-按加班时长扣除配置信息,当group.ot_info.otcheckinfo.ot_workingday_restinfo.type为2时有意义
+ */
+ @SerializedName("cal_ottime_rule")
+ private CalOtTimeRule calOttimeRule;
+ }
+
+ @Data
+ public static class OtApplyInfo implements Serializable{
+
+ private static final long serialVersionUID = 961217471918884103L;
+
+ /**
+ * 允许工作日加班,true为允许,false为不允许
+ */
+ @SerializedName("allow_ot_workingday")
+ private Boolean allowOtWorkingDay;
+
+ /**
+ * 允许非工作日加班,true为允许,flase为不允许
+ */
+ @SerializedName("allow_ot_nonworkingday")
+ private Boolean allowOtNonworkingDay;
+
+ /**
+ * 更新时间
+ */
+ @SerializedName("uptime")
+ private Long uptime;
+
+ /**
+ * 允许非工作日加班,true为允许,flase为不允许
+ */
+ @SerializedName("ot_workingday_restinfo")
+ private OtWorkingDayRestInfo otWorkingdayRestinfo;
+
+ /**
+ * 允许非工作日加班,true为允许,flase为不允许
+ */
+ @SerializedName("ot_nonworkingday_restinfo")
+ private OtNonworkingDayRestInfo otNonworkingdayRestinfo;
+
+ /**
+ * 非工作日加班,跨天时间,距离当天00:00的秒数
+ */
+ @SerializedName("ot_nonworkingday_spanday_time")
+ private Integer otNonworkingDaySpanDayTime;
+
+ }
+
+ @Data
+ public static class Schedule implements Serializable{
+
+ private static final long serialVersionUID = -2461113644925307266L;
+
+ /**
+ * 班次id
+ */
+ @SerializedName("schedule_id")
+ private Integer scheduleId;
+
+ /**
+ * 班次名称
+ */
+ @SerializedName("schedule_name")
+ private String scheduleName;
+
+ /**
+ * 班次上下班时段信息
+ */
+ @SerializedName("time_section")
+ private List timeSection;
+
+ /**
+ * 允许提前打卡时间
+ */
+ @SerializedName("limit_aheadtime")
+ private Long limitAheadTime;
+
+ /**
+ * 下班xx秒后不允许打下班卡
+ */
+ @SerializedName("limit_offtime")
+ private Integer limitOffTime;
+
+ /**
+ * 下班不需要打卡
+ */
+ @SerializedName("noneed_offwork")
+ private Boolean noNeedOffWork;
+
+ /**
+ * 是否允许弹性时间
+ */
+ @SerializedName("allow_flex")
+ private Boolean allowFlex;
+
+ /**
+ * 允许迟到时间
+ */
+ @SerializedName("flex_on_duty_time")
+ private Integer flexOnDutyTime;
+
+ /**
+ * 允许早退时间
+ */
+ @SerializedName("flex_off_duty_time")
+ private Integer flexOffDutyTime;
+
+ /**
+ * 非工作日加班,跨天时间,距离当天00:00的秒数
+ */
+ @SerializedName("late_rule")
+ private LateRule lateRule;
+
+ /**
+ * 最早可打卡时间限制
+ */
+ @SerializedName("max_allow_arrive_early")
+ private Integer maxAllowArriveEarly;
+
+ /**
+ * 最晚可打卡时间限制,max_allow_arrive_early、max_allow_arrive_early与flex_on_duty_time、flex_off_duty_time互斥,当设置其中一组时,另一组数值置0
+ */
+ @SerializedName("max_allow_arrive_late")
+ private Integer maxAllowArriveLate;
+
+ }
+
+
+ @Data
+ public static class TimeSection implements Serializable {
+ private static final long serialVersionUID = 7497252128339062724L;
+
+ /**
+ * 时段id,为班次中某一堆上下班时间组合的id
+ */
+ @SerializedName("time_id")
+ private Integer timeId;
+
+ /**
+ * 上班时间,表示为距离当天0点的秒数。
+ */
+ @SerializedName("work_sec")
+ private Integer workSec;
+
+ /**
+ * 下班时间,表示为距离当天0点的秒数。
+ */
+ @SerializedName("off_work_sec")
+ private Integer offWorkSec;
+
+ /**
+ * 上班提醒时间,表示为距离当天0点的秒数。
+ */
+ @SerializedName("remind_work_sec")
+ private Long remindWorkSec;
+
+ /**
+ * 下班提醒时间,表示为距离当天0点的秒数。
+ */
+ @SerializedName("remind_off_work_sec")
+ private Integer remindOffWorkSec;
+
+ /**
+ * 休息开始时间,仅单时段支持,距离0点的秒
+ */
+ @SerializedName("rest_begin_time")
+ private Integer restBeginTime;
+
+ /**
+ * 休息结束时间,仅单时段支持,距离0点的秒
+ */
+ @SerializedName("rest_end_time")
+ private Integer restEndTime;
+
+ /**
+ * 是否允许休息
+ */
+ @SerializedName("allow_rest")
+ private Boolean allowRest;
+ }
+
+
+ @Data
+ public static class LateRule implements Serializable{
+
+ private static final long serialVersionUID = 5604969713950037053L;
+
+
+ /**
+ * 是否允许超时下班(下班晚走次日晚到)允许时onwork_flex_time,offwork_after_time才有意义
+ */
+ @SerializedName("allow_offwork_after_time")
+ private Boolean allowOffWorkAfterTime;
+
+ /**
+ * 迟到规则时间
+ */
+ @SerializedName("timerules")
+ private List timerules;
+ }
+
+ @Data
+ public static class TimeRule implements Serializable{
+
+ private static final long serialVersionUID = 5680614050081598333L;
+
+ /**
+ * 晚走的时间 距离最晚一个下班的时间单位:秒
+ */
+ @SerializedName("offwork_after_time")
+ private Integer offWorkAfterTime;
+
+ /**
+ * 第二天第一个班次允许迟到的弹性时间单位:秒
+ */
+ @SerializedName("onwork_flex_time")
+ private Integer onWorkFlexTime;
+
+ }
+}
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 7ca857476b..f577fcb217 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
@@ -91,6 +91,7 @@ interface Menu {
}
interface Oa {
+ String GET_CORP_CHECKIN_OPTION = "/cgi-bin/checkin/getcorpcheckinoption";
String GET_CHECKIN_DATA = "/cgi-bin/checkin/getcheckindata";
String GET_CHECKIN_OPTION = "/cgi-bin/checkin/getcheckinoption";
String GET_CHECKIN_DAY_DATA = "/cgi-bin/checkin/getcheckin_daydata";
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
index 55c773305d..f838837b00 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
@@ -53,7 +53,7 @@ public void testGetCheckinData() throws ParseException, WxErrorException {
@Test
public void testGetCheckinDayData() throws ParseException, WxErrorException {
- Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-01");
+ Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-06-30");
Date endTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2021-07-31");
List results = wxService.getOaService()
@@ -103,6 +103,16 @@ public void testGetCheckinOption() throws WxErrorException {
System.out.println(gson.toJson(results));
}
+ @Test
+ public void testGetCropCheckinOption() throws WxErrorException {
+
+ Date now = new Date();
+ List results = wxService.getOaService().getCropCheckinOption();
+ assertThat(results).isNotNull();
+ System.out.println("results ");
+ System.out.println(gson.toJson(results));
+ }
+
@Test
public void testGetApprovalInfo() throws WxErrorException, ParseException {
Date startTime = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.parse("2019-12-01");
From 3a444d0fba7849785239061ac959e38f90bcb0e5 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Thu, 22 Jul 2021 14:41:43 +0800
Subject: [PATCH 0041/1235] Update README.md
---
README.md | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/README.md b/README.md
index a6323597c6..3552509fc2 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
## 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)
+[](https://github.com/Wechat-Group/WxJava)
[](https://github.com/Wechat-Group/WxJava/releases)
[](http://mvnrepository.com/artifact/com.github.binarywang/wx-java)
[](https://travis-ci.org/Wechat-Group/WxJava)
@@ -21,18 +21,18 @@
-
-
-
-
- 活动服务销售平台
-
- |
-
|
+
+
+
+ 1. 驰骋快速开发平台、工作流引擎、表单引擎采用GPL协议.
+2. 驰骋.net版称为ccflow, java版称为jflow,代码100%开源.
+3. 支持10多个国内外数据库. 单机版\集团版\SAAS版本.
+
+ |
From 7db5207feedeca05fd539e4419376f5dd1350e02 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 25 Jul 2021 21:20:13 +0800
Subject: [PATCH 0042/1235] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E9=87=8D?=
=?UTF-8?q?=E6=9E=84=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/common/util/json/GsonHelper.java | 3 +-
.../result/WxPayUnifiedOrderV3Result.java | 16 +-
.../binarywang/wxpay/util/ResourcesUtils.java | 166 +++++++-----------
.../binarywang/wxpay/v3/util/SignUtils.java | 6 +-
4 files changed, 82 insertions(+), 109 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java
index b41467f21c..0d807402ac 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java
@@ -4,7 +4,6 @@
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
-import jodd.util.MathUtil;
import me.chanjar.weixin.common.error.WxRuntimeException;
import java.util.List;
@@ -173,7 +172,7 @@ public static JsonObject buildJsonObject(Object... keyOrValue) {
* @param keyOrValue 包含key或value的数组
*/
public static void put(JsonObject jsonObject, Object... keyOrValue) {
- if (MathUtil.isOdd(keyOrValue.length)) {
+ if (keyOrValue.length % 2 == 1) {
throw new WxRuntimeException("参数个数必须为偶数");
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
index 58e74196f6..c9b5744b3f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
@@ -6,6 +6,7 @@
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.error.WxRuntimeException;
import java.io.Serializable;
import java.security.PrivateKey;
@@ -72,6 +73,8 @@ public class WxPayUnifiedOrderV3Result implements Serializable {
@Data
@Accessors(chain = true)
public static class JsapiResult implements Serializable {
+ private static final long serialVersionUID = 4465376277943307271L;
+
private String appId;
private String timeStamp;
private String nonceStr;
@@ -80,16 +83,18 @@ public static class JsapiResult implements Serializable {
private String paySign;
private String getSignStr() {
- return String.format("%s\n%s\n%s\n%s\n", appId, timeStamp, nonceStr, packageValue);
+ return String.format("%s%n%s%n%s%n%s%n", appId, timeStamp, nonceStr, packageValue);
}
}
@Data
@Accessors(chain = true)
public static class AppResult implements Serializable {
+ private static final long serialVersionUID = 5465773025172875110L;
+
private String appid;
- private String partnerid;
- private String prepayid;
+ private String partnerId;
+ private String prepayId;
private String packageValue;
private String noncestr;
private String timestamp;
@@ -111,14 +116,15 @@ public T getPayInfo(TradeTypeEnum tradeType, String appId, String mchId, Pri
return (T) this.h5Url;
case APP:
AppResult appResult = new AppResult();
- appResult.setAppid(appId).setPrepayid(this.prepayId).setPartnerid(mchId)
+ appResult.setAppid(appId).setPrepayId(this.prepayId).setPartnerId(mchId)
.setNoncestr(nonceStr).setTimestamp(timestamp)
//暂填写固定值Sign=WXPay
.setPackageValue("Sign=WXPay");
return (T) appResult;
case NATIVE:
return (T) this.codeUrl;
+ default:
+ throw new WxRuntimeException("不支持的支付类型");
}
- return null;
}
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/ResourcesUtils.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/ResourcesUtils.java
index 3a9e788551..ac68b00bb4 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/ResourcesUtils.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/ResourcesUtils.java
@@ -1,120 +1,86 @@
package com.github.binarywang.wxpay.util;
-import jodd.io.IOUtil;
import jodd.util.ClassUtil;
import lombok.val;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
-import java.net.URLConnection;
/**
* 基于jodd.util.ResourcesUtil改造实现
+ *
* @author jodd
*/
public class ResourcesUtils {
-
- /**
- * Retrieves given resource as URL.
- * @see #getResourceUrl(String, ClassLoader)
- */
- public static URL getResourceUrl(final String resourceName) {
- return getResourceUrl(resourceName, null);
- }
-
- /**
- * Retrieves given resource as URL. Resource is always absolute and may
- * starts with a slash character.
- *
- * Resource will be loaded using class loaders in the following order:
- *
- * - {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
- * - {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
- * - if
callingClass is provided: {@link Class#getClassLoader() callingClass.getClassLoader()}
- *
- */
- public static URL getResourceUrl(String resourceName, final ClassLoader classLoader) {
-
- if (resourceName.startsWith("/")) {
- resourceName = resourceName.substring(1);
- }
-
- URL resourceUrl;
-
- // try #1 - using provided class loader
- if (classLoader != null) {
- resourceUrl = classLoader.getResource(resourceName);
- if (resourceUrl != null) {
- return resourceUrl;
- }
- }
-
- // try #2 - using thread class loader
- final ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
- if ((currentThreadClassLoader != null) && (currentThreadClassLoader != classLoader)) {
- resourceUrl = currentThreadClassLoader.getResource(resourceName);
- if (resourceUrl != null) {
- return resourceUrl;
- }
- }
-
- // try #3 - using caller classloader, similar as Class.forName()
+ /**
+ * Retrieves given resource as URL. Resource is always absolute and may
+ * starts with a slash character.
+ *
+ * Resource will be loaded using class loaders in the following order:
+ *
+ * - {@link Thread#getContextClassLoader() Thread.currentThread().getContextClassLoader()}
+ * - {@link Class#getClassLoader() ClassLoaderUtil.class.getClassLoader()}
+ * - if
callingClass is provided: {@link Class#getClassLoader() callingClass.getClassLoader()}
+ *
+ */
+ public static URL getResourceUrl(String resourceName, final ClassLoader classLoader) {
+
+ if (resourceName.startsWith("/")) {
+ resourceName = resourceName.substring(1);
+ }
+
+ URL resourceUrl;
+
+ // try #1 - using provided class loader
+ if (classLoader != null) {
+ resourceUrl = classLoader.getResource(resourceName);
+ if (resourceUrl != null) {
+ return resourceUrl;
+ }
+ }
+
+ // try #2 - using thread class loader
+ final ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
+ if ((currentThreadClassLoader != null) && (currentThreadClassLoader != classLoader)) {
+ resourceUrl = currentThreadClassLoader.getResource(resourceName);
+ if (resourceUrl != null) {
+ return resourceUrl;
+ }
+ }
+
+ // try #3 - using caller classloader, similar as Class.forName()
val callerClass = ClassUtil.getCallerClass(2);
val callerClassLoader = callerClass.getClassLoader();
- if ((callerClassLoader != classLoader) && (callerClassLoader != currentThreadClassLoader)) {
- resourceUrl = callerClassLoader.getResource(resourceName);
+ if ((callerClassLoader != classLoader) && (callerClassLoader != currentThreadClassLoader)) {
+ resourceUrl = callerClassLoader.getResource(resourceName);
return resourceUrl;
- }
-
- return null;
- }
-
- public static String getResourceAsString(final String resourceName) throws IOException {
- final InputStream inputStream = getResourceAsStream(resourceName);
- try {
- final char[] data = IOUtil.readChars(inputStream);
- return new String(data);
- }
- finally {
- IOUtil.close(inputStream);
- }
- }
-
- /**
- * Opens a resource of the specified name for reading.
- * @see #getResourceAsStream(String, ClassLoader)
- */
- public static InputStream getResourceAsStream(final String resourceName) throws IOException {
- return getResourceAsStream(resourceName, null);
- }
-
- /**
- * Opens a resource of the specified name for reading.
- * @see #getResourceUrl(String, ClassLoader)
- */
- public static InputStream getResourceAsStream(final String resourceName, final ClassLoader callingClass) throws IOException {
- final URL url = getResourceUrl(resourceName, callingClass);
- if (url != null) {
- return url.openStream();
- }
- return null;
- }
-
- /**
- * Opens a resource of the specified name for reading. Controls caching,
- * that is important when the same jar is reloaded using custom classloader.
- */
- public static InputStream getResourceAsStream(final String resourceName, final ClassLoader callingClass,
- final boolean useCache) throws IOException {
- final URL url = getResourceUrl(resourceName, callingClass);
- if (url != null) {
- final URLConnection urlConnection = url.openConnection();
- urlConnection.setUseCaches(useCache);
- return urlConnection.getInputStream();
- }
- return null;
- }
+ }
+
+ return null;
+ }
+
+ /**
+ * Opens a resource of the specified name for reading.
+ *
+ * @see #getResourceAsStream(String, ClassLoader)
+ */
+ public static InputStream getResourceAsStream(final String resourceName) throws IOException {
+ return getResourceAsStream(resourceName, null);
+ }
+
+ /**
+ * Opens a resource of the specified name for reading.
+ *
+ * @see #getResourceUrl(String, ClassLoader)
+ */
+ public static InputStream getResourceAsStream(final String resourceName, final ClassLoader callingClass) throws IOException {
+ final URL url = getResourceUrl(resourceName, callingClass);
+ if (url != null) {
+ return url.openStream();
+ }
+ return null;
+ }
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/SignUtils.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/SignUtils.java
index fff68ce280..7065d06383 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/SignUtils.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/util/SignUtils.java
@@ -6,8 +6,10 @@
import java.util.Base64;
import java.util.Random;
+/**
+* @author cloudx
+ */
public class SignUtils {
-
public static String sign(String string, PrivateKey privateKey) {
try {
Signature sign = Signature.getInstance("SHA256withRSA");
@@ -35,7 +37,7 @@ public static String genRandomStr() {
* 生成随机字符串
*
* @param length 字符串长度
- * @return
+ * @return 随机字符串
*/
public static String genRandomStr(int length) {
String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
From 0eb474d31923116c7f7a6c5721b6451b5e62a91c Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 25 Jul 2021 21:33:20 +0800
Subject: [PATCH 0043/1235] =?UTF-8?q?:new:=20#2207=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=A2=9E=E5=8A=A0=E6=9E=84?=
=?UTF-8?q?=E5=BB=BA=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95=E4=BA=8C=E7=BB=B4?=
=?UTF-8?q?=E7=A0=81=E9=93=BE=E6=8E=A5=E7=9A=84=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/me/chanjar/weixin/cp/api/WxCpService.java | 8 ++++++++
.../weixin/cp/api/impl/BaseWxCpServiceImpl.java | 13 +++++++++----
2 files changed, 17 insertions(+), 4 deletions(-)
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 81d8f20c45..345b3bb344 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
@@ -287,6 +287,14 @@ public interface WxCpService extends WxService {
*/
void setWxCpConfigStorage(WxCpConfigStorage wxConfigProvider);
+ /**
+ * 构造扫码登录链接 - 构造独立窗口登录二维码
+ * @param redirectUri 重定向地址,需要进行UrlEncode
+ * @param state 用于保持请求和回调的状态,授权请求后原样带回给企业。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议企业带上该参数,可设置为简单的随机数加session进行校验
+ * @return .
+ */
+ String buildQrConnectUrl(String redirectUri, String state);
+
/**
* 获取部门相关接口的服务类对象
*
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 8c70178213..0a06571c97 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
@@ -17,15 +17,13 @@
import me.chanjar.weixin.common.util.DataUtils;
import me.chanjar.weixin.common.util.RandomUtils;
import me.chanjar.weixin.common.util.crypto.SHA1;
-import me.chanjar.weixin.common.util.http.RequestExecutor;
-import me.chanjar.weixin.common.util.http.RequestHttp;
-import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
-import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
+import me.chanjar.weixin.common.util.http.*;
import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.cp.api.*;
import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
import me.chanjar.weixin.cp.bean.WxCpProviderToken;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
+import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.IOException;
@@ -394,6 +392,13 @@ public String getTaskResult(String joinId) throws WxErrorException {
return get(url, null);
}
+ @Override
+ public String buildQrConnectUrl(String redirectUri, String state) {
+ return String.format("https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=%s&agentid=%s&redirect_uri=%s&state=%s",
+ this.configStorage.getCorpId(), this.configStorage.getAgentId(),
+ URIUtil.encodeURIComponent(redirectUri), StringUtils.trimToEmpty(state));
+ }
+
public File getTmpDirFile() {
return this.tmpDirFile;
}
From 59f871a3a15c3dca7fc70a0865c14051255e3bd1 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 25 Jul 2021 21:44:16 +0800
Subject: [PATCH 0044/1235] =?UTF-8?q?:art:=20=E6=A0=87=E8=AE=B0JedisLock?=
=?UTF-8?q?=E7=BB=84=E4=BB=B6=E4=B8=BA=E8=BF=87=E6=9C=9F=EF=BC=8C=E4=B8=8D?=
=?UTF-8?q?=E5=BB=BA=E8=AE=AE=E4=BD=BF=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/common/util/locks/JedisDistributedLock.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/locks/JedisDistributedLock.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/locks/JedisDistributedLock.java
index 7261d4a118..115777d1c9 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/locks/JedisDistributedLock.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/locks/JedisDistributedLock.java
@@ -11,9 +11,11 @@
/**
* JedisPool 分布式锁
+ * @deprecated 不建议使用jedis-lock这个过期组件,不可靠
*
* @author 007
*/
+@Deprecated
public class JedisDistributedLock implements Lock {
private final Pool jedisPool;
private final JedisLock lock;
From 596ada05f1e1f8e8e6b6e521a1e4c5e26f42bec8 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 25 Jul 2021 21:45:03 +0800
Subject: [PATCH 0045/1235] =?UTF-8?q?:art:=20#2194=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E4=BA=A4=E6=98=93=E7=BB=84=E4=BB=B6?=
=?UTF-8?q?=E7=94=9F=E6=88=90=E8=AE=A2=E5=8D=95=E6=8E=A5=E5=8F=A3=E8=AF=B7?=
=?UTF-8?q?=E6=B1=82=E5=A2=9E=E5=8A=A0=E7=BC=BA=E5=A4=B1=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../miniapp/bean/shop/WxMaShopAddOrderResult.java | 3 ++-
.../wx/miniapp/bean/shop/WxMaShopAddSpuResult.java | 7 ++++---
.../wx/miniapp/bean/shop/WxMaShopAddressInfo.java | 3 ++-
.../miniapp/bean/shop/WxMaShopDeliveryDetail.java | 2 --
.../wx/miniapp/bean/shop/WxMaShopDeliveryItem.java | 2 --
.../wx/miniapp/bean/shop/WxMaShopGetSpuResult.java | 7 ++++---
.../wx/miniapp/bean/shop/WxMaShopOrderDetail.java | 5 +++--
.../wx/miniapp/bean/shop/WxMaShopOrderInfo.java | 5 ++++-
.../wx/miniapp/bean/shop/WxMaShopOrderResult.java | 2 --
.../wx/miniapp/bean/shop/WxMaShopPayInfo.java | 2 --
.../wx/miniapp/bean/shop/WxMaShopPriceInfo.java | 6 +++---
.../wx/miniapp/bean/shop/WxMaShopProductInfo.java | 13 +++++++++++--
.../wx/miniapp/bean/shop/WxMaShopSkuAttribute.java | 5 -----
.../wx/miniapp/bean/shop/WxMaShopSkuInfo.java | 4 ----
.../wx/miniapp/bean/shop/WxMaShopSkuResult.java | 6 +++---
.../bean/shop/WxMaShopSkuWithoutAuditInfo.java | 2 --
.../wx/miniapp/bean/shop/WxMaShopSpuAudit.java | 6 +++---
.../wx/miniapp/bean/shop/WxMaShopSpuDescInfo.java | 7 ++++---
.../wx/miniapp/bean/shop/WxMaShopSpuInfo.java | 5 ++++-
.../bean/shop/WxMaShopSpuWithoutAuditInfo.java | 8 +++++---
.../bean/shop/request/WxMaShopOrderPayRequest.java | 2 --
.../bean/shop/request/WxMaShopSpuPageRequest.java | 6 +++---
.../shop/response/WxMaShopAddOrderResponse.java | 4 ++--
.../bean/shop/response/WxMaShopAddSpuResponse.java | 5 ++---
.../bean/shop/response/WxMaShopBaseResponse.java | 6 +++---
.../shop/response/WxMaShopGetOrderResponse.java | 7 ++++---
.../shop/response/WxMaShopGetSpuListResponse.java | 7 ++++---
.../bean/shop/response/WxMaShopGetSpuResponse.java | 7 ++++---
28 files changed, 74 insertions(+), 70 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddOrderResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddOrderResult.java
index 310a07a394..7733529983 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddOrderResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddOrderResult.java
@@ -7,10 +7,11 @@
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopAddOrderResult implements Serializable {
+ private static final long serialVersionUID = -6574489801942310752L;
+
/**
* 交易组件平台订单ID
*/
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddSpuResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddSpuResult.java
index 561bb114ec..5fdae9fd26 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddSpuResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddSpuResult.java
@@ -1,19 +1,20 @@
package cn.binarywang.wx.miniapp.bean.shop;
import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
import java.io.Serializable;
import java.util.List;
-import lombok.Data;
/**
* @author leiin
* @date 2021/3/23
- * @description: 添加商品参数返回
+ * 添加商品参数返回
*/
@Data
public class WxMaShopAddSpuResult implements Serializable {
-
private static final long serialVersionUID = 2520459849240776617L;
+
/**
* 交易组件平台内部商品ID
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddressInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddressInfo.java
index 4440205c5b..bab59469bb 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddressInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAddressInfo.java
@@ -7,10 +7,11 @@
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopAddressInfo implements Serializable {
+ private static final long serialVersionUID = 1180506593111279857L;
+
/**
* 收件人姓名
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopDeliveryDetail.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopDeliveryDetail.java
index 38d578a950..0a2ba9b2ef 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopDeliveryDetail.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopDeliveryDetail.java
@@ -8,11 +8,9 @@
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopDeliveryDetail implements Serializable {
-
private static final long serialVersionUID = 9074573142867543744L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopDeliveryItem.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopDeliveryItem.java
index 47289acd68..006b5a00d6 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopDeliveryItem.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopDeliveryItem.java
@@ -7,11 +7,9 @@
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopDeliveryItem implements Serializable {
-
private static final long serialVersionUID = -161617470937369136L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopGetSpuResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopGetSpuResult.java
index c2d9356db8..e25868fb39 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopGetSpuResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopGetSpuResult.java
@@ -1,17 +1,18 @@
package cn.binarywang.wx.miniapp.bean.shop;
import com.google.gson.annotations.SerializedName;
-import java.io.Serializable;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
+@EqualsAndHashCode(callSuper = true)
public class WxMaShopGetSpuResult extends WxMaShopSpuInfo implements Serializable {
-
private static final long serialVersionUID = -3859372286926181933L;
/**
* 商品审核信息
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderDetail.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderDetail.java
index afaac18ea6..661fa3208a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderDetail.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderDetail.java
@@ -1,17 +1,18 @@
package cn.binarywang.wx.miniapp.bean.shop;
import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
import java.io.Serializable;
import java.util.List;
-import lombok.Data;
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopOrderDetail implements Serializable {
+ private static final long serialVersionUID = 3325843289672341160L;
/**
* 下单商品信息
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderInfo.java
index 73499a182e..b942bb6b55 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderInfo.java
@@ -4,9 +4,12 @@
import java.io.Serializable;
import lombok.Data;
+/**
+ * @author Boris
+ * @date 2021/3/23
+ */
@Data
public class WxMaShopOrderInfo implements Serializable {
-
private static final long serialVersionUID = -159624260640727372L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderResult.java
index 272e0b3fe1..b2d23995d5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopOrderResult.java
@@ -7,11 +7,9 @@
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopOrderResult implements Serializable {
-
private static final long serialVersionUID = -2665426592693969921L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java
index 5a03b369e0..c9a56a3aed 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java
@@ -7,11 +7,9 @@
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopPayInfo implements Serializable {
-
private static final long serialVersionUID = 687488209024968647L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPriceInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPriceInfo.java
index 33df70f468..f050d3a127 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPriceInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPriceInfo.java
@@ -1,18 +1,18 @@
package cn.binarywang.wx.miniapp.bean.shop;
import com.google.gson.annotations.SerializedName;
-import java.io.Serializable;
import lombok.Data;
+import java.io.Serializable;
+
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopPriceInfo implements Serializable {
-
private static final long serialVersionUID = 1588840927992523263L;
+
/**
* 该订单最终的金额(单位:分)
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopProductInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopProductInfo.java
index 7023f6a235..b381b18f66 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopProductInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopProductInfo.java
@@ -3,13 +3,16 @@
import com.google.gson.annotations.SerializedName;
import lombok.Data;
+import java.io.Serializable;
+
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
-public class WxMaShopProductInfo {
+public class WxMaShopProductInfo implements Serializable {
+ private static final long serialVersionUID = 8979181840150112093L;
+
/**
* 商家自定义商品ID
*
@@ -79,5 +82,11 @@ public class WxMaShopProductInfo {
*/
@SerializedName("sku_id")
private Integer skuId;
+
+ /**
+ * 扣除优惠后单件sku的分摊价格(单位:分),如果没优惠则与sale_price一致
+ */
+ @SerializedName("real_price")
+ private Integer realPrice;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuAttribute.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuAttribute.java
index 3cdfc389e9..bbd3e6cb4e 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuAttribute.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuAttribute.java
@@ -8,9 +8,7 @@
import lombok.NoArgsConstructor;
/**
- *
* sku对象
- *
*
* @author boris
* @since 2021-03-22
@@ -20,11 +18,8 @@
@NoArgsConstructor
@AllArgsConstructor
public class WxMaShopSkuAttribute implements Serializable {
-
-
private static final long serialVersionUID = -3617077838017818865L;
-
/**
* 销售属性key(自定义)
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuInfo.java
index bfbee02694..36914d6b40 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuInfo.java
@@ -9,9 +9,7 @@
import lombok.NoArgsConstructor;
/**
- *
* sku对象
- *
*
* @author boris
* @since 2021-03-22
@@ -21,8 +19,6 @@
@NoArgsConstructor
@AllArgsConstructor
public class WxMaShopSkuInfo implements Serializable {
-
-
private static final long serialVersionUID = -3617077838017818865L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuResult.java
index a6ba18b74e..c4dc1e820f 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuResult.java
@@ -1,18 +1,18 @@
package cn.binarywang.wx.miniapp.bean.shop;
import com.google.gson.annotations.SerializedName;
-import java.io.Serializable;
import lombok.Data;
+import java.io.Serializable;
+
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopSkuResult implements Serializable {
-
private static final long serialVersionUID = 7127892618805299305L;
+
/**
* 交易组件平台自定义skuID
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuWithoutAuditInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuWithoutAuditInfo.java
index 61b9fec59d..334555b2bd 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuWithoutAuditInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSkuWithoutAuditInfo.java
@@ -7,11 +7,9 @@
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopSkuWithoutAuditInfo implements Serializable {
-
private static final long serialVersionUID = 3354108922805323888L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuAudit.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuAudit.java
index 2e56c433cd..a9d30139c3 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuAudit.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuAudit.java
@@ -1,18 +1,18 @@
package cn.binarywang.wx.miniapp.bean.shop;
import com.google.gson.annotations.SerializedName;
-import java.io.Serializable;
import lombok.Data;
+import java.io.Serializable;
+
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopSpuAudit implements Serializable {
-
private static final long serialVersionUID = -3793445161382782265L;
+
/**
* 上一次审核时间, yyyy-MM-dd HH:mm:ss
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuDescInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuDescInfo.java
index cfa03824f7..9213fed31f 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuDescInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuDescInfo.java
@@ -1,6 +1,8 @@
package cn.binarywang.wx.miniapp.bean.shop;
import com.google.gson.annotations.SerializedName;
+
+import java.io.Serializable;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -8,9 +10,7 @@
import lombok.NoArgsConstructor;
/**
- *
* 交易组件-spu商品详情图文
- *
* @author boris
* @since 2021-03-22
*/
@@ -18,7 +18,8 @@
@Builder
@NoArgsConstructor
@AllArgsConstructor
-public class WxMaShopSpuDescInfo {
+public class WxMaShopSpuDescInfo implements Serializable {
+ private static final long serialVersionUID = 9116393835880797275L;
/**
* 商品详情图文-描述
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuInfo.java
index 38f66017ee..bd0c552f0b 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuInfo.java
@@ -5,9 +5,12 @@
import java.util.List;
import lombok.Data;
+/**
+ * @author Boris
+ * @date 2021/3/23
+ */
@Data
public class WxMaShopSpuInfo implements Serializable {
-
private static final long serialVersionUID = 7237829277693177420L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuWithoutAuditInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuWithoutAuditInfo.java
index d4cd76b8cc..306120ed9d 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuWithoutAuditInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopSpuWithoutAuditInfo.java
@@ -1,16 +1,18 @@
package cn.binarywang.wx.miniapp.bean.shop;
import com.google.gson.annotations.SerializedName;
-import java.util.List;
import lombok.Data;
+import java.io.Serializable;
+import java.util.List;
+
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
-public class WxMaShopSpuWithoutAuditInfo {
+public class WxMaShopSpuWithoutAuditInfo implements Serializable {
+ private static final long serialVersionUID = 3878053072551733781L;
/**
* 交易组件平台内部商品ID,修改时与out_product_id二选一
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopOrderPayRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopOrderPayRequest.java
index c91a7895b4..96e56d891a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopOrderPayRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopOrderPayRequest.java
@@ -7,11 +7,9 @@
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopOrderPayRequest implements Serializable {
-
private static final long serialVersionUID = -954667936670521398L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopSpuPageRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopSpuPageRequest.java
index fbe89d9b09..8aee162f3f 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopSpuPageRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopSpuPageRequest.java
@@ -1,17 +1,17 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
-import java.io.Serializable;
import lombok.Data;
+import java.io.Serializable;
+
/**
* @author leiin
* @date 2021/3/23
- * @description: spu分页参数
+ * spu分页参数
*/
@Data
public class WxMaShopSpuPageRequest implements Serializable {
-
private static final long serialVersionUID = -4927300283039328661L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAddOrderResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAddOrderResponse.java
index 509b954dd3..4e724423bb 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAddOrderResponse.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAddOrderResponse.java
@@ -4,15 +4,15 @@
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import lombok.Data;
+import lombok.EqualsAndHashCode;
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
+@EqualsAndHashCode(callSuper = true)
public class WxMaShopAddOrderResponse extends WxMaShopBaseResponse implements Serializable {
-
private static final long serialVersionUID = -8923439859095040010L;
@SerializedName("data")
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAddSpuResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAddSpuResponse.java
index a5b159d663..4f5890c0de 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAddSpuResponse.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAddSpuResponse.java
@@ -4,18 +4,17 @@
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import lombok.Data;
+import lombok.EqualsAndHashCode;
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
+@EqualsAndHashCode(callSuper = true)
public class WxMaShopAddSpuResponse extends WxMaShopBaseResponse implements Serializable {
-
private static final long serialVersionUID = 4370719678135233135L;
-
@SerializedName("data")
private WxMaShopAddSpuResult data;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopBaseResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopBaseResponse.java
index 51ca133923..4332c130c4 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopBaseResponse.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopBaseResponse.java
@@ -1,17 +1,17 @@
package cn.binarywang.wx.miniapp.bean.shop.response;
import com.google.gson.annotations.SerializedName;
-import java.io.Serializable;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
public class WxMaShopBaseResponse implements Serializable {
-
private static final long serialVersionUID = -4647161641538864187L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetOrderResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetOrderResponse.java
index cda070c6e2..b55d163604 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetOrderResponse.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetOrderResponse.java
@@ -2,17 +2,18 @@
import cn.binarywang.wx.miniapp.bean.shop.WxMaShopOrderResult;
import com.google.gson.annotations.SerializedName;
-import java.io.Serializable;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
+@EqualsAndHashCode(callSuper = true)
public class WxMaShopGetOrderResponse extends WxMaShopBaseResponse implements Serializable {
-
private static final long serialVersionUID = -5036075669789800464L;
@SerializedName("order")
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetSpuListResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetSpuListResponse.java
index ceae2fba5b..b1b01978f2 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetSpuListResponse.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetSpuListResponse.java
@@ -2,18 +2,19 @@
import cn.binarywang.wx.miniapp.bean.shop.WxMaShopGetSpuResult;
import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
import java.io.Serializable;
import java.util.List;
-import lombok.Data;
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
+@EqualsAndHashCode(callSuper = true)
public class WxMaShopGetSpuListResponse extends WxMaShopBaseResponse implements Serializable {
-
private static final long serialVersionUID = 1423766388278762123L;
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetSpuResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetSpuResponse.java
index c8a0d5d5d6..be68f8ee84 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetSpuResponse.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopGetSpuResponse.java
@@ -2,17 +2,18 @@
import cn.binarywang.wx.miniapp.bean.shop.WxMaShopGetSpuResult;
import com.google.gson.annotations.SerializedName;
-import java.io.Serializable;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
/**
* @author leiin
* @date 2021/3/23
- * @description:
*/
@Data
+@EqualsAndHashCode(callSuper = true)
public class WxMaShopGetSpuResponse extends WxMaShopBaseResponse implements Serializable {
-
private static final long serialVersionUID = -3781992184787152637L;
/**
From 29498a9b3e96527eef176d6d3988f47775a176b3 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 25 Jul 2021 23:01:23 +0800
Subject: [PATCH 0046/1235] Update bug_report.md
---
.github/ISSUE_TEMPLATE/bug_report.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index ca05962438..d87b6c73fa 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,6 +1,6 @@
---
name: Bug报告
-about: 如果发现Bug,请告诉我们,我们会尽快修复
+about: 本项目仅对最新版本进行维护,使用老版本出现问题的盆友,请先升级到最新版本,升级完后如果发现bug依然存在,请继续填写此issue。
title: ''
labels: ''
assignees: ''
@@ -15,7 +15,7 @@ __简单概括描述下你所遇到的问题。__
### 模块版本情况
* WxJava 模块名:
-* WxJava 版本号:
+* WxJava 版本号:(旧版本不予支持,谢谢配合)
### 详细描述
__尽量详细描述。请不要使用截图,尽量使用文字描述,代码直接贴上来,日志则请附在后面所示区域。__
From b307c5aa85b21b9f1b547d589f0982d60aef9c5b Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 25 Jul 2021 22:07:40 +0800
Subject: [PATCH 0047/1235] =?UTF-8?q?:art:=20=E5=A2=9E=E5=8A=A0=E6=96=87?=
=?UTF-8?q?=E6=A1=A3=E5=9C=B0=E5=9D=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/binarywang/wx/miniapp/api/WxMaLiveGoodsService.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveGoodsService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveGoodsService.java
index df5c6e6534..d0e06d480f 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveGoodsService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLiveGoodsService.java
@@ -23,6 +23,8 @@ public interface WxMaLiveGoodsService {
* 注意:开发者必须保存【商品ID】与【审核单ID】,如果丢失,则无法调用其他相关接口
* 调用额度:500次/一天
* http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token=ACCESS_TOKEN
+ *
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/liveplayer/commodity-api.html#1
*
*
* @param goods 商品
From e15181867f4480e471bf5fd66fbc2b4a43022b4e Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 25 Jul 2021 22:28:46 +0800
Subject: [PATCH 0048/1235] =?UTF-8?q?:art:=20=E9=83=A8=E5=88=86bean?=
=?UTF-8?q?=E7=B1=BB=E5=AE=9E=E7=8E=B0=E5=BA=8F=E5=88=97=E5=8C=96=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wxpay/bean/ecommerce/FundBillRequest.java | 6 +++++-
.../wxpay/bean/ecommerce/FundBillResult.java | 7 +++++--
.../wxpay/bean/ecommerce/TradeBillRequest.java | 10 +++++++---
.../wxpay/bean/ecommerce/TradeBillResult.java | 6 +++++-
4 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java
index 9f12bc3781..9ed6b20cfa 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java
@@ -3,8 +3,11 @@
import com.google.gson.annotations.SerializedName;
import lombok.*;
+import java.io.Serializable;
+
/**
* 资金账单请求
+ *
* @author: f00lish
* @date: 2020/09/28
*/
@@ -13,7 +16,8 @@
@ToString
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
-public class FundBillRequest {
+public class FundBillRequest implements Serializable {
+ private static final long serialVersionUID = 686005394786326248L;
/**
*
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java
index de0dcdb890..b4a3ea45f6 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java
@@ -3,8 +3,11 @@
import com.google.gson.annotations.SerializedName;
import lombok.*;
+import java.io.Serializable;
+
/**
* 资金账单结果
+ *
* @author: f00lish
* @date: 2020/09/28
*/
@@ -13,7 +16,8 @@
@ToString
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
-public class FundBillResult {
+public class FundBillResult implements Serializable {
+ private static final long serialVersionUID = 4008480977464421822L;
/**
*
@@ -30,7 +34,6 @@ public class FundBillResult {
private int downloadBillCount;
-
/**
*
* 字段名:下载信息明细
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillRequest.java
index ad623edf56..f42127e824 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillRequest.java
@@ -3,17 +3,21 @@
import com.google.gson.annotations.SerializedName;
import lombok.*;
+import java.io.Serializable;
+
/**
* 交易账单请求
- * @author: f00lish
- * @date: 2020/09/28
+ *
+ * @author f00lish
+ * @date 2020/09/28
*/
@Data
@Builder
@ToString
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
-public class TradeBillRequest {
+public class TradeBillRequest implements Serializable {
+ private static final long serialVersionUID = 9120047088908567632L;
/**
*
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
index 2fb7b60564..0a19894ed8 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
@@ -3,8 +3,11 @@
import com.google.gson.annotations.SerializedName;
import lombok.*;
+import java.io.Serializable;
+
/**
* 交易账单结果
+ *
* @author: f00lish
* @date: 2020/09/28
*/
@@ -13,7 +16,8 @@
@ToString
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
-public class TradeBillResult {
+public class TradeBillResult implements Serializable {
+ private static final long serialVersionUID = 6928601792206656068L;
/**
*
From 426bcddd4779dd025ce580b3804ab6b50a3eb62d Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 25 Jul 2021 23:09:07 +0800
Subject: [PATCH 0049/1235] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E4=B8=89?=
=?UTF-8?q?=E6=96=B9=E5=BA=94=E7=94=A8=E7=99=BB=E5=BD=95=E6=9E=84=E5=BB=BA?=
=?UTF-8?q?=E7=9A=84=E6=8E=88=E6=9D=83=E9=93=BE=E6=8E=A5=E5=9C=B0=E5=9D=80?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/open/api/impl/WxOpenOAuth2ServiceImpl.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenOAuth2ServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenOAuth2ServiceImpl.java
index 19739e9e44..ce7e3af845 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenOAuth2ServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenOAuth2ServiceImpl.java
@@ -14,6 +14,7 @@
import java.io.IOException;
import static me.chanjar.weixin.mp.enums.WxMpApiUrl.OAuth2.*;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.QRCONNECT_URL;
/**
* oauth2接口实现.
@@ -28,7 +29,7 @@ public class WxOpenOAuth2ServiceImpl extends WxOpenServiceImpl implements WxOAut
@Override
public String buildAuthorizationUrl(String redirectUri, String scope, String state) {
- return String.format(CONNECT_OAUTH2_AUTHORIZE_URL.getUrl(null),
+ return String.format(QRCONNECT_URL.getUrl(null),
this.appId, URIUtil.encodeURIComponent(redirectUri), scope, StringUtils.trimToEmpty(state));
}
From 5f23a6f1012dca10a13a3a5a64a4e0084b6df43b Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 25 Jul 2021 23:34:32 +0800
Subject: [PATCH 0050/1235] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.3.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index 96493adf0f..5e77497b00 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index a9b56cb61d..cbb1a40a02 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 12a5a97f19..0097c19c53 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.2.B
+ 4.1.3.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index 0e0226871d..fcdbb4a83e 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.2.B
+ 4.1.3.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index c4bd57c499..482f1503dc 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.2.B
+ 4.1.3.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 299f9f3220..6eb6b8f50a 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.2.B
+ 4.1.3.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 03b7228d53..47ea0a28a2 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.2.B
+ 4.1.3.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index 925e5eaf70..29085988a1 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index 8a7dfc7e0c..8d7c8f5aa4 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 75cd9bddb4..d0b18bbc73 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index fa49f1c50b..5b5504c6c3 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 8a23b444f9..877ddc7fbe 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index 4a5ce7c480..9e98c68512 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index 6d9d42fcaa..576a6c1d0b 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index 44b46e466d..7f50cf6712 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.2.B
+ 4.1.3.B
weixin-java-qidian
From 8511f8f826a4e6f9cf19231c39003cf40df3f227 Mon Sep 17 00:00:00 2001
From: longliveh <35585613+longliveh@users.noreply.github.com>
Date: Tue, 27 Jul 2021 20:53:19 +0800
Subject: [PATCH 0051/1235] =?UTF-8?q?:new:=20#2219=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=20=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E4=B8=BA=E6=89=93=E5=8D=A1=E4=BA=BA=E5=91=98=E6=8E=92=E7=8F=AD?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/cp/api/WxCpOaService.java | 7 +++
.../weixin/cp/api/impl/WxCpOaServiceImpl.java | 6 ++
.../cp/bean/oa/WxCpSetCheckinSchedule.java | 59 +++++++++++++++++++
.../weixin/cp/constant/WxCpApiPathConsts.java | 1 +
.../cp/api/impl/WxCpOaServiceImplTest.java | 14 +++++
5 files changed, 87 insertions(+)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpSetCheckinSchedule.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
index 606155ec34..7eb986dbbb 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOaService.java
@@ -180,4 +180,11 @@ List getDialRecord(Date startTime, Date endTime, Integer offset,
List getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException;
+ /**
+ * 为打卡人员排班
+ *
+ * @param wxCpSetCheckinSchedule the wx cp set checkin schedule
+ * @throws WxErrorException the wx error exception
+ */
+ void setCheckinScheduleList(WxCpSetCheckinSchedule wxCpSetCheckinSchedule) throws WxErrorException;
}
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 3ba874401b..c6c9d60f11 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
@@ -336,4 +336,10 @@ public List getCheckinScheduleList(Date startTime, Date end
}.getType()
);
}
+
+ @Override
+ public void setCheckinScheduleList(WxCpSetCheckinSchedule wxCpSetCheckinSchedule) throws WxErrorException {
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(SET_CHECKIN_SCHEDULE_DATA);
+ this.mainService.post(url, WxCpGsonBuilder.create().toJson(wxCpSetCheckinSchedule));
+ }
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpSetCheckinSchedule.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpSetCheckinSchedule.java
new file mode 100644
index 0000000000..3d0d1f87f5
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpSetCheckinSchedule.java
@@ -0,0 +1,59 @@
+package me.chanjar.weixin.cp.bean.oa;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * The type Wx cp set checkin schedule.
+ */
+@Data
+public class WxCpSetCheckinSchedule implements Serializable {
+ private static final long serialVersionUID = -7106074373528367075L;
+
+ /**
+ * 打卡规则的规则id,可通过“获取打卡规则”、“获取打卡数据”、“获取打卡人员排班信息”等相关接口获取
+ */
+ @SerializedName("groupid")
+ private Integer groupId;
+
+ /**
+ * 排班表信息
+ */
+ @SerializedName("items")
+ private List- items;
+
+ /**
+ * 排班表月份,格式为年月,如202011
+ */
+ @SerializedName("yearmonth")
+ private Integer yearmonth;
+
+
+ @Data
+ public static class Item implements Serializable{
+
+ private static final long serialVersionUID = -918057757709951513L;
+
+ /**
+ * 打卡人员userid
+ */
+ @SerializedName("userid")
+ private String userid;
+
+ /**
+ * 要设置的天日期,取值在1-31之间。联合yearmonth组成唯一日期 比如20201205
+ */
+ @SerializedName("day")
+ private Integer day;
+
+ /**
+ * 对应groupid规则下的班次id,通过预先拉取规则信息获取,0代表休息
+ */
+ @SerializedName("schedule_id")
+ private Integer scheduleId;
+ }
+
+}
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 f577fcb217..98bd7425c5 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
@@ -97,6 +97,7 @@ interface Oa {
String GET_CHECKIN_DAY_DATA = "/cgi-bin/checkin/getcheckin_daydata";
String GET_CHECKIN_MONTH_DATA = "/cgi-bin/checkin/getcheckin_monthdata";
String GET_CHECKIN_SCHEDULE_DATA = "/cgi-bin/checkin/getcheckinschedulist";
+ String SET_CHECKIN_SCHEDULE_DATA = "/cgi-bin/checkin/setcheckinschedulist";
String GET_APPROVAL_INFO = "/cgi-bin/oa/getapprovalinfo";
String GET_APPROVAL_DETAIL = "/cgi-bin/oa/getapprovaldetail";
String GET_DIAL_RECORD = "/cgi-bin/dial/get_dial_record";
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
index f838837b00..4370bb3d83 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImplTest.java
@@ -16,6 +16,7 @@
import org.testng.collections.Lists;
import java.text.ParseException;
+import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -93,6 +94,19 @@ public void testGetCheckinScheduleData() throws ParseException, WxErrorException
System.out.println(gson.toJson(results));
}
+ @Test
+ public void testSetCheckinScheduleList() throws WxErrorException {
+ WxCpSetCheckinSchedule wxCpSetCheckinSchedule = new WxCpSetCheckinSchedule();
+ wxCpSetCheckinSchedule.setGroupId(3);
+ wxCpSetCheckinSchedule.setYearmonth(202108);
+ WxCpSetCheckinSchedule.Item item = new WxCpSetCheckinSchedule.Item();
+ item.setScheduleId(0);
+ item.setDay(20);
+ item.setUserid("12003648");
+ wxCpSetCheckinSchedule.setItems(Arrays.asList(item));
+ wxService.getOaService().setCheckinScheduleList(wxCpSetCheckinSchedule);
+ }
+
@Test
public void testGetCheckinOption() throws WxErrorException {
From 00347dc50c9e55cb901e6f336a4bcc91b72770b0 Mon Sep 17 00:00:00 2001
From: hywr <33077958+hywr@users.noreply.github.com>
Date: Thu, 29 Jul 2021 22:22:31 +0800
Subject: [PATCH 0052/1235] =?UTF-8?q?:art:=20#2226=20=E3=80=90=E5=BC=80?=
=?UTF-8?q?=E6=94=BE=E5=B9=B3=E5=8F=B0=E3=80=91=E7=AC=AC=E4=B8=89=E6=96=B9?=
=?UTF-8?q?=E5=B9=B3=E5=8F=B0=E8=8E=B7=E5=8F=96=E4=BB=A3=E7=A0=81=E6=A8=A1?=
=?UTF-8?q?=E6=9D=BF=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E5=8F=82=E6=95=B0=EF=BC=8C=E5=8F=AF=E8=BF=87=E6=BB=A4=E6=A0=87?=
=?UTF-8?q?=E5=87=86=E6=A8=A1=E6=9D=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../open/api/WxOpenComponentService.java | 83 ++++++++++++++-----
.../api/impl/WxOpenComponentServiceImpl.java | 9 +-
.../open/bean/WxOpenMaCodeTemplate.java | 7 ++
3 files changed, 75 insertions(+), 24 deletions(-)
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index 48f727ac3b..c25acdf1aa 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -15,6 +15,7 @@
import me.chanjar.weixin.open.bean.minishop.goods.*;
import me.chanjar.weixin.open.bean.minishop.limitdiscount.LimitDiscountGoods;
import me.chanjar.weixin.open.bean.result.*;
+import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.List;
@@ -169,7 +170,6 @@ public interface WxOpenComponentService {
String MINISHOP_GET_DELIVERY_COMPANY_URL = "https://api.weixin.qq.com/product/delivery/get_company_list";
-
/**
* Gets wx mp service by appid.
*
@@ -456,11 +456,23 @@ public interface WxOpenComponentService {
*
* @return 小程序代码模版列表 (templateId)
* @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档
+ * @see #getTemplateList(Integer)
*/
+ @Deprecated
List getTemplateList() throws WxErrorException;
/**
- * 请参考并使用 {@link #addToTemplate(long,int)}.
+ * 获取代码模版库中的所有小程序代码模版.
+ * 文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/code_template/gettemplatelist.html
+ *
+ * @param templateType 模板类型,可空,默认全部,填0普通模,1标准模板
+ * @return 小程序代码模版列表 (templateId)
+ * @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档
+ */
+ List getTemplateList(@Nullable Integer templateType) throws WxErrorException;
+
+ /**
+ * 请参考并使用 {@link #addToTemplate(long, int)}.
* 将草稿箱的草稿选为小程序代码模版.
*
* @param draftId 草稿ID,本字段可通过“获取草稿箱内的所有临时代码草稿”接口获得
@@ -474,7 +486,7 @@ public interface WxOpenComponentService {
* https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/code_template/addtotemplate.html
* 将草稿添加到代码模板库.
*
- * @param draftId 草稿ID,本字段可通过“获取草稿箱内的所有临时代码草稿”接口获得
+ * @param draftId 草稿ID,本字段可通过“获取草稿箱内的所有临时代码草稿”接口获得
* @param templateType 代码模版类型,【普通模板:0, 标准模板:1】
* @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档
* @see #getTemplateDraftList #getTemplateDraftList
@@ -573,12 +585,12 @@ public interface WxOpenComponentService {
* https://api.weixin.qq.com/product/register/register_shop?component_access_token=xxxxxxxxx
* 注册小商店账号
*
- * @param wxName 微信号(必填)
- * @param idCardName 身份证姓名(必填)
- * @param idCardNumber 身份证号(必填)
- * @param channelId 渠道号,服务商后台生成渠道信息。(选填)
- * @param apiOpenstoreType 1-整店打包(开通小商店),2-组件开放(开通小程序,并且已经完整的嵌入电商功能)(必填)
- * @param authPageUrl 授权url(选填)
+ * @param wxName 微信号(必填)
+ * @param idCardName 身份证姓名(必填)
+ * @param idCardNumber 身份证号(必填)
+ * @param channelId 渠道号,服务商后台生成渠道信息。(选填)
+ * @param apiOpenstoreType 1-整店打包(开通小商店),2-组件开放(开通小程序,并且已经完整的嵌入电商功能)(必填)
+ * @param authPageUrl 授权url(选填)
* @return the wx open result
* @throws WxErrorException
*/
@@ -588,7 +600,8 @@ public interface WxOpenComponentService {
/**
* https://api.weixin.qq.com/product/register/check_audit_status
* 异步状态查询
- * @param wxName 微信号
+ *
+ * @param wxName 微信号
* @return
*/
String checkAuditStatus(String wxName) throws WxErrorException;
@@ -596,15 +609,15 @@ public interface WxOpenComponentService {
/**
* 已经获取到小商店的appId,那么需要通过accesstoken来获取该小商店的状态
+ *
* @param appId
* @param wxName
* @return
* @throws WxErrorException
*/
- String checkAuditStatus(String appId, String wxName) throws WxErrorException;
+ String checkAuditStatus(String appId, String wxName) throws WxErrorException;
/**
- *
* @param appId
* @param subjectType
* @param busiLicense
@@ -617,7 +630,6 @@ public interface WxOpenComponentService {
WxOpenResult submitMerchantInfo(String appId, String subjectType, MinishopBusiLicense busiLicense, MinishopOrganizationCodeInfo organizationCodeInfo, MinishopIdcardInfo idcardInfo, MinishopSuperAdministratorInfo superAdministratorInfo, String merchantShoprtName) throws WxErrorException;
/**
- *
* @param appId
* @param nameInfo
* @param returnInfo
@@ -628,7 +640,6 @@ public interface WxOpenComponentService {
/**
- *
* @param height
* @param width
* @param file
@@ -640,6 +651,7 @@ public interface WxOpenComponentService {
/**
* 获取小商店的类目详情
+ *
* @param appId:小商店APPID
* @param fCatId:父类目ID,可先填0获取根部类目
* @return 小商店类目信息列表
@@ -649,6 +661,7 @@ public interface WxOpenComponentService {
/**
* 获取小商店品牌信息
+ *
* @param appId:小商店appID
* @return
*/
@@ -657,6 +670,7 @@ public interface WxOpenComponentService {
/**
* 获取小商店运费模版信息
+ *
* @param appId:小商店appID
* @return
*/
@@ -665,6 +679,7 @@ public interface WxOpenComponentService {
/**
* 获取小商店商品分类信息
+ *
* @param appId
* @return
*/
@@ -673,6 +688,7 @@ public interface WxOpenComponentService {
/**
* 获取小商店的快递公司列表
+ *
* @param appId
* @return
* @throws WxErrorException
@@ -681,18 +697,21 @@ public interface WxOpenComponentService {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//小商店优惠券接口
+
/**
* 创建小商店优惠券
+ *
* @param appId:小商店的appId
- * @param couponInfo: 优惠券信息
+ * @param couponInfo: 优惠券信息
* @return couponId: 优惠券ID
* @throws WxErrorException
*/
- Integer minishopCreateCoupon(String appId, WxMinishopCoupon couponInfo) throws WxErrorException;
+ Integer minishopCreateCoupon(String appId, WxMinishopCoupon couponInfo) throws WxErrorException;
/**
* 与小商店对接,获取小商店的优惠券信息
+ *
* @param appId:小商店的appId
* @param startCreateTime:优惠券创建时间的搜索开始时间
* @param endCreateTime:优惠券创建时间的搜索结束时间
@@ -707,16 +726,18 @@ public interface WxOpenComponentService {
/**
* 与小商店对接,将优惠券发送给某人
+ *
* @param appid:小商店appId
* @param openId:优惠券接收人的openId
- * @param couponId: 优惠券ID
+ * @param couponId: 优惠券ID
* @return
*/
- WxOpenResult minishopPushCouponToUser(String appid, String openId, Integer couponId) throws WxErrorException;
+ WxOpenResult minishopPushCouponToUser(String appid, String openId, Integer couponId) throws WxErrorException;
/**
* 与小商店对接,更新商城优惠券
+ *
* @param appId
* @param couponInfo
* @return
@@ -727,13 +748,14 @@ public interface WxOpenComponentService {
/**
* 从优惠券创建后status=1,可流转到2,4,5, COUPON_STATUS_VALID = 2 ;//生效 COUPON_STATUS_INVALID = 4 ;//已作废 COUPON_STATUS_DEL = 5;//删除
+ *
* @param appId
* @param couponId
* @param status
* @return
* @throws WxErrorException
*/
- WxOpenResult minishopUpdateCouponStatus(String appId, Integer couponId, Integer status) throws WxErrorException;
+ WxOpenResult minishopUpdateCouponStatus(String appId, Integer couponId, Integer status) throws WxErrorException;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -747,8 +769,10 @@ public interface WxOpenComponentService {
String MINISHOP_LISTING_SPU_URL = "https://api.weixin.qq.com/product/spu/listing";
String MINISHOP_DELISTING_SPU_URL = "https://api.weixin.qq.com/product/spu/delisting";
+
/**
* 小商店添加商品接口,添加商品后只是添加到草稿箱,需要通过调用上架商品,并通过审核才能在商城中显示。
+ *
* @param appId
* @param spu
* @return
@@ -759,17 +783,19 @@ public interface WxOpenComponentService {
/**
* 小商店删除商品接口,直接删除,不会存在小商店回收站里面。
+ *
* @param appId
* @param productId
* @param outProductId
* @return
* @throws WxErrorException
*/
- WxOpenResult minishopGoodsDelSpu(String appId, Long productId, Long outProductId) throws WxErrorException;
+ WxOpenResult minishopGoodsDelSpu(String appId, Long productId, Long outProductId) throws WxErrorException;
/**
* 小商店更新商品接口,不会直接影响上架商品的信息,而是存在草稿箱,需要调用上架商品接口,并通过审核才能在商城中显示。
+ *
* @param appId
* @param spu
* @return
@@ -780,6 +806,7 @@ public interface WxOpenComponentService {
/**
* 上架商品。
+ *
* @param appId
* @param productId
* @param outProductId
@@ -791,6 +818,7 @@ public interface WxOpenComponentService {
/**
* 下架商品
+ *
* @param appId
* @param productId
* @param outProductId
@@ -816,6 +844,7 @@ public interface WxOpenComponentService {
/**
* 小商店新增sku信息
+ *
* @param appId
* @param sku
* @return
@@ -826,6 +855,7 @@ public interface WxOpenComponentService {
/**
* 小商店批量新增sku信息
+ *
* @param appId
* @param skuList
* @return
@@ -836,6 +866,7 @@ public interface WxOpenComponentService {
/**
* 小商店删除sku消息
+ *
* @param appId
* @param productId
* @param outProductId
@@ -844,11 +875,12 @@ public interface WxOpenComponentService {
* @return
* @throws WxErrorException
*/
- WxOpenResult minishopGoodsDelSku(String appId, Long productId, Long outProductId, String outSkuId, Long skuId) throws WxErrorException;
+ WxOpenResult minishopGoodsDelSku(String appId, Long productId, Long outProductId, String outSkuId, Long skuId) throws WxErrorException;
/**
* 小商店更新sku
+ *
* @param appId
* @param sku
* @return
@@ -859,6 +891,7 @@ public interface WxOpenComponentService {
/**
* 小商店更新sku价格
+ *
* @param appId
* @param productId
* @param outProductId
@@ -874,6 +907,7 @@ public interface WxOpenComponentService {
/**
* 小商店更新sku库存
+ *
* @param appId
* @param productId
* @param outProductId
@@ -884,11 +918,12 @@ public interface WxOpenComponentService {
* @return
* @throws WxErrorException
*/
- WxOpenResult minishopGoodsUpdateSkuStock(String appId, Long productId, Long outProductId, String outSkuId, Long skuId, Integer type, Integer stockNum) throws WxErrorException;
+ WxOpenResult minishopGoodsUpdateSkuStock(String appId, Long productId, Long outProductId, String outSkuId, Long skuId, Integer type, Integer stockNum) throws WxErrorException;
/**
* 小商店通用Post接口
+ *
* @param appId
* @param url
* @param requestParam
@@ -898,7 +933,6 @@ public interface WxOpenComponentService {
String minishopCommonPost(String appId, String url, String requestParam) throws WxErrorException;
-
//////////////////////////////////////////////////////////////
//商品抢购任务-秒杀活动
String API_MINISHOP_ADD_LIMIT_DISCOUNT_URL = "https://api.weixin.qq.com/product/limiteddiscount/add/";
@@ -910,6 +944,7 @@ public interface WxOpenComponentService {
/**
* 添加抢购任务
* 每个商品(SPU)同一时间只能有一个抢购任务。 如果当前有抢购任务没有结束,无论是否开始,都不允许创建第二个抢购任务 可以提前修改抢购任务状态为结束后,再创建新的任务。 每次创建抢购任务时,必须填充该SPU下 所有SKU的抢购信息
+ *
* @param appId
* @param limitDiscountGoods
* @return
@@ -919,6 +954,7 @@ public interface WxOpenComponentService {
/**
* status为0代表 还未结束的抢购任务,无论是否开始 status为1代表已经结束的 抢购任务 如果不填status,则两种都拉取
+ *
* @param appId
* @param status
* @return
@@ -929,6 +965,7 @@ public interface WxOpenComponentService {
/**
* 修改抢购任务状态
* 用于提前结束抢购任务,无论抢购任务是否在执行中,都可以关闭。 也可以直接删除抢购任务 注意:结束后不允许再开启,状态不可逆
+ *
* @param appId
* @param taskId
* @param status
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 f3ca14696a..ac71523a7e 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
@@ -30,6 +30,7 @@
import me.chanjar.weixin.open.bean.result.*;
import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.math.BigDecimal;
@@ -493,7 +494,13 @@ public List getTemplateDraftList() throws WxErrorException
@Override
public List getTemplateList() throws WxErrorException {
- String responseContent = get(GET_TEMPLATE_LIST_URL, "access_token");
+ return getTemplateList(null);
+ }
+
+ @Override
+ public List getTemplateList(@Nullable Integer templateType) throws WxErrorException {
+ String url = GET_TEMPLATE_LIST_URL + (templateType == null ? "" : "?template_type=" + templateType);
+ String responseContent = get(url, "access_token");
JsonObject response = GsonParser.parse(StringUtils.defaultString(responseContent, "{}"));
boolean hasTemplateList = response.has("template_list");
if (hasTemplateList) {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java
index be1bb9b138..9bb8ce94e7 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java
@@ -32,6 +32,13 @@ public class WxOpenMaCodeTemplate implements Serializable {
*/
@SerializedName(value = "userDesc", alternate = "user_desc")
private String userDesc;
+
+ /**
+ * 模板类型 0对应普通模板,1对应标准模板
+ */
+ @SerializedName(value = "templateType", alternate = "template_type")
+ private Integer template_type;
+
/**
* 开发者上传草稿时间 / 被添加为模版的时间
*/
From 6d2c0a37099f742529db29118e843252f2290e30 Mon Sep 17 00:00:00 2001
From: zsail
Date: Thu, 29 Jul 2021 22:24:19 +0800
Subject: [PATCH 0053/1235] =?UTF-8?q?:new:=20#2222=20=E3=80=90=E5=85=AC?=
=?UTF-8?q?=E4=BC=97=E5=8F=B7=E3=80=91=20=E6=96=B0=E5=A2=9E=E7=9F=ADkey?=
=?UTF-8?q?=E6=89=98=E7=AE=A1=E5=92=8C=E8=A7=A3=E6=9E=90=E7=9A=84=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/mp/api/WxMpService.java | 30 +++++++++++++-
.../mp/api/impl/BaseWxMpServiceImpl.java | 19 +++++++++
.../mp/bean/result/WxMpShortKeyResult.java | 39 +++++++++++++++++++
.../chanjar/weixin/mp/enums/WxMpApiUrl.java | 12 +++++-
4 files changed, 98 insertions(+), 2 deletions(-)
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java
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 4e8cb96987..4dadbc174e 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
@@ -15,6 +15,7 @@
import me.chanjar.weixin.mp.bean.WxMpSemanticQuery;
import me.chanjar.weixin.mp.bean.result.WxMpCurrentAutoReplyInfo;
import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
+import me.chanjar.weixin.mp.bean.result.WxMpShortKeyResult;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.enums.WxMpApiUrl;
@@ -26,6 +27,31 @@
* @author chanjarster
*/
public interface WxMpService extends WxService {
+ /**
+ *
+ * 短key托管 类似于短链API.
+ * 详情请见: https://developers.weixin.qq.com/doc/offiaccount/Account_Management/KEY_Shortener.html
+ *
+ *
+ * @param longData 需要转换的长信息,不超过4KB
+ * @param expireSeconds 短key有效期(单位秒),最大值为2592000(即30天),默认为2592000(30天)
+ * @return shortKey 短key,15字节,base62编码(0-9/a-z/A-Z)
+ * @throws WxErrorException .
+ */
+ String genShorten(String longData, Integer expireSeconds) throws WxErrorException;
+
+ /**
+ *
+ * 短key解析 将短key还原为长信息。
+ * 详情请见: https://developers.weixin.qq.com/doc/offiaccount/Account_Management/KEY_Shortener.html
+ *
+ *
+ * @param shortKey 短key
+ * @return WxMpShortKeyResult 解析结果
+ * @throws WxErrorException .
+ */
+ WxMpShortKeyResult fetchShorten(String shortKey) throws WxErrorException;
+
/**
*
* 验证消息的确来自微信服务器.
@@ -263,7 +289,7 @@ public interface WxMpService extends WxService {
/**
* 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求.
*
- * @param url 请求接口地址
+ * @param url 请求接口地址
* @param obj 请求参数
* @return 接口响应字符串 string
* @throws WxErrorException 异常
@@ -536,12 +562,14 @@ public interface WxMpService extends WxService {
/**
* 返回电子发票报销方相关接口
+ *
* @return WxMpReimburseInvoiceService
*/
WxMpReimburseInvoiceService getReimburseInvoiceService();
/**
* .
+ *
* @param reimburseInvoiceService .
*/
void setReimburseInvoiceService(WxMpReimburseInvoiceService reimburseInvoiceService);
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 828921b1ea..2b8d9bfd39 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
@@ -32,6 +32,7 @@
import me.chanjar.weixin.mp.bean.WxMpSemanticQuery;
import me.chanjar.weixin.mp.bean.result.WxMpCurrentAutoReplyInfo;
import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
+import me.chanjar.weixin.mp.bean.result.WxMpShortKeyResult;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.enums.WxMpApiUrl;
import me.chanjar.weixin.mp.util.WxMpConfigStorageHolder;
@@ -150,6 +151,24 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
private int retrySleepMillis = 1000;
private int maxRetryTimes = 5;
+ @Override
+ public String genShorten(String longData, Integer expireSeconds) throws WxErrorException {
+ JsonObject param = new JsonObject();
+ param.addProperty("long_data", longData);
+ param.addProperty("expire_seconds", expireSeconds);
+ String responseContent = this.post(GEN_SHORTEN_URL, param.toString());
+ JsonObject tmpJsonObject = GsonParser.parse(responseContent);
+ return tmpJsonObject.get("short_key").getAsString();
+ }
+
+ @Override
+ public WxMpShortKeyResult fetchShorten(String shortKey) throws WxErrorException {
+ JsonObject param = new JsonObject();
+ param.addProperty("short_key", shortKey);
+ String responseContent = this.post(FETCH_SHORTEN_URL, param.toString());
+ return WxMpShortKeyResult.fromJson(responseContent);
+ }
+
@Override
public boolean checkSignature(String timestamp, String nonce, String signature) {
try {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java
new file mode 100644
index 0000000000..459b3c3674
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java
@@ -0,0 +1,39 @@
+package me.chanjar.weixin.mp.bean.result;
+
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 短key解析结果
+ *
+ * @author zsa
+ */
+@Data
+public class WxMpShortKeyResult implements Serializable {
+
+ private static final long serialVersionUID = 5770641374997158852L;
+
+ /**
+ * 创建的时间戳
+ */
+ protected String longData;
+ /**
+ * 创建的时间戳
+ */
+ protected long createTime;
+ /**
+ * 剩余的过期秒数
+ */
+ protected long expireSeconds;
+
+ public static WxMpShortKeyResult fromJson(String json) {
+ return WxMpGsonBuilder.create().fromJson(json, WxMpShortKeyResult.class);
+ }
+
+ @Override
+ public String toString() {
+ return WxMpGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
index 0facd7cbb0..8f6cfeea4c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
@@ -157,7 +157,17 @@ enum Other implements WxMpApiUrl {
/**
* 公众号调用或第三方平台帮公众号调用对公众号的所有api调用(包括第三方帮其调用)次数进行清零.
*/
- CLEAR_QUOTA_URL(API_DEFAULT_HOST_URL, "/cgi-bin/clear_quota");
+ CLEAR_QUOTA_URL(API_DEFAULT_HOST_URL, "/cgi-bin/clear_quota"),
+
+ /**
+ * 短key托管(生成短key的url)
+ */
+ GEN_SHORTEN_URL(API_DEFAULT_HOST_URL, "/cgi-bin/shorten/gen"),
+
+ /**
+ * 短key解析(解析短key的url)
+ */
+ FETCH_SHORTEN_URL(API_DEFAULT_HOST_URL, "/cgi-bin/shorten/fetch");
private final String prefix;
private final String path;
From 10fd006f32e5a672d72d0e1c35b439f9bcc59959 Mon Sep 17 00:00:00 2001
From: Sheng Chen <315709842@qq.com>
Date: Thu, 29 Jul 2021 22:24:54 +0800
Subject: [PATCH 0054/1235] :art: class BaseWxPayResult add a field named
signType
* feature (common): the callback xml from wechat maybe has sign_type
* feature (common): the callback xml from wechat maybe has sign_type
Co-authored-by: chensheng
---
.../binarywang/wxpay/bean/result/BaseWxPayResult.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
index 9f6f5e2700..6a33bf36a6 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
@@ -104,6 +104,11 @@ public abstract class BaseWxPayResult {
*/
@XStreamAlias("sign")
private String sign;
+ /**
+ * 签名类型.
+ */
+ @XStreamAlias("sign_type")
+ private String signType;
//以下为辅助属性
/**
@@ -180,6 +185,7 @@ private void loadBasicXML(Document d) {
subMchId = readXmlString(d, "sub_mch_id");
nonceStr = readXmlString(d, "nonce_str");
sign = readXmlString(d, "sign");
+ signType = readXmlString(d, "sign_type");
}
protected static Integer readXmlInteger(Node d, String tagName) {
From 140fb022a12472254b40ca02878beb3e76e9a510 Mon Sep 17 00:00:00 2001
From: huangxm129 <40385667+huangxm129@users.noreply.github.com>
Date: Sun, 1 Aug 2021 11:47:34 +0800
Subject: [PATCH 0055/1235] =?UTF-8?q?:art:=20#2229=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E6=9F=A5=E8=AF=A2=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=AE=9E=E4=BD=93=E7=B1=BB=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E8=A7=86=E9=A2=91=E5=8F=B7=E5=90=8D=E7=A7=B0=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/cp/bean/WxCpUser.java | 20 ++++++++++++++++++-
.../cp/util/json/WxCpUserGsonAdapter.java | 10 ++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java
index a23b499484..18ef125ab2 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java
@@ -68,6 +68,10 @@ public class WxCpUser implements Serializable {
private List externalAttrs = new ArrayList<>();
private String externalPosition;
private String externalCorpName;
+ private WechatChannels wechatChannels;
+
+
+
public void addExternalAttr(ExternalAttribute externalAttr) {
this.externalAttrs.add(externalAttr);
@@ -113,7 +117,7 @@ public static class Attr implements Serializable {
@AllArgsConstructor
public static class ExternalAttribute implements Serializable {
private static final long serialVersionUID = -5696099236344075582L;
-
+
/**
* 属性类型: 0-本文 1-网页 2-小程序.
*/
@@ -144,4 +148,18 @@ public static class ExternalAttribute implements Serializable {
*/
private String pagePath;
}
+
+
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class WechatChannels implements Serializable {
+ private static final long serialVersionUID = -5696099236344075582L;
+
+ private String nickname;
+
+ private Integer status;
+
+ }
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java
index 6b09c3dc12..6cecde0b4d 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java
@@ -30,6 +30,7 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri
private static final String EXTERNAL_POSITION = "external_position";
private static final String DEPARTMENT = "department";
private static final String EXTERNAL_CORP_NAME = "external_corp_name";
+ private static final String WECHAT_CHANNELS = "wechat_channels";
@Override
public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
@@ -95,6 +96,11 @@ public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationC
if (GsonHelper.isNotNull(o.get(EXTERNAL_PROFILE))) {
user.setExternalCorpName(GsonHelper.getString(o.getAsJsonObject().get(EXTERNAL_PROFILE).getAsJsonObject(), EXTERNAL_CORP_NAME));
+ JsonElement jsonElement = o.get(EXTERNAL_PROFILE).getAsJsonObject().get(WECHAT_CHANNELS);
+ if(jsonElement !=null){
+ JsonObject asJsonObject = jsonElement.getAsJsonObject();
+ user.setWechatChannels(WechatChannels.builder().nickname(GsonHelper.getString(asJsonObject,"nickname")).status(GsonHelper.getInteger(asJsonObject,"status")).build());
+ }
this.buildExternalAttrs(o, user);
}
@@ -321,6 +327,10 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon
attrsJson.addProperty(EXTERNAL_CORP_NAME, user.getExternalCorpName());
}
+ if(user.getWechatChannels() != null){
+ attrsJson.add(WECHAT_CHANNELS,GsonHelper.buildJsonObject("nickname", user.getWechatChannels().getNickname(), "status", user.getWechatChannels().getStatus()));
+ }
+
if (!user.getExternalAttrs().isEmpty()) {
JsonArray attrsJsonArray = new JsonArray();
for (ExternalAttribute attr : user.getExternalAttrs()) {
From 4a009fe9f24ed473d3dfd4d59312595c3caa1a6a Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 1 Aug 2021 11:49:35 +0800
Subject: [PATCH 0056/1235] =?UTF-8?q?:art:=20=E5=8E=BB=E6=8E=89=E9=94=99?=
=?UTF-8?q?=E8=AF=AF=E7=9A=84=E5=BF=85=E5=A1=AB=E6=A0=A1=E9=AA=8C=E6=B3=A8?=
=?UTF-8?q?=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../github/binarywang/wxpay/bean/entpay/EntPayBankRequest.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankRequest.java
index 04c26403c2..fee4b76fb2 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayBankRequest.java
@@ -110,7 +110,6 @@ public class EntPayBankRequest extends BaseWxPayRequest {
* 描述:企业付款到银行卡付款说明,即订单备注(UTF8编码,允许100个字符以内)
*
*/
- @Required
@XStreamAlias("desc")
private String description;
From 443fa220e2c95a3c28d2e98d86bb4d8825e371d8 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 1 Aug 2021 11:50:13 +0800
Subject: [PATCH 0057/1235] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=87=A0?=
=?UTF-8?q?=E4=B8=AA=E9=94=99=E8=AF=AF=E7=9A=84=E5=AD=97=E6=AE=B5=E7=B1=BB?=
=?UTF-8?q?=E5=9E=8B=E5=AE=9A=E4=B9=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bean/entpay/EntPayRedpackQueryResult.java | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryResult.java
index 57e7068c7a..996b4a51d1 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRedpackQueryResult.java
@@ -66,7 +66,7 @@ public class EntPayRedpackQueryResult extends BaseWxPayResult implements Seriali
* 发送失败原因
*/
@XStreamAlias("reason")
- private Integer reason;
+ private String reason;
/**
* 红包发送时间
@@ -119,20 +119,20 @@ public class EntPayRedpackQueryResult extends BaseWxPayResult implements Seriali
* 接收时间
*/
@XStreamAlias("rcv_time")
- private Integer rcvTime;
+ private String rcvTime;
/**
* 发送者名称
*/
@XStreamAlias("sender_name")
- private Integer senderName;
+ private String senderName;
/**
* 发送者头像
* 通过企业微信开放接口上传获取
*/
@XStreamAlias("sender_header_media_id")
- private Integer senderHeaderMediaId;
+ private String senderHeaderMediaId;
@Override
protected void loadXml(Document d) {
@@ -141,7 +141,7 @@ protected void loadXml(Document d) {
status = readXmlString(d, "status");
sendType = readXmlString(d, "send_type");
totalAmount = readXmlInteger(d, "total_amount");
- reason = readXmlInteger(d, "reason");
+ reason = readXmlString(d, "reason");
sendTime = readXmlString(d, "send_time");
refundTime = readXmlString(d, "refund_time");
refundAmount = readXmlInteger(d, "refund_amount");
@@ -150,8 +150,8 @@ protected void loadXml(Document d) {
actName = readXmlString(d, "act_name");
openid = readXmlString(d, "openid");
amount = readXmlInteger(d, "amount");
- rcvTime = readXmlInteger(d, "rcv_time");
- senderName = readXmlInteger(d, "sender_name");
- senderHeaderMediaId = readXmlInteger(d, "sender_header_media_id");
+ rcvTime = readXmlString(d, "rcv_time");
+ senderName = readXmlString(d, "sender_name");
+ senderHeaderMediaId = readXmlString(d, "sender_header_media_id");
}
}
From eecd3f87d769c4509d1d5e8bb7e03afb4d48f3a2 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 1 Aug 2021 12:21:23 +0800
Subject: [PATCH 0058/1235] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 3552509fc2..c8e0e338c5 100644
--- a/README.md
+++ b/README.md
@@ -41,7 +41,7 @@
1. **2021-06-02 发布 [【4.1.0正式版】](https://mp.weixin.qq.com/s/nIk_xOf6dxkhKfqq830Cuw)**!
1. 新手重要提示:本项目仅是一个SDK开发工具包,未提供Web实现,建议使用 `maven` 或 `gradle` 引用本项目即可使用本SDK提供的各种功能,详情可参考 **[【Demo项目】](demo.md)** 或本项目中的部分单元测试代码;另外微信开发新手请务必阅读[【开发文档 Wiki 首页】](https://github.com/Wechat-Group/WxJava/wiki)的常见问题部分,可以少走很多弯路,节省不少时间。
1. 技术交流群:想获得QQ群/微信群/钉钉企业群等信息的同学,请使用微信扫描上面的微信公众号二维码关注 `WxJava` 后点击相关菜单即可获取加入方式,同时也可以在微信中搜索 `weixin-java-tools` 或 `WxJava` 后选择正确的公众号进行关注,该公众号会及时通知SDK相关更新信息,并不定期分享微信Java开发相关技术知识;
-1. 钉钉技术交流群: `30294972`(技术交流群),`35724728`(通知群,实时通知Github项目变更记录)。
+1. 钉钉技术交流群:`32206329`(技术交流2群), `30294972`(技术交流1群,目前已满),`35724728`(通知群,实时通知Github项目变更记录)。
1. 微信开发新手或者Java开发新手在群内提问或新开Issue提问前,请先阅读[【提问的智慧】](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md),并确保已查阅过 [【开发文档Wiki】](https://github.com/wechat-group/WxJava/wiki) ,避免浪费大家的宝贵时间;
1. 寻求帮助时需贴代码或大长串异常信息的,请利用 http://paste.ubuntu.com
From 06c407a6f0e5763873dc230828f53983d8570f0f Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 1 Aug 2021 22:59:27 +0800
Subject: [PATCH 0059/1235] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.4.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index 5e77497b00..d09914a6af 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index cbb1a40a02..57c49c1844 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 0097c19c53..913e475d32 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.3.B
+ 4.1.4.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index fcdbb4a83e..a294d9ed47 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.3.B
+ 4.1.4.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index 482f1503dc..d1f9590f90 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.3.B
+ 4.1.4.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 6eb6b8f50a..fe4ba365aa 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.3.B
+ 4.1.4.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 47ea0a28a2..478c714ff6 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.3.B
+ 4.1.4.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index 29085988a1..a0e73edb7a 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index 8d7c8f5aa4..93e99a3fb9 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index d0b18bbc73..1399239972 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 5b5504c6c3..62849cc400 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 877ddc7fbe..37a9a83493 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index 9e98c68512..dd0346310a 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index 576a6c1d0b..7b463313c6 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index 7f50cf6712..0f4c73fc11 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.3.B
+ 4.1.4.B
weixin-java-qidian
From 2a8854656eca545965daa18884500a34ac8d6c5d Mon Sep 17 00:00:00 2001
From: zsail
Date: Tue, 3 Aug 2021 16:57:11 +0800
Subject: [PATCH 0060/1235] =?UTF-8?q?:art:=20=E4=BF=AE=E6=AD=A3=E5=AD=97?=
=?UTF-8?q?=E6=AE=B5=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java
index 459b3c3674..04b8c7d455 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java
@@ -16,7 +16,7 @@ public class WxMpShortKeyResult implements Serializable {
private static final long serialVersionUID = 5770641374997158852L;
/**
- * 创建的时间戳
+ * 长信息
*/
protected String longData;
/**
From 8c76e6067523b7d0f2506b7c749c45b7a2411bf2 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Wed, 4 Aug 2021 13:58:50 +0800
Subject: [PATCH 0061/1235] :bug: Revert "class BaseWxPayResult add a field
named signType"
This reverts commit 10fd006f32e5a672d72d0e1c35b439f9bcc59959.
---
.../binarywang/wxpay/bean/result/BaseWxPayResult.java | 6 ------
1 file changed, 6 deletions(-)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
index 6a33bf36a6..9f6f5e2700 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
@@ -104,11 +104,6 @@ public abstract class BaseWxPayResult {
*/
@XStreamAlias("sign")
private String sign;
- /**
- * 签名类型.
- */
- @XStreamAlias("sign_type")
- private String signType;
//以下为辅助属性
/**
@@ -185,7 +180,6 @@ private void loadBasicXML(Document d) {
subMchId = readXmlString(d, "sub_mch_id");
nonceStr = readXmlString(d, "nonce_str");
sign = readXmlString(d, "sign");
- signType = readXmlString(d, "sign_type");
}
protected static Integer readXmlInteger(Node d, String tagName) {
From 87c1952eef52b0f94b126af14a78ac3edbc8d91e Mon Sep 17 00:00:00 2001
From: longliveh <35585613+longliveh@users.noreply.github.com>
Date: Wed, 4 Aug 2021 17:32:18 +0800
Subject: [PATCH 0062/1235] =?UTF-8?q?:bug:=20#2235=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=20=E4=BF=AE=E5=A4=8D?=
=?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=89=93=E5=8D=A1=E6=95=B0=E6=8D=AE=E6=97=B6?=
=?UTF-8?q?=E9=97=B4=E6=A3=80=E6=9F=A5=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 c6c9d60f11..5403ec0b80 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
@@ -53,7 +53,7 @@ public List getCheckinData(Integer openCheckinDataType, Date st
long endTimestamp = endTime.getTime() / 1000L;
long startTimestamp = startTime.getTime() / 1000L;
- if (endTimestamp - startTimestamp < 0 || endTimestamp - startTimestamp >= MONTH_SECONDS) {
+ if (endTimestamp - startTimestamp < 0 || endTimestamp - startTimestamp >= MONTH_SECONDS * 1000L) {
throw new WxRuntimeException("获取记录时间跨度不超过一个月");
}
From 1652ae2f795883ae5db8b0d677ae8a6f6410f03d Mon Sep 17 00:00:00 2001
From: zsail
Date: Wed, 4 Aug 2021 17:33:00 +0800
Subject: [PATCH 0063/1235] =?UTF-8?q?:bug:=20=E3=80=90=E5=85=AC=E4=BC=97?=
=?UTF-8?q?=E5=8F=B7=E3=80=91=20=E7=9F=ADkey=E8=A7=A3=E6=9E=90=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=E7=BB=93=E6=9E=84?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java
index 04b8c7d455..a4dbf84f04 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpShortKeyResult.java
@@ -1,5 +1,6 @@
package me.chanjar.weixin.mp.bean.result;
+import com.google.gson.annotations.SerializedName;
import lombok.Data;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
@@ -18,14 +19,17 @@ public class WxMpShortKeyResult implements Serializable {
/**
* 长信息
*/
+ @SerializedName("long_data")
protected String longData;
/**
* 创建的时间戳
*/
+ @SerializedName("create_time")
protected long createTime;
/**
* 剩余的过期秒数
*/
+ @SerializedName("expire_seconds")
protected long expireSeconds;
public static WxMpShortKeyResult fromJson(String json) {
From 622b83800515615a033591c10df5ca05ad7ee911 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Wed, 4 Aug 2021 18:36:59 +0800
Subject: [PATCH 0064/1235] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/bean/external/WxCpUserExternalTagGroupList.java | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java
index 4ee913a24c..3e4f60df12 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java
@@ -11,11 +11,12 @@
import java.util.List;
/**
- *
+ * @author huangxm129
*/
@Getter
@Setter
public class WxCpUserExternalTagGroupList extends WxCpBaseResp {
+ private static final long serialVersionUID = -3349321791821450679L;
@SerializedName("tag_group")
private List tagGroupList;
@@ -35,7 +36,7 @@ public static class TagGroup implements Serializable {
private Long createTime;
@SerializedName("order")
- private Integer order;
+ private Long order;
@SerializedName("deleted")
private Boolean deleted;
@@ -62,7 +63,7 @@ public static class Tag implements Serializable {
private Long createTime;
@SerializedName("order")
- private Integer order;
+ private Long order;
@SerializedName("deleted")
private Boolean deleted;
From 091d74b6ee89eb124058bc4a4d393e93b25f8e84 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Thu, 5 Aug 2021 09:19:48 +0800
Subject: [PATCH 0065/1235] =?UTF-8?q?:art:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?=
=?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/api/impl/WxCpOaServiceImpl.java | 102 ++++++------------
.../cp/bean/external/WxCpContactWayInfo.java | 2 +-
.../bean/external/WxCpContactWayResult.java | 4 +-
.../external/WxCpUserExternalContactList.java | 2 +-
.../WxCpUserExternalGroupChatInfo.java | 12 +--
...WxCpUserExternalGroupChatTransferResp.java | 3 +-
.../WxCpUserExternalTagGroupInfo.java | 6 +-
.../WxCpUserExternalTagGroupList.java | 6 +-
.../WxCpUserExternalUnassignList.java | 1 +
...WxCpUserExternalUserBehaviorStatistic.java | 1 +
.../external/WxCpUserTransferResultResp.java | 1 +
.../WxCpUserWithExternalPermission.java | 2 +-
.../cp/bean/external/WxCpWelcomeMsg.java | 8 +-
.../bean/external/contact/FollowedUser.java | 2 +-
.../contact/WxCpExternalContactInfo.java | 2 +-
.../cp/bean/oa/applydata/ContentValue.java | 3 +-
.../bean/notify/OriginNotifyResponse.java | 1 +
17 files changed, 66 insertions(+), 92 deletions(-)
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 5403ec0b80..04821c252a 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
@@ -40,12 +40,8 @@ public String apply(WxCpOaApplyEventRequest request) throws WxErrorException {
}
@Override
- public List getCheckinData(Integer openCheckinDataType, Date startTime, Date endTime,
+ public List getCheckinData(Integer openCheckinDataType, @NonNull Date startTime, @NonNull Date endTime,
List userIdList) throws WxErrorException {
- if (startTime == null || endTime == null) {
- throw new WxRuntimeException("starttime and endtime can't be null");
- }
-
if (userIdList == null || userIdList.size() > USER_IDS_LIMIT) {
throw new WxRuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
}
@@ -73,20 +69,14 @@ public List getCheckinData(Integer openCheckinDataType, Date st
final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_DATA);
String responseContent = this.mainService.post(url, jsonObject.toString());
JsonObject tmpJson = GsonParser.parse(responseContent);
- return WxCpGsonBuilder.create()
- .fromJson(
- tmpJson.get("checkindata"),
- new TypeToken>() {
- }.getType()
- );
+ return WxCpGsonBuilder.create().fromJson(tmpJson.get("checkindata"),
+ new TypeToken>() {
+ }.getType()
+ );
}
@Override
- public List getCheckinOption(Date datetime, List userIdList) throws WxErrorException {
- if (datetime == null) {
- throw new WxRuntimeException("datetime can't be null");
- }
-
+ public List getCheckinOption(@NonNull Date datetime, List userIdList) throws WxErrorException {
if (userIdList == null || userIdList.size() > USER_IDS_LIMIT) {
throw new WxRuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
}
@@ -104,34 +94,29 @@ public List getCheckinOption(Date datetime, List user
String responseContent = this.mainService.post(url, jsonObject.toString());
JsonObject tmpJson = GsonParser.parse(responseContent);
- return WxCpGsonBuilder.create()
- .fromJson(
- tmpJson.get("info"),
- new TypeToken>() {
- }.getType()
- );
+ return WxCpGsonBuilder.create().fromJson(tmpJson.get("info"),
+ new TypeToken>() {
+ }.getType()
+ );
}
@Override
public List getCropCheckinOption() throws WxErrorException {
-
JsonObject jsonObject = new JsonObject();
final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CORP_CHECKIN_OPTION);
String responseContent = this.mainService.post(url, jsonObject.toString());
JsonObject tmpJson = GsonParser.parse(responseContent);
- return WxCpGsonBuilder.create()
- .fromJson(
- tmpJson.get("group"),
- new TypeToken>() {
- }.getType()
- );
+ return WxCpGsonBuilder.create().fromJson(tmpJson.get("group"),
+ new TypeToken>() {
+ }.getType()
+ );
}
@Override
public WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date endTime,
- Integer cursor, Integer size, List filters) throws WxErrorException {
-
+ Integer cursor, Integer size, List filters)
+ throws WxErrorException {
if (cursor == null) {
cursor = 0;
}
@@ -171,7 +156,6 @@ public WxCpApprovalInfo getApprovalInfo(@NonNull Date startTime, @NonNull Date e
@Override
public WxCpApprovalDetailResult getApprovalDetail(@NonNull String spNo) throws WxErrorException {
-
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("sp_no", spNo);
@@ -198,7 +182,6 @@ public List getDialRecord(Date startTime, Date endTime, Integer
jsonObject.addProperty("limit", limit);
if (startTime != null && endTime != null) {
-
long endtimestamp = endTime.getTime() / 1000L;
long starttimestamp = startTime.getTime() / 1000L;
@@ -230,12 +213,8 @@ public WxCpTemplateResult getTemplateDetail(@NonNull String templateId) throws W
}
@Override
- public List getCheckinDayData(Date startTime, Date endTime, List userIdList) throws WxErrorException {
-
- if (startTime == null || endTime == null) {
- throw new WxRuntimeException("starttime and endtime can't be null");
- }
-
+ public List getCheckinDayData(@NonNull Date startTime, @NonNull Date endTime, List userIdList)
+ throws WxErrorException {
if (userIdList == null || userIdList.size() > USER_IDS_LIMIT) {
throw new WxRuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
}
@@ -257,20 +236,15 @@ public List getCheckinDayData(Date startTime, Date endTime,
final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_DAY_DATA);
String responseContent = this.mainService.post(url, jsonObject.toString());
JsonObject tmpJson = GsonParser.parse(responseContent);
- return WxCpGsonBuilder.create()
- .fromJson(
- tmpJson.get("datas"),
- new TypeToken>() {
- }.getType()
- );
+ return WxCpGsonBuilder.create().fromJson(tmpJson.get("datas"),
+ new TypeToken>() {
+ }.getType()
+ );
}
@Override
- public List getCheckinMonthData(Date startTime, Date endTime, List userIdList) throws WxErrorException {
- if (startTime == null || endTime == null) {
- throw new WxRuntimeException("starttime and endtime can't be null");
- }
-
+ public List getCheckinMonthData(@NonNull Date startTime, @NonNull Date endTime, List userIdList)
+ throws WxErrorException {
if (userIdList == null || userIdList.size() > USER_IDS_LIMIT) {
throw new WxRuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
}
@@ -292,25 +266,19 @@ public List getCheckinMonthData(Date startTime, Date endTi
final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_MONTH_DATA);
String responseContent = this.mainService.post(url, jsonObject.toString());
JsonObject tmpJson = GsonParser.parse(responseContent);
- return WxCpGsonBuilder.create()
- .fromJson(
- tmpJson.get("datas"),
- new TypeToken>() {
- }.getType()
- );
+ return WxCpGsonBuilder.create().fromJson(tmpJson.get("datas"),
+ new TypeToken>() {
+ }.getType()
+ );
}
@Override
- public List getCheckinScheduleList(Date startTime, Date endTime, List userIdList) throws WxErrorException {
- if (startTime == null || endTime == null) {
- throw new WxRuntimeException("starttime and endtime can't be null");
- }
-
+ public List getCheckinScheduleList(@NonNull Date startTime, @NonNull Date endTime, List userIdList)
+ throws WxErrorException {
if (userIdList == null || userIdList.size() > USER_IDS_LIMIT) {
throw new WxRuntimeException("用户列表不能为空,不超过 " + USER_IDS_LIMIT + " 个,若用户超过 " + USER_IDS_LIMIT + " 个,请分批获取");
}
-
long endTimestamp = endTime.getTime() / 1000L;
long startTimestamp = startTime.getTime() / 1000L;
@@ -329,12 +297,10 @@ public List getCheckinScheduleList(Date startTime, Date end
final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_SCHEDULE_DATA);
String responseContent = this.mainService.post(url, jsonObject.toString());
JsonObject tmpJson = GsonParser.parse(responseContent);
- return WxCpGsonBuilder.create()
- .fromJson(
- tmpJson.get("schedule_list"),
- new TypeToken>() {
- }.getType()
- );
+ return WxCpGsonBuilder.create().fromJson(tmpJson.get("schedule_list"),
+ new TypeToken>() {
+ }.getType()
+ );
}
@Override
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayInfo.java
index ca3156f770..35f6a6eaa0 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayInfo.java
@@ -172,7 +172,7 @@ public String toJson() {
@JsonAdapter(WxCpConclusionAdapter.class)
public static class Conclusion implements Serializable {
private static final long serialVersionUID = -8697184659526210472L;
-
+
private String textContent;
private String imgMediaId;
private String imgPicUrl;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayResult.java
index 742cc49896..6bb9c41398 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayResult.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpContactWayResult.java
@@ -12,10 +12,10 @@
public class WxCpContactWayResult extends WxCpBaseResp {
@SerializedName("config_id")
private String configId;
-
+
@SerializedName("qr_code")
private String qrCode;
-
+
public static WxCpContactWayResult fromJson(String json) {
return WxCpGsonBuilder.create().fromJson(json, WxCpContactWayResult.class);
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactList.java
index f0cccabe66..29e7e28e53 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactList.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalContactList.java
@@ -18,7 +18,7 @@
*/
public class WxCpUserExternalContactList implements Serializable {
private static final long serialVersionUID = -4301684507150486556L;
-
+
@SerializedName("errcode")
@Expose
private Long errcode;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java
index 335c2e5c5a..053789f9c8 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatInfo.java
@@ -67,10 +67,10 @@ public static class GroupMember implements Serializable {
private Long joinTime;
/**
- * 外部联系人在微信开放平台的唯一身份标识(微信unionid)
- * 通过此字段企业可将外部联系人与公众号/小程序用户关联起来
- * 仅当群成员类型是微信用户(包括企业成员未添加好友),且企业或第三方服务商绑定了微信开发者ID有此字段
- */
+ * 外部联系人在微信开放平台的唯一身份标识(微信unionid)
+ * 通过此字段企业可将外部联系人与公众号/小程序用户关联起来
+ * 仅当群成员类型是微信用户(包括企业成员未添加好友),且企业或第三方服务商绑定了微信开发者ID有此字段
+ */
@SerializedName("unionid")
private String unionId;
@@ -106,7 +106,7 @@ public static class GroupMember implements Serializable {
@Getter
@Setter
- public static class Invitor{
+ public static class Invitor {
/**
* 邀请者的userid
@@ -117,7 +117,7 @@ public static class Invitor{
@Getter
@Setter
- public static class GroupAdmin{
+ public static class GroupAdmin {
/**
* 群管理员userid
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatTransferResp.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatTransferResp.java
index ff6fb82374..4f4ee7ef1c 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatTransferResp.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalGroupChatTransferResp.java
@@ -10,6 +10,7 @@
/**
* 分配离职成员的客户群结果
+ *
* @author pg
* @date 2021年6月21日
*/
@@ -33,7 +34,7 @@ public String toJson() {
@Getter
@Setter
- public static class GroupChatFailedTransfer extends WxCpBaseResp {
+ public static class GroupChatFailedTransfer extends WxCpBaseResp {
private static final long serialVersionUID = -5836775099634587239L;
/**
* 没能成功继承的群ID
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupInfo.java
index bf1ec0f0f4..5893065962 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupInfo.java
@@ -64,13 +64,13 @@ public static class Tag implements Serializable {
private String name;
@SerializedName("create_time")
- private Long createTime;
+ private Long createTime;
@SerializedName("order")
- private Integer order;
+ private Integer order;
@SerializedName("deleted")
- private Boolean deleted;
+ private Boolean deleted;
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java
index 3e4f60df12..a4d6257293 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalTagGroupList.java
@@ -60,13 +60,13 @@ public static class Tag implements Serializable {
private String name;
@SerializedName("create_time")
- private Long createTime;
+ private Long createTime;
@SerializedName("order")
- private Long order;
+ private Long order;
@SerializedName("deleted")
- private Boolean deleted;
+ private Boolean deleted;
}
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUnassignList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUnassignList.java
index 10d2b2ade5..68d065a2d4 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUnassignList.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUnassignList.java
@@ -11,6 +11,7 @@
/**
* 离职员工外部联系人列表
+ *
* @author yqx
* @date 2020/3/15
*/
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUserBehaviorStatistic.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUserBehaviorStatistic.java
index b05a29bb2a..2e0325e307 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUserBehaviorStatistic.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserExternalUserBehaviorStatistic.java
@@ -11,6 +11,7 @@
/**
* 联系客户统计数据
+ *
* @author yqx
* @date 2020/3/16
*/
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
index e1b8cc4591..064c6c3851 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
@@ -10,6 +10,7 @@
/**
* 在职成员的客户转接情况
+ *
* @author pg
* @date 2021年6月21日
*/
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserWithExternalPermission.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserWithExternalPermission.java
index 3cd21ea193..d8366ff3f9 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserWithExternalPermission.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserWithExternalPermission.java
@@ -14,7 +14,7 @@
@Data
public class WxCpUserWithExternalPermission implements Serializable {
private static final long serialVersionUID = -4301684507150486556L;
-
+
@SerializedName("errcode")
@Expose
private Long errCode;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java
index ade49684ce..ebe3634ef3 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpWelcomeMsg.java
@@ -1,8 +1,12 @@
package me.chanjar.weixin.cp.bean.external;
import com.google.gson.annotations.SerializedName;
-import lombok.*;
-import me.chanjar.weixin.cp.bean.external.msg.*;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.cp.bean.external.msg.Attachment;
+import me.chanjar.weixin.cp.bean.external.msg.Text;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.io.Serializable;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/FollowedUser.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/FollowedUser.java
index 6e1973e4a9..541711e7e6 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/FollowedUser.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/FollowedUser.java
@@ -14,7 +14,7 @@
@Data
public class FollowedUser implements Serializable {
private static final long serialVersionUID = -4301684507150486556L;
-
+
@SerializedName("userid")
private String userId;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactInfo.java
index 468aa53f1e..cad105e711 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/contact/WxCpExternalContactInfo.java
@@ -1,7 +1,7 @@
package me.chanjar.weixin.cp.bean.external.contact;
import com.google.gson.annotations.SerializedName;
-import lombok.*;
+import lombok.Data;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.io.Serializable;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/ContentValue.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/ContentValue.java
index cd66d3db39..1ad07bf2a8 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/ContentValue.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/applydata/ContentValue.java
@@ -67,8 +67,8 @@ public static class Option implements Serializable {
@Data
public static class Member implements Serializable {
-
private static final long serialVersionUID = 1316551341955496067L;
+
@SerializedName("userid")
private String userId;
private String name;
@@ -97,7 +97,6 @@ public static class Child implements Serializable {
private List list;
}
-
@Data
public static class Attendance implements Serializable {
private static final long serialVersionUID = -6627566040706594166L;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/OriginNotifyResponse.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/OriginNotifyResponse.java
index 7efd9adb06..c61f81e8a8 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/OriginNotifyResponse.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/OriginNotifyResponse.java
@@ -65,6 +65,7 @@ public class OriginNotifyResponse implements Serializable {
*/
@SerializedName(value = "summary")
private String summary;
+
/**
*
* 字段名:通知数据类型
From 2d36b4d6d2d3fe62ba25e2eb70c7a4b28b900087 Mon Sep 17 00:00:00 2001
From: shuaidawang <48595437+shuaidawang@users.noreply.github.com>
Date: Fri, 6 Aug 2021 09:40:14 +0800
Subject: [PATCH 0066/1235] =?UTF-8?q?:new:=20#2240=20=E3=80=90=E5=BC=80?=
=?UTF-8?q?=E6=94=BE=E5=B9=B3=E5=8F=B0=E3=80=91=20=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=8F=90=E5=AE=A1=E7=B4=A0=E6=9D=90?=
=?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=9A=84=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/open/api/WxOpenMaService.java | 15 ++++++++++++++-
.../weixin/open/api/impl/WxOpenMaServiceImpl.java | 7 +++++++
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
index 0f2df8e35f..fc49522450 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
@@ -1,6 +1,7 @@
package me.chanjar.weixin.open.api;
import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaAuditMediaUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
import me.chanjar.weixin.open.bean.ma.WxMaScheme;
@@ -232,6 +233,12 @@ public interface WxOpenMaService extends WxMaService {
* 通过此接口开通自定义版交易组件,将同步返回接入结果,不再有异步事件回调。
*/
String API_REGISTER_SHOP_COMPONENT = "https://api.weixin.qq.com/shop/register/apply";
+
+ /**
+ * 小程序审核 提审素材上传接口
+ */
+ String API_AUDIT_UPLOAD_MEDIA = "https://api.weixin.qq.com/wxa/uploadmedia";
+
/**
* 获得小程序的域名配置信息
*
@@ -613,11 +620,17 @@ WxOpenMaDomainResult modifyDomain(String action, List requestDomains, Li
* @return
*/
WxOpenResult registerShopComponent() throws WxErrorException;
-
+
/**
* 小程序基础信息服务 (小程序名称、头像、描述、类目等信息设置)
*
* @return 小程序基础信息服务
*/
WxOpenMaBasicService getBasicService();
+
+ /**
+ * 小程序审核 提审素材上传接口
+ * @return
+ */
+ WxMaAuditMediaUploadResult uploadMedia(File file) throws WxErrorException;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
index 590f703e4c..c8613ad5f2 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
@@ -2,8 +2,10 @@
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.bean.WxMaAuditMediaUploadResult;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import cn.binarywang.wx.miniapp.executor.AuditMediaUploadRequestExecutor;
import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -396,6 +398,11 @@ public WxOpenResult registerShopComponent() throws WxErrorException {
return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
}
+ @Override
+ public WxMaAuditMediaUploadResult uploadMedia(File file) throws WxErrorException {
+ return (WxMaAuditMediaUploadResult) this.execute(AuditMediaUploadRequestExecutor.create(getRequestHttp()), API_AUDIT_UPLOAD_MEDIA, file);
+ }
+
private JsonArray toJsonArray(List strList) {
JsonArray jsonArray = new JsonArray();
if (strList != null && !strList.isEmpty()) {
From 60663f2f7acaa7af5ee6092f2e7a887a38767c4c Mon Sep 17 00:00:00 2001
From: liming1019
Date: Fri, 6 Aug 2021 10:33:32 +0800
Subject: [PATCH 0067/1235] =?UTF-8?q?:new:=20#2243=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A?=
=?UTF-8?q?=E4=B9=89=E7=BB=84=E4=BB=B6=E7=94=B3=E8=AF=B7=E6=8E=A5=E5=85=A5?=
=?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaService.java | 6 ++
.../miniapp/api/WxMaShopRegisterService.java | 46 +++++++++++++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 6 ++
.../api/impl/WxMaShopRegisterServiceImpl.java | 68 +++++++++++++++++++
.../WxMaShopRegisterApplySceneRequest.java | 22 ++++++
...MaShopRegisterFinishAccessInfoRequest.java | 21 ++++++
.../WxMaShopRegisterCheckResponse.java | 22 ++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 7 ++
.../impl/WxMaLiveGoodsServiceImplTest.java | 9 +--
.../impl/WxMaShopRegisterServiceImplTest.java | 51 ++++++++++++++
10 files changed, 254 insertions(+), 4 deletions(-)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopRegisterService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopRegisterServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopRegisterApplySceneRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopRegisterFinishAccessInfoRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopRegisterCheckResponse.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopRegisterServiceImplTest.java
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 962424430f..e8a7d622f2 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
@@ -403,6 +403,12 @@ public interface WxMaService extends WxService {
*/
WxMaShopSpuService getShopSpuService();
+ /**
+ * 返回小程序交易组件-接入申请接口
+ * @return
+ */
+ WxMaShopRegisterService getShopRegisterService();
+
/**
* 获取小程序 URL Link服务接口
* @return
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopRegisterService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopRegisterService.java
new file mode 100644
index 0000000000..67e1f2bcd1
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopRegisterService.java
@@ -0,0 +1,46 @@
+package cn.binarywang.wx.miniapp.api;
+
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopRegisterApplySceneRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopRegisterFinishAccessInfoRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopRegisterCheckResponse;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * 小程序交易组件-申请接入服务
+ *
+ * @author liming1019
+ */
+public interface WxMaShopRegisterService {
+ /**
+ * 接入申请
+ *
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ WxMaShopBaseResponse registerApply() throws WxErrorException;
+
+ /**
+ * 获取接入状态
+ *
+ * @return WxMaShopRegisterCheckResponse
+ * @throws WxErrorException
+ */
+ WxMaShopRegisterCheckResponse registerCheck() throws WxErrorException;
+
+ /**
+ * 完成接入任务
+ *
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ WxMaShopBaseResponse registerFinishAccessInfo(WxMaShopRegisterFinishAccessInfoRequest request) throws WxErrorException;
+
+ /**
+ * 场景接入申请
+ *
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ WxMaShopBaseResponse registerApplyScene(WxMaShopRegisterApplySceneRequest request) 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 417f49801d..95829f151f 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
@@ -65,6 +65,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxImgProcService imgProcService = new WxMaImgProcServiceImpl(this);
private final WxMaShopSpuService shopSpuService = new WxMaShopSpuServiceImpl(this);
private final WxMaShopOrderService shopOrderService = new WxMaShopOrderServiceImpl(this);
+ private final WxMaShopRegisterService shopRegisterService = new WxMaShopRegisterServiceImpl(this);
private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
@@ -516,6 +517,11 @@ public WxMaShopOrderService getShopOrderService() {
return this.shopOrderService;
}
+ @Override
+ public WxMaShopRegisterService getShopRegisterService() {
+ return this.shopRegisterService;
+ }
+
@Override
public WxMaLinkService getLinkService() {
return this.linkService;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopRegisterServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopRegisterServiceImpl.java
new file mode 100644
index 0000000000..ac69dcab47
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopRegisterServiceImpl.java
@@ -0,0 +1,68 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.WxMaShopRegisterService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopRegisterApplySceneRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopRegisterFinishAccessInfoRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopRegisterCheckResponse;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.JsonObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+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.util.json.GsonParser;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Register.*;
+
+/**
+ * @author liming1019
+ */
+@RequiredArgsConstructor
+@Slf4j
+public class WxMaShopRegisterServiceImpl implements WxMaShopRegisterService {
+ private static final String ERR_CODE = "errcode";
+ private final WxMaService wxMaService;
+
+ @Override
+ public WxMaShopBaseResponse registerApply() throws WxErrorException {
+ String responseContent = this.wxMaService.post(REGISTER_APPLY, new JsonObject());
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
+
+ @Override
+ public WxMaShopRegisterCheckResponse registerCheck() throws WxErrorException {
+ String responseContent = this.wxMaService.post(REGISTER_CHECK, new JsonObject());
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopRegisterCheckResponse.class);
+ }
+
+ @Override
+ public WxMaShopBaseResponse registerFinishAccessInfo(WxMaShopRegisterFinishAccessInfoRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(REGISTER_FINISH_ACCESS_INFO, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
+
+ @Override
+ public WxMaShopBaseResponse registerApplyScene(WxMaShopRegisterApplySceneRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(REGISTER_APPLY_SCENE, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopRegisterApplySceneRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopRegisterApplySceneRequest.java
new file mode 100644
index 0000000000..bec18e27f1
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopRegisterApplySceneRequest.java
@@ -0,0 +1,22 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/6
+ */
+@Data
+public class WxMaShopRegisterApplySceneRequest implements Serializable {
+
+ private static final long serialVersionUID = -3008686013597621522L;
+ /**
+ * 1:视频号、公众号场景
+ */
+ @SerializedName("scene_group_id")
+ private Long sceneGroupId;
+}
+
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopRegisterFinishAccessInfoRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopRegisterFinishAccessInfoRequest.java
new file mode 100644
index 0000000000..6b2999e2f2
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopRegisterFinishAccessInfoRequest.java
@@ -0,0 +1,21 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/6
+ */
+@Data
+public class WxMaShopRegisterFinishAccessInfoRequest implements Serializable {
+ private static final long serialVersionUID = 8679586799807671563L;
+ /**
+ * 6:完成spu接口,7:完成订单接口,8:完成物流接口,9:完成售后接口,10:测试完成,11:发版完成
+ */
+ @SerializedName("access_info_item")
+ private Long accessInfoItem;
+}
+
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopRegisterCheckResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopRegisterCheckResponse.java
new file mode 100644
index 0000000000..494a70ff42
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopRegisterCheckResponse.java
@@ -0,0 +1,22 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import com.google.gson.JsonObject;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/5
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopRegisterCheckResponse extends WxMaShopBaseResponse implements Serializable {
+
+ private static final long serialVersionUID = 9061844525630614116L;
+
+ @SerializedName("data")
+ private JsonObject data;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index d2d15b8f50..3ec46a5caa 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -319,6 +319,13 @@ interface Order {
String ORDER_PAY = "https://api.weixin.qq.com/shop/order/pay";
String ORDER_GET = "https://api.weixin.qq.com/shop/order/get";
}
+
+ interface Register {
+ String REGISTER_APPLY = "https://api.weixin.qq.com/shop/register/apply";
+ String REGISTER_CHECK = "https://api.weixin.qq.com/shop/register/check";
+ String REGISTER_FINISH_ACCESS_INFO = "https://api.weixin.qq.com/shop/register/finish_access_info";
+ String REGISTER_APPLY_SCENE = "https://api.weixin.qq.com/shop/register/apply_scene";
+ }
}
/**
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java
index af068777ee..ccf073a534 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java
@@ -10,6 +10,7 @@
import org.testng.annotations.Test;
import java.io.File;
+import java.math.BigDecimal;
import java.util.Arrays;
import static org.testng.Assert.assertNotNull;
@@ -34,8 +35,8 @@ public void addGoods() throws Exception {
WxMaLiveGoodInfo goods = new WxMaLiveGoodInfo();
goods.setCoverImgUrl(mediaUpload.getMediaId());
goods.setName("宫廷奢华真丝四件套");
- goods.setPrice("1599");
- goods.setPrice2("0");
+ goods.setPrice(new BigDecimal("1599"));
+ goods.setPrice2(new BigDecimal("0"));
goods.setPriceType(1);
goods.setUrl("pages/goods/goods?id=b7c4fbf95493bd294054fe4296d0d9ad");
WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().addGoods(goods);
@@ -68,8 +69,8 @@ public void updateGoods() throws Exception {
goods.setGoodsId(8);
goods.setName("宫廷奢华真丝四件套");
goods.setCoverImgUrl("http://mmbiz.qpic.cn/mmbiz_png/omYktZNGamuUQE0WPVfqdnLV61JDhluXOac7PiaoZeticFpcR7wvicC0aXUC2VXkl7r1gN0QSKosv2satn6oCFeiaQ/0");
- goods.setPrice("2299");
- goods.setPrice2("0");
+ goods.setPrice(new BigDecimal("2299"));
+ goods.setPrice2(new BigDecimal("0"));
goods.setPriceType(1);
goods.setUrl("pages/goods/goods?id=b7c4fbf95493bd294054fe4296d0d9ad");
boolean maLiveInfo = this.wxService.getLiveGoodsService().updateGoods(goods);
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopRegisterServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopRegisterServiceImplTest.java
new file mode 100644
index 0000000000..311b183ac5
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopRegisterServiceImplTest.java
@@ -0,0 +1,51 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopRegisterApplySceneRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopRegisterFinishAccessInfoRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopRegisterCheckResponse;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author liming1019
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaShopRegisterServiceImplTest {
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testRegisterApply() throws Exception {
+ WxMaShopBaseResponse response = this.wxService.getShopRegisterService().registerApply();
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testRegisterCheck() throws Exception {
+ WxMaShopRegisterCheckResponse response = this.wxService.getShopRegisterService().registerCheck();
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testRegisterFinishAccessInfo() throws Exception {
+ WxMaShopRegisterFinishAccessInfoRequest request = new WxMaShopRegisterFinishAccessInfoRequest();
+ request.setAccessInfoItem(6L);
+ WxMaShopBaseResponse response = this.wxService.getShopRegisterService().registerFinishAccessInfo(request);
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testRegisterApplyScene() throws Exception {
+ WxMaShopRegisterApplySceneRequest request = new WxMaShopRegisterApplySceneRequest();
+ request.setSceneGroupId(1L);
+ WxMaShopBaseResponse response = this.wxService.getShopRegisterService().registerApplyScene(request);
+ assertThat(response).isNotNull();
+ }
+}
From 5c71b2a29f5ecb40038d574b1593d106593065cf Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 8 Aug 2021 21:51:24 +0800
Subject: [PATCH 0068/1235] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.5.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index d09914a6af..aba66934e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 57c49c1844..6c8e4a384d 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 913e475d32..84384f265f 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.4.B
+ 4.1.5.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index a294d9ed47..83d1a0c5cd 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.4.B
+ 4.1.5.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index d1f9590f90..62996fd3e7 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.4.B
+ 4.1.5.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index fe4ba365aa..924af39a59 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.4.B
+ 4.1.5.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 478c714ff6..2a170599ee 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.4.B
+ 4.1.5.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index a0e73edb7a..9dd574491e 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index 93e99a3fb9..cc3ea657a2 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 1399239972..b9d6ec6e4e 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 62849cc400..4a514e8962 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 37a9a83493..31d5c68861 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index dd0346310a..dd64311948 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index 7b463313c6..b87af9cbb8 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index 0f4c73fc11..fa617f7e1b 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.4.B
+ 4.1.5.B
weixin-java-qidian
From 16d98a6142ce8b2268152ecaa8f2c956f4ea31f5 Mon Sep 17 00:00:00 2001
From: liming1019
Date: Mon, 9 Aug 2021 22:08:29 +0800
Subject: [PATCH 0069/1235] =?UTF-8?q?:new:=20#2249=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A?=
=?UTF-8?q?=E4=B9=89=E7=BB=84=E4=BB=B6=E4=B9=8B=E5=95=86=E5=AE=B6=E5=85=A5?=
=?UTF-8?q?=E9=A9=BB=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaService.java | 19 +++++
.../miniapp/api/WxMaShopAccountService.java | 48 ++++++++++++
.../wx/miniapp/api/WxMaShopCatService.java | 19 +++++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 12 +++
.../api/impl/WxMaShopAccountServiceImpl.java | 69 +++++++++++++++++
.../api/impl/WxMaShopCatServiceImpl.java | 35 +++++++++
.../shop/WxMaShopAccountGetBrandListItem.java | 28 +++++++
.../WxMaShopAccountGetCategoryListItem.java | 48 ++++++++++++
.../bean/shop/WxMaShopAccountGetInfo.java | 26 +++++++
.../bean/shop/WxMaShopCatGetDetail.java | 75 +++++++++++++++++++
.../WxMaShopAccountUpdateInfoRequest.java | 26 +++++++
.../WxMaShopAccountGetBrandListResponse.java | 22 ++++++
...xMaShopAccountGetCategoryListResponse.java | 22 ++++++
.../WxMaShopAccountGetInfoResponse.java | 21 ++++++
.../shop/response/WxMaShopCatGetResponse.java | 22 ++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 11 +++
.../impl/WxMaShopAccountServiceImplTest.java | 51 +++++++++++++
.../api/impl/WxMaShopCatServiceImplTest.java | 28 +++++++
18 files changed, 582 insertions(+)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAccountService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopCatService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAccountServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopCatServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetBrandListItem.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetCategoryListItem.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetInfo.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopCatGetDetail.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAccountUpdateInfoRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetBrandListResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetCategoryListResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetInfoResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopCatGetResponse.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAccountServiceImplTest.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopCatServiceImplTest.java
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 e8a7d622f2..7b311952e8 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
@@ -393,30 +393,49 @@ public interface WxMaService extends WxService {
/**
* 返回小程序交易组件-订单服务接口
+ *
* @return
*/
WxMaShopOrderService getShopOrderService();
/**
* 返回小程序交易组件-spu商品服务接口
+ *
* @return
*/
WxMaShopSpuService getShopSpuService();
/**
* 返回小程序交易组件-接入申请接口
+ *
* @return
*/
WxMaShopRegisterService getShopRegisterService();
+ /**
+ * 返回小程序交易组件-商户入驻接口
+ *
+ * @return
+ */
+ WxMaShopAccountService getShopAccountService();
+
+ /**
+ * 小程序交易组件-接入商品前必需接口-类目相关
+ *
+ * @return
+ */
+ WxMaShopCatService getShopCatService();
+
/**
* 获取小程序 URL Link服务接口
+ *
* @return
*/
WxMaLinkService getLinkService();
/**
* 获取电子发票报销方服务接口
+ *
* @return
*/
WxMaReimburseInvoiceService getReimburseInvoiceService();
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAccountService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAccountService.java
new file mode 100644
index 0000000000..25a487c83f
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAccountService.java
@@ -0,0 +1,48 @@
+package cn.binarywang.wx.miniapp.api;
+
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAccountUpdateInfoRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAccountGetBrandListResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAccountGetCategoryListResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAccountGetInfoResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * 小程序交易组件-商家入驻接口
+ *
+ * @author liming1019
+ */
+public interface WxMaShopAccountService {
+ /**
+ * 获取商家类目列表
+ *
+ * @return WxMaShopAccountGetCategoryListResponse
+ * @throws WxErrorException
+ */
+ WxMaShopAccountGetCategoryListResponse getCategoryList() throws WxErrorException;
+
+ /**
+ * 获取商家品牌列表
+ *
+ * @return WxMaShopAccountGetBrandListResponse
+ * @throws WxErrorException
+ */
+ WxMaShopAccountGetBrandListResponse getBrandList() throws WxErrorException;
+
+ /**
+ * 更新商家信息
+ *
+ * @param request
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ WxMaShopBaseResponse updateInfo(WxMaShopAccountUpdateInfoRequest request) throws WxErrorException;
+
+ /**
+ * 获取商家信息
+ *
+ * @return WxMaShopAccountGetInfoResponse
+ * @throws WxErrorException
+ */
+ WxMaShopAccountGetInfoResponse getInfo() throws WxErrorException;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopCatService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopCatService.java
new file mode 100644
index 0000000000..1f826fc24c
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopCatService.java
@@ -0,0 +1,19 @@
+package cn.binarywang.wx.miniapp.api;
+
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopCatGetResponse;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * 小程序交易组件-接入商品前必需接口
+ *
+ * @author liming1019
+ */
+public interface WxMaShopCatService {
+ /**
+ * 获取商品类目
+ *
+ * @return WxMaShopCatGetResponse
+ * @throws WxErrorException
+ */
+ WxMaShopCatGetResponse getCat() 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 95829f151f..48cd6f4189 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
@@ -66,6 +66,8 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaShopSpuService shopSpuService = new WxMaShopSpuServiceImpl(this);
private final WxMaShopOrderService shopOrderService = new WxMaShopOrderServiceImpl(this);
private final WxMaShopRegisterService shopRegisterService = new WxMaShopRegisterServiceImpl(this);
+ private final WxMaShopAccountService shopAccountService = new WxMaShopAccountServiceImpl(this);
+ private final WxMaShopCatService shopCatService = new WxMaShopCatServiceImpl(this);
private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
@@ -522,6 +524,16 @@ public WxMaShopRegisterService getShopRegisterService() {
return this.shopRegisterService;
}
+ @Override
+ public WxMaShopAccountService getShopAccountService() {
+ return this.shopAccountService;
+ }
+
+ @Override
+ public WxMaShopCatService getShopCatService() {
+ return this.shopCatService;
+ }
+
@Override
public WxMaLinkService getLinkService() {
return this.linkService;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAccountServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAccountServiceImpl.java
new file mode 100644
index 0000000000..00ea99850c
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAccountServiceImpl.java
@@ -0,0 +1,69 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.WxMaShopAccountService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAccountUpdateInfoRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAccountGetBrandListResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAccountGetCategoryListResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAccountGetInfoResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.JsonObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+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.util.json.GsonParser;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Account.*;
+
+/**
+ * @author liming1019
+ */
+@RequiredArgsConstructor
+@Slf4j
+public class WxMaShopAccountServiceImpl implements WxMaShopAccountService {
+ private static final String ERR_CODE = "errcode";
+ private final WxMaService wxMaService;
+
+ @Override
+ public WxMaShopAccountGetCategoryListResponse getCategoryList() throws WxErrorException {
+ String responseContent = this.wxMaService.post(GET_CATEGORY_LIST, new JsonObject());
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopAccountGetCategoryListResponse.class);
+ }
+
+ @Override
+ public WxMaShopAccountGetBrandListResponse getBrandList() throws WxErrorException {
+ String responseContent = this.wxMaService.post(GET_BRAND_LIST, new JsonObject());
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopAccountGetBrandListResponse.class);
+ }
+
+ @Override
+ public WxMaShopBaseResponse updateInfo(WxMaShopAccountUpdateInfoRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(UPDATE_INFO, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
+
+ @Override
+ public WxMaShopAccountGetInfoResponse getInfo() throws WxErrorException {
+ String responseContent = this.wxMaService.post(GET_INFO, new JsonObject());
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopAccountGetInfoResponse.class);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopCatServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopCatServiceImpl.java
new file mode 100644
index 0000000000..8bf9411f4a
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopCatServiceImpl.java
@@ -0,0 +1,35 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.WxMaShopCatService;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopCatGetResponse;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.JsonObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+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.util.json.GsonParser;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Cat.GET_CAT;
+import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ERRCODE;
+
+/**
+ * @author liming1019
+ */
+@RequiredArgsConstructor
+@Slf4j
+public class WxMaShopCatServiceImpl implements WxMaShopCatService {
+ private final WxMaService wxMaService;
+
+ @Override
+ public WxMaShopCatGetResponse getCat() throws WxErrorException {
+ String responseContent = this.wxMaService.post(GET_CAT, new JsonObject());
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopCatGetResponse.class);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetBrandListItem.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetBrandListItem.java
new file mode 100644
index 0000000000..48019b2420
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetBrandListItem.java
@@ -0,0 +1,28 @@
+package cn.binarywang.wx.miniapp.bean.shop;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/9
+ */
+@Data
+public class WxMaShopAccountGetBrandListItem implements Serializable {
+ private static final long serialVersionUID = -8889271375365538573L;
+
+ /**
+ * 品牌ID
+ */
+ @SerializedName("brand_id")
+ private Long brandId;
+
+ /**
+ * 品牌名称
+ */
+ @SerializedName("brand_wording")
+ private String brandWording;
+}
+
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetCategoryListItem.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetCategoryListItem.java
new file mode 100644
index 0000000000..987ff074d5
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetCategoryListItem.java
@@ -0,0 +1,48 @@
+package cn.binarywang.wx.miniapp.bean.shop;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/9
+ */
+@Data
+public class WxMaShopAccountGetCategoryListItem implements Serializable {
+ private static final long serialVersionUID = -6574489801942310752L;
+
+ /**
+ * 一级类目ID
+ */
+ @SerializedName("first_cat_id")
+ private Long firstCatId;
+ /**
+ * 二级类目ID
+ */
+ @SerializedName("second_cat_id")
+ private Long secondCatId;
+ /**
+ * 类目ID
+ */
+ @SerializedName("third_cat_id")
+ private Long thirdCatId;
+ /**
+ * 一级类目名称
+ */
+ @SerializedName("first_cat_name")
+ private String firstCatName;
+ /**
+ * 二级类目名称
+ */
+ @SerializedName("second_cat_name")
+ private String secondCatName;
+
+ /**
+ * 类目名称
+ */
+ @SerializedName("third_cat_name")
+ private String thirdCatName;
+}
+
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetInfo.java
new file mode 100644
index 0000000000..7c0fd95cbd
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopAccountGetInfo.java
@@ -0,0 +1,26 @@
+package cn.binarywang.wx.miniapp.bean.shop;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/9
+ */
+@Data
+public class WxMaShopAccountGetInfo implements Serializable {
+ /**
+ * 品牌ID
+ */
+ @SerializedName("brand_id")
+ private Long brandId;
+
+ /**
+ * 品牌名称
+ */
+ @SerializedName("brand_wording")
+ private String brandWording;
+}
+
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopCatGetDetail.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopCatGetDetail.java
new file mode 100644
index 0000000000..3c8f752dd8
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopCatGetDetail.java
@@ -0,0 +1,75 @@
+package cn.binarywang.wx.miniapp.bean.shop;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/9
+ */
+@Data
+public class WxMaShopCatGetDetail implements Serializable {
+ private static final long serialVersionUID = -3404372682043466685L;
+
+ /**
+ * 类目ID
+ */
+ @SerializedName("third_cat_id")
+ private Long thirdCatId;
+
+ /**
+ * 类目名称
+ */
+ @SerializedName("third_cat_name")
+ private String thirdCatName;
+
+ /**
+ * 类目资质
+ */
+ @SerializedName("qualification")
+ private String qualification;
+
+ /**
+ * 类目资质类型,0:不需要,1:必填,2:选填
+ */
+ @SerializedName("qualification_type")
+ private Integer qualificationType;
+
+ /**
+ * 商品资质
+ */
+ @SerializedName("product_qualification")
+ private String productQualification;
+
+ /**
+ * 商品资质类型,0:不需要,1:必填,2:选填
+ */
+ @SerializedName("product_qualification_type")
+ private Integer productQualificationType;
+
+ /**
+ * 一级类目ID
+ */
+ @SerializedName("first_cat_id")
+ private Long firstCatId;
+
+ /**
+ * 一级类目名称
+ */
+ @SerializedName("first_cat_name")
+ private String firstCatName;
+
+ /**
+ * 二级类目ID
+ */
+ @SerializedName("second_cat_id")
+ private Long secondCatId;
+
+ /**
+ * 二级类目名称
+ */
+ @SerializedName("second_cat_name")
+ private String secondCatName;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAccountUpdateInfoRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAccountUpdateInfoRequest.java
new file mode 100644
index 0000000000..8e74f6b4a9
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAccountUpdateInfoRequest.java
@@ -0,0 +1,26 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/9
+ */
+@Data
+public class WxMaShopAccountUpdateInfoRequest implements Serializable {
+ private static final long serialVersionUID = 5185978220275730559L;
+ /**
+ * 小程序path
+ */
+ @SerializedName("service_agent_path")
+ private String serviceAgentPath;
+
+ /**
+ * 小程序path
+ */
+ @SerializedName("service_agent_phone")
+ private String serviceAgentPhone;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetBrandListResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetBrandListResponse.java
new file mode 100644
index 0000000000..a734126bc4
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetBrandListResponse.java
@@ -0,0 +1,22 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import cn.binarywang.wx.miniapp.bean.shop.WxMaShopAccountGetBrandListItem;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author liming1019
+ * @date 2021/8/9
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopAccountGetBrandListResponse extends WxMaShopBaseResponse implements Serializable {
+ private static final long serialVersionUID = -5196210913054514206L;
+
+ @SerializedName("data")
+ private List items;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetCategoryListResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetCategoryListResponse.java
new file mode 100644
index 0000000000..ba9ccee563
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetCategoryListResponse.java
@@ -0,0 +1,22 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import cn.binarywang.wx.miniapp.bean.shop.WxMaShopAccountGetCategoryListItem;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author liming1019
+ * @date 2021/8/9
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopAccountGetCategoryListResponse extends WxMaShopBaseResponse implements Serializable {
+ private static final long serialVersionUID = -3182300077261435356L;
+
+ @SerializedName("data")
+ private List items;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetInfoResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetInfoResponse.java
new file mode 100644
index 0000000000..f14a59ae5a
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAccountGetInfoResponse.java
@@ -0,0 +1,21 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import cn.binarywang.wx.miniapp.bean.shop.WxMaShopAccountGetInfo;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/9
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopAccountGetInfoResponse extends WxMaShopBaseResponse implements Serializable {
+ private static final long serialVersionUID = -3954383181691898592L;
+
+ @SerializedName("data")
+ private WxMaShopAccountGetInfo data;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopCatGetResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopCatGetResponse.java
new file mode 100644
index 0000000000..2077027f29
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopCatGetResponse.java
@@ -0,0 +1,22 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import cn.binarywang.wx.miniapp.bean.shop.WxMaShopCatGetDetail;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author liming1019
+ * @date 2021/8/9
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopCatGetResponse extends WxMaShopBaseResponse implements Serializable {
+ private static final long serialVersionUID = -2565959470798387313L;
+
+ @SerializedName("third_cat_list")
+ private List thirdCatList;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index 3ec46a5caa..c6b428db85 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -326,6 +326,17 @@ interface Register {
String REGISTER_FINISH_ACCESS_INFO = "https://api.weixin.qq.com/shop/register/finish_access_info";
String REGISTER_APPLY_SCENE = "https://api.weixin.qq.com/shop/register/apply_scene";
}
+
+ interface Account {
+ String GET_CATEGORY_LIST = "https://api.weixin.qq.com/shop/account/get_category_list";
+ String GET_BRAND_LIST = "https://api.weixin.qq.com/shop/account/get_brand_list";
+ String UPDATE_INFO = "https://api.weixin.qq.com/shop/account/update_info";
+ String GET_INFO = "https://api.weixin.qq.com/shop/account/get_info";
+ }
+
+ interface Cat {
+ String GET_CAT = "https://api.weixin.qq.com/shop/cat/get";
+ }
}
/**
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAccountServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAccountServiceImplTest.java
new file mode 100644
index 0000000000..44c8f97e04
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAccountServiceImplTest.java
@@ -0,0 +1,51 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAccountUpdateInfoRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopRegisterApplySceneRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopRegisterFinishAccessInfoRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.*;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author liming1019
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaShopAccountServiceImplTest {
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testGetCategoryList() throws WxErrorException {
+ WxMaShopAccountGetCategoryListResponse response = this.wxService.getShopAccountService().getCategoryList();
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testGetBrandList() throws WxErrorException {
+ WxMaShopAccountGetBrandListResponse response = this.wxService.getShopAccountService().getBrandList();
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testUpdateInfo() throws WxErrorException {
+ WxMaShopAccountUpdateInfoRequest request = new WxMaShopAccountUpdateInfoRequest();
+ request.setServiceAgentPhone("020-888888");
+ request.setServiceAgentPath("https://www.web.com");
+ WxMaShopBaseResponse response = this.wxService.getShopAccountService().updateInfo(request);
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testGetInfo() throws WxErrorException {
+ WxMaShopAccountGetInfoResponse response = this.wxService.getShopAccountService().getInfo();
+ assertThat(response).isNotNull();
+ }
+}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopCatServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopCatServiceImplTest.java
new file mode 100644
index 0000000000..89b31083a0
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopCatServiceImplTest.java
@@ -0,0 +1,28 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopCatGetResponse;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author liming1019
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaShopCatServiceImplTest {
+
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testGetCat() throws WxErrorException {
+ WxMaShopCatGetResponse response = this.wxService.getShopCatService().getCat();
+ assertThat(response).isNotNull();
+ }
+}
From 72f3005ac67661a287ea1af324c1ce4f3f1423d0 Mon Sep 17 00:00:00 2001
From: longliveh <35585613+longliveh@users.noreply.github.com>
Date: Tue, 10 Aug 2021 13:47:46 +0800
Subject: [PATCH 0070/1235] =?UTF-8?q?:bug:=20#2251=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=20=E4=BF=AE=E5=A4=8D?=
=?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=89=93=E5=8D=A1=E6=95=B0=E6=8D=AE=E6=97=B6?=
=?UTF-8?q?=E9=97=B4=E6=A3=80=E6=9F=A5=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 04821c252a..b921798e7b 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
@@ -49,7 +49,7 @@ public List getCheckinData(Integer openCheckinDataType, @NonNul
long endTimestamp = endTime.getTime() / 1000L;
long startTimestamp = startTime.getTime() / 1000L;
- if (endTimestamp - startTimestamp < 0 || endTimestamp - startTimestamp >= MONTH_SECONDS * 1000L) {
+ if (endTimestamp - startTimestamp < 0 || endTimestamp - startTimestamp >= MONTH_SECONDS) {
throw new WxRuntimeException("获取记录时间跨度不超过一个月");
}
From 24bde9298c9c5d4bffe31ef5133df0b9ad4952f8 Mon Sep 17 00:00:00 2001
From: akingzwk <57396633+akingzwk@users.noreply.github.com>
Date: Wed, 11 Aug 2021 09:47:34 +0800
Subject: [PATCH 0071/1235] =?UTF-8?q?:bug:=20=20#2253=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BF=AE=E5=A4=8D=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=E5=95=86=E6=A8=A1=E5=BC=8F=E9=80=9A=E8=BF=87=E6=8E=88?=
=?UTF-8?q?=E6=9D=83=E7=A0=81=E8=8E=B7=E5=8F=96=E7=99=BB=E5=BD=95=E7=94=A8?=
=?UTF-8?q?=E6=88=B7=E7=9A=84=E4=BF=A1=E6=81=AF=E8=BF=94=E5=9B=9E=E2=80=9D?=
=?UTF-8?q?=E4=B8=8D=E5=90=88=E6=B3=95=E7=9A=84=E7=9A=84suite=5Fticket?=
=?UTF-8?q?=E5=8F=82=E6=95=B0=E2=80=9C=E7=9A=84=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java
index 89903d6f00..03316b9ae2 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java
@@ -461,7 +461,7 @@ public WxTpLoginInfo getLoginInfo(String authCode) throws WxErrorException {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("auth_code", authCode);
String access_token = getWxCpProviderToken();
- String responseText = post(configStorage.getApiUrl(GET_LOGIN_INFO) + "?access_token=" + access_token, jsonObject.toString());
+ String responseText = post(configStorage.getApiUrl(GET_LOGIN_INFO) + "?access_token=" + access_token, jsonObject.toString(), true);
return WxTpLoginInfo.fromJson(responseText);
}
From e9c1cda3563e94a57563611326a7068923aeac5e Mon Sep 17 00:00:00 2001
From: liming1019
Date: Wed, 11 Aug 2021 09:49:32 +0800
Subject: [PATCH 0072/1235] =?UTF-8?q?:new:=20#2252=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A?=
=?UTF-8?q?=E4=B9=89=E7=BB=84=E4=BB=B6=E4=B9=8B=E5=9B=BE=E7=89=87=E4=B8=8A?=
=?UTF-8?q?=E4=BC=A0=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../WxMinishopImageUploadCustomizeResult.java | 38 ++++++++++++
.../WxMinishopPicFileCustomizeResult.java | 11 ++++
...inishopUploadRequestCustomizeExecutor.java | 37 ++++++++++++
...opMediaUploadRequestCustomizeExecutor.java | 58 +++++++++++++++++++
...opMediaUploadRequestCustomizeExecutor.java | 49 ++++++++++++++++
...opMediaUploadRequestCustomizeExecutor.java | 47 +++++++++++++++
.../wx/miniapp/api/WxMaService.java | 7 +++
.../wx/miniapp/api/WxMaShopImgService.java | 21 +++++++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 6 ++
.../api/impl/WxMaShopImgServiceImpl.java | 29 ++++++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 4 ++
.../api/impl/WxMaShopImgServiceImplTest.java | 31 ++++++++++
12 files changed, 338 insertions(+)
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopPicFileCustomizeResult.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java
create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java
new file mode 100644
index 0000000000..e3077fd00a
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java
@@ -0,0 +1,38 @@
+package me.chanjar.weixin.common.bean.result;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+@Data
+public class WxMinishopImageUploadCustomizeResult implements Serializable {
+ private String errcode;
+ private String errmsg;
+
+ private WxMinishopPicFileCustomizeResult imgInfo;
+
+ public static WxMinishopImageUploadCustomizeResult fromJson(String json) {
+ JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
+ WxMinishopImageUploadCustomizeResult result = new WxMinishopImageUploadCustomizeResult();
+ result.setErrcode(jsonObject.get("errcode").getAsNumber().toString());
+ if (result.getErrcode().equals("0")) {
+ WxMinishopPicFileCustomizeResult picFileResult = new WxMinishopPicFileCustomizeResult();
+ JsonObject picObject = jsonObject.get("img_info").getAsJsonObject();
+ picFileResult.setMediaId(picObject.get("media_id").getAsString());
+ if (picObject.has("temp_img_url")) {
+ picFileResult.setTempImgUrl(picObject.get("temp_img_url").getAsString());
+ }
+ result.setImgInfo(picFileResult);
+
+ }
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopPicFileCustomizeResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopPicFileCustomizeResult.java
new file mode 100644
index 0000000000..8f2f36f8dd
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopPicFileCustomizeResult.java
@@ -0,0 +1,11 @@
+package me.chanjar.weixin.common.bean.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxMinishopPicFileCustomizeResult implements Serializable {
+ private String mediaId;
+ private String tempImgUrl;
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java
new file mode 100644
index 0000000000..d782466c3b
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java
@@ -0,0 +1,37 @@
+package me.chanjar.weixin.common.util.http;
+
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadCustomizeResult;
+import me.chanjar.weixin.common.enums.WxType;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.apache.ApacheMinishopMediaUploadRequestCustomizeExecutor;
+import me.chanjar.weixin.common.util.http.jodd.JoddHttpMinishopMediaUploadRequestCustomizeExecutor;
+import me.chanjar.weixin.common.util.http.okhttp.OkHttpMinishopMediaUploadRequestCustomizeExecutor;
+
+import java.io.File;
+import java.io.IOException;
+
+public abstract class MinishopUploadRequestCustomizeExecutor implements RequestExecutor {
+ protected RequestHttp requestHttp;
+
+ public MinishopUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
+ this.requestHttp = requestHttp;
+ }
+
+ @Override
+ public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
+ }
+
+ public static RequestExecutor create(RequestHttp requestHttp) {
+ switch (requestHttp.getRequestType()) {
+ case APACHE_HTTP:
+ return new ApacheMinishopMediaUploadRequestCustomizeExecutor(requestHttp);
+ case JODD_HTTP:
+ return new JoddHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp);
+ case OK_HTTP:
+ return new OkHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp);
+ default:
+ return null;
+ }
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java
new file mode 100644
index 0000000000..dc38fbae5a
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java
@@ -0,0 +1,58 @@
+package me.chanjar.weixin.common.util.http.apache;
+
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadCustomizeResult;
+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.util.http.MinishopUploadRequestCustomizeExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Created by liming1019 on 2021/8/10.
+ */
+@Slf4j
+public class ApacheMinishopMediaUploadRequestCustomizeExecutor extends MinishopUploadRequestCustomizeExecutor {
+ public ApacheMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ @Override
+ public WxMinishopImageUploadCustomizeResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+ HttpPost httpPost = new HttpPost(uri);
+ if (requestHttp.getRequestHttpProxy() != null) {
+ RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
+ httpPost.setConfig(config);
+ }
+ if (file != null) {
+ HttpEntity entity = MultipartEntityBuilder
+ .create()
+ .addBinaryBody("media", file)
+ .setMode(HttpMultipartMode.RFC6532)
+ .build();
+ httpPost.setEntity(entity);
+ }
+ try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
+ String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
+ WxError error = WxError.fromJson(responseContent, wxType);
+ if (error.getErrorCode() != 0) {
+ throw new WxErrorException(error);
+ }
+ log.info("responseContent: " + responseContent);
+ return WxMinishopImageUploadCustomizeResult.fromJson(responseContent);
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java
new file mode 100644
index 0000000000..8fa1de4279
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java
@@ -0,0 +1,49 @@
+package me.chanjar.weixin.common.util.http.jodd;
+
+import jodd.http.HttpConnectionProvider;
+import jodd.http.HttpRequest;
+import jodd.http.HttpResponse;
+import jodd.http.ProxyInfo;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadCustomizeResult;
+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.util.http.MinishopUploadRequestCustomizeExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @author liming1019
+ * @date 2021/8/10
+ */
+@Slf4j
+public class JoddHttpMinishopMediaUploadRequestCustomizeExecutor extends MinishopUploadRequestCustomizeExecutor {
+ public JoddHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ @Override
+ public WxMinishopImageUploadCustomizeResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+ HttpRequest request = HttpRequest.post(uri);
+ if (requestHttp.getRequestHttpProxy() != null) {
+ requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
+ }
+ request.withConnectionProvider(requestHttp.getRequestHttpClient());
+ request.form("media", file);
+ HttpResponse response = request.send();
+ response.charset(StandardCharsets.UTF_8.name());
+
+ String responseContent = response.bodyText();
+ WxError error = WxError.fromJson(responseContent, wxType);
+ if (error.getErrorCode() != 0) {
+ throw new WxErrorException(error);
+ }
+ log.info("responseContent: " + responseContent);
+
+ return WxMinishopImageUploadCustomizeResult.fromJson(responseContent);
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java
new file mode 100644
index 0000000000..8b2cdc7b6c
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java
@@ -0,0 +1,47 @@
+package me.chanjar.weixin.common.util.http.okhttp;
+
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadCustomizeResult;
+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.util.http.MinishopUploadRequestCustomizeExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import okhttp3.*;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author liming1019
+ * @date 2021/8/10
+ */
+@Slf4j
+public class OkHttpMinishopMediaUploadRequestCustomizeExecutor extends MinishopUploadRequestCustomizeExecutor {
+ public OkHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ @Override
+ public WxMinishopImageUploadCustomizeResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+
+ RequestBody body = new MultipartBody.Builder()
+ .setType(MediaType.parse("multipart/form-data"))
+ .addFormDataPart("media",
+ file.getName(),
+ RequestBody.create(MediaType.parse("application/octet-stream"), file))
+ .build();
+ Request request = new Request.Builder().url(uri).post(body).build();
+
+ Response response = requestHttp.getRequestHttpClient().newCall(request).execute();
+ String responseContent = response.body().string();
+ WxError error = WxError.fromJson(responseContent, wxType);
+ if (error.getErrorCode() != 0) {
+ throw new WxErrorException(error);
+ }
+ log.info("responseContent: " + responseContent);
+
+ return WxMinishopImageUploadCustomizeResult.fromJson(responseContent);
+ }
+
+}
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 7b311952e8..3115a7d5b9 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
@@ -426,6 +426,13 @@ public interface WxMaService extends WxService {
*/
WxMaShopCatService getShopCatService();
+ /**
+ * 小程序交易组件-接入商品前必需接口-上传图片
+ *
+ * @return
+ */
+ WxMaShopImgService getShopImgService();
+
/**
* 获取小程序 URL Link服务接口
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java
new file mode 100644
index 0000000000..c44bc7df35
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java
@@ -0,0 +1,21 @@
+package cn.binarywang.wx.miniapp.api;
+
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadCustomizeResult;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+import java.io.File;
+
+/**
+ * 小程序交易组件-接入商品前必需接口
+ *
+ * @author liming1019
+ */
+public interface WxMaShopImgService {
+ /**
+ * 上传图片
+ *
+ * @return WxMinishopImageUploadCustomizeResult
+ * @throws WxErrorException
+ */
+ WxMinishopImageUploadCustomizeResult uploadImg(File file) 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 48cd6f4189..1de659e603 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
@@ -68,6 +68,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaShopRegisterService shopRegisterService = new WxMaShopRegisterServiceImpl(this);
private final WxMaShopAccountService shopAccountService = new WxMaShopAccountServiceImpl(this);
private final WxMaShopCatService shopCatService = new WxMaShopCatServiceImpl(this);
+ private final WxMaShopImgService shopImgService = new WxMaShopImgServiceImpl(this);
private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
@@ -534,6 +535,11 @@ public WxMaShopCatService getShopCatService() {
return this.shopCatService;
}
+ @Override
+ public WxMaShopImgService getShopImgService() {
+ return this.shopImgService;
+ }
+
@Override
public WxMaLinkService getLinkService() {
return this.linkService;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java
new file mode 100644
index 0000000000..f253bca280
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java
@@ -0,0 +1,29 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.WxMaShopImgService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadCustomizeResult;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.MinishopUploadRequestCustomizeExecutor;
+
+import java.io.File;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Img.IMG_UPLOAD;
+
+/**
+ * @author liming1019
+ */
+@RequiredArgsConstructor
+@Slf4j
+public class WxMaShopImgServiceImpl implements WxMaShopImgService {
+ private final WxMaService service;
+
+ @Override
+ public WxMinishopImageUploadCustomizeResult uploadImg(File file) throws WxErrorException {
+ WxMinishopImageUploadCustomizeResult result = this.service.execute(
+ MinishopUploadRequestCustomizeExecutor.create(this.service.getRequestHttp()), IMG_UPLOAD, file);
+ return result;
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index c6b428db85..c76c8963d6 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -337,6 +337,10 @@ interface Account {
interface Cat {
String GET_CAT = "https://api.weixin.qq.com/shop/cat/get";
}
+
+ interface Img {
+ String IMG_UPLOAD = "https://api.weixin.qq.com/shop/img/upload";
+ }
}
/**
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java
new file mode 100644
index 0000000000..191b429630
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java
@@ -0,0 +1,31 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.bean.result.WxMinishopImageUploadCustomizeResult;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.io.File;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author liming1019
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaShopImgServiceImplTest {
+
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testUploadImg() throws WxErrorException {
+ File file = new File("/Users/liming/Desktop/test.jpeg");
+ WxMinishopImageUploadCustomizeResult result = wxService.getShopImgService().uploadImg(file);
+ assertThat(result).isNotNull();
+ }
+}
From 2b92b6fdc23d2b09f1297d02cfb4ed5144839607 Mon Sep 17 00:00:00 2001
From: hywr <33077958+hywr@users.noreply.github.com>
Date: Fri, 13 Aug 2021 13:37:54 +0800
Subject: [PATCH 0073/1235] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=87=A0?=
=?UTF-8?q?=E4=B8=AA=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1.修复微信公众号无法模板消息行业:其他
2.修复第三方平台无法上传标准模板的代码到小程序
3.修复小程序代码模板类型类字段拼写错误
---
.../template/WxMpTemplateIndustryEnum.java | 11 +++-
.../weixin/open/api/WxOpenMaService.java | 17 ++++--
.../open/api/impl/WxOpenMaServiceImpl.java | 5 +-
.../open/bean/WxOpenMaCodeTemplate.java | 4 +-
.../open/bean/ma/WxMaOpenCommitExtInfo.java | 23 ++++++++
.../bean/ma/WxMaOpenCommitStandardExt.java | 56 +++++++++++++++++++
6 files changed, 104 insertions(+), 12 deletions(-)
create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitStandardExt.java
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java
index 6620d86aa4..23ba2097e7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java
@@ -2,6 +2,9 @@
import lombok.AllArgsConstructor;
import lombok.Getter;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Objects;
/**
* 模版消息行业枚举.
@@ -195,15 +198,19 @@ public enum WxMpTemplateIndustryEnum {
*
* @param firstClass 主行业名称
* @param secondClass 副行业名称
- * @return .
+ * @return 如果找不到, 返回null
*/
+ @Nullable
public static WxMpTemplateIndustryEnum findByClass(String firstClass, String secondClass) {
for (WxMpTemplateIndustryEnum industryEnum : WxMpTemplateIndustryEnum.values()) {
if (industryEnum.firstClass.equals(firstClass) && industryEnum.secondClass.contains(secondClass)) {
return industryEnum;
}
}
-
+ if (Objects.equals(firstClass, "其他") && Objects.equals(secondClass, "其他")) {
+ //微信返回的其他行业实际上为"其他",而非"其它",此处兼容处理
+ return OTHER;
+ }
return null;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
index fc49522450..cbb4b23783 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenMaService.java
@@ -3,7 +3,6 @@
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaAuditMediaUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
import me.chanjar.weixin.open.bean.ma.WxMaScheme;
import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
import me.chanjar.weixin.open.bean.result.*;
@@ -379,14 +378,18 @@ WxOpenMaDomainResult modifyDomain(String action, List requestDomains, Li
/**
* 1、为授权的小程序帐号上传小程序代码
*
- * @param templateId 代码模板ID
- * @param userVersion 用户定义版本
- * @param userDesc 用户定义版本描述
- * @param extInfo 第三方自定义的配置
+ * @param templateId 代码模板ID
+ * @param userVersion 用户定义版本
+ * @param userDesc 用户定义版本描述
+ * @param extJsonObject 为了方便第三方平台的开发者引入 extAppid 的开发调试工作,引入ext.json配置文件概念,该参数则是用于控制ext.json配置文件的内容。
+ * 如果是普通模板可以使用 WxMaOpenCommitExtInfo 类构造参数,
+ * 如果是标准模板可支持的参数为:{"extAppid":'', "ext": {}, "window": {}} 所以可以使用 WxMaOpenCommitStandardExt 构造参数
* @return the wx open result
* @throws WxErrorException the wx error exception
+ * @see me.chanjar.weixin.open.bean.ma.WxMaOpenCommitStandardExt
+ * @see me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo
*/
- WxOpenResult codeCommit(Long templateId, String userVersion, String userDesc, WxMaOpenCommitExtInfo extInfo) throws WxErrorException;
+ WxOpenResult codeCommit(Long templateId, String userVersion, String userDesc, Object extJsonObject) throws WxErrorException;
/**
* 获取体验小程序的体验二维码
@@ -617,6 +620,7 @@ WxOpenMaDomainResult modifyDomain(String action, List requestDomains, Li
/**
* 为小程序开通小商店组件
+ *
* @return
*/
WxOpenResult registerShopComponent() throws WxErrorException;
@@ -630,6 +634,7 @@ WxOpenMaDomainResult modifyDomain(String action, List requestDomains, Li
/**
* 小程序审核 提审素材上传接口
+ *
* @return
*/
WxMaAuditMediaUploadResult uploadMedia(File file) throws WxErrorException;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
index c8613ad5f2..4fb637b393 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMaServiceImpl.java
@@ -16,7 +16,6 @@
import me.chanjar.weixin.open.api.WxOpenComponentService;
import me.chanjar.weixin.open.api.WxOpenMaBasicService;
import me.chanjar.weixin.open.api.WxOpenMaService;
-import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
import me.chanjar.weixin.open.bean.ma.WxMaQrcodeParam;
import me.chanjar.weixin.open.bean.ma.WxMaScheme;
import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
@@ -185,13 +184,13 @@ public WxOpenResult updateShowWxaItem(Integer flag, String mpAppId) throws WxErr
}
@Override
- public WxOpenResult codeCommit(Long templateId, String userVersion, String userDesc, WxMaOpenCommitExtInfo extInfo) throws WxErrorException {
+ public WxOpenResult codeCommit(Long templateId, String userVersion, String userDesc, Object extJsonObject) throws WxErrorException {
JsonObject params = new JsonObject();
params.addProperty("template_id", templateId);
params.addProperty("user_version", userVersion);
params.addProperty("user_desc", userDesc);
//注意:ext_json必须是字符串类型
- params.addProperty("ext_json", GSON.toJson(extInfo));
+ params.addProperty("ext_json", GSON.toJson(extJsonObject));
String response = post(API_CODE_COMMIT, GSON.toJson(params));
return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java
index 9bb8ce94e7..d441906c80 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java
@@ -6,6 +6,8 @@
import java.io.Serializable;
/**
+ * 小程序代码模板
+ *
* @author Charming
* @since 2018-04-26 17:10
*/
@@ -37,7 +39,7 @@ public class WxOpenMaCodeTemplate implements Serializable {
* 模板类型 0对应普通模板,1对应标准模板
*/
@SerializedName(value = "templateType", alternate = "template_type")
- private Integer template_type;
+ private Integer templateType;
/**
* 开发者上传草稿时间 / 被添加为模版的时间
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java
index e7a43894a2..16439fa153 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java
@@ -19,6 +19,29 @@
* https://developers.weixin.qq.com/miniprogram/dev/devtools/ext.html#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF%E5%BC%80%E5%8F%91
*
*
+ *
+ * ext_json补充说明
+ * 文档地址:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/commit.html
+ * 为了便于第三方平台使用同一个小程序模板为不同的小程序提供服务,第三方可以将自定义信息放置在 ext_json 中,在模板小程序中,可以使用 wx.getExtConfigSync 接口获取自定义信息,从而区分不同的小程序。详见:小程序模板开发
+ * ext_json 中的参数可选,参数详见小程序配置;但是,如果是模板id为标准模板库的模板id,则ext_json可支持的参数为:{"extAppid":'', "ext": {}, "window": {}}
+ * ext_json 中有限支持 pages,支持配置模板页面的子集(ext_json 中不可新增页面)。
+ * ext_json 中有限支持 subPackages,支持配置模板分包及其页面的子集(ext_json 中配置的分包必须已声明于模板中,且不可新增分包页面)。
+ * ext_json支持plugins配置,该配置会覆盖模板中的app.json中的plugins配置。关于plugin的使用详情请参考使用插件。
+ * 如果代码中已经有配置,则配置的合并规则为:
+ * ext整体替换
+ * pages整体替换
+ * extPages中找到对应页面,同级覆盖page.json
+ * window同级覆盖
+ * extAppid直接加到app.json
+ * networkTimeout同级覆盖
+ * customOpen整体替换
+ * tabbar同级覆盖
+ * functionPages整体替换
+ * subPackages整体替换
+ * navigateToMiniProgaramAppIdList:整体替换
+ * plugins整体替换
+ *
+ *
* @author yqx
* @date 2018/9/13
*/
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitStandardExt.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitStandardExt.java
new file mode 100644
index 0000000000..2d4b713919
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitStandardExt.java
@@ -0,0 +1,56 @@
+package me.chanjar.weixin.open.bean.ma;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 微信第三方平台上传代码到小程序代码标准模板时的参数
+ * ext_json补充说明
+ * 文档地址:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/commit.html
+ * 为了便于第三方平台使用同一个小程序模板为不同的小程序提供服务,第三方可以将自定义信息放置在 ext_json 中,在模板小程序中,可以使用 wx.getExtConfigSync 接口获取自定义信息,从而区分不同的小程序。详见:小程序模板开发
+ * ext_json 中的参数可选,参数详见小程序配置;但是,如果是模板id为标准模板库的模板id,则ext_json可支持的参数为:{"extAppid":'', "ext": {}, "window": {}}
+ * ext_json 中有限支持 pages,支持配置模板页面的子集(ext_json 中不可新增页面)。
+ * ext_json 中有限支持 subPackages,支持配置模板分包及其页面的子集(ext_json 中配置的分包必须已声明于模板中,且不可新增分包页面)。
+ * ext_json支持plugins配置,该配置会覆盖模板中的app.json中的plugins配置。关于plugin的使用详情请参考使用插件。
+ * 如果代码中已经有配置,则配置的合并规则为:
+ * ext整体替换
+ * pages整体替换
+ * extPages中找到对应页面,同级覆盖page.json
+ * window同级覆盖
+ * extAppid直接加到app.json
+ * networkTimeout同级覆盖
+ * customOpen整体替换
+ * tabbar同级覆盖
+ * functionPages整体替换
+ * subPackages整体替换
+ * navigateToMiniProgaramAppIdList:整体替换
+ * plugins整体替换
+ *
+ *
+ * @author 广州跨界
+ * @since 2021/08/12
+ */
+@Data
+public class WxMaOpenCommitStandardExt implements Serializable {
+
+ private static final long serialVersionUID = 4595618023108631477L;
+
+ /**
+ * 授权小程序Appid,可填入商户小程序AppID,以区分不同商户
+ */
+ @SerializedName("create_time")
+ private String extAppId;
+
+ /**
+ * 开发自定义的数据字段
+ */
+ private Map ext;
+
+ /**
+ * 授权小程序Appid,可填入商户小程序AppID,以区分不同商户
+ */
+ private Map window;
+}
From 60c9df46f545849dcda914c942a8636fe2a1c8ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8C=AA=E8=B9=84=E5=AE=9D=E5=AE=9D?=
Date: Fri, 13 Aug 2021 13:39:35 +0800
Subject: [PATCH 0074/1235] =?UTF-8?q?:bug:=20#2246=20=E3=80=90=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E3=80=91=E4=BF=AE=E5=A4=8D=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98V3=E7=AD=BE=E5=90=8D/=E9=AA=8C?=
=?UTF-8?q?=E7=AD=BE=E7=9A=84=E6=8D=A2=E8=A1=8C=E7=AC=A6=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
参考微信支付文档:
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml
https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml
签名时使用的换行符必须是\n,因此不应使用%n,这会导致windows平台下签名错误
---
.../binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java | 2 +-
.../wxpay/service/impl/BusinessCircleServiceImpl.java | 2 +-
.../wxpay/service/impl/MarketingFavorServiceImpl.java | 2 +-
.../binarywang/wxpay/service/impl/PayScoreServiceImpl.java | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
index c9b5744b3f..1180815df0 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
@@ -83,7 +83,7 @@ public static class JsapiResult implements Serializable {
private String paySign;
private String getSignStr() {
- return String.format("%s%n%s%n%s%n%s%n", appId, timeStamp, nonceStr, packageValue);
+ return String.format("%s\n%s\n%s\n%s\n", appId, timeStamp, nonceStr, packageValue);
}
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BusinessCircleServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BusinessCircleServiceImpl.java
index ee0874aa8a..49c400538d 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BusinessCircleServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BusinessCircleServiceImpl.java
@@ -46,7 +46,7 @@ public void notifyPoints(PointsNotifyRequest request) throws WxPayException {
* @return true:校验通过 false:校验不通过
*/
private boolean verifyNotifySign(SignatureHeader header, String data) {
- String beforeSign = String.format("%s%n%s%n%s%n", header.getTimeStamp(), header.getNonce(), data);
+ String beforeSign = String.format("%s\n%s\n%s\n", header.getTimeStamp(), header.getNonce(), data);
return payService.getConfig().getVerifier().verify(header.getSerialNo(),
beforeSign.getBytes(StandardCharsets.UTF_8), header.getSigned());
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java
index 8917db7d95..5923d0e106 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java
@@ -177,7 +177,7 @@ public FavorStocksStartResult restartFavorStocksV3(String stockId, FavorStocksSe
* @return true:校验通过 false:校验不通过
*/
private boolean verifyNotifySign(SignatureHeader header, String data) {
- String beforeSign = String.format("%s%n%s%n%s%n", header.getTimeStamp(), header.getNonce(), data);
+ String beforeSign = String.format("%s\n%s\n%s\n", header.getTimeStamp(), header.getNonce(), data);
return payService.getConfig().getVerifier().verify(header.getSerialNo(),
beforeSign.getBytes(StandardCharsets.UTF_8), header.getSigned());
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/PayScoreServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/PayScoreServiceImpl.java
index d4313a8db6..0b237fda34 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/PayScoreServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/PayScoreServiceImpl.java
@@ -303,7 +303,7 @@ public WxPayScoreResult decryptNotifyDataResource(PayScoreNotifyData data) throw
* @return true:校验通过 false:校验不通过
*/
private boolean verifyNotifySign(SignatureHeader header, String data) {
- String beforeSign = String.format("%s%n%s%n%s%n", header.getTimeStamp(), header.getNonce(), data);
+ String beforeSign = String.format("%s\n%s\n%s\n", header.getTimeStamp(), header.getNonce(), data);
return payService.getConfig().getVerifier().verify(header.getSerialNo(),
beforeSign.getBytes(StandardCharsets.UTF_8), header.getSigned());
}
From 5326c5b1558c3660b500d7ceca1739b2639f86b5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8C=AA=E8=B9=84=E5=AE=9D=E5=AE=9D?=
Date: Fri, 13 Aug 2021 13:41:00 +0800
Subject: [PATCH 0075/1235] =?UTF-8?q?:bug:=20#2216=20=E3=80=90=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E3=80=91=E4=BF=AE=E5=A4=8DAPP?=
=?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=B8=8B=E5=8D=95v3=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E7=BC=BA=E5=B0=91sign=E5=8F=82=E6=95=B0=E7=9A=84=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wxpay/bean/result/WxPayUnifiedOrderV3Result.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
index 1180815df0..8f3307cc1e 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
@@ -98,7 +98,11 @@ public static class AppResult implements Serializable {
private String packageValue;
private String noncestr;
private String timestamp;
+ private String sign;
+ private String getSignStr() {
+ return String.format("%s\n%s\n%s\n%s\n", appid, timestamp, noncestr, prepayid);
+ }
}
public T getPayInfo(TradeTypeEnum tradeType, String appId, String mchId, PrivateKey privateKey) {
@@ -119,7 +123,8 @@ public T getPayInfo(TradeTypeEnum tradeType, String appId, String mchId, Pri
appResult.setAppid(appId).setPrepayId(this.prepayId).setPartnerId(mchId)
.setNoncestr(nonceStr).setTimestamp(timestamp)
//暂填写固定值Sign=WXPay
- .setPackageValue("Sign=WXPay");
+ .setPackageValue("Sign=WXPay")
+ .setSign(SignUtils.sign(appResult.getSignStr(), privateKey));
return (T) appResult;
case NATIVE:
return (T) this.codeUrl;
From b3eadb4ffaa0f7f9c8cb900aacd7c7ce08c8f141 Mon Sep 17 00:00:00 2001
From: liming1019
Date: Fri, 13 Aug 2021 13:46:33 +0800
Subject: [PATCH 0076/1235] =?UTF-8?q?:new:=20#2255=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A?=
=?UTF-8?q?=E4=B9=89=E7=BB=84=E4=BB=B6=E4=B9=8B=E6=8E=A5=E5=85=A5=E5=95=86?=
=?UTF-8?q?=E5=93=81=E5=89=8D=E5=BF=85=E9=9C=80=E7=9A=84=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaService.java | 7 ++
.../wx/miniapp/api/WxMaShopAuditService.java | 53 +++++++++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 6 ++
.../api/impl/WxMaShopAuditServiceImpl.java | 101 ++++++++++++++++++
.../request/WxMaShopAuditBrandRequest.java | 93 ++++++++++++++++
.../request/WxMaShopAuditCategoryRequest.java | 59 ++++++++++
.../response/WxMaShopAuditBrandResponse.java | 20 ++++
.../WxMaShopAuditCategoryResponse.java | 20 ++++
.../response/WxMaShopAuditResultResponse.java | 40 +++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 7 ++
.../impl/WxMaShopAuditServiceImplTest.java | 93 ++++++++++++++++
11 files changed, 499 insertions(+)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAuditService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditBrandResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditCategoryResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditResultResponse.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java
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 3115a7d5b9..484968f3d9 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
@@ -433,6 +433,13 @@ public interface WxMaService extends WxService {
*/
WxMaShopImgService getShopImgService();
+ /**
+ * 小程序交易组件-接入商品前必需接口-审核相关接口
+ *
+ * @return
+ */
+ WxMaShopAuditService getShopAuditService();
+
/**
* 获取小程序 URL Link服务接口
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAuditService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAuditService.java
new file mode 100644
index 0000000000..157052b4c0
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAuditService.java
@@ -0,0 +1,53 @@
+package cn.binarywang.wx.miniapp.api;
+
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAuditBrandRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAuditCategoryRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAuditBrandResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAuditCategoryResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAuditResultResponse;
+import com.google.gson.JsonObject;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * 小程序交易组件-接入商品前必需接口(审核相关接口)
+ *
+ * @author liming1019
+ * @date 2021/8/12
+ */
+public interface WxMaShopAuditService {
+ /**
+ * 上传品牌信息(品牌审核)
+ *
+ * @param request
+ * @return WxMaShopAuditBrandResponse
+ * @throws WxErrorException
+ */
+ WxMaShopAuditBrandResponse auditBrand(WxMaShopAuditBrandRequest request) throws WxErrorException;
+
+ /**
+ * 上传类目资质(类目审核)
+ *
+ * @param request
+ * @return
+ * @throws WxErrorException
+ */
+ WxMaShopAuditCategoryResponse auditCategory(WxMaShopAuditCategoryRequest request) throws WxErrorException;
+
+ /**
+ * 获取审核结果
+ *
+ * @param auditId
+ * @return WxMaShopAuditResultResponse
+ * @throws WxErrorException
+ */
+ WxMaShopAuditResultResponse getAuditResult(String auditId) throws WxErrorException;
+
+ /**
+ * 获取小程序提交过的入驻资质信息
+ *
+ * @param reqType
+ * @return JsonObject
+ * @throws WxErrorException
+ */
+ JsonObject getMiniappCertificate(int reqType) 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 1de659e603..fe841a57a0 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
@@ -69,6 +69,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaShopAccountService shopAccountService = new WxMaShopAccountServiceImpl(this);
private final WxMaShopCatService shopCatService = new WxMaShopCatServiceImpl(this);
private final WxMaShopImgService shopImgService = new WxMaShopImgServiceImpl(this);
+ private final WxMaShopAuditService shopAuditService = new WxMaShopAuditServiceImpl(this);
private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
@@ -540,6 +541,11 @@ public WxMaShopImgService getShopImgService() {
return this.shopImgService;
}
+ @Override
+ public WxMaShopAuditService getShopAuditService() {
+ return this.shopAuditService;
+ }
+
@Override
public WxMaLinkService getLinkService() {
return this.linkService;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImpl.java
new file mode 100644
index 0000000000..b456410124
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImpl.java
@@ -0,0 +1,101 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.WxMaShopAuditService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAuditBrandRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAuditCategoryRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAuditBrandResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAuditCategoryResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAuditResultResponse;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.JsonObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+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.util.json.GsonHelper;
+import me.chanjar.weixin.common.util.json.GsonParser;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Audit.*;
+import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ERRCODE;
+
+/**
+ * 小程序交易组件-接入商品前必需接口(审核相关接口)
+ *
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@RequiredArgsConstructor
+@Slf4j
+public class WxMaShopAuditServiceImpl implements WxMaShopAuditService {
+ private final WxMaService wxMaService;
+
+ /**
+ * 上传品牌信息(品牌审核)
+ *
+ * @param request
+ * @return WxMaShopAuditBrandResponse
+ * @throws WxErrorException
+ */
+ @Override
+ public WxMaShopAuditBrandResponse auditBrand(WxMaShopAuditBrandRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(AUDIT_BRAND, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopAuditBrandResponse.class);
+ }
+
+ /**
+ * 上传类目资质(类目审核)
+ *
+ * @param request
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxMaShopAuditCategoryResponse auditCategory(WxMaShopAuditCategoryRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(AUDIT_CATEGORY, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopAuditCategoryResponse.class);
+ }
+
+ /**
+ * 获取审核结果
+ *
+ * @param auditId
+ * @return WxMaShopAuditResultResponse
+ * @throws WxErrorException
+ */
+ @Override
+ public WxMaShopAuditResultResponse getAuditResult(String auditId) throws WxErrorException {
+ String responseContent = this.wxMaService.post(AUDIT_RESULT, GsonHelper.buildJsonObject("audit_id", auditId));
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopAuditResultResponse.class);
+ }
+
+ /**
+ * 获取小程序提交过的入驻资质信息
+ *
+ * @param reqType
+ * @return JsonObject
+ * @throws WxErrorException
+ */
+ @Override
+ public JsonObject getMiniappCertificate(int reqType) throws WxErrorException {
+ String responseContent = this.wxMaService.post(GET_MINIAPP_CERTIFICATE, GsonHelper.buildJsonObject("req_type", reqType));
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, JsonObject.class);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java
new file mode 100644
index 0000000000..fec5e3ee57
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java
@@ -0,0 +1,93 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@Builder
+public class WxMaShopAuditBrandRequest implements Serializable {
+ private static final long serialVersionUID = -969331692973992066L;
+
+ /**
+ * audit_req : {"license":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"],"brand_info":{"brand_audit_type":1,"trademark_type":"29","brand_management_type":2,"commodity_origin_type":2,"brand_wording":"346225226351203275","sale_authorization":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"],"trademark_registration_certificate":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"],"trademark_change_certificate":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"],"trademark_registrant":"https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg","trademark_registrant_nu":"1249305","trademark_authorization_period":"2020-03-25 12:05:25","trademark_registration_application":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"],"trademark_applicant":"张三","trademark_application_time":"2020-03-25 12:05:25","imported_goods_form":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]}}
+ */
+
+ @SerializedName("audit_req")
+ private AuditReqBean auditReq;
+
+ @Data
+ @Builder
+ public static class AuditReqBean implements Serializable {
+ /**
+ * license : ["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]
+ * brand_info : {"brand_audit_type":1,"trademark_type":"29","brand_management_type":2,"commodity_origin_type":2,"brand_wording":"346225226351203275","sale_authorization":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"],"trademark_registration_certificate":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"],"trademark_change_certificate":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"],"trademark_registrant":"https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg","trademark_registrant_nu":"1249305","trademark_authorization_period":"2020-03-25 12:05:25","trademark_registration_application":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"],"trademark_applicant":"张三","trademark_application_time":"2020-03-25 12:05:25","imported_goods_form":["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]}
+ */
+
+ @SerializedName("brand_info")
+ private BrandInfoBean brandInfo;
+ @SerializedName("license")
+ private List license;
+
+ @Data
+ @Builder
+ public static class BrandInfoBean implements Serializable {
+ /**
+ * brand_audit_type : 1
+ * trademark_type : 29
+ * brand_management_type : 2
+ * commodity_origin_type : 2
+ * brand_wording : 346225226351203275
+ * sale_authorization : ["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]
+ * trademark_registration_certificate : ["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]
+ * trademark_change_certificate : ["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]
+ * trademark_registrant : https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg
+ * trademark_registrant_nu : 1249305
+ * trademark_authorization_period : 2020-03-25 12:05:25
+ * trademark_registration_application : ["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]
+ * trademark_applicant : 张三
+ * trademark_application_time : 2020-03-25 12:05:25
+ * imported_goods_form : ["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]
+ */
+
+ @SerializedName("brand_audit_type")
+ private Integer brandAuditType;
+ @SerializedName("trademark_type")
+ private String trademarkType;
+ @SerializedName("brand_management_type")
+ private Integer brandManagementType;
+ @SerializedName("commodity_origin_type")
+ private Integer commodityOriginType;
+ @SerializedName("brand_wording")
+ private String brandWording;
+ @SerializedName("trademark_registrant")
+ private String trademarkRegistrant;
+ @SerializedName("trademark_registrant_nu")
+ private String trademarkRegistrantNu;
+ @SerializedName("trademark_authorization_period")
+ private String trademarkAuthorizationPeriod;
+ @SerializedName("trademark_applicant")
+ private String trademarkApplicant;
+ @SerializedName("trademark_application_time")
+ private String trademarkApplicationTime;
+ @SerializedName("sale_authorization")
+ private List saleAuthorization;
+ @SerializedName("trademark_registration_certificate")
+ private List trademarkRegistrationCertificate;
+ @SerializedName("trademark_change_certificate")
+ private List trademarkChangeCertificate;
+ @SerializedName("trademark_registration_application")
+ private List trademarkRegistrationApplication;
+ @SerializedName("imported_goods_form")
+ private List importedGoodsForm;
+ }
+ }
+}
+
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java
new file mode 100644
index 0000000000..8fe40176c4
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java
@@ -0,0 +1,59 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@Builder
+public class WxMaShopAuditCategoryRequest implements Serializable {
+ private static final long serialVersionUID = -6730876344556487071L;
+
+ /**
+ * audit_req : {"license":["www.xxxxx.com"],"category_info":{"level1":7419,"level2":7439,"level3":7448,"certificate":["www.xxx.com"]}}
+ */
+
+ @SerializedName("audit_req")
+ private AuditReqBean auditReq;
+
+ @Data
+ @Builder
+ public static class AuditReqBean implements Serializable {
+ /**
+ * license : ["www.xxxxx.com"]
+ * category_info : {"level1":7419,"level2":7439,"level3":7448,"certificate":["www.xxx.com"]}
+ */
+
+ @SerializedName("category_info")
+ private CategoryInfoBean categoryInfo;
+ @SerializedName("license")
+ private List license;
+
+ @Data
+ @Builder
+ public static class CategoryInfoBean implements Serializable {
+ /**
+ * level1 : 7419
+ * level2 : 7439
+ * level3 : 7448
+ * certificate : ["www.xxx.com"]
+ */
+
+ @SerializedName("level1")
+ private Integer level1;
+ @SerializedName("level2")
+ private Integer level2;
+ @SerializedName("level3")
+ private Integer level3;
+ @SerializedName("certificate")
+ private List certificate;
+ }
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditBrandResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditBrandResponse.java
new file mode 100644
index 0000000000..59f7a6ff9c
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditBrandResponse.java
@@ -0,0 +1,20 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopAuditBrandResponse extends WxMaShopBaseResponse implements Serializable {
+ private static final long serialVersionUID = -4643316662725276237L;
+
+ @SerializedName("audit_id")
+ private String auditId;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditCategoryResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditCategoryResponse.java
new file mode 100644
index 0000000000..db157fdddd
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditCategoryResponse.java
@@ -0,0 +1,20 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopAuditCategoryResponse extends WxMaShopBaseResponse implements Serializable {
+ private static final long serialVersionUID = -1822188134865177738L;
+
+ @SerializedName("audit_id")
+ private String auditId;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditResultResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditResultResponse.java
new file mode 100644
index 0000000000..5f3fca5cc7
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAuditResultResponse.java
@@ -0,0 +1,40 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopAuditResultResponse extends WxMaShopBaseResponse implements Serializable {
+ private static final long serialVersionUID = -1068201722686667490L;
+
+ /**
+ * data : {"status":9,"brand_id":0,"reject_reason":"请重新提交审核"}
+ */
+
+ @SerializedName("data")
+ private DataBean data;
+
+ @Data
+ public static class DataBean implements Serializable {
+ /**
+ * status : 9
+ * brand_id : 0
+ * reject_reason : 请重新提交审核
+ */
+
+ @SerializedName("status")
+ private Integer status;
+ @SerializedName("brand_id")
+ private Integer brandId;
+ @SerializedName("reject_reason")
+ private String rejectReason;
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index c76c8963d6..74f656d25d 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -341,6 +341,13 @@ interface Cat {
interface Img {
String IMG_UPLOAD = "https://api.weixin.qq.com/shop/img/upload";
}
+
+ interface Audit {
+ String AUDIT_BRAND = "https://api.weixin.qq.com/shop/audit/audit_brand";
+ String AUDIT_CATEGORY = "https://api.weixin.qq.com/shop/audit/audit_category";
+ String AUDIT_RESULT = "https://api.weixin.qq.com/shop/audit/result";
+ String GET_MINIAPP_CERTIFICATE = "https://api.weixin.qq.com/shop/audit/get_miniapp_certificate";
+ }
}
/**
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java
new file mode 100644
index 0000000000..c8ec9f081c
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java
@@ -0,0 +1,93 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAuditBrandRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAuditCategoryRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAuditBrandResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAuditCategoryResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAuditResultResponse;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.gson.JsonObject;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author liming1019
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaShopAuditServiceImplTest {
+
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testAuditBrand() throws WxErrorException {
+ WxMaShopAuditBrandRequest request = WxMaShopAuditBrandRequest.builder().build();
+ WxMaShopAuditBrandRequest.AuditReqBean auditReqBean = WxMaShopAuditBrandRequest.AuditReqBean.builder().build();
+
+ auditReqBean.setLicense(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")));
+ auditReqBean.setBrandInfo(WxMaShopAuditBrandRequest.AuditReqBean.BrandInfoBean.builder()
+ .brandAuditType(1)
+ .trademarkType("29")
+ .brandManagementType(2)
+ .commodityOriginType(2)
+ .brandWording("346225226351203275")
+ .saleAuthorization(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkRegistrationCertificate(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkChangeCertificate(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkRegistrant("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")
+ .trademarkRegistrantNu("1249305")
+ .trademarkAuthorizationPeriod("2020-03-25 12:05:25")
+ .trademarkRegistrationApplication(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkApplicant("张三")
+ .trademarkApplicationTime("2020-03-25 12:05:25")
+ .importedGoodsForm(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .build());
+ request.setAuditReq(auditReqBean);
+
+ WxMaShopAuditBrandResponse response = wxService.getShopAuditService().auditBrand(request);
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testAuditCategory() throws WxErrorException {
+ WxMaShopAuditCategoryRequest request = WxMaShopAuditCategoryRequest.builder().build();
+ WxMaShopAuditCategoryRequest.AuditReqBean auditReqBean = WxMaShopAuditCategoryRequest.AuditReqBean.builder().build();
+ auditReqBean.setLicense(new ArrayList(Arrays.asList("www.xxxxx.com")));
+ auditReqBean.setCategoryInfo(WxMaShopAuditCategoryRequest.AuditReqBean.CategoryInfoBean.builder()
+ .level1(7419)
+ .level2(7439)
+ .level3(7448)
+ .certificate(new ArrayList(Arrays.asList("www.xxxxx.com")))
+ .build());
+ request.setAuditReq(auditReqBean);
+ WxMaShopAuditCategoryResponse response = wxService.getShopAuditService().auditCategory(request);
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testGetAuditResult() throws WxErrorException {
+ WxMaShopAuditResultResponse response = wxService.getShopAuditService().getAuditResult("RQAAAHIOW-QGAAAAveAUYQ");
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testGetMiniappCertificate1() throws WxErrorException {
+ JsonObject response = wxService.getShopAuditService().getMiniappCertificate(1);
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testGetMiniappCertificate2() throws WxErrorException {
+ JsonObject response = wxService.getShopAuditService().getMiniappCertificate(2);
+ assertThat(response).isNotNull();
+ }
+}
From 426ad57aa519fad2c9f9868909f0ceecce38b396 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Fri, 13 Aug 2021 14:51:11 +0800
Subject: [PATCH 0077/1235] =?UTF-8?q?:art:=20=E4=BC=98=E5=8C=96=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../executor/QrcodeRequestExecutor.java | 5 ++---
.../impl/WxMaLiveGoodsServiceImplTest.java | 14 ++++++------
.../me/chanjar/weixin/mp/api/WxMpService.java | 22 +++++++++++++++----
.../result/WxPayUnifiedOrderV3Result.java | 2 +-
4 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/QrcodeRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/QrcodeRequestExecutor.java
index cea0f96206..bf85004ac5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/QrcodeRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/QrcodeRequestExecutor.java
@@ -16,7 +16,7 @@
public abstract class QrcodeRequestExecutor implements RequestExecutor {
protected RequestHttp requestHttp;
- public QrcodeRequestExecutor(RequestHttp requestHttp) {
+ protected QrcodeRequestExecutor(RequestHttp requestHttp) {
this.requestHttp = requestHttp;
}
@@ -30,10 +30,9 @@ public static RequestExecutor create(RequestHtt
switch (requestHttp.getRequestType()) {
case APACHE_HTTP:
return new ApacheQrcodeFileRequestExecutor(requestHttp, path);
- case JODD_HTTP:
- return null;
case OK_HTTP:
return new OkHttpQrcodeFileRequestExecutor(requestHttp, path);
+ case JODD_HTTP:
default:
return null;
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java
index ccf073a534..5ea3b11ea4 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImplTest.java
@@ -35,13 +35,13 @@ public void addGoods() throws Exception {
WxMaLiveGoodInfo goods = new WxMaLiveGoodInfo();
goods.setCoverImgUrl(mediaUpload.getMediaId());
goods.setName("宫廷奢华真丝四件套");
- goods.setPrice(new BigDecimal("1599"));
- goods.setPrice2(new BigDecimal("0"));
+ goods.setPrice(BigDecimal.valueOf(1599));
+ goods.setPrice2(BigDecimal.ZERO);
goods.setPriceType(1);
goods.setUrl("pages/goods/goods?id=b7c4fbf95493bd294054fe4296d0d9ad");
WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().addGoods(goods);
assertNotNull(liveResult);
- System.out.println(liveResult.toString());
+ System.out.println(liveResult);
}
@Test
@@ -69,8 +69,8 @@ public void updateGoods() throws Exception {
goods.setGoodsId(8);
goods.setName("宫廷奢华真丝四件套");
goods.setCoverImgUrl("http://mmbiz.qpic.cn/mmbiz_png/omYktZNGamuUQE0WPVfqdnLV61JDhluXOac7PiaoZeticFpcR7wvicC0aXUC2VXkl7r1gN0QSKosv2satn6oCFeiaQ/0");
- goods.setPrice(new BigDecimal("2299"));
- goods.setPrice2(new BigDecimal("0"));
+ goods.setPrice(BigDecimal.valueOf(2299));
+ goods.setPrice2(BigDecimal.ZERO);
goods.setPriceType(1);
goods.setUrl("pages/goods/goods?id=b7c4fbf95493bd294054fe4296d0d9ad");
boolean maLiveInfo = this.wxService.getLiveGoodsService().updateGoods(goods);
@@ -81,13 +81,13 @@ public void updateGoods() throws Exception {
public void getGoodsWareHouse() throws Exception {
WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().getGoodsWareHouse(Arrays.asList(1, 2));
assertNotNull(liveResult);
- System.out.println(liveResult.toString());
+ System.out.println(liveResult);
}
@Test
public void getApprovedGoods() throws Exception {
WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().getApprovedGoods(0, 4, 2);
assertNotNull(liveResult);
- System.out.println(liveResult.toString());
+ System.out.println(liveResult);
}
}
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 4dadbc174e..6b6e30b7f3 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
@@ -70,7 +70,7 @@ public interface WxMpService extends WxService {
*
* @return token access token
* @throws WxErrorException .
- * @see #getAccessToken(boolean) #getAccessToken(boolean)
+ * @see #getAccessToken(boolean) #getAccessToken(boolean)#getAccessToken(boolean)
*/
String getAccessToken() throws WxErrorException;
@@ -98,7 +98,7 @@ public interface WxMpService extends WxService {
* @param type ticket 类型
* @return ticket ticket
* @throws WxErrorException .
- * @see #getTicket(TicketType, boolean) #getTicket(TicketType, boolean)
+ * @see #getTicket(TicketType, boolean) #getTicket(TicketType, boolean)#getTicket(TicketType, boolean)
*/
String getTicket(TicketType type) throws WxErrorException;
@@ -120,7 +120,7 @@ public interface WxMpService extends WxService {
*
* @return jsapi ticket
* @throws WxErrorException .
- * @see #getJsapiTicket(boolean) #getJsapiTicket(boolean)
+ * @see #getJsapiTicket(boolean) #getJsapiTicket(boolean)#getJsapiTicket(boolean)
*/
String getJsapiTicket() throws WxErrorException;
@@ -563,7 +563,7 @@ public interface WxMpService extends WxService {
/**
* 返回电子发票报销方相关接口
*
- * @return WxMpReimburseInvoiceService
+ * @return WxMpReimburseInvoiceService reimburse invoice service
*/
WxMpReimburseInvoiceService getReimburseInvoiceService();
@@ -804,4 +804,18 @@ public interface WxMpService extends WxService {
* @param guideMassedJobService the guide service
*/
void setGuideMassedJobService(WxMpGuideMassedJobService guideMassedJobService);
+
+ /**
+ * Gets merchant invoice service.
+ *
+ * @return the merchant invoice service
+ */
+ WxMpMerchantInvoiceService getMerchantInvoiceService();
+
+ /**
+ * Sets merchant invoice service.
+ *
+ * @param merchantInvoiceService the merchant invoice service
+ */
+ void setMerchantInvoiceService(WxMpMerchantInvoiceService merchantInvoiceService);
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
index 8f3307cc1e..309fb8e752 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java
@@ -101,7 +101,7 @@ public static class AppResult implements Serializable {
private String sign;
private String getSignStr() {
- return String.format("%s\n%s\n%s\n%s\n", appid, timestamp, noncestr, prepayid);
+ return String.format("%s\n%s\n%s\n%s\n", appid, timestamp, noncestr, prepayId);
}
}
From ed6bd016f55f0e461e9693b0ee387db00279a88b Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Fri, 13 Aug 2021 15:19:10 +0800
Subject: [PATCH 0078/1235] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index c8e0e338c5..2386cce594 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
[](https://github.com/Wechat-Group/WxJava)
[](https://github.com/Wechat-Group/WxJava/releases)
[](http://mvnrepository.com/artifact/com.github.binarywang/wx-java)
-[](https://travis-ci.org/Wechat-Group/WxJava)
+[](https://travis-ci.com/Wechat-Group/WxJava)
[](https://www.jetbrains.com/?from=WxJava-weixin-java-tools)
[](https://opensource.org/licenses/Apache-2.0)
From 3f42a162c21593599b8d90349665466576d5f942 Mon Sep 17 00:00:00 2001
From: po <36494934+chanlyang@users.noreply.github.com>
Date: Fri, 13 Aug 2021 17:53:01 +0800
Subject: [PATCH 0079/1235] =?UTF-8?q?:new:=20#2257=E3=80=90=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E3=80=91=E5=A2=9E=E5=8A=A0=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E7=AD=BE=E7=BA=A6=E4=BB=A3=E6=89=A3=E7=9B=B8=E5=85=B3?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bean/request/WxH5EntrustRequest.java | 193 +++++++++
.../bean/request/WxMaEntrustRequest.java | 179 +++++++++
.../bean/request/WxMpEntrustRequest.java | 179 +++++++++
.../bean/request/WxPayEntrustRequest.java | 368 ++++++++++++++++++
.../bean/request/WxPreWithholdRequest.java | 65 ++++
.../bean/request/WxSignQueryRequest.java | 105 +++++
.../request/WxTerminatedContractRequest.java | 122 ++++++
.../request/WxWithholdOrderQueryRequest.java | 64 +++
.../wxpay/bean/request/WxWithholdRequest.java | 194 +++++++++
.../wxpay/bean/result/WxH5EntrustResult.java | 43 ++
.../wxpay/bean/result/WxPayEntrustResult.java | 190 +++++++++
.../wxpay/bean/result/WxSignQueryResult.java | 123 ++++++
.../bean/result/WxSignStatusNotifyResult.java | 127 ++++++
.../result/WxTerminationContractResult.java | 57 +++
.../bean/result/WxWithholdNotifyResult.java | 234 +++++++++++
.../result/WxWithholdOrderQueryResult.java | 182 +++++++++
.../wxpay/bean/result/WxWithholdResult.java | 44 +++
.../wxpay/service/WxEntrustPapService.java | 157 ++++++++
.../wxpay/service/WxPayService.java | 6 +
.../service/impl/BaseWxPayServiceImpl.java | 7 +
.../service/impl/WxEntrustPapServiceImpl.java | 139 +++++++
.../service/impl/WxEntrustPapServiceTest.java | 236 +++++++++++
22 files changed, 3014 insertions(+)
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxH5EntrustRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxMaEntrustRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxMpEntrustRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayEntrustRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPreWithholdRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxSignQueryRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxTerminatedContractRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxWithholdOrderQueryRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxWithholdRequest.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxH5EntrustResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayEntrustResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignStatusNotifyResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxTerminationContractResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdOrderQueryResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdResult.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java
create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceImpl.java
create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceTest.java
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxH5EntrustRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxH5EntrustRequest.java
new file mode 100644
index 0000000000..57f34eb136
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxH5EntrustRequest.java
@@ -0,0 +1,193 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.*;
+import me.chanjar.weixin.common.annotation.Required;
+
+import java.util.Map;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:12 下午
+ *
+ *
+ * 微信h5纯签约入参
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+@XStreamAlias("xml")
+public class WxH5EntrustRequest extends BaseWxPayRequest {
+
+ /**
+ *
+ * 协议模板ID
+ * plan_id
+ * 是
+ * String(28)
+ * 12535
+ * 协议模板ID,分为首次签约,支付中签约,重新签约
+ *
+ */
+ @Required
+ @XStreamAlias("plan_id")
+ private String planId;
+
+ /**
+ *
+ * 签约协议号
+ * contract_code
+ * 是
+ * String(32)
+ * 100000
+ * 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成
+ *
+ */
+ @Required
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+ /**
+ *
+ * 请求序列号
+ * request_serial
+ * 是
+ * int(64)
+ * 1000
+ * 商户请求签约时的序列号,要求唯一性,禁止使用0开头的,用户排序,纯数字
+ *
+ */
+ @Required
+ @XStreamAlias("request_serial")
+ private Long requestSerial;
+
+ /**
+ *
+ * 用户账户展示名称
+ * contract_display_account
+ * 是
+ * string(32)
+ * 微信代扣
+ * 签约用户的名称,用户页面展示,不支持符号表情
+ *
+ */
+ @Required
+ @XStreamAlias("contract_display_account")
+ private String contractDisplayAccount;
+
+ /**
+ *
+ * 回调通知URL
+ * notify_url
+ * 是
+ * string(256)
+ * https://weixin.qq.com
+ * 用于接收签约成功消息的回调通知地址
+ *
+ */
+ @Required
+ @XStreamAlias("notify_url")
+ private String notifyUrl;
+
+ /**
+ *
+ * 版本号
+ * sign
+ * 是
+ * string(8)
+ * 1.0
+ * 固定值1.0
+ *
+ */
+ @Required
+ @XStreamAlias("version")
+ private String version;
+
+ /**
+ *
+ * 时间戳
+ * timestamp
+ * 是
+ * string(10)
+ * 1414488825
+ * 系统当前时间,10位
+ *
+ */
+ @Required
+ @XStreamAlias("timestamp")
+ private String timestamp;
+
+ /**
+ *
+ * 客户端IP
+ * clientip
+ * 是
+ * string(32)
+ * 127.0.0.1
+ * 用户客户端的IP地址
+ *
+ */
+ @Required
+ @XStreamAlias("clientip")
+ private String clientIp;
+
+ /**
+ *
+ * 回调应用appid
+ * return_appid
+ * 否
+ * string(32)
+ * wxcbda96de0b16
+ * 用来控制签约页面结束后的返回路径,
+ * 当指定该字段是,签约成功将返回return_appid指定的APP应用,如果不填且签约发起的浏览器ua可被微信识别,
+ * 则挑战到浏览器,否则留在微信
+ *
+ */
+ @XStreamAlias("return_appid")
+ private String returnAppid;
+
+ /**
+ *
+ * 商户测用户标识
+ * outerid
+ * 否
+ * string(32)
+ * 陈*(10000001)
+ * 用于多账号签约,值与contract_display_account一样就行
+ *
+ */
+ @XStreamAlias("outerid")
+ private String outerId;
+
+
+ /**
+ * 是否需要nonce_str
+ */
+ @Override
+ protected boolean needNonceStr() {
+ return false;
+ }
+
+ @Override
+ protected void checkConstraints() throws WxPayException {
+
+ }
+
+ @Override
+ protected void storeMap(Map map) {
+ map.put("plan_id", planId);
+ map.put("contract_code", contractCode);
+ map.put("request_serial", String.valueOf(requestSerial));
+ map.put("contract_display_account", contractDisplayAccount);
+ map.put("notify_url", notifyUrl);
+ map.put("version", version);
+ map.put("timestamp", timestamp);
+ map.put("clientip", clientIp);
+ map.put("return_appid", returnAppid);
+ map.put("outerid", outerId);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxMaEntrustRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxMaEntrustRequest.java
new file mode 100644
index 0000000000..0a9e8c2f24
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxMaEntrustRequest.java
@@ -0,0 +1,179 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.google.gson.FieldNamingPolicy;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.*;
+import me.chanjar.weixin.common.annotation.Required;
+
+import java.util.Map;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:13 下午
+ *
+ * 小程序纯签约入参
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+@XStreamAlias("xml")
+public class WxMaEntrustRequest extends BaseWxPayRequest {
+ /**
+ *
+ * 协议模板ID
+ * plan_id
+ * 是
+ * String(28)
+ * 12535
+ * 协议模板ID,分为首次签约,支付中签约,重新签约
+ *
+ */
+ @Required
+ @SerializedName(value = "plan_id")
+ @XStreamAlias("plan_id")
+ private String planId;
+
+ /**
+ *
+ * 签约协议号
+ * contract_code
+ * 是
+ * String(32)
+ * 100000
+ * 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成
+ *
+ */
+ @Required
+ @SerializedName(value = "contract_code")
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+ /**
+ *
+ * 请求序列号
+ * request_serial
+ * 是
+ * int(64)
+ * 1000
+ * 商户请求签约时的序列号,要求唯一性,禁止使用0开头的,用户排序,纯数字
+ *
+ */
+ @Required
+ @SerializedName(value = "request_serial")
+ @XStreamAlias("request_serial")
+ private Long requestSerial;
+
+ /**
+ *
+ * 用户账户展示名称
+ * contract_display_account
+ * 是
+ * string(32)
+ * 微信代扣
+ * 签约用户的名称,用户页面展示,不支持符号表情
+ *
+ */
+ @Required
+ @SerializedName(value = "contract_display_account")
+ @XStreamAlias("contract_display_account")
+ private String contractDisplayAccount;
+
+ /**
+ *
+ * 回调通知URL
+ * notify_url
+ * 是
+ * string(256)
+ * https://weixin.qq.com
+ * 用于接收签约成功消息的回调通知地址
+ *
+ */
+ @Required
+ @SerializedName(value = "notify_url")
+ @XStreamAlias("notify_url")
+ private String notifyUrl;
+
+ /**
+ *
+ * 版本号
+ * sign
+ * 是
+ * string(8)
+ * 1.0
+ * 固定值1.0
+ *
+ */
+ @Required
+ @XStreamAlias("version")
+ private String version;
+
+
+ /**
+ *
+ * 时间戳
+ * timestamp
+ * 是
+ * string(10)
+ * 1414488825
+ * 系统当前时间,10位
+ *
+ */
+ @Required
+ @XStreamAlias("timestamp")
+ private String timestamp;
+
+ /**
+ *
+ * 商户侧用户标识
+ * outerId
+ * 否
+ * String
+ * 陈*(141448825)
+ * 用户在商户侧的标识
+ *
+ */
+ @XStreamAlias("outerid")
+ private String outerId;
+
+ @Override
+ protected void checkConstraints() throws WxPayException {
+
+ }
+
+ /**
+ * 是否需要nonce_str
+ */
+ @Override
+ protected boolean needNonceStr() {
+ return false;
+ }
+
+ @Override
+ protected void storeMap(Map map) {
+ map.put("plan_id", planId);
+ map.put("contract_code", contractCode);
+ map.put("request_serial", String.valueOf(requestSerial));
+ map.put("contract_display_account", contractDisplayAccount);
+ map.put("notify_url", notifyUrl);
+ map.put("timestamp", timestamp);
+ map.put("outerid", outerId);
+ }
+
+ @Override
+ public String toString() {
+ GsonBuilder gsonBuilder = new GsonBuilder();
+
+ gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
+
+ Gson gson = gsonBuilder.create();
+
+ return gson.toJson(this);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxMpEntrustRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxMpEntrustRequest.java
new file mode 100644
index 0000000000..0344f36d86
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxMpEntrustRequest.java
@@ -0,0 +1,179 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.*;
+import me.chanjar.weixin.common.annotation.Required;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:17 下午
+ *
+ *
+ * 公众号纯签约入参
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+@XStreamAlias("xml")
+public class WxMpEntrustRequest extends BaseWxPayRequest {
+
+ /**
+ *
+ * 协议模板ID
+ * plan_id
+ * 是
+ * String(28)
+ * 12535
+ * 协议模板ID,分为首次签约,支付中签约,重新签约
+ *
+ */
+ @Required
+ @XStreamAlias("plan_id")
+ private String planId;
+
+ /**
+ *
+ * 签约协议号
+ * contract_code
+ * 是
+ * String(32)
+ * 100000
+ * 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成
+ *
+ */
+ @Required
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+ /**
+ *
+ * 请求序列号
+ * request_serial
+ * 是
+ * int(64)
+ * 1000
+ * 商户请求签约时的序列号,要求唯一性,禁止使用0开头的,用户排序,纯数字
+ *
+ */
+ @Required
+ @XStreamAlias("request_serial")
+ private Long requestSerial;
+
+ /**
+ *
+ * 用户账户展示名称
+ * contract_display_account
+ * 是
+ * string(32)
+ * 微信代扣
+ * 签约用户的名称,用户页面展示,不支持符号表情
+ *
+ */
+ @Required
+ @XStreamAlias("contract_display_account")
+ private String contractDisplayAccount;
+
+ /**
+ *
+ * 回调通知URL
+ * notify_url
+ * 是
+ * string(256)
+ * https://weixin.qq.com
+ * 用于接收签约成功消息的回调通知地址
+ *
+ */
+ @Required
+ @XStreamAlias("notify_url")
+ private String notifyUrl;
+
+ /**
+ *
+ * 版本号
+ * sign
+ * 是
+ * string(8)
+ * 1.0
+ * 固定值1.0
+ *
+ */
+ @Required
+ @XStreamAlias("version")
+ private String version;
+
+ /**
+ *
+ * 时间戳
+ * timestamp
+ * 是
+ * string(10)
+ * 1414488825
+ * 系统当前时间,10位
+ *
+ */
+ @Required
+ @XStreamAlias("timestamp")
+ private String timestamp;
+
+ /**
+ *
+ * 返回web
+ * return_web
+ * 否
+ * int
+ * 1
+ * 用来控制签约页面结束后的返回路径(不传签约后留在微信内),1 表示返回签约页面的referrer url,
+ * 不填或获取不到referrer则不返回,跳转referrer url 时会自动带上from_wxpay=1
+ *
+ */
+ @XStreamAlias("return_web")
+ private Integer returnWeb;
+
+ /**
+ *
+ * 商户测的用户标识
+ * outerid
+ * 否
+ * String()
+ * 陈*(101000203)
+ * 用于多账户签约,同一个模板下要保持一致,取值和contractDisplayAccount取一样就行
+ *
+ */
+ @XStreamAlias("outerid")
+ private String outerId;
+
+ @Override
+ protected void checkConstraints() throws WxPayException {
+
+ }
+
+ /**
+ * 是否需要nonce_str
+ */
+ @Override
+ protected boolean needNonceStr() {
+ return false;
+ }
+
+ @Override
+ protected void storeMap(Map map) {
+ map.put("plan_id", planId);
+ map.put("contract_code", contractCode);
+ map.put("request_serial", String.valueOf(requestSerial));
+ map.put("contract_display_account", contractDisplayAccount);
+ map.put("notify_url", notifyUrl);
+ map.put("version", version);
+ map.put("timestamp", timestamp);
+ if (Objects.nonNull(returnWeb)) {
+ map.put("return_web", String.valueOf(returnWeb));
+ }
+ map.put("outerid", outerId);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayEntrustRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayEntrustRequest.java
new file mode 100644
index 0000000000..764e0e56af
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayEntrustRequest.java
@@ -0,0 +1,368 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.*;
+import me.chanjar.weixin.common.annotation.Required;
+
+import java.util.Map;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:18 下午
+ *
+ * 支付中签约入参
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+@XStreamAlias("xml")
+public class WxPayEntrustRequest extends BaseWxPayRequest {
+
+ /**
+ *
+ * 签约商户号
+ * contract_mchid
+ * 是
+ * String(32)
+ * 1200009811
+ * 签约商户号,必须与mch_id一致
+ *
+ */
+ @Required
+ @XStreamAlias("contract_mchid")
+ private String contractMchId;
+
+ /**
+ *
+ * 签约APPID
+ * contract_appid
+ * 是
+ * String(32)
+ * wxcbda96de0b165486
+ * 签约公众号,必须与APPID一致
+ *
+ */
+ @Required
+ @XStreamAlias("contract_appid")
+ private String contractAppId;
+
+ /**
+ *
+ * 商户订单号
+ * out_trade_no
+ * 是
+ * String(32)
+ * 123456
+ * 商户系统内部的订单号,32字符内,可包含字母
+ *
+ */
+ @Required
+ @XStreamAlias("out_trade_no")
+ private String outTradeNo;
+
+ /**
+ *
+ * 设备号
+ * device_info
+ * 否
+ * String(32)
+ * 013467007045764
+ * 终端设备号,若为PC网页或公众号内则传WEB
+ *
+ */
+ @XStreamAlias("device_info")
+ private String deviceInfo;
+
+ /**
+ *
+ * 商品描述
+ * body
+ * 是
+ * String(128)
+ * ipad mini 16G 白色
+ * 商品支付单简要描述
+ *
+ */
+ @Required
+ @XStreamAlias("body")
+ private String body;
+
+ /**
+ *
+ * 商品详情
+ * detail
+ * 否
+ * String(8192)
+ * ipad mini 16G 白色
+ * 商品名称明细列表
+ *
+ */
+ @XStreamAlias("detail")
+ private String detail;
+
+ /**
+ *
+ * 附加数据
+ * attach
+ * 否
+ * String(127)
+ * online/dev/dev1
+ * 商家数据包
+ *
+ */
+ @XStreamAlias("attach")
+ private String attach;
+
+ /**
+ *
+ * 回调通知url
+ * notify_url
+ * 是
+ * String(256)
+ * https://weixin.qq.com
+ * 回调通知地址
+ *
+ */
+ @Required
+ @XStreamAlias("notify_url")
+ private String notifyUrl;
+
+ /**
+ *
+ * 总金额
+ * total_fee
+ * 是
+ * int
+ * 888
+ * 订单总金额,单位分
+ *
+ */
+ @Required
+ @XStreamAlias("total_fee")
+ private Integer totalFee;
+
+ /**
+ *
+ * 终端ip
+ * spbill_create_ip
+ * 是
+ * String(16)
+ * 127.0.0.1
+ * 用户的客户端IP
+ *
+ */
+ @Required
+ @XStreamAlias("spbill_create_ip")
+ private String spbillCreateIp;
+
+ /**
+ *
+ * 交易起始时间
+ * time_start
+ * 否
+ * String(14)
+ * 20201025171529
+ * 订单生成时间,格式yyyyMMddHHmmss
+ *
+ */
+ @XStreamAlias("time_start")
+ private String timeStart;
+
+ /**
+ *
+ * 交易结束时间
+ * time_expire
+ * 否
+ * String(14)
+ * 20201025171529
+ * 订单失效时间,格式yyyyMMddHHmmss
+ *
+ */
+ @XStreamAlias("time_expire")
+ private String timeExpire;
+
+ /**
+ *
+ * 商品标记
+ * goods_tag
+ * 否
+ * String(32)
+ * wxg
+ * 商品标记,代金券或立减优惠功能参数
+ *
+ */
+ @XStreamAlias("goods_tag")
+ private String goodsTag;
+
+ /**
+ *
+ * 交易类型
+ * trade_type
+ * 是
+ * String(16)
+ * JSAPI
+ * JSAPI,MWEB
+ *
+ */
+ @Required
+ @XStreamAlias("trade_type")
+ private String tradeType;
+
+ /**
+ *
+ * 商品ID
+ * product_id
+ * 否
+ * String(32)
+ * 12234355463434643
+ * 二维码支付必传,二维码中包含商品ID
+ *
+ */
+ @XStreamAlias("product_id")
+ private String productId;
+
+ /**
+ *
+ * 指定支付方式
+ * limit_pay
+ * 否
+ * String(32)
+ * no_credit
+ * no_credit--指定不能使用信用卡支付
+ *
+ */
+ @XStreamAlias("limit_pay")
+ private String limitPay;
+
+ /**
+ *
+ * 用户表示
+ * openid
+ * 否
+ * String(128)
+ * oUpF4sdsidj3Jds89
+ * tradetype=JSAPI 则必传
+ *
+ */
+ @XStreamAlias("openid")
+ private String openId;
+
+ /**
+ *
+ * 协议模板ID
+ * plan_id
+ * 是
+ * String(28)
+ * 12535
+ * 协议模板ID,分为首次签约,支付中签约,重新签约
+ *
+ */
+ @Required
+ @XStreamAlias("plan_id")
+ private String planId;
+
+ /**
+ *
+ * 签约协议号
+ * contract_code
+ * 是
+ * String(32)
+ * 100000
+ * 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成
+ *
+ */
+ @Required
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+ /**
+ *
+ * 请求序列号
+ * request_serial
+ * 是
+ * int(64)
+ * 1000
+ * 商户请求签约时的序列号,要求唯一性,禁止使用0开头的,用户排序,纯数字
+ *
+ */
+ @Required
+ @XStreamAlias("request_serial")
+ private Long requestSerial;
+
+ /**
+ *
+ * 用户账户展示名称
+ * contract_display_account
+ * 是
+ * string(32)
+ * 微信代扣
+ * 签约用户的名称,用户页面展示,不支持符号表情
+ *
+ */
+ @Required
+ @XStreamAlias("contract_display_account")
+ private String contractDisplayAccount;
+
+ /**
+ *
+ * 签约信息通知URL
+ * contract_notify_url
+ * 是
+ * string(32)
+ * https://yoursite.com
+ * 签约信息回调通知URL
+ *
+ */
+ @Required
+ @XStreamAlias("contract_notify_url")
+ private String contractNotifyUrl;
+
+ /**
+ *
+ * 商户测的用户标识
+ * contract_outerid
+ * 否
+ * string(32)
+ * 陈*(12000002)
+ * 用于多账户签约,值与contract_display_account相同即可,同一模板下唯一
+ *
+ */
+ @XStreamAlias("contract_outerid")
+ private String contractOuterId;
+
+ @Override
+ protected void checkConstraints() throws WxPayException {
+
+ }
+
+ @Override
+ protected void storeMap(Map map) {
+ map.put("contract_mchid", contractMchId);
+ map.put("contract_appid", contractAppId);
+ map.put("out_trade_no", outTradeNo);
+ map.put("device_info", deviceInfo);
+ map.put("body", body);
+ map.put("detail", detail);
+ map.put("attach", attach);
+ map.put("notify_url", notifyUrl);
+ map.put("total_fee", totalFee.toString());
+ map.put("spbill_create_ip", spbillCreateIp);
+ map.put("time_start", timeStart);
+ map.put("time_expire", timeExpire);
+ map.put("goods_tag", goodsTag);
+ map.put("trade_type", tradeType);
+ map.put("product_id", productId);
+ map.put("limit_pay", limitPay);
+ map.put("openid", openId);
+ map.put("plan_id", planId);
+ map.put("contract_code", contractCode);
+ map.put("request_serial", requestSerial.toString());
+ map.put("contract_display_account", contractDisplayAccount);
+ map.put("contract_notify_url", contractNotifyUrl);
+ map.put("contract_outerid", contractOuterId);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPreWithholdRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPreWithholdRequest.java
new file mode 100644
index 0000000000..ed806afecf
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPreWithholdRequest.java
@@ -0,0 +1,65 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:20 下午
+ *
+ *
+ * 微信预扣款请求参数
+ *
+ */
+@Data
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxPreWithholdRequest implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 委托代扣协议ID
+ */
+ @SerializedName(value = "contract_id")
+ private String contractId;
+
+ /**
+ * 直连商户号
+ */
+ @SerializedName(value = "mchid")
+ private String mchId;
+
+ /**
+ * 公众号ID
+ */
+ @SerializedName(value = "appid")
+ private String appId;
+
+ /**
+ * 预计扣款的金额信息
+ */
+ @SerializedName(value = "estimated_amount")
+ private EstimateAmount estimateAmount;
+
+
+ @Data
+ public static class EstimateAmount implements Serializable {
+ /**
+ * 预计扣费金额
+ */
+ private Integer amount;
+
+ /**
+ * 人民币:CNY
+ * 非必填
+ */
+ private String currency;
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxSignQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxSignQueryRequest.java
new file mode 100644
index 0000000000..3ecee3fe81
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxSignQueryRequest.java
@@ -0,0 +1,105 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.*;
+import me.chanjar.weixin.common.annotation.Required;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:23 下午
+ *
+ * 微信签约状态查询入参
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+@XStreamAlias("xml")
+public class WxSignQueryRequest extends BaseWxPayRequest {
+
+ //方式1. 使用contract_id查
+ /**
+ *
+ * 字段名:委托代扣协议ID.
+ * 变量名:contract_id
+ * 是否必填:二选一
+ * 类型:String(32)
+ * 示例值:1000005698
+ * 签约成功后由微信返回
+ *
+ */
+ @XStreamAlias("contract_id")
+ private String contractId;
+
+ /**
+ *
+ * 字段名:接口版本号.
+ * 变量名:version
+ * 是否必填:是
+ * 类型:String(8)
+ * 示例值:1.0
+ * 固定填写1.0,
+ *
+ */
+ @Required
+ @XStreamAlias("version")
+ private String version;
+
+ //方式2. 使用plan_id和contract_code查
+ /**
+ *
+ * 字段名:模板ID.
+ * 变量名:plan_id
+ * 是否必填:二选一
+ * 类型:int
+ * 示例值:123
+ * 代扣模板ID
+ *
+ */
+ @XStreamAlias("plan_id")
+ private Integer planId;
+
+ /**
+ *
+ * 字段名:签约协议号.
+ * 变量名:contract_code
+ * 是否必填:二选一
+ * 类型:String(32)
+ * 示例值:12332343
+ * 商户侧唯一
+ *
+ */
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+
+ @Override
+ protected boolean needNonceStr() {
+ return false;
+ }
+
+ @Override
+ protected void checkConstraints() throws WxPayException {
+ if (StringUtils.isNotBlank(contractId) &&
+ (Objects.nonNull(planId) || StringUtils.isNotBlank(contractCode))) {
+ throw new WxPayException("contractId 和 planId&contractCode 不能同时存在或同时为空,必须二选一");
+ }
+ }
+
+ @Override
+ protected void storeMap(Map map) {
+ map.put("contract_id", contractId);
+ map.put("version", version);
+ if (Objects.nonNull(planId)) {
+ map.put("plan_id", planId.toString());
+ }
+ map.put("contract_code", contractCode);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxTerminatedContractRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxTerminatedContractRequest.java
new file mode 100644
index 0000000000..2ebd96e780
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxTerminatedContractRequest.java
@@ -0,0 +1,122 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.*;
+import me.chanjar.weixin.common.annotation.Required;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:24 下午
+ *
+ *
+ * 微信api申请解约
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+@XStreamAlias("xml")
+public class WxTerminatedContractRequest extends BaseWxPayRequest {
+ //方式1. 使用contract_id查
+ /**
+ *
+ * 字段名:委托代扣协议ID.
+ * 变量名:contract_id
+ * 是否必填:二选一
+ * 类型:String(32)
+ * 示例值:1000005698
+ * 签约成功后由微信返回
+ *
+ */
+ @XStreamAlias("contract_id")
+ private String contractId;
+
+ /**
+ *
+ * 字段名:解约备注.
+ * 变量名:contract_termination_remark
+ * 是否必填:是
+ * 类型:String(256)
+ * 示例值:解约原因
+ * 例如:签约信息有误,须重新签约
+ *
+ */
+ @Required
+ @XStreamAlias("contract_termination_remark")
+ private String contractTerminationRemark;
+
+ /**
+ *
+ * 字段名:接口版本号.
+ * 变量名:version
+ * 是否必填:是
+ * 类型:String(8)
+ * 示例值:1.0
+ * 固定填写1.0,
+ *
+ */
+ @Required
+ @XStreamAlias("version")
+ private String version;
+
+ //方式2. 使用plan_id和contract_code查
+
+ /**
+ *
+ * 字段名:模板ID.
+ * 变量名:plan_id
+ * 是否必填:二选一
+ * 类型:int
+ * 示例值:123
+ * 代扣模板ID
+ *
+ */
+ @XStreamAlias("plan_id")
+ private Integer planId;
+
+ /**
+ *
+ * 字段名:签约协议号.
+ * 变量名:contract_code
+ * 是否必填:二选一
+ * 类型:String(32)
+ * 示例值:12332343
+ * 商户侧唯一
+ *
+ */
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+
+ @Override
+ protected void checkConstraints() throws WxPayException {
+ if (StringUtils.isNotBlank(contractId) &&
+ (Objects.nonNull(planId) || StringUtils.isNotBlank(contractCode))) {
+ throw new WxPayException("contractId 和 planId&contractCode 不能同时存在或同时为空,必须二选一");
+ }
+ }
+
+ @Override
+ protected boolean needNonceStr() {
+ return false;
+ }
+
+
+ @Override
+ protected void storeMap(Map map) {
+ map.put("contract_id", contractId);
+ map.put("contract_termination_remark", contractTerminationRemark);
+ map.put("version", version);
+ if (Objects.nonNull(planId)) {
+ map.put("plan_id", planId.toString());
+ }
+ map.put("contract_code", contractCode);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxWithholdOrderQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxWithholdOrderQueryRequest.java
new file mode 100644
index 0000000000..a94e0a4c16
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxWithholdOrderQueryRequest.java
@@ -0,0 +1,64 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.*;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:25 下午
+ *
+ * 代扣订单查询参数
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+@XStreamAlias("xml")
+public class WxWithholdOrderQueryRequest extends BaseWxPayRequest {
+ /**
+ *
+ * 字段名:微信订单号.
+ * 变量名:transaction_id
+ * 是否必填:二选一
+ * 类型:String(32)
+ * 示例值:1000005698
+ * 微信生成的单号,支付通知中返回
+ *
+ */
+ @XStreamAlias("transaction_id")
+ private String transactionId;
+
+ /**
+ *
+ * 字段名:商户订单号.
+ * 变量名:out_trade_no
+ * 是否必填:二选一
+ * 类型:String(32)
+ * 示例值:1000005698
+ * 商户系统内部订单号
+ *
+ */
+ @XStreamAlias("out_trade_no")
+ private String outTradeNo;
+
+
+ @Override
+ protected void checkConstraints() throws WxPayException {
+ if (StringUtils.isNotBlank(transactionId) && StringUtils.isNotBlank(outTradeNo)) {
+ throw new WxPayException("transactionId 和 outTradeNo 不能同时存在或同时为空,必须二选一");
+ }
+ }
+
+ @Override
+ protected void storeMap(Map map) {
+
+ map.put("transaction_id", transactionId);
+ map.put("out_trade_no", outTradeNo);
+
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxWithholdRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxWithholdRequest.java
new file mode 100644
index 0000000000..d31e3a36ed
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxWithholdRequest.java
@@ -0,0 +1,194 @@
+package com.github.binarywang.wxpay.bean.request;
+
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.*;
+import me.chanjar.weixin.common.annotation.Required;
+
+import java.util.Map;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:26 下午
+ *
+ *
+ * 发起微信委托代扣参数
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder(builderMethodName = "newBuilder")
+@NoArgsConstructor
+@AllArgsConstructor
+@XStreamAlias("xml")
+public class WxWithholdRequest extends BaseWxPayRequest {
+
+ /**
+ *
+ * 商品描述
+ * body
+ * 是
+ * String(128)
+ * ipad mini 16G 白色
+ * 商品支付单简要描述
+ *
+ */
+ @Required
+ @XStreamAlias("body")
+ private String body;
+
+ /**
+ *
+ * 商品详情
+ * detail
+ * 否
+ * String(8192)
+ * ipad mini 16G 白色
+ * 商品名称明细列表
+ *
+ */
+ @XStreamAlias("detail")
+ private String detail;
+
+ /**
+ *
+ * 附加数据
+ * attach
+ * 否
+ * String(127)
+ * online/dev/dev1
+ * 商家数据包
+ *
+ */
+ @XStreamAlias("attach")
+ private String attach;
+
+ /**
+ *
+ * 商户订单号
+ * out_trade_no
+ * 是
+ * String(32)
+ * 123456
+ * 商户系统内部的订单号,32字符内,可包含字母
+ *
+ */
+ @Required
+ @XStreamAlias("out_trade_no")
+ private String outTradeNo;
+
+ /**
+ *
+ * 总金额
+ * total_fee
+ * 是
+ * int
+ * 888
+ * 订单总金额,单位分
+ *
+ */
+ @Required
+ @XStreamAlias("total_fee")
+ private Integer totalFee;
+
+ /**
+ *
+ * 货币类型
+ * fee_type
+ * 否
+ * String(16)
+ * CNY
+ * 默认人民币:CNY
+ *
+ */
+ @XStreamAlias("fee_type")
+ private String feeType;
+
+ /**
+ *
+ * 终端ip
+ * spbill_create_ip
+ * 否
+ * String(16)
+ * 127.0.0.1
+ * 用户的客户端IP
+ *
+ */
+ @XStreamAlias("spbill_create_ip")
+ private String spbillCreateIp;
+
+ /**
+ *
+ * 商品标记
+ * goods_tag
+ * 否
+ * String(32)
+ * wxg
+ * 商品标记,代金券或立减优惠功能参数
+ *
+ */
+ @XStreamAlias("goods_tag")
+ private String goodsTag;
+
+ /**
+ *
+ * 回调通知url
+ * notify_url
+ * 是
+ * String(256)
+ * https://weixin.qq.com
+ * 回调通知地址
+ *
+ */
+ @Required
+ @XStreamAlias("notify_url")
+ private String notifyUrl;
+
+ /**
+ *
+ * 交易类型
+ * trade_type
+ * 是
+ * String(16)
+ * JSAPI
+ * JSAPI,MWEB
+ *
+ */
+ @Required
+ @XStreamAlias("trade_type")
+ private String tradeType;
+
+ /**
+ *
+ * 委托代扣协议ID
+ * contract_id
+ * 是
+ * String(32)
+ * Wx234324808503234483920
+ * 签约成功后微信返回的委托代扣协议ID
+ *
+ */
+ @Required
+ @XStreamAlias("contract_id")
+ private String contractId;
+
+ @Override
+ protected void checkConstraints() throws WxPayException {
+
+ }
+
+ @Override
+ protected void storeMap(Map map) {
+ map.put("body", body);
+ map.put("detail", detail);
+ map.put("attach", attach);
+ map.put("out_trade_no", outTradeNo);
+ map.put("total_fee", totalFee.toString());
+ map.put("fee_type", feeType);
+ map.put("spbill_create_ip", spbillCreateIp);
+ map.put("goods_tag", goodsTag);
+ map.put("notify_url", notifyUrl);
+ map.put("trade_type", tradeType);
+ map.put("contract_id", contractId);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxH5EntrustResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxH5EntrustResult.java
new file mode 100644
index 0000000000..3cd8daad71
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxH5EntrustResult.java
@@ -0,0 +1,43 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.w3c.dom.Document;
+
+import java.io.Serializable;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:37 下午
+ *
+ *
+ * h5纯签约后结果
+ *
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class WxH5EntrustResult extends BaseWxPayResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 业务结果描述
+ */
+ @XStreamAlias("result_msg")
+ private String resultMsg;
+
+ /**
+ * 跳转url
+ */
+ @XStreamAlias("redirect_url")
+ private String redirectUrl;
+
+ @Override
+ protected void loadXml(Document d) {
+ resultMsg = readXmlString(d, "result_msg");
+ redirectUrl = readXmlString(d, "redirect_url");
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayEntrustResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayEntrustResult.java
new file mode 100644
index 0000000000..4dc6f19ae4
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayEntrustResult.java
@@ -0,0 +1,190 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.util.SignUtils;
+import com.google.common.collect.Lists;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import org.apache.commons.lang3.StringUtils;
+import org.w3c.dom.Document;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:38 下午
+ *
+ *
+ * 支付中签约返回结果
+ *
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class WxPayEntrustResult extends BaseWxPayResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 预签约结果
+ */
+ @XStreamAlias("contract_result_code")
+ private String contractResultCode;
+
+ /**
+ * 预约签约错误码
+ */
+ @XStreamAlias("contract_err_code")
+ private String contractErrCode;
+
+ /**
+ * 预签约错误描述
+ */
+ @XStreamAlias("contract_err_code_des")
+ private String contractErrCodeDes;
+
+ /**
+ * 预支付ID
+ */
+ @XStreamAlias("prepay_id")
+ private String prepayId;
+
+ /**
+ * 交易类型
+ */
+ @XStreamAlias("trade_type")
+ private String tradeType;
+
+ /**
+ * 二维码链接
+ * 非必传
+ */
+ @XStreamAlias("code_url")
+ private String codeUrl;
+
+ /**
+ * 模板ID
+ * 非必传
+ */
+ @XStreamAlias("plan_id")
+ private Integer planId;
+
+ /**
+ * 请求序列号
+ * 非必传
+ */
+ @XStreamAlias("request_serial")
+ private Integer requestSerial;
+
+ /**
+ * 签约协议号
+ * 非必传
+ */
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+ /**
+ * 用户账户展示名称
+ * 非必传
+ */
+ @XStreamAlias("contract_display_account")
+ private String contractDisplayAccount;
+
+ /**
+ * 支付跳转链接
+ * 非必传
+ */
+ @XStreamAlias("mweb_url")
+ private String mwebUrl;
+
+ /**
+ * 商户订单号
+ */
+ @XStreamAlias("out_trade_no")
+ private String outTradeNo;
+
+
+ @Override
+ protected void loadXml(Document d) {
+ contractResultCode = readXmlString(d, "contract_result_code");
+ contractErrCode = readXmlString(d, "contract_err_code");
+ contractErrCodeDes = readXmlString(d, "contract_err_code_des");
+ prepayId = readXmlString(d, "prepay_id");
+ tradeType = readXmlString(d, "trade_type");
+ codeUrl = readXmlString(d, "code_url");
+ planId = readXmlInteger(d, "plan_id");
+ requestSerial = readXmlInteger(d, "request_serial");
+ contractCode = readXmlString(d, "contract_code");
+ contractDisplayAccount = readXmlString(d, "contract_display_account");
+ mwebUrl = readXmlString(d, "mweb_url");
+ outTradeNo = readXmlString(d, "out_trade_no");
+ }
+
+ /**
+ * 校验返回结果签名.
+ *
+ * @param wxPayService the wx pay service
+ * @param signType 签名类型
+ * @param checkSuccess 是否同时检查结果是否成功
+ * @throws WxPayException the wx pay exception
+ */
+
+ @Override
+ public void checkResult(WxPayService wxPayService, String signType, boolean checkSuccess) throws WxPayException {
+ //校验返回结果签名
+ Map map = toMap();
+ if (getSign() != null && !SignUtils.checkSign(map, signType, wxPayService.getConfig().getMchKey())) {
+ this.getLogger().debug("校验结果签名失败,参数:{}", map);
+ throw new WxPayException("参数格式校验错误!");
+ }
+
+ //校验结果是否成功
+ if (checkSuccess) {
+ List successStrings = Lists.newArrayList(WxPayConstants.ResultCode.SUCCESS, "");
+ if (!successStrings.contains(StringUtils.trimToEmpty(getReturnCode()).toUpperCase())
+ || !successStrings.contains(StringUtils.trimToEmpty(getResultCode()).toUpperCase())) {
+ StringBuilder errorMsg = new StringBuilder();
+ if (getReturnCode() != null) {
+ errorMsg.append("返回代码:").append(getReturnCode());
+ }
+ if (getReturnMsg() != null) {
+ errorMsg.append(",返回信息:").append(getReturnMsg());
+ }
+ if (getResultCode() != null) {
+ errorMsg.append(",结果代码:").append(getResultCode());
+ }
+ if (getErrCode() != null) {
+ errorMsg.append(",错误代码:").append(getErrCode());
+ }
+ if (getErrCodeDes() != null) {
+ errorMsg.append(",错误详情:").append(getErrCodeDes());
+ }
+ if (getContractErrCode() != null) {
+ errorMsg.append(",预签约错误代码:").append(getContractErrCode());
+ }
+ if (getContractErrCodeDes() != null) {
+ errorMsg.append(",预签约错误描述:").append(getContractErrCodeDes());
+ }
+ if (getContractResultCode() != null) {
+ errorMsg.append(",预签约结果:").append(getContractResultCode());
+ }
+
+
+ this.getLogger().warn("\n结果业务代码异常,返回结果:{},\n{}", map, errorMsg.toString());
+ throw WxPayException.from(this);
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResult.java
new file mode 100644
index 0000000000..492c6c9251
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResult.java
@@ -0,0 +1,123 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import org.w3c.dom.Document;
+
+import java.io.Serializable;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:40 下午
+ *
+ *
+ * 微信签约查询返回结果
+ *
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class WxSignQueryResult extends BaseWxPayResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 委托代扣协议ID
+ */
+ @XStreamAlias("contractId")
+ private String contractId;
+
+ /**
+ * 模板ID
+ */
+ @XStreamAlias("plan_id")
+ private String planId;
+
+ /**
+ * 请求序列号
+ */
+ @XStreamAlias("request_serial")
+ private Integer requestSerial;
+
+ /**
+ * 签约协议号
+ */
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+ /**
+ * 用户账户展示名称
+ */
+ @XStreamAlias("contract_display_account")
+ private String contractDisplayAccount;
+
+ /**
+ * 协议状态
+ */
+ @XStreamAlias("contract_state")
+ private Integer contractState;
+
+ /**
+ * 协议签署时间
+ */
+ @XStreamAlias("contract_signed_time")
+ private String contractSignedTime;
+
+ /**
+ * 协议到期时间
+ */
+ @XStreamAlias("contract_expired_time")
+ private String contractExpiredTime;
+
+ /**
+ * 协议解约时间
+ * 非必传
+ */
+ @XStreamAlias("contract_terminated_time")
+ private String contractTerminatedTime;
+
+ /**
+ * 协议解约方式
+ * 非必传
+ */
+ @XStreamAlias("contract_terminated_mode")
+ private Integer contractTerminatedMode;
+
+ /**
+ * 解约备注
+ * 非必传
+ */
+ @XStreamAlias("contract_termination_remark")
+ private String contractTerminationRemark;
+
+ /**
+ * 用户表示
+ */
+ @XStreamAlias("openid")
+ private String openId;
+
+
+ @Override
+ protected void loadXml(Document d) {
+ contractId = readXmlString(d, "contract_id");
+ planId = readXmlString(d, "plan_id");
+ requestSerial = readXmlInteger(d, "request_serial");
+ contractCode = readXmlString(d, "contract_code");
+ contractDisplayAccount = readXmlString(d, "contract_display_account");
+ contractState = readXmlInteger(d, "contract_state");
+ contractSignedTime = readXmlString(d, "contract_signed_time");
+ contractExpiredTime = readXmlString(d, "contrace_Expired_time");
+ contractTerminatedTime = readXmlString(d, "contract_terminated_time");
+ contractTerminatedMode = readXmlInteger(d, "contract_terminate_mode");
+ contractTerminationRemark = readXmlString(d, "contract_termination_remark");
+ openId = readXmlString(d, "openid");
+ }
+
+ @Override
+ public String toString() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignStatusNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignStatusNotifyResult.java
new file mode 100644
index 0000000000..f55b576e36
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignStatusNotifyResult.java
@@ -0,0 +1,127 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import me.chanjar.weixin.common.util.xml.XStreamInitializer;
+import org.w3c.dom.Document;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 4:59 下午
+ *
+ * 微信签约/解约 回调结果
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@XStreamAlias("xml")
+public class WxSignStatusNotifyResult extends BaseWxPayResult {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 签约协议号
+ */
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+ /**
+ * 模板ID
+ */
+ @XStreamAlias("plan_id")
+ private String planId;
+
+ /**
+ * 用户表示
+ */
+ @XStreamAlias("openid")
+ private String openId;
+
+ /**
+ * 变更类型, ADD:签约,DELETE:解约
+ */
+ @XStreamAlias("change_type")
+ private String changeType;
+
+ /**
+ * 操作时间
+ */
+ @XStreamAlias("operate_time")
+ private String operateTime;
+
+ /**
+ * 委托代扣协议ID
+ */
+ @XStreamAlias("contract_id")
+ private String contractId;
+
+ /**
+ * 协议到期时间,ADD会有,长期有效,忽略
+ * 非必传
+ */
+ @XStreamAlias("contract_expired_time")
+ private String contractExpiredTime;
+
+ /**
+ * DELETE时返回,0: 未解约,1:有效期过期自动解约,2:用户主动解约,3:商户api解约,4:商户平台解约,5:用户账号注销
+ * 非必传
+ */
+ @XStreamAlias("contract_termination_mode")
+ private Integer contractTerminationMode;
+
+ /**
+ * 请求序列号
+ */
+ @XStreamAlias("request_serial")
+ private Integer requestSerial;
+
+ @Override
+ public void checkResult(WxPayService wxPayService, String signType, boolean checkSuccess) throws WxPayException {
+ //防止伪造成功通知
+ if (WxPayConstants.ResultCode.SUCCESS.equals(getReturnCode()) && getSign() == null) {
+ throw new WxPayException("伪造的通知!");
+ }
+
+ super.checkResult(wxPayService, signType, checkSuccess);
+ }
+
+ /**
+ * From xml wx sign notify result.
+ *
+ * @param xmlString the xml string
+ * @return the wx sign result
+ */
+ public static WxSignStatusNotifyResult fromXML(String xmlString) {
+ XStream xstream = XStreamInitializer.getInstance();
+ xstream.processAnnotations(WxSignStatusNotifyResult.class);
+ WxSignStatusNotifyResult result = (WxSignStatusNotifyResult) xstream.fromXML(xmlString);
+ result.setXmlString(xmlString);
+ return result;
+ }
+
+ @Override
+ protected void loadXml(Document d) {
+ contractCode = readXmlString(d, "contract_code");
+ planId = readXmlString(d, "plan_id");
+ openId = readXmlString(d, "openid");
+ changeType = readXmlString(d, "change_type");
+ operateTime = readXmlString(d, "operate_time");
+ contractId = readXmlString(d, "contract_id");
+ contractExpiredTime = readXmlString(d, "contract_expired_time");
+ contractTerminationMode = readXmlInteger(d, "contract_termination_mode");
+ requestSerial = readXmlInteger(d, "request_serial");
+ }
+
+ @Override
+ public String toString() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxTerminationContractResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxTerminationContractResult.java
new file mode 100644
index 0000000000..77067d0213
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxTerminationContractResult.java
@@ -0,0 +1,57 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import org.w3c.dom.Document;
+
+import java.io.Serializable;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:41 下午
+ *
+ *
+ * 主动解约返回值
+ *
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class WxTerminationContractResult extends BaseWxPayResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 委托代扣协议ID
+ */
+ @XStreamAlias("contractId")
+ private String contractId;
+
+ /**
+ * 模板ID
+ */
+ @XStreamAlias("plan_id")
+ private String planId;
+
+ /**
+ * 签约协议号
+ */
+ @XStreamAlias("contract_code")
+ private String contractCode;
+
+
+ @Override
+ protected void loadXml(Document d) {
+ contractId = readXmlString(d, "contract_id");
+ planId = readXmlString(d, "plan_id");
+ contractCode = readXmlString(d, "contract_code");
+ }
+
+ @Override
+ public String toString() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java
new file mode 100644
index 0000000000..87cbfd1b71
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java
@@ -0,0 +1,234 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyCoupon;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.converter.WxPayOrderNotifyResultConverter;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.util.SignUtils;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import me.chanjar.weixin.common.util.xml.XStreamInitializer;
+import org.w3c.dom.Document;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:09 下午
+ *
+ *
+ * 微信代扣扣款回调结果
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@XStreamAlias("xml")
+public class WxWithholdNotifyResult extends BaseWxPayResult {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备号
+ * 非必传
+ */
+ @XStreamAlias("device_info")
+ private String deviceInfo;
+
+ /**
+ * 用户标识
+ */
+ @XStreamAlias("openid")
+ private String openId;
+
+ /**
+ * 用户子标识
+ * 非必传
+ */
+ @XStreamAlias("sub_openid")
+ private String subOpenId;
+
+ /**
+ * 是否关注公众号
+ * 非必传
+ */
+ @XStreamAlias("is_subscribe")
+ private String isSubscribe;
+
+ /**
+ * 付款银行
+ */
+ @XStreamAlias("bank_type")
+ private String bankType;
+
+ /**
+ * 总金额
+ */
+ @XStreamAlias("total_fee")
+ private Integer totalFee;
+
+ /**
+ * 货币类型
+ * 非必传
+ */
+ @XStreamAlias("fee_type")
+ private String feeType;
+
+ /**
+ * 现金支付金额
+ */
+ @XStreamAlias("cash_fee")
+ private Integer cashFee;
+
+ /**
+ * 现金支付货币类型
+ * 非必传
+ */
+ @XStreamAlias("cash_fee_type")
+ private String cashFeeType;
+
+ /**
+ * 交易状态
+ * SUCCESS : 支付成功,REFUND:转入退款,NOTPAY:未支付,CLOSED:已关闭,ACCEPT:已接收,PAY_FAIL:支付失败
+ */
+ @XStreamAlias("trade_state")
+ private String tradeState;
+
+ /**
+ * 代金券或立减优惠金额
+ * 非必传
+ */
+ @XStreamAlias("coupon_fee")
+ private Integer couponFee;
+
+ /**
+ * 代金券或立减优惠使用数量
+ */
+ @XStreamAlias("coupon_count")
+ private Integer couponCount;
+
+ private List couponList;
+
+
+ /**
+ * 微信支付单号
+ */
+ @XStreamAlias("transaction_id")
+ private String transactionId;
+
+ /**
+ * 商户订单号
+ */
+ @XStreamAlias("out_trade_no")
+ private String outTradeNo;
+
+ /**
+ * 商家数据包
+ */
+ @XStreamAlias("attach")
+ private String attach;
+
+ /**
+ * 支付完成时间
+ */
+ @XStreamAlias("time_end")
+ private String timeEnd;
+
+ /**
+ * 委托代扣协议ID
+ */
+ @XStreamAlias("contract_id")
+ private String contractId;
+
+
+
+ @Override
+ public void checkResult(WxPayService wxPayService, String signType, boolean checkSuccess) throws WxPayException {
+ //防止伪造成功通知
+ if (WxPayConstants.ResultCode.SUCCESS.equals(getReturnCode()) && getSign() == null) {
+ throw new WxPayException("伪造的通知!");
+ }
+
+ super.checkResult(wxPayService, signType, checkSuccess);
+ }
+
+ /**
+ * From xml wx withhold notify result.
+ *
+ * @param xmlString the xml string
+ * @return the wx withhold result
+ */
+ public static WxWithholdNotifyResult fromXML(String xmlString) {
+ XStream xstream = XStreamInitializer.getInstance();
+ xstream.processAnnotations(WxWithholdNotifyResult.class);
+ xstream.registerConverter(new WxPayOrderNotifyResultConverter(xstream.getMapper(), xstream.getReflectionProvider()));
+ WxWithholdNotifyResult result = (WxWithholdNotifyResult) xstream.fromXML(xmlString);
+ result.setXmlString(xmlString);
+ return result;
+ }
+
+ @Override
+ public Map toMap() {
+ Map resultMap = SignUtils.xmlBean2Map(this);
+ if (this.getCouponCount() != null && this.getCouponCount() > 0) {
+ for (int i = 0; i < this.getCouponCount(); i++) {
+ WxPayOrderNotifyCoupon coupon = couponList.get(i);
+ resultMap.putAll(coupon.toMap(i));
+ }
+ }
+ return resultMap;
+ }
+
+ @Override
+ protected void loadXml(Document d) {
+ deviceInfo = readXmlString(d, "device_info");
+ openId = readXmlString(d, "openid");
+ isSubscribe = readXmlString(d, "is_subscribe");
+ subOpenId = readXmlString(d, "sub_openid");
+ bankType = readXmlString(d, "bank_type");
+ totalFee = readXmlInteger(d, "total_fee");
+ feeType = readXmlString(d, "fee_type");
+ cashFee = readXmlInteger(d, "cash_fee");
+ cashFeeType = readXmlString(d, "cash_fee_type");
+ couponFee = readXmlInteger(d, "coupon_fee");
+ couponCount = readXmlInteger(d, "coupon_count");
+ transactionId = readXmlString(d, "transaction_id");
+ outTradeNo = readXmlString(d, "out_trade_no");
+ attach = readXmlString(d, "attach");
+ timeEnd = readXmlString(d, "time_end");
+ tradeState = readXmlString(d, "trade_state");
+ contractId = readXmlString(d, "contract_id");
+
+ composeCoupons();
+ }
+
+ /**
+ * 通过xml组装couponList属性内容.
+ */
+ protected void composeCoupons() {
+ if (this.couponCount == null || this.couponCount == 0) {
+ return;
+ }
+ this.couponList = new ArrayList(couponCount);
+ for (int i = 0; i < this.couponCount; i++) {
+ WxPayOrderNotifyCoupon coupon = new WxPayOrderNotifyCoupon();
+ coupon.setCouponId(this.getXmlValue("xml/coupon_id_" + i));
+ coupon.setCouponType(this.getXmlValue("xml/coupon_type_" + i));
+ coupon.setCouponFee(this.getXmlValueAsInt("xml/coupon_fee_" + i));
+ couponList.add(coupon);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdOrderQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdOrderQueryResult.java
new file mode 100644
index 0000000000..752bf7e64a
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdOrderQueryResult.java
@@ -0,0 +1,182 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyCoupon;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.w3c.dom.Document;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:42 下午
+ *
+ *
+ * 代扣订单查询结果
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@XStreamAlias("xml")
+public class WxWithholdOrderQueryResult extends BaseWxPayResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备号
+ * 非必传
+ */
+ @XStreamAlias("device_info")
+ private String deviceInfo;
+
+ /**
+ * 用户标识
+ */
+ @XStreamAlias("openid")
+ private String openId;
+
+ /**
+ * 是否关注公众号
+ * 非必传
+ */
+ @XStreamAlias("is_subscribe")
+ private String isSubscribe;
+
+ /**
+ * 交易类型
+ */
+ @XStreamAlias("trade_type")
+ private String tradeType;
+
+ /**
+ * 交易状态
+ * SUCCESS : 支付成功,REFUND:转入退款,NOTPAY:未支付,CLOSED:已关闭,ACCEPT:已接收,PAY_FAIL:支付失败
+ */
+ @XStreamAlias("trade_state")
+ private String tradeState;
+
+ /**
+ * 付款银行
+ */
+ @XStreamAlias("bank_type")
+ private String bankType;
+
+ /**
+ * 总金额
+ */
+ @XStreamAlias("total_fee")
+ private Integer totalFee;
+
+ /**
+ * 货币类型
+ * 非必传
+ */
+ @XStreamAlias("fee_type")
+ private String feeType;
+
+ /**
+ * 现金支付金额
+ */
+ @XStreamAlias("cash_fee")
+ private Integer cashFee;
+
+ /**
+ * 现金支付货币类型
+ * 非必传
+ */
+ @XStreamAlias("cash_fee_type")
+ private String cashFeeType;
+
+ /**
+ * 代金券或立减优惠金额
+ * 非必传
+ */
+ @XStreamAlias("coupon_fee")
+ private Integer couponFee;
+
+ /**
+ * 代金券或立减优惠使用数量
+ */
+ @XStreamAlias("coupon_count")
+ private Integer couponCount;
+
+ private List couponList;
+
+
+ /**
+ * 微信支付单号
+ */
+ @XStreamAlias("transaction_id")
+ private String transactionId;
+
+ /**
+ * 商户订单号
+ */
+ @XStreamAlias("out_trade_no")
+ private String outTradeNo;
+
+ /**
+ * 商家数据包
+ */
+ @XStreamAlias("attach")
+ private String attach;
+
+ /**
+ * 支付完成时间
+ */
+ @XStreamAlias("time_end")
+ private String timeEnd;
+
+ /**
+ * 交易状态描述
+ * 例如:支付失败,请重新下单
+ */
+ @XStreamAlias("trade_state_desc")
+ private String tradeStateDesc;
+
+
+ /**
+ * 通过xml组装couponList属性内容.
+ */
+ protected void composeCoupons() {
+ if (this.couponCount == null || this.couponCount == 0) {
+ return;
+ }
+ this.couponList = new ArrayList(couponCount);
+ for (int i = 0; i < this.couponCount; i++) {
+ WxPayOrderNotifyCoupon coupon = new WxPayOrderNotifyCoupon();
+ coupon.setCouponId(this.getXmlValue("xml/coupon_id_" + i));
+ coupon.setCouponType(this.getXmlValue("xml/coupon_type_" + i));
+ coupon.setCouponFee(this.getXmlValueAsInt("xml/coupon_fee_" + i));
+ couponList.add(coupon);
+ }
+ }
+
+ @Override
+ protected void loadXml(Document d) {
+ deviceInfo = readXmlString(d, "device_info");
+ openId = readXmlString(d, "openid");
+ isSubscribe = readXmlString(d, "is_subscribe");
+ bankType = readXmlString(d, "bank_type");
+ totalFee = readXmlInteger(d, "total_fee");
+ feeType = readXmlString(d, "fee_type");
+ cashFee = readXmlInteger(d, "cash_fee");
+ tradeType = readXmlString(d, "trade_type");
+ cashFeeType = readXmlString(d, "cash_fee_type");
+ couponFee = readXmlInteger(d, "coupon_fee");
+ couponCount = readXmlInteger(d, "coupon_count");
+ transactionId = readXmlString(d, "transaction_id");
+ outTradeNo = readXmlString(d, "out_trade_no");
+ attach = readXmlString(d, "attach");
+ timeEnd = readXmlString(d, "time_end");
+ tradeState = readXmlString(d, "trade_state");
+ tradeStateDesc = readXmlString(d, "trade_state_desc");
+
+ composeCoupons();
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdResult.java
new file mode 100644
index 0000000000..a2c4dcf055
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdResult.java
@@ -0,0 +1,44 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import org.w3c.dom.Document;
+
+import java.io.Serializable;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 5:39 下午
+ *
+ *
+ * 委托扣款返回值
+ *
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class WxWithholdResult extends BaseWxPayResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+
+ /**
+ * 临时字段
+ */
+ @XStreamAlias("temp")
+ private String temp;
+
+
+ @Override
+ protected void loadXml(Document d) {
+ temp = readXmlString(d, "temp");
+ }
+
+ @Override
+ public String toString() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java
new file mode 100644
index 0000000000..be76b34c47
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java
@@ -0,0 +1,157 @@
+package com.github.binarywang.wxpay.service;
+
+import com.github.binarywang.wxpay.bean.request.*;
+import com.github.binarywang.wxpay.bean.result.*;
+import com.github.binarywang.wxpay.exception.WxPayException;
+
+/**
+ *
+ * 微信签约代扣相关接口.
+ * https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter2_8.shtml
+ *
+ *
+ * @author chenliang
+ * @date 2021-08-02 4:50 下午
+ */
+public interface WxEntrustPapService {
+
+ /**
+ *
+ *
+ * 获取公众号纯签约链接,
+ * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_1.shtml
+ * 该接口返回一个签约链接,该链接只能在微信内打开
+ *
+ *
+ * @param wxMpEntrustRequest
+ * @return
+ * @throws WxPayException
+ */
+ String mpSign(WxMpEntrustRequest wxMpEntrustRequest) throws WxPayException;
+
+ /**
+ *
+ *
+ * 获取小程序纯签约参数json
+ * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_3.shtml
+ * 返回一个json 前端用来拉起一个新的签约小程序进行签约
+ *
+ *
+ *
+ * @param wxMaEntrustRequest
+ * @return
+ * @throws WxPayException
+ */
+ String maSign(WxMaEntrustRequest wxMaEntrustRequest) throws WxPayException;
+
+ /**
+ *
+ *
+ * 获取h5纯签约支付跳转链接
+ * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_4.shtml
+ * 返回一个签约链接 在浏览器请求链接拉起微信
+ *
+ *
+ * @param wxH5EntrustRequest
+ * @return
+ * @throws WxPayException
+ */
+ WxH5EntrustResult h5Sign(WxH5EntrustRequest wxH5EntrustRequest) throws WxPayException;
+
+ /**
+ *
+ *
+ * 支付中签约
+ * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_5.shtml
+ * 请求微信 若微信内请求 需要构造json返回,
+ * 若h5请求 直接使用mweb_url 链接即可拉起微信
+ *
+ *
+ * @param wxPayEntrustRequest
+ * @return
+ * @throws WxPayException
+ */
+ WxPayEntrustResult paySign(WxPayEntrustRequest wxPayEntrustRequest) throws WxPayException;
+
+ /**
+ * 申请扣款
+ *
+ * 申请扣款
+ * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_8.shtml
+ * 请求微信发起委托扣款,扣款额度和次数由使用的签约模板限制,
+ * 该扣款接口是立即扣款 无延时 扣款前无消息通知。
+ *
+ * • 特殊情况:周期扣费为通知后24小时扣费方式情况下,如果用户为首次签约(包含解约后重新签约),
+ * 从用户签约成功时间开始算,商户在12小时内发起的扣款,会被立即执行,无延迟。商户超过12小时以后发起的扣款,都按24小时扣费规则执行
+ *
+ *
+ * @param wxWithholdRequest
+ * @return
+ * @throws WxPayException
+ */
+ WxWithholdResult withhold(WxWithholdRequest wxWithholdRequest) throws WxPayException;
+
+ /**
+ * 预扣费通知
+ *
+ * 预扣费接口
+ * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_10.shtml
+ * 商户进行委托代扣扣费前需要在可通知时间段内调用「预扣费通知」的接口为用户发送扣费提醒,
+ * 并设定扣费持续天数和预计扣费金额,经过扣费等待期后,在可扣费期内可发起扣费,扣款金额不能高于预计扣费金额,
+ * 扣费失败可主动发起重试扣费(重试次数由其他规则限制),直到扣费成功,或者可扣费期结束。
+ * 商户只能在北京时间每天 6:00~22:00调用「预扣费通知」
+ *
+ *
+ * @param wxPreWithholdRequest
+ * @return
+ * @throws WxPayException
+ */
+ String preWithhold(WxPreWithholdRequest wxPreWithholdRequest) throws WxPayException;
+
+ /**
+ * 签约状态查询
+ *
+ * 签约状态查询
+ * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_7.shtml
+ * 查询签约关系接口提供单笔签约关系查询。
+ *
+ *
+ * @param wxSignQueryRequest
+ * @return
+ * @throws WxPayException
+ */
+ WxSignQueryResult querySign(WxSignQueryRequest wxSignQueryRequest) throws WxPayException;
+
+
+ /**
+ * 申请解约
+ *
+ * 申请解约
+ * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_9.shtml
+ * 商户与用户的签约关系有误或者商户主动要求与用户解除之前的签约协议时可调用此接口完成解约。
+ * 商户可以在商户后台(pay.weixin.qq.com)设置解约回调地址,当发生解约关系的时候,微信服务器会向此地址通知解约信息,内容与签约返回一致
+ *
+ *
+ * @param wxTerminatedContractRequest
+ * @return
+ * @throws WxPayException
+ */
+ WxTerminationContractResult terminationContract(WxTerminatedContractRequest wxTerminatedContractRequest) throws WxPayException;
+
+ /**
+ *
+ *
+ * 查询代扣订单
+ * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter4_5.shtml
+ * 该接口仅提供微信扣款服务申请扣款接口创建的订单进行查询,商户可以通过该接口主动查询微信代扣订单状态,完成下一步的业务逻辑。
+ * ACCEPT等待扣款:为24小时延时扣费场景下独有的,当没有达到24小时前一直是这种状态;
+ * NOTPAY未支付:系统已经启动扣款流程,这个状态只是瞬间状态,很快会进入终态(SUCCESS、PAY_FAIL)
+ *
+ *
+ *
+ * @param wxWithholdOrderQueryRequest
+ * @return
+ * @throws WxPayException
+ */
+ WxWithholdOrderQueryResult papOrderQuery(WxWithholdOrderQueryRequest wxWithholdOrderQueryRequest) 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 e11f65c139..9b42bd75be 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
@@ -173,6 +173,12 @@ public interface WxPayService {
*/
InputStream downloadV3(String url) throws WxPayException;
+ /**
+ * 获取微信签约代扣服务类
+ * @return entrust service
+ */
+ WxEntrustPapService getWxEntrustPapService();
+
/**
* 获取企业付款服务类.
*
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 95919ed254..a80a7f4527 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
@@ -74,6 +74,8 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
private final MarketingMediaService marketingMediaService = new MarketingMediaServiceImpl(this);
private final MarketingFavorService marketingFavorService = new MarketingFavorServiceImpl(this);
private final MarketingBusiFavorService marketingBusiFavorService = new MarketingBusiFavorServiceImpl(this);
+ private final WxEntrustPapService wxEntrustPapService = new WxEntrustPapServiceImpl(this);
+
protected Map configMap;
@@ -137,6 +139,11 @@ public void setEntPayService(EntPayService entPayService) {
this.entPayService = entPayService;
}
+ @Override
+ public WxEntrustPapService getWxEntrustPapService() {
+ return wxEntrustPapService;
+ }
+
@Override
public WxPayConfig getConfig() {
if (this.configMap.size() == 1) {
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceImpl.java
new file mode 100644
index 0000000000..7555425a81
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceImpl.java
@@ -0,0 +1,139 @@
+package com.github.binarywang.wxpay.service.impl;
+
+import com.github.binarywang.wxpay.bean.request.*;
+import com.github.binarywang.wxpay.bean.result.*;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxEntrustPapService;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.util.SignUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.net.URLEncoder;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 4:53 下午
+ */
+@Slf4j
+@RequiredArgsConstructor
+public class WxEntrustPapServiceImpl implements WxEntrustPapService {
+
+ private final WxPayService payService;
+
+
+ @Override
+ public String mpSign(WxMpEntrustRequest wxMpEntrustRequest) throws WxPayException {
+ StringBuilder signStrTemp = new StringBuilder(payService.getPayBaseUrl() + "/papay/entrustweb");
+ signStrTemp.append("?appid=").append(wxMpEntrustRequest.getAppid());
+ signStrTemp.append("&contract_code=").append(wxMpEntrustRequest.getContractCode());
+ signStrTemp.append("&contract_display_account=").append(URLEncoder.encode(wxMpEntrustRequest.getContractDisplayAccount()));
+ signStrTemp.append("&mch_id=").append(wxMpEntrustRequest.getMchId()).append("¬ify_url=").append(URLEncoder.encode(wxMpEntrustRequest.getNotifyUrl()));
+ signStrTemp.append("&plan_id=").append(wxMpEntrustRequest.getPlanId()).append("&outerid=").append(URLEncoder.encode(wxMpEntrustRequest.getOuterId()));
+ signStrTemp.append("&request_serial=").append(wxMpEntrustRequest.getRequestSerial()).append("×tamp=").append(wxMpEntrustRequest.getTimestamp());
+ signStrTemp.append("&version=").append(wxMpEntrustRequest.getVersion()).append("&return_web=").append(wxMpEntrustRequest.getReturnWeb()).append("&sign=").append(wxMpEntrustRequest.getSign());
+
+ return signStrTemp.toString();
+ }
+
+ @Override
+ public String maSign(WxMaEntrustRequest wxMaEntrustRequest) throws WxPayException {
+ wxMaEntrustRequest.checkAndSign(payService.getConfig());
+ wxMaEntrustRequest.setNotifyUrl(URLEncoder.encode(wxMaEntrustRequest.getNotifyUrl()));
+ return wxMaEntrustRequest.toString();
+ }
+
+ @Override
+ public WxH5EntrustResult h5Sign(WxH5EntrustRequest wxH5EntrustRequest) throws WxPayException {
+ wxH5EntrustRequest.checkAndSign(payService.getConfig());
+
+ String sign = SignUtils.createSign(wxH5EntrustRequest, WxPayConstants.SignType.HMAC_SHA256, payService.getConfig().getMchKey(), null);
+ /**
+ * https://api.mch.weixin.qq.com/papay/h5entrustweb?appid=wxxxxx&contract_code=001
+ * &contract_display_account=name1&mch_id=1223816102¬ify_url=www.qq.com%2Ftest%2Fpapay&plan_id=106
+ * &request_serial=123&return_appid= wxcbda96de0b165542&clientip=12.1.1.12×tamp=1414488825
+ * &version=1.0&sign= 130C7B07DD3B8074F7BF8BEF5C9A86487A1C57478F8C55587876B9C782F72036
+ */
+ String url = payService.getPayBaseUrl() + "/papay/h5entrustweb";
+
+ StringBuilder strBuilder = new StringBuilder(url);
+ strBuilder.append("?appid=").append(wxH5EntrustRequest.getAppid());
+ strBuilder.append("&contract_code=").append(wxH5EntrustRequest.getContractCode());
+ strBuilder.append("&contract_display_account=").append(URLEncoder.encode(wxH5EntrustRequest.getContractDisplayAccount()));
+ strBuilder.append("&mch_id=").append(wxH5EntrustRequest.getMchId()).append("¬ify_url=").append(URLEncoder.encode(wxH5EntrustRequest.getNotifyUrl()));
+ strBuilder.append("&plan_id=").append(wxH5EntrustRequest.getPlanId()).append("&outerid=").append(URLEncoder.encode(wxH5EntrustRequest.getOuterId()));
+ strBuilder.append("&return_appid=").append(wxH5EntrustRequest.getReturnAppid());
+ strBuilder.append("&clientip=").append(wxH5EntrustRequest.getClientIp());
+ strBuilder.append("&request_serial=").append(wxH5EntrustRequest.getRequestSerial()).append("×tamp=").append(wxH5EntrustRequest.getTimestamp());
+ strBuilder.append("&version=").append(wxH5EntrustRequest.getVersion()).append("&sign=").append(sign);
+
+ log.debug("h5纯签约请求URL:{}", strBuilder.toString());
+
+ String responseContent = payService.getV3(strBuilder.toString());
+ WxH5EntrustResult result = BaseWxPayResult.fromXML(responseContent, WxH5EntrustResult.class);
+ result.checkResult(payService, wxH5EntrustRequest.getSignType(), true);
+ return result;
+ }
+
+ @Override
+ public WxPayEntrustResult paySign(WxPayEntrustRequest wxPayEntrustRequest) throws WxPayException {
+ wxPayEntrustRequest.checkAndSign(payService.getConfig());
+
+ String url = payService.getPayBaseUrl() + "/pay/contractorder";
+ String responseContent = payService.post(url, wxPayEntrustRequest.toXML(), false);
+ WxPayEntrustResult result = BaseWxPayResult.fromXML(responseContent, WxPayEntrustResult.class);
+ result.checkResult(payService, wxPayEntrustRequest.getSignType(), true);
+
+ return result;
+ }
+
+ @Override
+ public WxWithholdResult withhold(WxWithholdRequest wxWithholdRequest) throws WxPayException {
+ wxWithholdRequest.checkAndSign(payService.getConfig());
+ String url = payService.getPayBaseUrl() + "/pay/pappayapply";
+ String responseContent = payService.post(url, wxWithholdRequest.toXML(), false);
+ WxWithholdResult result = BaseWxPayResult.fromXML(responseContent, WxWithholdResult.class);
+ result.checkResult(payService, wxWithholdRequest.getSignType(), true);
+ return result;
+ }
+
+ @Override
+ public String preWithhold(WxPreWithholdRequest wxPreWithholdRequest) throws WxPayException {
+ String requestParam = WxGsonBuilder.create().toJson(wxPreWithholdRequest);
+ String url = payService.getPayBaseUrl() + "/v3/papay/contracts/%s/notify"; // %s为{contract_id}
+ String httpResponse = payService.postV3(String.format(url, wxPreWithholdRequest.getContractId()), requestParam);
+ return httpResponse;
+ }
+
+ @Override
+ public WxSignQueryResult querySign(WxSignQueryRequest wxSignQueryRequest) throws WxPayException {
+ wxSignQueryRequest.checkAndSign(payService.getConfig());
+ String url = payService.getPayBaseUrl() + "/papay/querycontract";
+ String responseContent = payService.post(url, wxSignQueryRequest.toXML(), false);
+ WxSignQueryResult result = BaseWxPayResult.fromXML(responseContent, WxSignQueryResult.class);
+ result.checkResult(payService, wxSignQueryRequest.getSignType(), true);
+ return result;
+ }
+
+ @Override
+ public WxTerminationContractResult terminationContract(WxTerminatedContractRequest wxTerminatedContractRequest) throws WxPayException {
+ wxTerminatedContractRequest.checkAndSign(payService.getConfig());
+ String url = payService.getPayBaseUrl() + "/papay/deletecontract";
+ String responseContent = payService.post(url, wxTerminatedContractRequest.toXML(), false);
+ WxTerminationContractResult terminationContractResult = BaseWxPayResult.fromXML(responseContent, WxTerminationContractResult.class);
+ terminationContractResult.checkResult(payService, wxTerminatedContractRequest.getSignType(), true);
+ return terminationContractResult;
+ }
+
+ @Override
+ public WxWithholdOrderQueryResult papOrderQuery(WxWithholdOrderQueryRequest wxWithholdOrderQueryRequest) throws WxPayException {
+ wxWithholdOrderQueryRequest.checkAndSign(payService.getConfig());
+ String url = payService.getPayBaseUrl() + "/pay/paporderquery";
+ String responseContent = payService.post(url, wxWithholdOrderQueryRequest.toXML(), false);
+ WxWithholdOrderQueryResult wxWithholdOrderQueryResult = BaseWxPayResult.fromXML(responseContent, WxWithholdOrderQueryResult.class);
+ wxWithholdOrderQueryResult.checkResult(payService, wxWithholdOrderQueryRequest.getSignType(), true);
+ return wxWithholdOrderQueryResult;
+ }
+}
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceTest.java
new file mode 100644
index 0000000000..9323108963
--- /dev/null
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxEntrustPapServiceTest.java
@@ -0,0 +1,236 @@
+package com.github.binarywang.wxpay.service.impl;
+
+import com.github.binarywang.wxpay.bean.request.*;
+import com.github.binarywang.wxpay.bean.result.*;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.testbase.ApiTestModule;
+import com.google.common.base.Joiner;
+import com.google.inject.Inject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+/**
+ * @author chenliang
+ * @date 2021-08-02 6:45 下午
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxEntrustPapServiceTest {
+
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+ @Inject
+ private WxPayService payService;
+
+ /**
+ * 公众号纯签约
+ */
+ @Test
+ public void testMpSign() {
+
+ String contractCode = "222200002222";
+ String displayAccount = Joiner.on("").join("陈*", "(", "10000014", ")");
+ WxMpEntrustRequest wxMpEntrust = WxMpEntrustRequest.newBuilder()
+ .planId("142323") //模板ID:跟微信申请
+ .contractCode(contractCode)
+ .contractDisplayAccount(displayAccount)
+ .notifyUrl("http://domain.com/api/wxpay/sign/callback.do")
+ .requestSerial(6L)
+ //.returnWeb(1)
+ .version("1.0")
+ .timestamp(String.valueOf(System.currentTimeMillis() / 1000))
+ .outerId(displayAccount)
+ .build();
+
+ String url = null;
+ try {
+ url = this.payService.getWxEntrustPapService().mpSign(wxMpEntrust);
+ } catch (WxPayException e) {
+ e.printStackTrace();
+ }
+ logger.info(url);
+ }
+
+ /**
+ * 小程序纯签约
+ */
+ @Test
+ public void testMaSign() {
+ String contractCode = "222220000022222";
+ String displayAccount = Joiner.on("").join("陈*", "(", "10000001", ")");
+
+ WxMaEntrustRequest wxMaEntrustRequest = WxMaEntrustRequest.newBuilder()
+ .contractCode(contractCode)
+ .contractDisplayAccount(contractCode)
+ .notifyUrl("http://domain.com/api/wxpay/sign/callback.do")
+ .outerId(displayAccount)
+ .planId("141535")
+ .requestSerial(2L)
+ .timestamp(String.valueOf(System.currentTimeMillis() / 1000))
+ .build();
+
+ try {
+ String url = this.payService.getWxEntrustPapService().maSign(wxMaEntrustRequest);
+ logger.info(url);
+ } catch (WxPayException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * h5纯签约
+ */
+ @Test
+ public void testH5Sign() {
+ String contractCode = "222111122222";
+ String displayAccount = Joiner.on("").join("陈*", "(", "100000000", ")");
+
+ WxH5EntrustRequest wxH5EntrustRequest = WxH5EntrustRequest.newBuilder()
+ .requestSerial(2L)
+ .clientIp("127.0.0.1")
+ .contractCode(contractCode)
+ .contractDisplayAccount(displayAccount)
+ .notifyUrl("http://domain.com/api/wxpay/sign/callback.do")
+ .planId("141535")
+ .returnAppid("1")
+ .timestamp(String.valueOf(System.currentTimeMillis() / 1000))
+ .version("1.0")
+ .outerId(displayAccount)
+ .build();
+
+ try {
+ WxH5EntrustResult wxH5EntrustResult = this.payService.getWxEntrustPapService().h5Sign(wxH5EntrustRequest);
+ logger.info(wxH5EntrustResult.toString());
+ } catch (WxPayException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testPaySign() {
+ String contractCode = "2222211110000222";
+ String displayAccount = Joiner.on("").join("陈*", "(", "10000005", ")");
+ String outTradeNo = "11100111101";
+
+ WxPayEntrustRequest wxPayEntrustRequest = WxPayEntrustRequest.newBuilder()
+ .attach("local")
+ .body("产品名字")
+ .contractAppId(this.payService.getConfig().getAppId())
+ .contractCode(contractCode)
+ .contractDisplayAccount(displayAccount)
+ .contractMchId(this.payService.getConfig().getMchId())
+ //签约回调
+ .contractNotifyUrl("http://domain.com/api/wxpay/sign/callback.do")
+ .detail("产品是好")
+ .deviceInfo("oneplus 7 pro")
+ //.goodsTag()
+ //.limitPay()
+ //支付回调
+ .notifyUrl("http://domain.com/api/wxpay/pay/callback.do")
+ .openId("oIvLdt8Q-_aKy4Vo6f4YI6gsIhMc") //openId
+ .outTradeNo(outTradeNo)
+ .planId("141535")
+ //.productId()
+ .requestSerial(3L)
+ .spbillCreateIp("127.0.0.1")
+ //.timeExpire()
+ //.timeStart()
+ .totalFee(1)
+ .tradeType("MWEB")
+ .contractOuterId(displayAccount)
+ .build();
+
+ try {
+ WxPayEntrustResult wxPayEntrustResult = this.payService.getWxEntrustPapService().paySign(wxPayEntrustRequest);
+ logger.info(wxPayEntrustResult.toString());
+ } catch (WxPayException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testWithhold() {
+ String outTradeNo = "101010101";
+ WxWithholdRequest withholdRequest = WxWithholdRequest.newBuilder()
+ .attach("local")
+ .body("产品名字")
+ .contractId("202011065409471222") // 微信返回的签约协议号
+ .detail("产品描述")
+ .feeType("CNY")
+ //.goodsTag()
+ .notifyUrl("http://domain.com/api/wxpay/withhold/callback.do")
+ .outTradeNo(outTradeNo)
+ .spbillCreateIp("127.0.0.1")
+ .totalFee(1)
+ .tradeType("PAP")
+ .build();
+
+ try {
+ WxWithholdResult wxWithholdResult = this.payService.getWxEntrustPapService().withhold(withholdRequest);
+ logger.info(wxWithholdResult.toString());
+ } catch (WxPayException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testPreWithhold() {
+ WxPreWithholdRequest.EstimateAmount estimateAmount = new WxPreWithholdRequest.EstimateAmount();
+ estimateAmount.setAmount(1);
+ estimateAmount.setCurrency("CNY");
+
+ WxPreWithholdRequest wxPreWithholdRequest = WxPreWithholdRequest.newBuilder()
+ .appId("wx73dssxxxxxx")
+ .contractId("202010275173070001")
+ .estimateAmount(estimateAmount)
+ .mchId("1600010102")
+ .build();
+
+ try {
+ String httpResponseModel = this.payService.getWxEntrustPapService().preWithhold(wxPreWithholdRequest);
+ logger.info(httpResponseModel);
+ } catch (WxPayException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testQuerySign() {
+ String outTradeNo = "1212121212";
+
+ WxSignQueryRequest wxSignQueryRequest = WxSignQueryRequest.newBuilder()
+ //.contractId("202010275173073211")
+ .contractCode(outTradeNo)
+ .planId(1432112)
+ .version("1.0")
+ .build();
+
+ try {
+ WxSignQueryResult wxSignQueryResult = this.payService.getWxEntrustPapService().querySign(wxSignQueryRequest);
+ logger.info(wxSignQueryResult.toString());
+ } catch (WxPayException e) {
+ logger.info("异常码:" + e.getErrCode());
+ logger.info("异常:" + e);
+ }
+ }
+
+ @Test
+ public void testTerminationContract() {
+ WxTerminatedContractRequest wxTerminatedContractRequest = WxTerminatedContractRequest.newBuilder()
+ .contractId("202010275173070231")
+ .contractTerminationRemark("测试解约")
+ .version("1.0")
+ .build();
+
+ try {
+ WxTerminationContractResult wxTerminationContractResult = this.payService.getWxEntrustPapService().terminationContract(wxTerminatedContractRequest);
+ logger.info(wxTerminationContractResult.toString());
+ } catch (WxPayException e) {
+ logger.error(e.getMessage());
+ }
+ }
+}
From e785b1f9a72fd248923d044535a129a312743133 Mon Sep 17 00:00:00 2001
From: liming1019
Date: Fri, 13 Aug 2021 17:55:35 +0800
Subject: [PATCH 0080/1235] =?UTF-8?q?:new:=20#2258=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A?=
=?UTF-8?q?=E4=B9=89=E7=BB=84=E4=BB=B6=E4=B9=8B=E7=89=A9=E6=B5=81=E5=92=8C?=
=?UTF-8?q?=E5=94=AE=E5=90=8E=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaService.java | 26 ++++---
.../miniapp/api/WxMaShopAfterSaleService.java | 34 +++++++++
.../miniapp/api/WxMaShopDeliveryService.java | 32 ++++++++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 12 +++
.../impl/WxMaShopAfterSaleServiceImpl.java | 65 +++++++++++++++-
.../api/impl/WxMaShopDeliveryServiceImpl.java | 65 +++++++++++++++-
.../request/WxMaShopAfterSaleAddRequest.java | 69 +++++++++++++++++
.../request/WxMaShopAfterSaleGetRequest.java | 30 ++++++++
.../WxMaShopAfterSaleUpdateRequest.java | 36 +++++++++
.../WxMaShopDeliveryRecieveRequest.java | 30 ++++++++
.../request/WxMaShopDeliverySendRequest.java | 51 +++++++++++++
.../WxMaShopAfterSaleGetResponse.java | 67 +++++++++++++++++
...xMaShopDeliveryGetCompanyListResponse.java | 30 ++++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 12 +++
.../WxMaShopAfterSaleServiceImplTest.java | 75 +++++++++++++++++++
.../impl/WxMaShopDeliveryServiceImplTest.java | 61 +++++++++++++++
16 files changed, 681 insertions(+), 14 deletions(-)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAfterSaleGetResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopDeliveryGetCompanyListResponse.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java
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 484968f3d9..a182c245cd 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
@@ -377,18 +377,20 @@ public interface WxMaService extends WxService {
*/
WxImgProcService getImgProcService();
-// /**
-// * 返回小程序交易组件-售后服务接口
-// * @return
-// */
-// WxMaShopAfterSaleService getShopAfterSaleService();
-//
-//
-// /**
-// * 返回小程序交易组件-物流服务接口
-// * @return
-// */
-// WxMaShopDeliveryService getShopDeliveryService();
+ /**
+ * 返回小程序交易组件-售后服务接口
+ *
+ * @return
+ */
+ WxMaShopAfterSaleService getShopAfterSaleService();
+
+
+ /**
+ * 返回小程序交易组件-物流服务接口
+ *
+ * @return
+ */
+ WxMaShopDeliveryService getShopDeliveryService();
/**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAfterSaleService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAfterSaleService.java
index 6e9878c9fb..97b8aa56d7 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAfterSaleService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopAfterSaleService.java
@@ -1,10 +1,44 @@
package cn.binarywang.wx.miniapp.api;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAfterSaleAddRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAfterSaleGetRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAfterSaleUpdateRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAfterSaleGetResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import me.chanjar.weixin.common.error.WxErrorException;
+
/**
* 小程序交易组件-售后服务
*
* @author boris
+ * @author liming1019
*/
public interface WxMaShopAfterSaleService {
+ /**
+ * 创建售后
+ *
+ * @param request
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ WxMaShopBaseResponse add(WxMaShopAfterSaleAddRequest request) throws WxErrorException;
+
+ /**
+ * 获取订单下售后单
+ *
+ * @param request
+ * @return WxMaShopAfterSaleGetResponse
+ * @throws WxErrorException
+ */
+ WxMaShopAfterSaleGetResponse get(WxMaShopAfterSaleGetRequest request) throws WxErrorException;
+
+ /**
+ * 更新售后
+ *
+ * @param request
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ WxMaShopBaseResponse update(WxMaShopAfterSaleUpdateRequest request) throws WxErrorException;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopDeliveryService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopDeliveryService.java
index 2a3a119862..d6aadbebc2 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopDeliveryService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopDeliveryService.java
@@ -1,10 +1,42 @@
package cn.binarywang.wx.miniapp.api;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopDeliveryRecieveRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopDeliverySendRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopDeliveryGetCompanyListResponse;
+import me.chanjar.weixin.common.error.WxErrorException;
+
/**
* 小程序交易组件-物流发货服务
*
* @author boris
+ * @author liming1019
*/
public interface WxMaShopDeliveryService {
+ /**
+ * 获取快递公司列表
+ *
+ * @return WxMaShopDeliveryGetCompanyListResponse
+ * @throws WxErrorException
+ */
+ WxMaShopDeliveryGetCompanyListResponse getCompanyList() throws WxErrorException;
+
+ /**
+ * 订单发货
+ *
+ * @param request
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ WxMaShopBaseResponse send(WxMaShopDeliverySendRequest request) throws WxErrorException;
+
+ /**
+ * 订单确认收货
+ *
+ * @param request
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ WxMaShopBaseResponse receive(WxMaShopDeliveryRecieveRequest request) 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 fe841a57a0..096eedd5bf 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
@@ -70,6 +70,8 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaShopCatService shopCatService = new WxMaShopCatServiceImpl(this);
private final WxMaShopImgService shopImgService = new WxMaShopImgServiceImpl(this);
private final WxMaShopAuditService shopAuditService = new WxMaShopAuditServiceImpl(this);
+ private final WxMaShopAfterSaleService shopAfterSaleService = new WxMaShopAfterSaleServiceImpl(this);
+ private final WxMaShopDeliveryService shopDeliveryService = new WxMaShopDeliveryServiceImpl(this);
private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
@@ -546,6 +548,16 @@ public WxMaShopAuditService getShopAuditService() {
return this.shopAuditService;
}
+ @Override
+ public WxMaShopAfterSaleService getShopAfterSaleService() {
+ return this.shopAfterSaleService;
+ }
+
+ @Override
+ public WxMaShopDeliveryService getShopDeliveryService() {
+ return this.shopDeliveryService;
+ }
+
@Override
public WxMaLinkService getLinkService() {
return this.linkService;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImpl.java
index 85fdb90b61..9fd24350a5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImpl.java
@@ -2,18 +2,81 @@
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.WxMaShopAfterSaleService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAfterSaleAddRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAfterSaleGetRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAfterSaleUpdateRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAfterSaleGetResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.JsonObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+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.util.json.GsonParser;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Aftersale.*;
+import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ERRCODE;
/**
* @author boris
+ * @author liming1019
*/
@RequiredArgsConstructor
@Slf4j
public class WxMaShopAfterSaleServiceImpl implements WxMaShopAfterSaleService {
- private final WxMaService service;
+ private final WxMaService wxMaService;
+ /**
+ * 创建售后
+ *
+ * @param request
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ @Override
+ public WxMaShopBaseResponse add(WxMaShopAfterSaleAddRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(AFTERSALE_ADD, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
+ /**
+ * 获取订单下售后单
+ *
+ * @param request
+ * @return WxMaShopAfterSaleGetResponse
+ * @throws WxErrorException
+ */
+ @Override
+ public WxMaShopAfterSaleGetResponse get(WxMaShopAfterSaleGetRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(AFTERSALE_GET, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopAfterSaleGetResponse.class);
+ }
+ /**
+ * 更新售后
+ *
+ * @param request
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxMaShopBaseResponse update(WxMaShopAfterSaleUpdateRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(AFTERSALE_UPDATE, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImpl.java
index 9b6a093eb8..8fd9d63f95 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImpl.java
@@ -2,15 +2,78 @@
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.WxMaShopDeliveryService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopDeliveryRecieveRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopDeliverySendRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopDeliveryGetCompanyListResponse;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import com.google.gson.JsonObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+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.util.json.GsonParser;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Delivery.*;
+import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ERRCODE;
/**
* @author boris
+ * @author liming1019
*/
@RequiredArgsConstructor
@Slf4j
public class WxMaShopDeliveryServiceImpl implements WxMaShopDeliveryService {
- private final WxMaService service;
+ private final WxMaService wxMaService;
+
+ /**
+ * 获取快递公司列表
+ *
+ * @return WxMaShopDeliveryGetCompanyListResponse
+ * @throws WxErrorException
+ */
+ @Override
+ public WxMaShopDeliveryGetCompanyListResponse getCompanyList() throws WxErrorException {
+ String responseContent = this.wxMaService.post(GET_COMPANY_LIST, new JsonObject());
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopDeliveryGetCompanyListResponse.class);
+ }
+
+ /**
+ * 订单发货
+ *
+ * @param request
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ @Override
+ public WxMaShopBaseResponse send(WxMaShopDeliverySendRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(DELIVERY_SEND, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
+ /**
+ * 订单确认收货
+ *
+ * @param request
+ * @return WxMaShopBaseResponse
+ * @throws WxErrorException
+ */
+ @Override
+ public WxMaShopBaseResponse receive(WxMaShopDeliveryRecieveRequest request) throws WxErrorException {
+ String responseContent = this.wxMaService.post(DELIVERY_RECEIVE, request);
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java
new file mode 100644
index 0000000000..9f9c13e988
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java
@@ -0,0 +1,69 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@Builder
+public class WxMaShopAfterSaleAddRequest implements Serializable {
+ private static final long serialVersionUID = 6652525413062887786L;
+
+ /**
+ * out_order_id : xxxxx
+ * out_aftersale_id : xxxxxx
+ * openid : oTVP50O53a7jgmawAmxKukNlq3XI
+ * type : 1
+ * create_time : 2020-12-01 00:00:00
+ * status : 1
+ * finish_all_aftersale : 0
+ * path : /pages/aftersale.html?out_aftersale_id=xxxxx
+ * refund : 100
+ * product_infos : [{"out_product_id":"234245","out_sku_id":"23424","product_cnt":5}]
+ */
+
+ @SerializedName("out_order_id")
+ private String outOrderId;
+ @SerializedName("out_aftersale_id")
+ private String outAftersaleId;
+ @SerializedName("openid")
+ private String openid;
+ @SerializedName("type")
+ private Integer type;
+ @SerializedName("create_time")
+ private String createTime;
+ @SerializedName("status")
+ private Integer status;
+ @SerializedName("finish_all_aftersale")
+ private Integer finishAllAftersale;
+ @SerializedName("path")
+ private String path;
+ @SerializedName("refund")
+ private Long refund;
+ @SerializedName("product_infos")
+ private List productInfos;
+
+ @Data
+ @Builder
+ public static class ProductInfosBean implements Serializable {
+ /**
+ * out_product_id : 234245
+ * out_sku_id : 23424
+ * product_cnt : 5
+ */
+
+ @SerializedName("out_product_id")
+ private String outProductId;
+ @SerializedName("out_sku_id")
+ private String outSkuId;
+ @SerializedName("product_cnt")
+ private Integer productCnt;
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java
new file mode 100644
index 0000000000..31afee26ce
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java
@@ -0,0 +1,30 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@Builder
+public class WxMaShopAfterSaleGetRequest implements Serializable {
+ private static final long serialVersionUID = -1275475147400719521L;
+
+ /**
+ * order_id : 32434234
+ * out_order_id : xxxxx
+ * openid : oTVP50O53a7jgmawAmxKukNlq3XI
+ */
+
+ @SerializedName("order_id")
+ private Long orderId;
+ @SerializedName("out_order_id")
+ private String outOrderId;
+ @SerializedName("openid")
+ private String openid;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java
new file mode 100644
index 0000000000..8bbeadb1af
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java
@@ -0,0 +1,36 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@Builder
+public class WxMaShopAfterSaleUpdateRequest implements Serializable {
+ private static final long serialVersionUID = 2712027510252221370L;
+
+ /**
+ * out_order_id : xxxxx
+ * openid : oTVP50O53a7jgmawAmxKukNlq3XI
+ * out_aftersale_id : xxxxxx
+ * status : 1
+ * finish_all_aftersale : 0
+ */
+
+ @SerializedName("out_order_id")
+ private String outOrderId;
+ @SerializedName("openid")
+ private String openid;
+ @SerializedName("out_aftersale_id")
+ private String outAftersaleId;
+ @SerializedName("status")
+ private Integer status;
+ @SerializedName("finish_all_aftersale")
+ private Integer finishAllAftersale;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java
new file mode 100644
index 0000000000..50ef7a63ef
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java
@@ -0,0 +1,30 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@Builder
+public class WxMaShopDeliveryRecieveRequest implements Serializable {
+ private static final long serialVersionUID = 1540854758624081221L;
+
+ /**
+ * order_id : 123456
+ * out_order_id : xxxxx
+ * openid : oTVP50O53a7jgmawAmxKukNlq3XI
+ */
+
+ @SerializedName("order_id")
+ private Long orderId;
+ @SerializedName("out_order_id")
+ private String outOrderId;
+ @SerializedName("openid")
+ private String openid;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java
new file mode 100644
index 0000000000..6636b64055
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java
@@ -0,0 +1,51 @@
+package cn.binarywang.wx.miniapp.bean.shop.request;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author liming1019
+ * @date 2021/8/12
+ */
+@Data
+@Builder
+public class WxMaShopDeliverySendRequest implements Serializable {
+ private static final long serialVersionUID = -4034672301224469057L;
+
+ /**
+ * order_id : 123456
+ * out_order_id : xxxxx
+ * openid : oTVP50O53a7jgmawAmxKukNlq3XI
+ * finish_all_delivery : 0
+ * delivery_list : [{"delivery_id":"SF","waybill_id":"23424324253"}]
+ */
+
+ @SerializedName("order_id")
+ private Long orderId;
+ @SerializedName("out_order_id")
+ private String outOrderId;
+ @SerializedName("openid")
+ private String openid;
+ @SerializedName("finish_all_delivery")
+ private Integer finishAllDelivery;
+ @SerializedName("delivery_list")
+ private List deliveryList;
+
+ @Data
+ @Builder
+ public static class DeliveryListBean implements Serializable {
+ /**
+ * delivery_id : SF
+ * waybill_id : 23424324253
+ */
+
+ @SerializedName("delivery_id")
+ private String deliveryId;
+ @SerializedName("waybill_id")
+ private String waybillId;
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAfterSaleGetResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAfterSaleGetResponse.java
new file mode 100644
index 0000000000..ac8f68db66
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopAfterSaleGetResponse.java
@@ -0,0 +1,67 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopAfterSaleGetResponse extends WxMaShopBaseResponse implements Serializable {
+ private static final long serialVersionUID = 213666907103837748L;
+
+ @SerializedName("aftersale_infos")
+ private List aftersaleInfos;
+
+ @Data
+ public static class AftersaleInfosBean implements Serializable {
+ /**
+ * out_order_id : xxxxx
+ * out_aftersale_id : xxxxxx
+ * openid : oTVP50O53a7jgmawAmxKukNlq3XI
+ * type : 1
+ * create_time : 2020-12-01 00:00:00
+ * path : /pages/order.html?out_order_id=xxxxx
+ * status : 1
+ * refund : 100
+ * product_infos : [{"out_product_id":"234245","out_sku_id":"23424","product_cnt":5}]
+ */
+
+ @SerializedName("out_order_id")
+ private String outOrderId;
+ @SerializedName("out_aftersale_id")
+ private String outAftersaleId;
+ @SerializedName("openid")
+ private String openid;
+ @SerializedName("type")
+ private Integer type;
+ @SerializedName("create_time")
+ private String createTime;
+ @SerializedName("path")
+ private String path;
+ @SerializedName("status")
+ private Integer status;
+ @SerializedName("refund")
+ private Long refund;
+ @SerializedName("product_infos")
+ private List productInfos;
+
+ @Data
+ public static class ProductInfosBean implements Serializable {
+ /**
+ * out_product_id : 234245
+ * out_sku_id : 23424
+ * product_cnt : 5
+ */
+
+ @SerializedName("out_product_id")
+ private String outProductId;
+ @SerializedName("out_sku_id")
+ private String outSkuId;
+ @SerializedName("product_cnt")
+ private Integer productCnt;
+ }
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopDeliveryGetCompanyListResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopDeliveryGetCompanyListResponse.java
new file mode 100644
index 0000000000..096d92e38e
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/response/WxMaShopDeliveryGetCompanyListResponse.java
@@ -0,0 +1,30 @@
+package cn.binarywang.wx.miniapp.bean.shop.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxMaShopDeliveryGetCompanyListResponse extends WxMaShopBaseResponse implements Serializable {
+ private static final long serialVersionUID = -1478684494303814483L;
+
+ @SerializedName("company_list")
+ private List companyList;
+
+ @Data
+ public static class CompanyListBean implements Serializable {
+ /**
+ * delivery_id : SF
+ * delivery_name : 顺丰速运
+ */
+
+ @SerializedName("delivery_id")
+ private String deliveryId;
+ @SerializedName("delivery_name")
+ private String deliveryName;
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index 74f656d25d..28a38a1f20 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -348,6 +348,18 @@ interface Audit {
String AUDIT_RESULT = "https://api.weixin.qq.com/shop/audit/result";
String GET_MINIAPP_CERTIFICATE = "https://api.weixin.qq.com/shop/audit/get_miniapp_certificate";
}
+
+ interface Delivery {
+ String GET_COMPANY_LIST = "https://api.weixin.qq.com/shop/delivery/get_company_list";
+ String DELIVERY_SEND = "https://api.weixin.qq.com/shop/delivery/send";
+ String DELIVERY_RECEIVE = "https://api.weixin.qq.com/shop/delivery/recieve";
+ }
+
+ interface Aftersale {
+ String AFTERSALE_ADD = "https://api.weixin.qq.com/shop/aftersale/add";
+ String AFTERSALE_GET = "https://api.weixin.qq.com/shop/aftersale/get";
+ String AFTERSALE_UPDATE = "https://api.weixin.qq.com/shop/aftersale/update";
+ }
}
/**
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java
new file mode 100644
index 0000000000..3d38d82e01
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java
@@ -0,0 +1,75 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAfterSaleAddRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAfterSaleGetRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopAfterSaleUpdateRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopAfterSaleGetResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author liming1019
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaShopAfterSaleServiceImplTest {
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testAdd() throws WxErrorException {
+ WxMaShopAfterSaleAddRequest.ProductInfosBean productInfosBean = WxMaShopAfterSaleAddRequest.ProductInfosBean.builder()
+ .outProductId("234245")
+ .outSkuId("23424")
+ .productCnt(5)
+ .build();
+ WxMaShopAfterSaleAddRequest request = WxMaShopAfterSaleAddRequest.builder()
+ .outOrderId("xxxxx")
+ .outAftersaleId("xxxxxx")
+ .openid("oTVP50O53a7jgmawAmxKukNlq3XI")
+ .type(1)
+ .createTime("2020-12-01 00:00:00")
+ .status(1)
+ .finishAllAftersale(0)
+ .path("/pages/aftersale.html?out_aftersale_id=xxxxx")
+ .refund(100L)
+ .productInfos(new ArrayList<>(Arrays.asList(productInfosBean)))
+ .build();
+ WxMaShopBaseResponse response = wxService.getShopAfterSaleService().add(request);
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testGet() throws WxErrorException {
+ WxMaShopAfterSaleGetRequest request = WxMaShopAfterSaleGetRequest.builder()
+ .openid("oTVP50O53a7jgmawAmxKukNlq3XI")
+ .orderId(32434234L)
+ .outOrderId("xxxxx")
+ .build();
+ WxMaShopAfterSaleGetResponse response = wxService.getShopAfterSaleService().get(request);
+ assertThat(response).isNotNull();
+ }
+
+ @Test
+ public void testUpdate() throws WxErrorException {
+ WxMaShopAfterSaleUpdateRequest request = WxMaShopAfterSaleUpdateRequest.builder()
+ .outOrderId("xxxxx")
+ .openid("oTVP50O53a7jgmawAmxKukNlq3XI")
+ .outAftersaleId("xxxxxx")
+ .status(1)
+ .finishAllAftersale(0)
+ .build();
+ WxMaShopBaseResponse response = wxService.getShopAfterSaleService().update(request);
+ assertThat(response).isNotNull();
+ }
+}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java
new file mode 100644
index 0000000000..e19a9c0862
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java
@@ -0,0 +1,61 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopDeliveryRecieveRequest;
+import cn.binarywang.wx.miniapp.bean.shop.request.WxMaShopDeliverySendRequest;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopBaseResponse;
+import cn.binarywang.wx.miniapp.bean.shop.response.WxMaShopDeliveryGetCompanyListResponse;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import static org.testng.Assert.assertNotNull;
+
+/**
+ * @author liming1019
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaShopDeliveryServiceImplTest {
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testGetCompanyList() throws WxErrorException {
+ WxMaShopDeliveryGetCompanyListResponse response = wxService.getShopDeliveryService().getCompanyList();
+ assertNotNull(response);
+ }
+
+ @Test
+ public void testSend() throws WxErrorException {
+ WxMaShopDeliverySendRequest.DeliveryListBean deliveryListBean = WxMaShopDeliverySendRequest.DeliveryListBean.builder()
+ .deliveryId("SF")
+ .waybillId("23424324253")
+ .build();
+ WxMaShopDeliverySendRequest request = WxMaShopDeliverySendRequest.builder()
+ .orderId(123456L)
+ .outOrderId("xxxxx")
+ .openid("oTVP50O53a7jgmawAmxKukNlq3XI")
+ .finishAllDelivery(0)
+ .deliveryList(new ArrayList<>(Arrays.asList(deliveryListBean)))
+ .build();
+ WxMaShopBaseResponse response = wxService.getShopDeliveryService().send(request);
+ assertNotNull(response);
+ }
+
+ @Test
+ public void testReceive() throws WxErrorException {
+ WxMaShopDeliveryRecieveRequest request = WxMaShopDeliveryRecieveRequest.builder()
+ .openid("oTVP50O53a7jgmawAmxKukNlq3XI")
+ .orderId(123456L)
+ .outOrderId("xxxxx")
+ .build();
+ WxMaShopBaseResponse response = wxService.getShopDeliveryService().receive(request);
+ assertNotNull(response);
+ }
+}
From d4a1a98ba17f3fd66ba44bb4509be4b7594d1abb Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sat, 14 Aug 2021 22:37:03 +0800
Subject: [PATCH 0081/1235] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.6.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index aba66934e8..fb5ad2f91b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 6c8e4a384d..fc592c2a32 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 84384f265f..5905faf7ca 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.5.B
+ 4.1.6.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index 83d1a0c5cd..14706dc8f3 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.5.B
+ 4.1.6.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index 62996fd3e7..2bd024114e 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.5.B
+ 4.1.6.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 924af39a59..501594d231 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.5.B
+ 4.1.6.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 2a170599ee..1cd2e60f68 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.5.B
+ 4.1.6.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index 9dd574491e..e22af0eba2 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index cc3ea657a2..e9ecbcb0cd 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index b9d6ec6e4e..45477235b7 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 4a514e8962..51f89785f4 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 31d5c68861..92494bb955 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index dd64311948..68e94348dd 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index b87af9cbb8..b7b2247bfe 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index fa617f7e1b..2be86f12b6 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.5.B
+ 4.1.6.B
weixin-java-qidian
From dfeb2f944fa5ae960281614f5efae3cb26683249 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 16 Aug 2021 17:55:40 +0800
Subject: [PATCH 0082/1235] =?UTF-8?q?:arrow=5Fup:=20=E5=8D=87=E7=BA=A7=20S?=
=?UTF-8?q?pring=20Boot=20=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
spring-boot-starters/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index fc592c2a32..3209761d7e 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -12,7 +12,7 @@
WxJava 各个模块的 Spring Boot Starter
- 2.3.3.RELEASE
+ 2.5.3
From 6cfe90b31eeafc3b301939f1fd38a7de824a716b Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 16 Aug 2021 17:59:52 +0800
Subject: [PATCH 0083/1235] =?UTF-8?q?:art:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?=
=?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/mp/config/impl/WxMpMapConfigImpl.java | 6 +++---
.../weixin/open/bean/ma/WxMaOpenSubpackage.java | 4 ++--
.../bean/ecommerce/ApplymentsStatusResult.java | 1 -
.../bean/ecommerce/CombineTransactionsRequest.java | 2 +-
.../bean/ecommerce/CombineTransactionsResult.java | 2 +-
.../wxpay/bean/ecommerce/FinishOrderRequest.java | 5 +++--
.../wxpay/bean/ecommerce/FundBalanceResult.java | 4 ++--
.../wxpay/bean/ecommerce/FundBillRequest.java | 4 ++--
.../wxpay/bean/ecommerce/FundBillResult.java | 4 ++--
.../ecommerce/PartnerTransactionsCloseRequest.java | 5 +++--
.../wxpay/bean/ecommerce/ProfitSharingRequest.java | 5 +++--
.../wxpay/bean/ecommerce/ProfitSharingResult.java | 5 +++--
.../wxpay/bean/ecommerce/RefundsRequest.java | 13 ++++---------
.../wxpay/bean/ecommerce/RefundsResult.java | 11 ++++++-----
.../bean/ecommerce/ReturnOrdersQueryRequest.java | 9 ++++++---
.../wxpay/bean/ecommerce/ReturnOrdersRequest.java | 7 ++++---
.../wxpay/bean/ecommerce/ReturnOrdersResult.java | 4 ++--
.../bean/ecommerce/SpWithdrawStatusResult.java | 5 +++--
.../bean/ecommerce/SubWithdrawStatusResult.java | 5 +++--
.../wxpay/bean/ecommerce/TradeBillResult.java | 4 ++--
.../wxpay/bean/ecommerce/TransactionsResult.java | 6 +++---
.../bean/ecommerce/enums/FundBillTypeEnum.java | 5 +++--
.../bean/ecommerce/enums/SpAccountTypeEnum.java | 5 +++--
.../wxpay/bean/entwxpay/EntWxEmpPayRequest.java | 1 +
24 files changed, 65 insertions(+), 57 deletions(-)
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpMapConfigImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpMapConfigImpl.java
index a9eb344f3c..388f39b8fa 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpMapConfigImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpMapConfigImpl.java
@@ -6,9 +6,9 @@
import java.util.concurrent.ConcurrentHashMap;
/**
- * @Author: Brayden Wong
- * @Date: 2021/1/16
- * @Description: 提供accesstoken保存在concurrenthashmap中的实现,支持高并发。仅限于单机部署。
+ * @author Brayden Wong
+ * @date 2021/1/16
+ * 提供accesstoken保存在concurrenthashmap中的实现,支持高并发。仅限于单机部署。
*/
@Data
public class WxMpMapConfigImpl extends WxMpDefaultConfigImpl {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenSubpackage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenSubpackage.java
index e74049a530..3f71c42855 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenSubpackage.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenSubpackage.java
@@ -4,8 +4,8 @@
import lombok.Data;
/**
- * @author: momorans
- * @create: 2019-03-12
+ * @author momorans
+ * @create 2019-03-12
**/
@Data
@Builder
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 bfd034dcbb..243f4e6866 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
@@ -9,7 +9,6 @@
/**
* 二级商户进件 查询申请状态结果响应
- *
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsRequest.java
index 9cc0d4b33c..3f285285ae 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsRequest.java
@@ -344,7 +344,7 @@ public static class Amount implements Serializable {
@Data
@NoArgsConstructor
- public static class SettleInfo implements Serializable{
+ public static class SettleInfo implements Serializable {
/**
*
* 字段名:是否指定分账
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsResult.java
index f8d13db88d..1b929ed96f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsResult.java
@@ -99,7 +99,7 @@ public class CombineTransactionsResult implements Serializable {
@Data
@NoArgsConstructor
- public static class SubOrders implements Serializable {
+ public static class SubOrders implements Serializable {
/**
*
* 字段名:子单商户号
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FinishOrderRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FinishOrderRequest.java
index 1b09ba6ffc..0ab6b526e7 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FinishOrderRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FinishOrderRequest.java
@@ -10,8 +10,9 @@
*
* 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_5.shtml
*
- * @author: f00lish
- * @date: 2020/09/12
+ *
+ * @author f00lish
+ * @date 2020/09/12
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBalanceResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBalanceResult.java
index e53b480c3f..af1d77ad75 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBalanceResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBalanceResult.java
@@ -5,8 +5,8 @@
import lombok.NoArgsConstructor;
/**
- * @author: f00lish
- * @date: 2020/09/12
+ * @author f00lish
+ * @date 2020/09/12
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java
index 9ed6b20cfa..c47a9a045f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java
@@ -8,8 +8,8 @@
/**
* 资金账单请求
*
- * @author: f00lish
- * @date: 2020/09/28
+ * @author f00lish
+ * @date 2020/09/28
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java
index b4a3ea45f6..54ab3a1653 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java
@@ -8,8 +8,8 @@
/**
* 资金账单结果
*
- * @author: f00lish
- * @date: 2020/09/28
+ * @author f00lish
+ * @date 2020/09/28
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/PartnerTransactionsCloseRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/PartnerTransactionsCloseRequest.java
index a98d0c69e7..0222e7145a 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/PartnerTransactionsCloseRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/PartnerTransactionsCloseRequest.java
@@ -8,8 +8,9 @@
/**
* 关闭普通订单请求
- * @author: f00lish
- * @date: 2020/12/09
+ *
+ * @author f00lish
+ * @date 2020/12/09
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingRequest.java
index ab83cab033..1ae90c6b80 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingRequest.java
@@ -13,8 +13,9 @@
*
* 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_1.shtml
*
- * @author: f00lish
- * @date: 2020/09/12
+ *
+ * @author f00lish
+ * @date 2020/09/12
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingResult.java
index 37ff86c25a..09cc3e843c 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingResult.java
@@ -9,8 +9,9 @@
/**
* 请求分账 结果响应
- * @author: f00lish
- * @date: 2020/09/12
+ *
+ * @author f00lish
+ * @date 2020/09/12
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsRequest.java
index 68dfd3e004..3666b43195 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsRequest.java
@@ -1,10 +1,5 @@
package com.github.binarywang.wxpay.bean.ecommerce;
-/**
- * @author: f00lish
- * @date: 2020/09/17
- */
-
import com.google.gson.annotations.SerializedName;
import lombok.*;
@@ -12,11 +7,12 @@
/**
* 退款申请
- * *
+ * *
* * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/refunds/chapter3_1.shtml
* *
- * @author: f00lish
- * @date: 2020/09/14
+ *
+ * @author f00lish
+ * @date 2020/09/14
*/
@Data
@Builder
@@ -156,7 +152,6 @@ public class RefundsRequest implements Serializable {
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public static class Amount implements Serializable {
-
private static final long serialVersionUID = 7383027142329410399L;
/**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsResult.java
index 52eef53bfd..c83fdf4a5a 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsResult.java
@@ -1,8 +1,8 @@
package com.github.binarywang.wxpay.bean.ecommerce;
/**
- * @author: f00lish
- * @date: 2020/09/17
+ * @author f00lish
+ * @date 2020/09/17
*/
import com.google.gson.annotations.SerializedName;
@@ -14,11 +14,12 @@
/**
* 退款结果
- * *
+ * *
* * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/refunds/chapter3_1.shtml
* *
- * @author: f00lish
- * @date: 2020/09/14
+ *
+ * @author f00lish
+ * @date 2020/09/14
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersQueryRequest.java
index 1b6aeee801..6eec6d8f2f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersQueryRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersQueryRequest.java
@@ -7,17 +7,20 @@
/**
* 查询分账回退结果请求
- * *
+ * *
* * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_3.shtml
* *
- * @author: wangrui
- * @date: 2021/02/20
+ *
+ * @author wangrui
+ * @date 2021/02/20
*/
@Data
@Builder
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ReturnOrdersQueryRequest implements Serializable {
+ private static final long serialVersionUID = 4250796057341297359L;
+
/**
*
* 字段名:二级商户号
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersRequest.java
index 957b1a8d63..6c0197b722 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersRequest.java
@@ -7,11 +7,12 @@
/**
* 请求分账回退
- * *
+ * *
* * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_3.shtml
* *
- * @author: f00lish
- * @date: 2020/09/14
+ *
+ * @author f00lish
+ * @date 2020/09/14
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersResult.java
index f2110cc5d8..5655139d0f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersResult.java
@@ -8,8 +8,8 @@
/**
- * @author: f00lish
- * @date: 2020/09/14
+ * @author f00lish
+ * @date 2020/09/14
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SpWithdrawStatusResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SpWithdrawStatusResult.java
index d4c02443aa..1165722bf9 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SpWithdrawStatusResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SpWithdrawStatusResult.java
@@ -11,8 +11,9 @@
*
* 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_6.shtml
*
- * @author: f00lish
- * @date: 2020/10/27
+ *
+ * @author f00lish
+ * @date 2020/10/27
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SubWithdrawStatusResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SubWithdrawStatusResult.java
index 27d624872b..d76d4a5124 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SubWithdrawStatusResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SubWithdrawStatusResult.java
@@ -11,8 +11,9 @@
*
* 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_3.shtml
*
- * @author: f00lish
- * @date: 2020/10/27
+ *
+ * @author f00lish
+ * @date 2020/10/27
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
index 0a19894ed8..477c83aa38 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
@@ -8,8 +8,8 @@
/**
* 交易账单结果
*
- * @author: f00lish
- * @date: 2020/09/28
+ * @author f00lish
+ * @date 2020/09/28
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java
index 12a22ead74..6bb04f9a63 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java
@@ -69,7 +69,7 @@ public static class JsapiResult implements Serializable {
private String signType;
private String paySign;
- private String getSignStr(){
+ private String getSignStr() {
return String.format("%s\n%s\n%s\n%s\n", appId, timeStamp, nonceStr, packageValue);
}
}
@@ -86,10 +86,10 @@ public static class AppResult implements Serializable {
}
- public T getPayInfo(TradeTypeEnum tradeType, String appId, String mchId, PrivateKey privateKey){
+ public T getPayInfo(TradeTypeEnum tradeType, String appId, String mchId, PrivateKey privateKey) {
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String nonceStr = SignUtils.genRandomStr();
- switch (tradeType){
+ switch (tradeType) {
case JSAPI:
JsapiResult jsapiResult = new JsapiResult();
jsapiResult.setAppId(appId).setTimeStamp(timestamp)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java
index 72aff3a02b..a5058e2ba7 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java
@@ -5,8 +5,9 @@
/**
* 账单类型
- * @author: f00lish
- * @date: 2020/09/28
+ *
+ * @author f00lish
+ * @date 2020/09/28
*/
@Getter
@AllArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/SpAccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/SpAccountTypeEnum.java
index 2d7067804e..aa53db6c39 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/SpAccountTypeEnum.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/SpAccountTypeEnum.java
@@ -5,8 +5,9 @@
/**
* 服务商账户类型
- * @author: f00lish
- * @date: 2020/09/12
+ *
+ * @author f00lish
+ * @date 2020/09/12
*/
@Getter
@AllArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java
index 37c0d038dd..193c5293f7 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java
@@ -20,6 +20,7 @@
@AllArgsConstructor
@XStreamAlias("xml")
public class EntWxEmpPayRequest extends BaseWxPayRequest {
+ private static final long serialVersionUID = -3677217123742740648L;
/**
*
From 614a1c923ecc9a318a035003c420562a41c3789f Mon Sep 17 00:00:00 2001
From: liming1019
Date: Wed, 18 Aug 2021 10:52:16 +0800
Subject: [PATCH 0084/1235] =?UTF-8?q?:new:=20#2261=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AE=B9?=
=?UTF-8?q?=E5=AE=89=E5=85=A8=E6=8E=A5=E5=8F=A3=EF=BC=88=E5=85=BC=E5=AE=B9?=
=?UTF-8?q?2.0=E7=89=88=E6=9C=AC=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../WxMinishopImageUploadCustomizeResult.java | 5 +-
...inishopUploadRequestCustomizeExecutor.java | 12 ++--
...opMediaUploadRequestCustomizeExecutor.java | 5 +-
...opMediaUploadRequestCustomizeExecutor.java | 4 +-
...opMediaUploadRequestCustomizeExecutor.java | 4 +-
.../wx/miniapp/api/WxMaSecCheckService.java | 13 ++++
.../wx/miniapp/api/WxMaShopImgService.java | 11 +++
.../api/impl/WxMaSecCheckServiceImpl.java | 16 +++++
.../api/impl/WxMaShopImgServiceImpl.java | 9 ++-
.../wx/miniapp/bean/WxMaBaseResponse.java | 32 +++++++++
.../security/WxMaMsgSecCheckCheckRequest.java | 37 ++++++++++
.../WxMaMsgSecCheckCheckResponse.java | 72 +++++++++++++++++++
.../api/impl/WxMaSecCheckServiceImplTest.java | 14 ++++
.../api/impl/WxMaShopImgServiceImplTest.java | 7 ++
14 files changed, 227 insertions(+), 14 deletions(-)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaBaseResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckResponse.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java
index e3077fd00a..515189e469 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java
@@ -21,12 +21,13 @@ public static WxMinishopImageUploadCustomizeResult fromJson(String json) {
if (result.getErrcode().equals("0")) {
WxMinishopPicFileCustomizeResult picFileResult = new WxMinishopPicFileCustomizeResult();
JsonObject picObject = jsonObject.get("img_info").getAsJsonObject();
- picFileResult.setMediaId(picObject.get("media_id").getAsString());
+ if (picObject.has("media_id")) {
+ picFileResult.setMediaId(picObject.get("media_id").getAsString());
+ }
if (picObject.has("temp_img_url")) {
picFileResult.setTempImgUrl(picObject.get("temp_img_url").getAsString());
}
result.setImgInfo(picFileResult);
-
}
return result;
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java
index d782466c3b..23309202d7 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java
@@ -12,9 +12,11 @@
public abstract class MinishopUploadRequestCustomizeExecutor implements RequestExecutor {
protected RequestHttp requestHttp;
+ protected String respType;
- public MinishopUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
+ public MinishopUploadRequestCustomizeExecutor(RequestHttp requestHttp, String respType) {
this.requestHttp = requestHttp;
+ this.respType = respType;
}
@Override
@@ -22,14 +24,14 @@ public void execute(String uri, File data, ResponseHandler create(RequestHttp requestHttp) {
+ public static RequestExecutor create(RequestHttp requestHttp, String respType) {
switch (requestHttp.getRequestType()) {
case APACHE_HTTP:
- return new ApacheMinishopMediaUploadRequestCustomizeExecutor(requestHttp);
+ return new ApacheMinishopMediaUploadRequestCustomizeExecutor(requestHttp, respType);
case JODD_HTTP:
- return new JoddHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp);
+ return new JoddHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp, respType);
case OK_HTTP:
- return new OkHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp);
+ return new OkHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp, respType);
default:
return null;
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java
index dc38fbae5a..64888c08d6 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java
@@ -24,8 +24,8 @@
*/
@Slf4j
public class ApacheMinishopMediaUploadRequestCustomizeExecutor extends MinishopUploadRequestCustomizeExecutor {
- public ApacheMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
- super(requestHttp);
+ public ApacheMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp, String respType) {
+ super(requestHttp, respType);
}
@Override
@@ -39,6 +39,7 @@ public WxMinishopImageUploadCustomizeResult execute(String uri, File file, WxTyp
HttpEntity entity = MultipartEntityBuilder
.create()
.addBinaryBody("media", file)
+ .addTextBody("resp_type", this.respType)
.setMode(HttpMultipartMode.RFC6532)
.build();
httpPost.setEntity(entity);
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java
index 8fa1de4279..a79eb8eda5 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java
@@ -22,8 +22,8 @@
*/
@Slf4j
public class JoddHttpMinishopMediaUploadRequestCustomizeExecutor extends MinishopUploadRequestCustomizeExecutor {
- public JoddHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
- super(requestHttp);
+ public JoddHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp, String respType) {
+ super(requestHttp, respType);
}
@Override
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java
index 8b2cdc7b6c..45d112cd6c 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java
@@ -18,8 +18,8 @@
*/
@Slf4j
public class OkHttpMinishopMediaUploadRequestCustomizeExecutor extends MinishopUploadRequestCustomizeExecutor {
- public OkHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
- super(requestHttp);
+ public OkHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp, String respType) {
+ super(requestHttp, respType);
}
@Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java
index 50e03b30d6..8b135adcdf 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java
@@ -1,6 +1,8 @@
package cn.binarywang.wx.miniapp.api;
import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckRequest;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckResponse;
import me.chanjar.weixin.common.error.WxErrorException;
import java.io.File;
@@ -55,6 +57,17 @@ public interface WxMaSecCheckService {
boolean checkMessage(String msgString) throws WxErrorException;
+ /**
+ *
+ * 检查一段文本是否含有违法违规内容(新版本接口,主要是request和response做了参数优化)
+ * 详情请见: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.msgSecCheck.html
+ *
+ * @param msgRequest
+ * @return WxMaMsgSecCheckCheckResponse
+ * @throws WxErrorException
+ */
+ WxMaMsgSecCheckCheckResponse checkMessage(WxMaMsgSecCheckCheckRequest msgRequest) throws WxErrorException;
+
/**
*
* 异步校验图片/音频是否含有违法违规内容。
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java
index c44bc7df35..2cb9334fc2 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java
@@ -14,8 +14,19 @@ public interface WxMaShopImgService {
/**
* 上传图片
*
+ * @param file
* @return WxMinishopImageUploadCustomizeResult
* @throws WxErrorException
*/
WxMinishopImageUploadCustomizeResult uploadImg(File file) throws WxErrorException;
+
+ /**
+ * 上传图片,带respType参数
+ *
+ * @param file
+ * @param respType
+ * @return WxMinishopImageUploadCustomizeResult
+ * @throws WxErrorException
+ */
+ WxMinishopImageUploadCustomizeResult uploadImg(File file, String respType) throws WxErrorException;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
index fbff2f3203..332a47ad7a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
@@ -3,12 +3,17 @@
import cn.binarywang.wx.miniapp.api.WxMaSecCheckService;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckRequest;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckResponse;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
import com.google.gson.JsonObject;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+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.util.http.MediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.json.GsonParser;
import org.apache.commons.io.FileUtils;
import java.io.File;
@@ -16,6 +21,7 @@
import java.net.URL;
import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.SecCheck.*;
+import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ERRCODE;
/**
*
@@ -59,6 +65,16 @@ public boolean checkMessage(String msgString) throws WxErrorException {
return true;
}
+ @Override
+ public WxMaMsgSecCheckCheckResponse checkMessage(WxMaMsgSecCheckCheckRequest msgRequest) throws WxErrorException {
+ String response = this.service.post(MSG_SEC_CHECK_URL, msgRequest);
+ JsonObject jsonObject = GsonParser.parse(response);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(response, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(response, WxMaMsgSecCheckCheckResponse.class);
+ }
+
@Override
public WxMaMediaAsyncCheckResult mediaCheckAsync(String mediaUrl, int mediaType)
throws WxErrorException {
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java
index f253bca280..1c69f8dc80 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java
@@ -23,7 +23,14 @@ public class WxMaShopImgServiceImpl implements WxMaShopImgService {
@Override
public WxMinishopImageUploadCustomizeResult uploadImg(File file) throws WxErrorException {
WxMinishopImageUploadCustomizeResult result = this.service.execute(
- MinishopUploadRequestCustomizeExecutor.create(this.service.getRequestHttp()), IMG_UPLOAD, file);
+ MinishopUploadRequestCustomizeExecutor.create(this.service.getRequestHttp(), "0"), IMG_UPLOAD, file);
+ return result;
+ }
+
+ @Override
+ public WxMinishopImageUploadCustomizeResult uploadImg(File file, String respType) throws WxErrorException {
+ WxMinishopImageUploadCustomizeResult result = this.service.execute(
+ MinishopUploadRequestCustomizeExecutor.create(this.service.getRequestHttp(), respType), IMG_UPLOAD, file);
return result;
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaBaseResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaBaseResponse.java
new file mode 100644
index 0000000000..a0f524d324
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaBaseResponse.java
@@ -0,0 +1,32 @@
+package cn.binarywang.wx.miniapp.bean;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/17
+ */
+@Data
+public class WxMaBaseResponse implements Serializable {
+ private static final long serialVersionUID = 3932406255203539965L;
+ /**
+ * 错误码
+ *
+ * 是否必填:
+ *
+ */
+ @SerializedName("errcode")
+ private Integer errcode;
+
+ /**
+ * 错误信息
+ *
+ * 是否必填:
+ *
+ */
+ @SerializedName("errmsg")
+ private String errmsg;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckRequest.java
new file mode 100644
index 0000000000..2379f14b3c
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckRequest.java
@@ -0,0 +1,37 @@
+package cn.binarywang.wx.miniapp.bean.security;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ */
+@Data
+@Builder
+public class WxMaMsgSecCheckCheckRequest implements Serializable {
+ private static final long serialVersionUID = 3233176903681625506L;
+
+ @SerializedName("version")
+ private String version;
+
+ @SerializedName("openid")
+ private String openid;
+
+ @SerializedName("scene")
+ private Integer scene;
+
+ @SerializedName("content")
+ private String content;
+
+ @SerializedName("nickname")
+ private String nickname;
+
+ @SerializedName("title")
+ private String title;
+
+ @SerializedName("signature")
+ private String signature;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckResponse.java
new file mode 100644
index 0000000000..6e6a93afe3
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckResponse.java
@@ -0,0 +1,72 @@
+package cn.binarywang.wx.miniapp.bean.security;
+
+import cn.binarywang.wx.miniapp.bean.WxMaBaseResponse;
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author liming1019
+ */
+@Data
+@Builder
+public class WxMaMsgSecCheckCheckResponse extends WxMaBaseResponse implements Serializable {
+ private static final long serialVersionUID = 1903247824980080974L;
+ /**
+ * result : {"suggest":"risky","label":20001}
+ * detail : [{"strategy":"content_model","errcode":0,"suggest":"risky","label":20006,"prob":90},{"strategy":"keyword","errcode":0,"suggest":"pass","label":20006,"level":20,"keyword":"命中的关键词1"},{"strategy":"keyword","errcode":0,"suggest":"risky","label":20006,"level":90,"keyword":"命中的关键词2"}]
+ * trace_id : 60ae120f-371d5872-7941a05b
+ */
+ @SerializedName("result")
+ private ResultBean result;
+ @SerializedName("trace_id")
+ private String traceId;
+ @SerializedName("detail")
+ private List detail;
+
+ @Data
+ @Builder
+ public static class ResultBean implements Serializable {
+ /**
+ * suggest : risky
+ * label : 20001
+ */
+
+ @SerializedName("suggest")
+ private String suggest;
+ @SerializedName("label")
+ private String label;
+ }
+
+ @Data
+ @Builder
+ public static class DetailBean implements Serializable {
+ /**
+ * strategy : content_model
+ * errcode : 0
+ * suggest : risky
+ * label : 20006
+ * prob : 90
+ * level : 20
+ * keyword : 命中的关键词1
+ */
+
+ @SerializedName("strategy")
+ private String strategy;
+ @SerializedName("errcode")
+ private Integer errcode;
+ @SerializedName("suggest")
+ private String suggest;
+ @SerializedName("label")
+ private String label;
+ @SerializedName("prob")
+ private Integer prob;
+ @SerializedName("level")
+ private String level;
+ @SerializedName("keyword")
+ private String keyword;
+ }
+}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
index 19bca1ca4f..f55ce9c487 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
@@ -2,6 +2,8 @@
import java.io.File;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckRequest;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckResponse;
import org.testng.annotations.*;
import cn.binarywang.wx.miniapp.api.WxMaService;
@@ -49,4 +51,16 @@ public void testCheckMessage(String msg, boolean result) throws WxErrorException
.checkMessage(msg))
.isEqualTo(result);
}
+
+ @Test(dataProvider = "secData")
+ public void testCheckMessage2(String msg, boolean result) throws WxErrorException {
+ WxMaMsgSecCheckCheckRequest request = WxMaMsgSecCheckCheckRequest.builder()
+ .content(msg)
+ .scene(1)
+ .version("2")
+ .openid("xxx")
+ .build();
+ WxMaMsgSecCheckCheckResponse response = this.wxService.getSecCheckService().checkMessage(request);
+ assertThat(response).isNotNull();
+ }
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java
index 191b429630..060896ab09 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java
@@ -28,4 +28,11 @@ public void testUploadImg() throws WxErrorException {
WxMinishopImageUploadCustomizeResult result = wxService.getShopImgService().uploadImg(file);
assertThat(result).isNotNull();
}
+
+ @Test
+ public void testUploadImg2() throws WxErrorException {
+ File file = new File("/Users/liming/Desktop/test.jpeg");
+ WxMinishopImageUploadCustomizeResult result = wxService.getShopImgService().uploadImg(file, "1");
+ assertThat(result).isNotNull();
+ }
}
From 28b2ca93fb4c3f6db581d3195d0a25683ef53d3f Mon Sep 17 00:00:00 2001
From: ShienPro <19704239+ShienPro@users.noreply.github.com>
Date: Thu, 19 Aug 2021 10:56:34 +0800
Subject: [PATCH 0085/1235] =?UTF-8?q?:new:=20#2260=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A?=
=?UTF-8?q?=E4=B9=89=E7=BB=84=E4=BB=B6=E4=B9=8B=E6=92=A4=E9=94=80=E5=95=86?=
=?UTF-8?q?=E5=93=81=E5=AE=A1=E6=A0=B8=E7=9A=84=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaShopSpuService.java | 3 +++
.../api/impl/WxMaShopSpuServiceImpl.java | 24 ++++++++++++-------
.../miniapp/constant/WxMaApiUrlConstants.java | 1 +
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopSpuService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopSpuService.java
index 183d239670..c896f7eaf5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopSpuService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopSpuService.java
@@ -35,4 +35,7 @@ WxMaShopBaseResponse listingSpu(Integer productId, String outProductId)
WxMaShopBaseResponse delistingSpu(Integer productId, String outProductId)
throws WxErrorException;
+
+ WxMaShopBaseResponse deleteAudit(Integer productId, String outProductId)
+ throws WxErrorException;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopSpuServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopSpuServiceImpl.java
index 4be695a075..94b779c6c9 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopSpuServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopSpuServiceImpl.java
@@ -1,14 +1,5 @@
package cn.binarywang.wx.miniapp.api.impl;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_ADD_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_DELISTING_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_DEL_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_GET_LIST_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_GET_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_LISTING_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_UPDATE_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_UPDATE_WITHOUT_URL;
-
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.WxMaShopSpuService;
import cn.binarywang.wx.miniapp.bean.shop.WxMaShopSpuInfo;
@@ -28,6 +19,8 @@
import me.chanjar.weixin.common.util.json.GsonHelper;
import me.chanjar.weixin.common.util.json.GsonParser;
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.*;
+
/**
* @author boris
*/
@@ -131,4 +124,17 @@ public WxMaShopBaseResponse delistingSpu(Integer productId, String outProductId)
}
return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
}
+
+ @Override
+ public WxMaShopBaseResponse deleteAudit(Integer productId, String outProductId)
+ throws WxErrorException {
+ String responseContent = this.wxMaService
+ .post(DEL_AUDIT_URL, GsonHelper.buildJsonObject("product_id", productId,
+ "out_product_id", outProductId));
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index 28a38a1f20..f65fceaaa8 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -311,6 +311,7 @@ interface Spu {
String SPU_UPDATE_WITHOUT_URL = "https://api.weixin.qq.com/shop/spu/update_without_audit";
String SPU_LISTING_URL = "https://api.weixin.qq.com/shop/spu/listing";
String SPU_DELISTING_URL = "https://api.weixin.qq.com/shop/spu/delisting";
+ String DEL_AUDIT_URL = "https://api.weixin.qq.com/shop/spu/del_audit";
}
interface Order {
From 9531df80679724d82d45f66fde37ee73ac8c1dc4 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Thu, 19 Aug 2021 16:51:40 +0800
Subject: [PATCH 0086/1235] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 2386cce594..8f0a4f95b6 100644
--- a/README.md
+++ b/README.md
@@ -126,6 +126,7 @@
- 未来信封
- 5G惠享
- 生菜wordpress转小程序
+- 丽日购
#### 公众号:
- 中国电信上海网厅(sh_189)
From 373aa777c7ad546ac65d10f861839ef6a87eed9f Mon Sep 17 00:00:00 2001
From: ifhelen <34478773+ifhelen@users.noreply.github.com>
Date: Mon, 23 Aug 2021 22:12:11 +0800
Subject: [PATCH 0087/1235] =?UTF-8?q?:art:=20#2271=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=BA=94=E7=94=A8=E6=B6=88?=
=?UTF-8?q?=E6=81=AF=E5=8F=91=E9=80=81=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E?=
=?UTF-8?q?=E7=B1=BB=E5=A2=9E=E5=8A=A0=E6=B6=88=E6=81=AFid=E5=AD=97?=
=?UTF-8?q?=E6=AE=B5=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=92=A4=E5=9B=9E=E5=BA=94?=
=?UTF-8?q?=E7=94=A8=E6=B6=88=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java
index fa1db1065e..4c41d631b4 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java
@@ -44,7 +44,9 @@ public static WxCpMessageSendResult fromJson(String json) {
@SerializedName("invalidtag")
private String invalidTag;
-
+
+ @SerializedName("msgid")
+ private String msgId;
public List getInvalidUserList() {
return this.content2List(this.invalidUser);
From 226c2af5a17735477a1468701e980e1047a16017 Mon Sep 17 00:00:00 2001
From: huangxm129 <40385667+huangxm129@users.noreply.github.com>
Date: Mon, 23 Aug 2021 22:16:46 +0800
Subject: [PATCH 0088/1235] =?UTF-8?q?:art:=E3=80=90=E4=BC=81=E4=B8=9A?=
=?UTF-8?q?=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BF=AE=E6=94=B9=E6=9F=A5=E8=AF=A2?=
=?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=8E=A5=E6=9B=BF=E7=8A=B6=E6=80=81=E6=9C=AA?=
=?UTF-8?q?=E6=8E=A5=E5=8F=97customer=E6=95=B0=E6=8D=AE=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/bean/external/WxCpUserTransferResultResp.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
index 064c6c3851..53380b55a3 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
@@ -7,6 +7,7 @@
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.io.Serializable;
+import java.util.List;
/**
* 在职成员的客户转接情况
@@ -21,6 +22,8 @@ public class WxCpUserTransferResultResp extends WxCpBaseResp {
@SerializedName("next_cursor")
private String nextCursor;
+ private List customer;
+
public static WxCpUserTransferResultResp fromJson(String json) {
return WxCpGsonBuilder.create().fromJson(json, WxCpUserTransferResultResp.class);
}
From b65783bd726f469955db99df08cf8ee510d1d4d7 Mon Sep 17 00:00:00 2001
From: liming1019
Date: Mon, 23 Aug 2021 22:18:25 +0800
Subject: [PATCH 0089/1235] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E5=AE=A2?=
=?UTF-8?q?=E6=88=B7=E7=AB=AF=E5=9C=A8=E4=BD=BF=E7=94=A8Request=E5=AF=B9?=
=?UTF-8?q?=E8=B1=A1=E6=97=B6=E7=94=B1lombok=E6=B3=A8=E8=A7=A3=E5=BC=95?=
=?UTF-8?q?=E5=8F=91=E7=9A=84=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../request/WxMaShopAfterSaleAddRequest.java | 6 ++++++
.../request/WxMaShopAfterSaleGetRequest.java | 4 ++++
.../request/WxMaShopAfterSaleUpdateRequest.java | 4 ++++
.../shop/request/WxMaShopAuditBrandRequest.java | 8 ++++++++
.../request/WxMaShopAuditCategoryRequest.java | 6 ++++++
.../request/WxMaShopDeliveryRecieveRequest.java | 4 ++++
.../request/WxMaShopDeliverySendRequest.java | 6 ++++++
.../impl/WxMaShopAfterSaleServiceImplTest.java | 16 ++++++++--------
.../impl/WxMaShopDeliveryServiceImplTest.java | 11 +++++------
9 files changed, 51 insertions(+), 14 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java
index 9f9c13e988..47c33f1ae7 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@@ -13,6 +15,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAfterSaleAddRequest implements Serializable {
private static final long serialVersionUID = 6652525413062887786L;
@@ -52,6 +56,8 @@ public class WxMaShopAfterSaleAddRequest implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class ProductInfosBean implements Serializable {
/**
* out_product_id : 234245
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java
index 31afee26ce..fdad13ebb0 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
@@ -12,6 +14,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAfterSaleGetRequest implements Serializable {
private static final long serialVersionUID = -1275475147400719521L;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java
index 8bbeadb1af..d208b239e2 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
@@ -12,6 +14,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAfterSaleUpdateRequest implements Serializable {
private static final long serialVersionUID = 2712027510252221370L;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java
index fec5e3ee57..f589f503f5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@@ -13,6 +15,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAuditBrandRequest implements Serializable {
private static final long serialVersionUID = -969331692973992066L;
@@ -25,6 +29,8 @@ public class WxMaShopAuditBrandRequest implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class AuditReqBean implements Serializable {
/**
* license : ["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]
@@ -38,6 +44,8 @@ public static class AuditReqBean implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class BrandInfoBean implements Serializable {
/**
* brand_audit_type : 1
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java
index 8fe40176c4..300c77db78 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@@ -13,6 +15,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAuditCategoryRequest implements Serializable {
private static final long serialVersionUID = -6730876344556487071L;
@@ -25,6 +29,8 @@ public class WxMaShopAuditCategoryRequest implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class AuditReqBean implements Serializable {
/**
* license : ["www.xxxxx.com"]
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java
index 50ef7a63ef..bbf896626d 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
@@ -12,6 +14,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopDeliveryRecieveRequest implements Serializable {
private static final long serialVersionUID = 1540854758624081221L;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java
index 6636b64055..bf8acced5e 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@@ -13,6 +15,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopDeliverySendRequest implements Serializable {
private static final long serialVersionUID = -4034672301224469057L;
@@ -37,6 +41,8 @@ public class WxMaShopDeliverySendRequest implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class DeliveryListBean implements Serializable {
/**
* delivery_id : SF
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java
index 3d38d82e01..75538a1510 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java
@@ -29,19 +29,19 @@ public class WxMaShopAfterSaleServiceImplTest {
@Test
public void testAdd() throws WxErrorException {
WxMaShopAfterSaleAddRequest.ProductInfosBean productInfosBean = WxMaShopAfterSaleAddRequest.ProductInfosBean.builder()
- .outProductId("234245")
- .outSkuId("23424")
- .productCnt(5)
+ .outProductId("19030")
+ .outSkuId("123266")
+ .productCnt(1)
.build();
WxMaShopAfterSaleAddRequest request = WxMaShopAfterSaleAddRequest.builder()
- .outOrderId("xxxxx")
- .outAftersaleId("xxxxxx")
- .openid("oTVP50O53a7jgmawAmxKukNlq3XI")
+ .outOrderId("318070290792415232X")
+ .outAftersaleId("318092069606883328X")
+ .openid("odIi15CuQ0IQviqsnUMy6CKNetrMX")
.type(1)
- .createTime("2020-12-01 00:00:00")
+ .createTime("2021-08-20 00:00:00")
.status(1)
.finishAllAftersale(0)
- .path("/pages/aftersale.html?out_aftersale_id=xxxxx")
+ .path("/pages/aftersale.html?out_aftersale_id=318092069606883328X")
.refund(100L)
.productInfos(new ArrayList<>(Arrays.asList(productInfosBean)))
.build();
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java
index e19a9c0862..ab27cbdeb7 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java
@@ -34,14 +34,13 @@ public void testGetCompanyList() throws WxErrorException {
@Test
public void testSend() throws WxErrorException {
WxMaShopDeliverySendRequest.DeliveryListBean deliveryListBean = WxMaShopDeliverySendRequest.DeliveryListBean.builder()
- .deliveryId("SF")
- .waybillId("23424324253")
+ .deliveryId("ZTO")
+ .waybillId("73164691843558")
.build();
WxMaShopDeliverySendRequest request = WxMaShopDeliverySendRequest.builder()
- .orderId(123456L)
- .outOrderId("xxxxx")
- .openid("oTVP50O53a7jgmawAmxKukNlq3XI")
- .finishAllDelivery(0)
+ .outOrderId("318070290792415232")
+ .openid("odIi15CuQ0IQviqsnUMy6CKNetrM")
+ .finishAllDelivery(1)
.deliveryList(new ArrayList<>(Arrays.asList(deliveryListBean)))
.build();
WxMaShopBaseResponse response = wxService.getShopDeliveryService().send(request);
From 28156fcb3a2501d2f4912348e5c53e9b337dee86 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 23 Aug 2021 22:34:33 +0800
Subject: [PATCH 0090/1235] =?UTF-8?q?:art:=20#2272=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=8F=91=E9=80=81=E6=96=B0?=
=?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=AC=A2=E8=BF=8E=E8=AF=AD=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9file=E6=96=87=E4=BB=B6=E6=B6=88?=
=?UTF-8?q?=E6=81=AF=E7=9A=84=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/bean/external/msg/Attachment.java | 52 ++++++-------------
.../weixin/cp/bean/external/msg/File.java | 18 +++++++
.../weixin/cp/constant/WxCpConsts.java | 5 ++
3 files changed, 38 insertions(+), 37 deletions(-)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/File.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java
index 0c64b9bf63..7dce73ad03 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java
@@ -1,10 +1,15 @@
package me.chanjar.weixin.cp.bean.external.msg;
import com.google.gson.annotations.SerializedName;
+import lombok.Data;
import me.chanjar.weixin.cp.constant.WxCpConsts;
import java.io.Serializable;
+/**
+ * @author chutian0124
+ */
+@Data
public class Attachment implements Serializable {
private static final long serialVersionUID = -8078748379570640198L;
@@ -15,62 +20,35 @@ public class Attachment implements Serializable {
private Link link;
- private MiniProgram miniprogram;
+ @SerializedName("miniprogram")
+ private MiniProgram miniProgram;
private Video video;
- @Override
- public String toString() {
- return "Attachment{" +
- "msgType='" + msgType + '\'' +
- ", image=" + image +
- ", link=" + link +
- ", miniprogram=" + miniprogram +
- ", video=" + video +
- '}';
- }
-
- private String getMsgType() {
- return msgType;
- }
-
- private void setMsgType(String msgType) {
- this.msgType = msgType;
- }
-
- public Image getImage() {
- return image;
- }
+ private File file;
public void setImage(Image image) {
this.image = image;
this.msgType = WxCpConsts.WelcomeMsgType.IMAGE;
}
- public Link getLink() {
- return link;
- }
-
public void setLink(Link link) {
this.link = link;
this.msgType = WxCpConsts.WelcomeMsgType.LINK;
}
- public MiniProgram getMiniprogram() {
- return miniprogram;
- }
-
- public void setMiniprogram(MiniProgram miniprogram) {
- this.miniprogram = miniprogram;
+ public void setMiniProgram(MiniProgram miniProgram) {
+ this.miniProgram = miniProgram;
this.msgType = WxCpConsts.WelcomeMsgType.MINIPROGRAM;
}
- public Video getVideo() {
- return video;
- }
-
public void setVideo(Video video) {
this.video = video;
this.msgType = WxCpConsts.WelcomeMsgType.VIDEO;
}
+
+ public void setFile(File file ) {
+ this.file = file;
+ this.msgType = WxCpConsts.WelcomeMsgType.FILE;
+ }
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/File.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/File.java
new file mode 100644
index 0000000000..a9726322e6
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/File.java
@@ -0,0 +1,18 @@
+package me.chanjar.weixin.cp.bean.external.msg;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Binary Wang
+ * @date 2021-08-23
+ */
+@Data
+public class File implements Serializable {
+ private static final long serialVersionUID = 2794189478198329090L;
+
+ @SerializedName("media_id")
+ private String mediaId;
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java
index 69db78efbe..601c7dbb30 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java
@@ -353,5 +353,10 @@ public static class WelcomeMsgType {
* 小程序消息.
*/
public static final String MINIPROGRAM = "miniprogram";
+
+ /**
+ * 文件消息.
+ */
+ public static final String FILE = "file";
}
}
From af212bd68fefdb8f41d86d60be33e5ee68056cc1 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 23 Aug 2021 23:11:53 +0800
Subject: [PATCH 0091/1235] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.7.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index fb5ad2f91b..7acba77d54 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 3209761d7e..ce755fd86c 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 5905faf7ca..522dd844be 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index 14706dc8f3..7e47cbe62d 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index 2bd024114e..1a1e8a67e2 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 501594d231..391f2d48de 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 1cd2e60f68..08d82ac1f8 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index e22af0eba2..5fa142ec70 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index e9ecbcb0cd..f197d9efe5 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 45477235b7..c836d6d2e0 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 51f89785f4..2edd2fce79 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 92494bb955..6c93330117 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index 68e94348dd..c76fd9136d 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index b7b2247bfe..ceb69a1ba3 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index 2be86f12b6..c39fa67ddf 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-qidian
From 159471c9cb8c1e6b6613b1dc666c82a2f2dce531 Mon Sep 17 00:00:00 2001
From: 721806280 <33091348+721806280@users.noreply.github.com>
Date: Wed, 25 Aug 2021 15:13:21 +0800
Subject: [PATCH 0092/1235] :art: Update pom.xml
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 7acba77d54..73dfc916ab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -175,7 +175,7 @@
com.thoughtworks.xstream
xstream
- 1.4.17
+ 1.4.18
com.google.guava
From 2a36ebf45fc332fee57a314140927da3b0d4f181 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 30 Aug 2021 16:49:29 +0800
Subject: [PATCH 0093/1235] :arrow_up: Bump xstream in /others/weixin-java-osgi
(#2280)
Bumps [xstream](https://github.com/x-stream/xstream) from 1.4.17 to 1.4.18.
- [Release notes](https://github.com/x-stream/xstream/releases)
- [Commits](https://github.com/x-stream/xstream/commits)
---
updated-dependencies:
- dependency-name: com.thoughtworks.xstream:xstream
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
others/weixin-java-osgi/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/others/weixin-java-osgi/pom.xml b/others/weixin-java-osgi/pom.xml
index 28826b5df3..7207e9b99d 100644
--- a/others/weixin-java-osgi/pom.xml
+++ b/others/weixin-java-osgi/pom.xml
@@ -28,7 +28,7 @@
com.thoughtworks.xstream
xstream
- 1.4.17
+ 1.4.18
provided
From 59a1456799d0c3aff5b3ab136f648ac0a96b944e Mon Sep 17 00:00:00 2001
From: ArBing
Date: Sun, 5 Sep 2021 16:03:37 +0800
Subject: [PATCH 0094/1235] =?UTF-8?q?:new:=20#2298=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=A2=9E=E5=8A=A0=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=E5=95=86=E6=A8=A1=E5=BC=8F=E5=A4=96=E9=83=A8=E8=81=94?=
=?UTF-8?q?=E7=B3=BB=E4=BA=BAunionid=E8=BD=AC=E6=8D=A2=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/api/WxCpExternalContactService.java | 23 +++++++++++++++++++
.../impl/WxCpExternalContactServiceImpl.java | 10 ++++++++
.../weixin/cp/constant/WxCpApiPathConsts.java | 1 +
3 files changed, 34 insertions(+)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
index 0f06a9adba..c7507d656d 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
@@ -159,6 +159,29 @@ public interface WxCpExternalContactService {
*/
String convertToOpenid(String externalUserid) throws WxErrorException;
+ /**
+ * 服务商为企业代开发微信小程序的场景,服务商可通过此接口,将微信客户的unionid转为external_userid。
+ *
+ *
+ * 文档地址:https://work.weixin.qq.com/api/doc/90001/90143/93274
+ *
+ * 服务商代开发小程序指企业使用的小程序为企业主体的,非服务商主体的小程序。
+ * 场景:企业客户在微信端从企业主体的小程序(非服务商应用)登录,同时企业在企业微信安装了服务商的第三方应用,服务商可以调用该接口将登录用户的unionid转换为服务商全局唯一的外部联系人id
+ *
+ * 权限说明:
+ *
+ * 仅认证企业可调用
+ * unionid必须是企业主体下的unionid。即unionid的主体(为绑定了该小程序的微信开放平台账号主体)需与当前企业的主体一致。
+ * unionid的主体(即微信开放平台账号主体)需认证
+ * 该客户的跟进人必须在应用的可见范围之内
+ *
+ *
+ * @param unionid 微信客户的unionid
+ * @return 该企业的外部联系人ID
+ * @throws WxErrorException .
+ */
+ String unionidToExternalUserid(String unionid) throws WxErrorException;
+
/**
* 批量获取客户详情.
*
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
index 60c7c068ba..29d70a2595 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
@@ -137,6 +137,16 @@ public String convertToOpenid(@NotNull String externalUserId) throws WxErrorExce
return tmpJson.get("openid").getAsString();
}
+ @Override
+ public String unionidToExternalUserid(@NotNull String unionid) throws WxErrorException {
+ JsonObject json = new JsonObject();
+ json.addProperty("unionid", unionid);
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(UNIONID_TO_EXTERNAL_USERID);
+ String responseContent = this.mainService.post(url, json.toString());
+ JsonObject tmpJson = GsonParser.parse(responseContent);
+ return tmpJson.get("external_userid").getAsString();
+ }
+
@Override
public WxCpExternalContactBatchInfo getContactDetailBatch(String userId,
String cursor,
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 98bd7425c5..1a184e9a54 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
@@ -181,6 +181,7 @@ interface ExternalContact {
String GET_FOLLOW_USER_LIST = "/cgi-bin/externalcontact/get_follow_user_list";
String GET_CONTACT_DETAIL = "/cgi-bin/externalcontact/get?external_userid=";
String CONVERT_TO_OPENID = "/cgi-bin/externalcontact/convert_to_openid";
+ String UNIONID_TO_EXTERNAL_USERID = "/cgi-bin/externalcontact/unionid_to_external_userid";
String GET_CONTACT_DETAIL_BATCH = "/cgi-bin/externalcontact/batch/get_by_user?";
String UPDATE_REMARK = "/cgi-bin/externalcontact/remark";
String LIST_EXTERNAL_CONTACT = "/cgi-bin/externalcontact/list?userid=";
From b06cc90f94c1702226d37b7068f7124d6ba3cd79 Mon Sep 17 00:00:00 2001
From: dinghe1018 <33716606+dinghe1018@users.noreply.github.com>
Date: Sun, 5 Sep 2021 16:06:30 +0800
Subject: [PATCH 0095/1235] =?UTF-8?q?:bug:=20#2284=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E4=BF=AE=E5=A4=8D=E7=9B=B4=E6=92=AD?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9A=84type=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
index 4078cd77e1..7d880ecc89 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
@@ -101,6 +101,7 @@ public static class RoomInfo implements Serializable {
private String anchorWechat;
@SerializedName("anchor_img")
private String anchorImg;
+ @SerializedName("live_type")
private Integer type;
@SerializedName("screen_type")
private Integer screenType;
From ba99224d137a36f44e384bb5e78cdef3ea5e23de Mon Sep 17 00:00:00 2001
From: xingyao
Date: Sun, 5 Sep 2021 22:17:30 +0800
Subject: [PATCH 0096/1235] =?UTF-8?q?:art:=20#2295=20=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E6=89=B9=E9=87=8F=E8=8E=B7?=
=?UTF-8?q?=E5=8F=96=E5=A4=96=E9=83=A8=E5=AE=A2=E6=88=B7=E8=AF=A6=E6=83=85?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AAuserId?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/api/WxCpExternalContactService.java | 73 ++++++++++---------
.../impl/WxCpExternalContactServiceImpl.java | 4 +-
.../WxCpExternalContactServiceImplTest.java | 15 +++-
3 files changed, 53 insertions(+), 39 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
index c7507d656d..2a6ffe218a 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
@@ -153,6 +153,7 @@ public interface WxCpExternalContactService {
/**
* 企业和服务商可通过此接口,将微信外部联系人的userid转为微信openid,用于调用支付相关接口。暂不支持企业微信外部联系人(ExternalUserid为wo开头)的userid转openid。
+ *
* @param externalUserid 微信外部联系人的userid
* @return 该企业的外部联系人openid
* @throws WxErrorException .
@@ -197,13 +198,13 @@ public interface WxCpExternalContactService {
* 第三方/自建应用调用时,返回的跟进人follow_user仅包含应用可见范围之内的成员。
*
*
- * @param userId 企业成员的userid,注意不是外部联系人的帐号
- * @param cursor the cursor
- * @param limit the limit
+ * @param userIdList 企业成员的userid列表,注意不是外部联系人的帐号
+ * @param cursor the cursor
+ * @param limit the limit
* @return wx cp user external contact batch info
* @throws WxErrorException .
*/
- WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
+ WxCpExternalContactBatchInfo getContactDetailBatch(String[] userIdList, String cursor,
Integer limit)
throws WxErrorException;
@@ -273,24 +274,25 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* @param takeOverUserid the take over userid
* @return wx cp base resp
* @throws WxErrorException the wx error exception
- * @deprecated 此后续将不再更新维护,建议使用 {@link #transferCustomer(WxCpUserTransferCustomerReq)}
+ * @deprecated 此后续将不再更新维护, 建议使用 {@link #transferCustomer(WxCpUserTransferCustomerReq)}
*/
@Deprecated
WxCpBaseResp transferExternalContact(String externalUserid, String handOverUserid, String takeOverUserid) throws WxErrorException;
/**
* 企业可通过此接口,转接在职成员的客户给其他成员。
- *
+ *
* external_userid必须是handover_userid的客户(即配置了客户联系功能的成员所添加的联系人)。
* 在职成员的每位客户最多被分配2次。客户被转接成功后,将有90个自然日的服务关系保护期,保护期内的客户无法再次被分配。
- *
+ *
* 权限说明:
- * * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
+ * * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->在职继承”权限
* 接替成员必须在此第三方应用或自建应用的可见范围内。
* 接替成员需要配置了客户联系功能。
* 接替成员需要在企业微信激活且已经过实名认证。
- *
+ *
+ *
* @param req 转接在职成员的客户给其他成员请求实体
* @return wx cp base resp
* @throws WxErrorException the wx error exception
@@ -300,35 +302,37 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
/**
* 企业和第三方可通过此接口查询在职成员的客户转接情况。
*
- * 权限说明:
- *
+ * 权限说明:
+ *
* 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->在职继承”权限
* 接替成员必须在此第三方应用或自建应用的可见范围内。
*
+ *
* @param handOverUserid 原添加成员的userid
* @param takeOverUserid 接替成员的userid
- * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
+ * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
* @return 客户转接接口实体
* @throws WxErrorException the wx error exception
*/
- WxCpUserTransferResultResp transferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
+ WxCpUserTransferResultResp transferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
/**
* 企业可通过此接口,分配离职成员的客户给其他成员。
- *
+ *
* handover_userid必须是已离职用户。
* external_userid必须是handover_userid的客户(即配置了客户联系功能的成员所添加的联系人)。
* 在职成员的每位客户最多被分配2次。客户被转接成功后,将有90个自然日的服务关系保护期,保护期内的客户无法再次被分配。
- *
+ *
* 权限说明:
- *
+ *
* 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->离职分配”权限
* 接替成员必须在此第三方应用或自建应用的可见范围内。
* 接替成员需要配置了客户联系功能。
* 接替成员需要在企业微信激活且已经过实名认证。
- *
+ *
+ *
* @param req 转接在职成员的客户给其他成员请求实体
* @return wx cp base resp
* @throws WxErrorException the wx error exception
@@ -339,18 +343,19 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* 企业和第三方可通过此接口查询离职成员的客户分配情况。
*
* 权限说明:
- *
+ *
* 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->在职继承”权限
* 接替成员必须在此第三方应用或自建应用的可见范围内。
*
+ *
* @param handOverUserid 原添加成员的userid
* @param takeOverUserid 接替成员的userid
- * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
+ * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
* @return 客户转接接口实体
* @throws WxErrorException the wx error exception
*/
- WxCpUserTransferResultResp resignedTransferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
+ WxCpUserTransferResultResp resignedTransferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
/**
*
@@ -360,7 +365,6 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* 微信文档:https://work.weixin.qq.com/api/doc/90000/90135/92119
*
*
- * @deprecated 请使用 {@link WxCpExternalContactService#listGroupChat(Integer, String, int, String[])}
* @param pageIndex the page index
* @param pageSize the page size
* @param status the status
@@ -368,6 +372,7 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* @param partyIds the party ids
* @return the wx cp user external group chat list
* @throws WxErrorException the wx error exception
+ * @deprecated 请使用 {@link WxCpExternalContactService#listGroupChat(Integer, String, int, String[])}
*/
@Deprecated
WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pageSize, int status, String[] userIds, String[] partyIds) throws WxErrorException;
@@ -380,10 +385,10 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* 微信文档:https://work.weixin.qq.com/api/doc/90000/90135/92119
*
*
- * @param limit 分页,预期请求的数据量,取值范围 1 ~ 1000
- * @param cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填
- * @param status 客户群跟进状态过滤。0 - 所有列表(即不过滤) 1 - 离职待继承 2 - 离职继承中 3 - 离职继承完成 默认为0
- * @param userIds 群主过滤。如果不填,表示获取应用可见范围内全部群主的数据(但是不建议这么用,如果可见范围人数超过1000人,为了防止数据包过大,会报错 81017);用户ID列表。最多100个
+ * @param limit 分页,预期请求的数据量,取值范围 1 ~ 1000
+ * @param cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填
+ * @param status 客户群跟进状态过滤。0 - 所有列表(即不过滤) 1 - 离职待继承 2 - 离职继承中 3 - 离职继承完成 默认为0
+ * @param userIds 群主过滤。如果不填,表示获取应用可见范围内全部群主的数据(但是不建议这么用,如果可见范围人数超过1000人,为了防止数据包过大,会报错 81017);用户ID列表。最多100个
* @return the wx cp user external group chat list
* @throws WxErrorException the wx error exception
*/
@@ -404,30 +409,30 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
WxCpUserExternalGroupChatInfo getGroupChat(String chatId, Integer needName) throws WxErrorException;
/**
- *
* 企业可通过此接口,将已离职成员为群主的群,分配给另一个客服成员。
*
*
* 注意::
- *
+ *
* 群主离职了的客户群,才可继承
* 继承给的新群主,必须是配置了客户联系功能的成员
* 继承给的新群主,必须有设置实名
* 继承给的新群主,必须有激活企业微信
* 同一个人的群,限制每天最多分配300个给新群主
- *
+ *
* 权限说明:
- *
+ *
* 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->分配离职成员的客户群”权限
* 对于第三方/自建应用,群主必须在应用的可见范围。
*
- * @param chatIds 需要转群主的客户群ID列表。取值范围: 1 ~ 100
- * @param newOwner 新群主ID
+ *
+ * @param chatIds 需要转群主的客户群ID列表。取值范围: 1 ~ 100
+ * @param newOwner 新群主ID
* @return 分配结果,主要是分配失败的群列表
- * @throws WxErrorException the wx error exception
+ * @throws WxErrorException the wx error exception
*/
- WxCpUserExternalGroupChatTransferResp transferGroupChat(String[] chatIds, String newOwner) throws WxErrorException;
+ WxCpUserExternalGroupChatTransferResp transferGroupChat(String[] chatIds, String newOwner) throws WxErrorException;
/**
*
@@ -520,7 +525,7 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* 同时传递tag_id和group_id时,忽略tag_id,仅以group_id作为过滤条件。
*
*
- * @param tagId the tag id
+ * @param tagId the tag id
* @param groupId the tagGroup id
* @return corp tag list
* @throws WxErrorException the wx error exception
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
index 29d70a2595..d4b4e7db48 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
@@ -148,7 +148,7 @@ public String unionidToExternalUserid(@NotNull String unionid) throws WxErrorExc
}
@Override
- public WxCpExternalContactBatchInfo getContactDetailBatch(String userId,
+ public WxCpExternalContactBatchInfo getContactDetailBatch(String[] userIdList,
String cursor,
Integer limit)
throws WxErrorException {
@@ -157,7 +157,7 @@ public WxCpExternalContactBatchInfo getContactDetailBatch(String userId,
.getWxCpConfigStorage()
.getApiUrl(GET_CONTACT_DETAIL_BATCH);
JsonObject json = new JsonObject();
- json.addProperty("userid", userId);
+ json.add("userid_list", new Gson().toJsonTree(userIdList).getAsJsonArray());
if (StringUtils.isNotBlank(cursor)) {
json.addProperty("cursor", cursor);
}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
index accd8f2701..cfbdcca930 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
@@ -7,6 +7,7 @@
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.bean.external.*;
+import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactBatchInfo;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactInfo;
import me.chanjar.weixin.cp.bean.external.msg.Attachment;
import me.chanjar.weixin.cp.bean.external.msg.Image;
@@ -115,6 +116,14 @@ public void testGetContactDetail() throws WxErrorException {
assertNotNull(result);
}
+ @Test
+ public void testGetContactDetailBatch() throws WxErrorException {
+ String userId = this.configStorage.getUserId();
+ WxCpExternalContactBatchInfo result = this.wxCpService.getExternalContactService().getContactDetailBatch(new String[]{userId}, "", 100);
+ System.out.println(result);
+ assertNotNull(result);
+ }
+
@Test
public void testGetCorpTagList() throws WxErrorException {
String[] tag = {};
@@ -236,14 +245,14 @@ public void testresignedTrnsferResult() throws WxErrorException {
@Test
public void testListGroupChat() throws WxErrorException {
- WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(0, 100 ,0,new String[1],new String[1]);
+ WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(0, 100, 0, new String[1], new String[1]);
System.out.println(result);
assertNotNull(result);
}
@Test
public void testListGroupChatV3() throws WxErrorException {
- WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(100, "" ,0,new String[1]);
+ WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(100, "", 0, new String[1]);
System.out.println(result);
assertNotNull(result);
}
@@ -301,7 +310,7 @@ public void testUpdateRemark() throws WxErrorException {
.externalUserId("aaa")
.remark("aa")
.remarkCompany("aaa")
- .remarkMobiles(new String[]{"111","222"})
+ .remarkMobiles(new String[]{"111", "222"})
.remarkPicMediaId("aaa")
.build());
}
From 5f35ab27fb118c6af4052a5f9ba79478f0f8e3fe Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 5 Sep 2021 23:00:54 +0800
Subject: [PATCH 0097/1235] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.8.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index 73dfc916ab..b573e8b85e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index ce755fd86c..9f867c34d5 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 522dd844be..5365e12b52 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index 7e47cbe62d..1a261b44f0 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index 1a1e8a67e2..c0c806020a 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 391f2d48de..64c7ff1020 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 08d82ac1f8..0dd830a4b4 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index 5fa142ec70..f86fe25683 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index f197d9efe5..a83cb838c0 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index c836d6d2e0..6b034d30c1 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 2edd2fce79..ef301b5071 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 6c93330117..7a56d4fe1d 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index c76fd9136d..d84eea879c 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index ceb69a1ba3..c32188ba2f 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index c39fa67ddf..35a6475d4a 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-qidian
From 8f4993971d07fa22240a85c147b605ce578c6700 Mon Sep 17 00:00:00 2001
From: Leeway
Date: Tue, 7 Sep 2021 22:41:08 +0800
Subject: [PATCH 0098/1235] =?UTF-8?q?:new:=20#2305=E3=80=90=E5=85=AC?=
=?UTF-8?q?=E4=BC=97=E5=8F=B7=E3=80=91=E5=BE=AE=E4=BF=A1=E4=BA=8B=E4=BB=B6?=
=?UTF-8?q?=E6=B6=88=E6=81=AF=E7=B1=BB=E5=A2=9E=E5=8A=A0=E7=BE=A4=E5=8F=91?=
=?UTF-8?q?=E5=9B=BE=E6=96=87=E7=9A=84url=E7=BB=93=E6=9E=9C=E5=B1=9E?=
=?UTF-8?q?=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mp/bean/message/ArticleUrlResult.java | 48 +++++++++++++++++++
.../mp/bean/message/WxMpXmlMessage.java | 5 +-
2 files changed, 52 insertions(+), 1 deletion(-)
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java
new file mode 100644
index 0000000000..e635e7e506
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java
@@ -0,0 +1,48 @@
+package me.chanjar.weixin.mp.bean.message;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamConverter;
+import lombok.Data;
+import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author plw on 2021/9/7 10:39 AM.
+ * @version 1.0
+ */
+@XStreamAlias("ArticleUrlResult")
+@Data
+public class ArticleUrlResult implements Serializable {
+
+ @XStreamAlias("ResultList")
+ private List- resultList;
+
+ @XStreamAlias("Count")
+ private Long count;
+
+ @Override
+ public String toString() {
+ return WxMpGsonBuilder.create().toJson(this);
+ }
+
+ @XStreamAlias("item")
+ @Data
+ public static class Item implements Serializable {
+
+ @XStreamAlias("ArticleIdx")
+ private String articleIdx;
+
+ @XStreamAlias("ArticleUrl")
+ @XStreamConverter(value = XStreamCDataConverter.class)
+ private String articleUrl;
+
+ @Override
+ public String toString() {
+ return WxMpGsonBuilder.create().toJson(this);
+ }
+
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java
index 43d6a47bde..56af43a642 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java
@@ -353,6 +353,9 @@ public class WxMpXmlMessage implements Serializable {
@XStreamAlias("SendLocationInfo")
private SendLocationInfo sendLocationInfo = new SendLocationInfo();
+ @XStreamAlias("ArticleUrlResult")
+ private ArticleUrlResult articleUrlResult = new ArticleUrlResult();
+
/**
* 审核不通过原因
*/
@@ -446,7 +449,7 @@ public class WxMpXmlMessage implements Serializable {
/**
* 审核结果,成功succ 或失败fail.
- *
+ *
* 在商品审核结果推送时,verify_ok表示审核通过,verify_not_pass表示审核未通过。
*/
@XStreamAlias("Result")
From f7f2121fcae5211a3d9c47f1cc9b78f4abdbd523 Mon Sep 17 00:00:00 2001
From: yiyi910
Date: Tue, 7 Sep 2021 22:43:10 +0800
Subject: [PATCH 0099/1235] =?UTF-8?q?:bug:=20#2301=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E4=BF=AE=E5=A4=8D=E7=94=9F=E6=88=90?=
=?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=A0=81=E7=9A=84okhttp=E4=B8=8EJod?=
=?UTF-8?q?d=E5=AE=9E=E7=8E=B0=E7=B1=BB=E5=BD=93=E5=BE=AE=E4=BF=A1?=
=?UTF-8?q?=E5=90=8E=E7=AB=AF=E6=8A=A5=E9=94=99=E6=97=B6=E4=B8=8D=E4=BC=9A?=
=?UTF-8?q?=E6=8A=9B=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../JoddHttpQrcodeFileRequestExecutor.java | 9 ++-
.../JoddQrcodeBytesRequestExecutor.java | 55 +++++++++++++++++++
.../OkHttpQrcodeBytesRequestExecutor.java | 6 +-
.../OkHttpQrcodeFileRequestExecutor.java | 6 +-
4 files changed, 67 insertions(+), 9 deletions(-)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddQrcodeBytesRequestExecutor.java
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpQrcodeFileRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpQrcodeFileRequestExecutor.java
index 714a857ae1..d63e29c5d4 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpQrcodeFileRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpQrcodeFileRequestExecutor.java
@@ -57,12 +57,15 @@ public File execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper, WxType
HttpResponse response = request.send();
response.charset(StandardCharsets.UTF_8.name());
String contentTypeHeader = response.header("Content-Type");
- if (MimeTypes.MIME_TEXT_PLAIN.equals(contentTypeHeader)) {
+ if (MimeTypes.MIME_APPLICATION_JSON.equals(contentTypeHeader)) {
String responseContent = response.bodyText();
- throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ throw new WxErrorException(WxError.fromJson(responseContent, wxType));
}
try (InputStream inputStream = new ByteArrayInputStream(response.bodyBytes())) {
- return FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), "jpg");
+ if (StringUtils.isBlank(filePath)) {
+ return FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), "jpg");
+ }
+ return FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), "jpg", Paths.get(filePath).toFile());
}
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddQrcodeBytesRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddQrcodeBytesRequestExecutor.java
new file mode 100644
index 0000000000..234360a735
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddQrcodeBytesRequestExecutor.java
@@ -0,0 +1,55 @@
+package cn.binarywang.wx.miniapp.executor;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
+import jodd.http.HttpConnectionProvider;
+import jodd.http.HttpRequest;
+import jodd.http.HttpResponse;
+import jodd.http.ProxyInfo;
+import jodd.net.MimeTypes;
+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.util.http.RequestHttp;
+
+/**
+ * @author vania
+ * @since 2021/09/06
+ */
+public class JoddQrcodeBytesRequestExecutor extends QrcodeBytesRequestExecutor {
+
+
+ public JoddQrcodeBytesRequestExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ /**
+ * 执行http请求.
+ *
+ * @param uri uri
+ * @param qrcodeWrapper 数据
+ * @param wxType 微信模块类型
+ * @return 响应结果
+ * @throws WxErrorException 自定义异常
+ * @throws IOException io异常
+ */
+ @Override
+ public byte[] execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper, WxType wxType) throws WxErrorException, IOException {
+ HttpRequest request = HttpRequest.get(uri);
+ if (requestHttp.getRequestHttpProxy() != null) {
+ requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
+ }
+ request.withConnectionProvider(requestHttp.getRequestHttpClient());
+
+ HttpResponse response = request.send();
+ response.charset(StandardCharsets.UTF_8.name());
+ String contentTypeHeader = response.header("Content-Type");
+ if (MimeTypes.MIME_APPLICATION_JSON.equals(contentTypeHeader)) {
+ String responseContent = response.bodyText();
+ throw new WxErrorException(WxError.fromJson(responseContent, wxType));
+ }
+ return response.bodyBytes();
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpQrcodeBytesRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpQrcodeBytesRequestExecutor.java
index 9a1c677af1..d716987ceb 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpQrcodeBytesRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpQrcodeBytesRequestExecutor.java
@@ -35,13 +35,13 @@ public OkHttpQrcodeBytesRequestExecutor(RequestHttp
Date: Tue, 7 Sep 2021 22:44:03 +0800
Subject: [PATCH 0100/1235] =?UTF-8?q?:new:=20#2281=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E5=B0=8F=E7=A8=8B?=
=?UTF-8?q?=E5=BA=8F=E5=8A=A0=E5=AF=86=E7=BD=91=E7=BB=9C=E9=80=9A=E9=81=93?=
=?UTF-8?q?=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaInternetService.java | 27 ++++++++
.../wx/miniapp/api/WxMaService.java | 7 +++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 6 ++
.../api/impl/WxMaInternetServiceImpl.java | 33 ++++++++++
.../bean/internet/WxMaInternetResponse.java | 61 +++++++++++++++++++
.../internet/WxMaInternetUserKeyInfo.java | 56 +++++++++++++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 4 ++
.../api/impl/WxMaInternetServiceImplTest.java | 29 +++++++++
8 files changed, 223 insertions(+)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaInternetService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetUserKeyInfo.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImplTest.java
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaInternetService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaInternetService.java
new file mode 100644
index 0000000000..8e6a3e2d80
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaInternetService.java
@@ -0,0 +1,27 @@
+package cn.binarywang.wx.miniapp.api;
+
+import cn.binarywang.wx.miniapp.bean.internet.WxMaInternetResponse;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ *
+ * 【小程序-服务端-网络】网络相关接口.
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/internet/internet.getUserEncryptKey.html
+ *
+ * @author chutian0124
+ */
+public interface WxMaInternetService {
+ /**
+ *
+ *
+ *
+ * 获取用户encryptKey。 会获取用户最近3次的key,每个key的存活时间为3600s。
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/internet/internet.getUserEncryptKey.html
+ * 接口地址:POST https://api.weixin.qq.com/wxa/business/getuserencryptkey?access_token=ACCESS_TOKEN&openid=OPENID&signature=SIGNATURE&sig_method=hmac_sha256
+ *
+ *
+ * @return {@link WxMaInternetResponse}
+ * @throws WxErrorException
+ */
+ WxMaInternetResponse getUserEncryptKey() 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 a182c245cd..1ebf7d7eba 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
@@ -342,6 +342,13 @@ public interface WxMaService extends WxService {
*/
WxMaCloudService getCloudService();
+ /**
+ * 获取服务端网络接口服务对象
+ *
+ * @return 。internet service
+ */
+ WxMaInternetService getInternetService();
+
/**
* 获取直播接口服务对象
*
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 096eedd5bf..ecbce2ee05 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
@@ -49,6 +49,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaSchemeService schemeService = new WxMaSchemeServiceImpl(this);
private final WxMaAnalysisService analysisService = new WxMaAnalysisServiceImpl(this);
private final WxMaCodeService codeService = new WxMaCodeServiceImpl(this);
+ private final WxMaInternetService internetService = new WxMaInternetServiceImpl(this);
private final WxMaSettingService settingService = new WxMaSettingServiceImpl(this);
private final WxMaJsapiService jsapiService = new WxMaJsapiServiceImpl(this);
private final WxMaShareService shareService = new WxMaShareServiceImpl(this);
@@ -488,6 +489,11 @@ public WxMaCloudService getCloudService() {
return this.cloudService;
}
+ @Override
+ public WxMaInternetService getInternetService() {
+ return this.internetService;
+ }
+
@Override
public WxMaLiveService getLiveService() {
return this.liveService;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImpl.java
new file mode 100644
index 0000000000..8ee023baf5
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImpl.java
@@ -0,0 +1,33 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaInternetService;
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.internet.WxMaInternetResponse;
+import cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.common.enums.WxType;
+import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ *
+ * 服务端网络相关接口
+ *
+ * @author chutian0124
+ * @Date 2021-09-06
+ */
+@RequiredArgsConstructor
+public class WxMaInternetServiceImpl implements WxMaInternetService {
+ private final WxMaService wxMaService;
+
+ @Override
+ public WxMaInternetResponse getUserEncryptKey() throws WxErrorException {
+ String responseContent = this.wxMaService.post(WxMaApiUrlConstants.Internet.GET_USER_ENCRYPT_KEY, "");
+ WxMaInternetResponse response = WxMaGsonBuilder.create().fromJson(responseContent, WxMaInternetResponse.class);
+ if (response.getErrcode() == -1) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return response;
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetResponse.java
new file mode 100644
index 0000000000..da9cfbc059
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetResponse.java
@@ -0,0 +1,61 @@
+package cn.binarywang.wx.miniapp.bean.internet;
+
+import cn.binarywang.wx.miniapp.bean.WxMaBaseResponse;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ *
+ *
+ * 获取用户encryptKey。 用户最近三次的加密key,每个key的存活时间为3600s。
+ * 【小程序-服务端-网络】网络相关接口.
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/internet/internet.getUserEncryptKey.html
+ * 微信返回报文:
+ * {
+ * "errcode":0,
+ * "errmsg":"ok",
+ * "key_info_list":
+ * [
+ * {
+ * "encrypt_key":"VI6BpyrK9XH4i4AIGe86tg==",
+ * "version":10,
+ * "expire_in":3597,
+ * "iv":"6003f73ec441c386",
+ * "create_time":1616572301
+ * },
+ * {
+ * "encrypt_key":"aoUGAHltcliiL9f23oTKHA==",
+ * "version":9,
+ * "expire_in":0,
+ * "iv":"7996656384218dbb",
+ * "create_time":1616504886
+ * },
+ * {
+ * "encrypt_key":"MlZNQNnRQz3zXHHcr6A3mA==",
+ * "version":8,
+ * "expire_in":0,
+ * "iv":"58a1814f88883024",
+ * "create_time":1616488061
+ * }
+ * ]
+ * }
+ *
+ *
+ * @author chutian0124
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WxMaInternetResponse extends WxMaBaseResponse implements Serializable {
+
+ private static final long serialVersionUID = 6254922047193011785L;
+ /**
+ * 用户最近三次的加密key列表
+ */
+ @SerializedName("key_info_list")
+ List keyInfoList;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetUserKeyInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetUserKeyInfo.java
new file mode 100644
index 0000000000..01bcfbce0b
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetUserKeyInfo.java
@@ -0,0 +1,56 @@
+package cn.binarywang.wx.miniapp.bean.internet;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ * 【小程序-服务端-网络】网络相关接口.
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/internet/internet.getUserEncryptKey.html
+ * 微信返回报文:
+ * {
+ * "encrypt_key":"VI6BpyrK9XH4i4AIGe86tg==",
+ * "version":10,
+ * "expire_in":3597,
+ * "iv":"6003f73ec441c386",
+ * "create_time":1616572301
+ * }
+ *
+ *
+ * @author chutian0124
+ */
+@Data
+public class WxMaInternetUserKeyInfo implements Serializable {
+ private static final long serialVersionUID = 117922490907396705L;
+ /**
+ * 加密key
+ */
+ @SerializedName("encrypt_key")
+ private String encryptKey;
+
+ /**
+ * key的版本号
+ */
+ private Integer version;
+
+ /**
+ * 剩余有效时间
+ */
+ @SerializedName("expire_in")
+ private Long expireIn;
+
+ /**
+ * 加密iv
+ */
+ private String iv;
+
+ /**
+ * 创建key的时间戳
+ */
+ @SerializedName("create_time")
+ private Long createTime;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index f65fceaaa8..37c8db1314 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -388,4 +388,8 @@ public interface Invoice{
*/
String UPDATE_STATUS_BATCH = "https://api.weixin.qq.com/card/invoice/reimburse/updatestatusbatch";
}
+
+ public interface Internet{
+ String GET_USER_ENCRYPT_KEY = "https://api.weixin.qq.com/wxa/business/getuserencryptkey";
+ }
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImplTest.java
new file mode 100644
index 0000000000..ccc2f9c93a
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImplTest.java
@@ -0,0 +1,29 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.internet.WxMaInternetResponse;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+/**
+ *
+ * 服务端网络相关接口测试
+ *
+ * @author chutian0124
+ * @date 2021-09-06
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaInternetServiceImplTest {
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testGetUserEncryptKey() throws WxErrorException {
+ WxMaInternetResponse response = this.wxService.getInternetService().getUserEncryptKey();
+ System.out.println(response);
+ }
+}
From ea31b7bfbebed306db646ce54261cc156ee852e2 Mon Sep 17 00:00:00 2001
From: linlinjava
Date: Fri, 10 Sep 2021 11:38:35 +0800
Subject: [PATCH 0101/1235] =?UTF-8?q?:new:=20#2306=E3=80=90=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8FShort=20Link=E7=94=9F=E6=88=90?=
=?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaService.java | 7 +++
.../wx/miniapp/api/WxMaShortLinkService.java | 14 ++++++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 6 +++
.../api/impl/WxMaShortLinkServiceImpl.java | 34 ++++++++++++++
.../shortlink/GenerateShortLinkRequest.java | 45 +++++++++++++++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 4 ++
.../impl/WxMaShortLinkServiceImplTest.java | 24 ++++++++++
7 files changed, 134 insertions(+)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shortlink/GenerateShortLinkRequest.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
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 1ebf7d7eba..fdbc3ec11e 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
@@ -456,6 +456,13 @@ public interface WxMaService extends WxService {
*/
WxMaLinkService getLinkService();
+ /**
+ * 获取小程序 Short Link服务接口
+ *
+ * @return
+ */
+ WxMaShortLinkService getShortLinkService();
+
/**
* 获取电子发票报销方服务接口
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
new file mode 100644
index 0000000000..e8e5942a9c
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
@@ -0,0 +1,14 @@
+package cn.binarywang.wx.miniapp.api;
+
+
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * 获取小程序 Short Link接口
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
+ */
+public interface WxMaShortLinkService {
+
+ String generate(GenerateShortLinkRequest request) 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 ecbce2ee05..ebc96e8dfa 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
@@ -74,6 +74,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaShopAfterSaleService shopAfterSaleService = new WxMaShopAfterSaleServiceImpl(this);
private final WxMaShopDeliveryService shopDeliveryService = new WxMaShopDeliveryServiceImpl(this);
private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
+ private final WxMaShortLinkService shortlinkService = new WxMaShortLinkServiceImpl(this);
private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
private int retrySleepMillis = 1000;
@@ -569,6 +570,11 @@ public WxMaLinkService getLinkService() {
return this.linkService;
}
+ @Override
+ public WxMaShortLinkService getShortLinkService() {
+ return this.shortlinkService;
+ }
+
@Override
public WxMaReimburseInvoiceService getReimburseInvoiceService() {
return this.reimburseInvoiceService;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
new file mode 100644
index 0000000000..074dfd4d5e
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
@@ -0,0 +1,34 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.WxMaShortLinkService;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
+import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Link.GENERATE_URLLINK_URL;
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.ShortLink.GENERATE_SHORT_LINK_URL;
+
+/**
+ * 获取小程序 Short Link接口
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
+ */
+@AllArgsConstructor
+public class WxMaShortLinkServiceImpl implements WxMaShortLinkService {
+
+ private final WxMaService wxMaService;
+
+ @Override
+ public String generate(GenerateShortLinkRequest request) throws WxErrorException {
+ String result = this.wxMaService.post(GENERATE_SHORT_LINK_URL,request);
+ String linkField = "link";
+ JsonObject jsonObject = GsonParser.parse(result);
+ if(jsonObject.has(linkField)){
+ return jsonObject.get(linkField).toString();
+ }
+ throw new WxErrorException("无link");
+ }
+ }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shortlink/GenerateShortLinkRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shortlink/GenerateShortLinkRequest.java
new file mode 100644
index 0000000000..2356475148
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shortlink/GenerateShortLinkRequest.java
@@ -0,0 +1,45 @@
+package cn.binarywang.wx.miniapp.bean.shortlink;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 获取小程序 Short Link参数对象
+ *
+ */
+@Data
+@Builder
+public class GenerateShortLinkRequest implements Serializable {
+ private static final long serialVersionUID = -7517804620683442832L;
+
+ /**
+ * 通过 Short Link 进入的小程序页面路径,必须是已经发布的小程序存在的页面,可携带 query,最大1024个字符
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("page_url")
+ private String pageUrl;
+
+ /**
+ * 页面标题,不能包含违法信息,超过20字符会用... 截断代替
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("page_title")
+ private String pageTitle;
+
+ /**
+ * 生成的 Short Link 类型,短期有效:false,永久有效:true
+ *
+ * 是否必填: 否
+ *
+ */
+ @SerializedName("is_permanent")
+ private Boolean isPermanent;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index 37c8db1314..17b72c8db5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -226,6 +226,10 @@ public interface Link {
String GENERATE_URLLINK_URL = "https://api.weixin.qq.com/wxa/generate_urllink";
}
+ public interface ShortLink {
+ String GENERATE_SHORT_LINK_URL = "https://api.weixin.qq.com/wxa/genwxashortlink";
+ }
+
public interface SecCheck {
String IMG_SEC_CHECK_URL = "https://api.weixin.qq.com/wxa/img_sec_check";
String MSG_SEC_CHECK_URL = "https://api.weixin.qq.com/wxa/msg_sec_check";
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
new file mode 100644
index 0000000000..4e6e1a9f62
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
@@ -0,0 +1,24 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaShortLinkServiceImplTest {
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testGenerate() throws WxErrorException {
+ final String generate = this.wxService.getShortLinkService().generate(GenerateShortLinkRequest.builder().
+ pageUrl("pages/productView/editPhone/editPhone?id=31832").pageTitle("productView").isPermanent(false).build());
+ System.out.println("generate:");
+ System.out.println(generate);
+ }
+}
From ba23afd49f85270ff29ea00099e0d3854bb2c20b Mon Sep 17 00:00:00 2001
From: xdtand <346570926@qq.com>
Date: Fri, 10 Sep 2021 11:40:01 +0800
Subject: [PATCH 0102/1235] =?UTF-8?q?:art:=20#2311=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BC=81=E4=B8=9A=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=89=93=E5=8D=A1=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=83=A8=E5=88=86=E7=BC=BA=E5=A4=B1=E5=AD=97?=
=?UTF-8?q?=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/bean/oa/WxCpCheckinData.java | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
index 4ab801de1a..c33c99fec5 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
@@ -96,4 +96,28 @@ public class WxCpCheckinData implements Serializable {
*/
@SerializedName("deviceid")
private String deviceId;
+
+ /**
+ * 标准打卡时间,指此次打卡时间对应的标准上班时间或标准下班时间
+ */
+ @SerializedName("sch_checkin_time")
+ private String schCheckinTime;
+
+ /**
+ * 规则id,表示打卡记录所属规则的id
+ */
+ @SerializedName("groupid")
+ private String groupId;
+
+ /**
+ * 班次id,表示打卡记录所属规则中,所属班次的id
+ */
+ @SerializedName("schedule_id")
+ private String scheduleId;
+
+ /**
+ * 时段id,表示打卡记录所属规则中,某一班次中的某一时段的id,如上下班时间为9:00-12:00、13:00-18:00的班次中,9:00-12:00为其中一组时段
+ */
+ @SerializedName("timeline_id")
+ private String timelineId;
}
From 123bef0ea9464ade28ff05f8c540baf50f3c8fde Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 13 Sep 2021 23:08:32 +0800
Subject: [PATCH 0103/1235] =?UTF-8?q?:art:=20=E9=87=8D=E6=9E=84=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E5=B0=8F=E7=A8=8B=E5=BA=8FLink=E7=9B=B8=E5=85=B3?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaLinkService.java | 22 ++++++++++--
.../wx/miniapp/api/WxMaShortLinkService.java | 14 --------
.../miniapp/api/impl/WxMaLinkServiceImpl.java | 22 +++++++++---
.../api/impl/WxMaShortLinkServiceImpl.java | 34 -------------------
.../api/impl/WxMaLinkServiceImplTest.java | 24 ++++++++-----
.../impl/WxMaShortLinkServiceImplTest.java | 24 -------------
6 files changed, 51 insertions(+), 89 deletions(-)
delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
delete mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java
index c3c4559a83..090ac95e35 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java
@@ -1,16 +1,32 @@
package cn.binarywang.wx.miniapp.api;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
import me.chanjar.weixin.common.error.WxErrorException;
/**
- * 获取小程序 URL Link接口
- * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
* @author xiaoyu
* @since 2021-06-10
*/
public interface WxMaLinkService {
+ /**
+ * 获取小程序 URL Link接口
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
+ *
+ * @param request 请求
+ * @return link地址
+ * @throws WxErrorException .
+ */
+ String generateUrlLink(GenerateUrlLinkRequest request) throws WxErrorException;
- String generate(GenerateUrlLinkRequest request) throws WxErrorException;
+ /**
+ * 获取小程序 Short Link接口
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
+ *
+ * @param request 请求
+ * @return link地址
+ * @throws WxErrorException .
+ */
+ String generateShortLink(GenerateShortLinkRequest request) throws WxErrorException;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
deleted file mode 100644
index e8e5942a9c..0000000000
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package cn.binarywang.wx.miniapp.api;
-
-
-import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
-import me.chanjar.weixin.common.error.WxErrorException;
-
-/**
- * 获取小程序 Short Link接口
- * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
- */
-public interface WxMaShortLinkService {
-
- String generate(GenerateShortLinkRequest request) throws WxErrorException;
-}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java
index c3b78e4e1e..e0dd4a915c 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java
@@ -2,34 +2,46 @@
import cn.binarywang.wx.miniapp.api.WxMaLinkService;
import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
import com.google.gson.JsonObject;
import lombok.AllArgsConstructor;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.json.GsonParser;
-import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Link.GENERATE_URLLINK_URL;
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.ShortLink.GENERATE_SHORT_LINK_URL;
/**
* 获取小程序 URL Link接口实现
* 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
+ *
* @author xiaoyu
* @since 2021-06-10
*/
@AllArgsConstructor
public class WxMaLinkServiceImpl implements WxMaLinkService {
-
private final WxMaService wxMaService;
@Override
- public String generate(GenerateUrlLinkRequest request) throws WxErrorException {
- String result = this.wxMaService.post(GENERATE_URLLINK_URL,request);
+ public String generateUrlLink(GenerateUrlLinkRequest request) throws WxErrorException {
+ String result = this.wxMaService.post(GENERATE_URLLINK_URL, request);
String linkField = "url_link";
JsonObject jsonObject = GsonParser.parse(result);
- if(jsonObject.has(linkField)){
+ if (jsonObject.has(linkField)) {
return jsonObject.get(linkField).toString();
}
throw new WxErrorException("无url_link");
}
+
+ @Override
+ public String generateShortLink(GenerateShortLinkRequest request) throws WxErrorException {
+ String result = this.wxMaService.post(GENERATE_SHORT_LINK_URL, request);
+ String linkField = "link";
+ JsonObject jsonObject = GsonParser.parse(result);
+ if (jsonObject.has(linkField)) {
+ return jsonObject.get(linkField).toString();
+ }
+ throw new WxErrorException("无link");
}
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
deleted file mode 100644
index 074dfd4d5e..0000000000
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package cn.binarywang.wx.miniapp.api.impl;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.api.WxMaShortLinkService;
-import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
-import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
-import com.google.gson.JsonObject;
-import lombok.AllArgsConstructor;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.util.json.GsonParser;
-
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Link.GENERATE_URLLINK_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.ShortLink.GENERATE_SHORT_LINK_URL;
-
-/**
- * 获取小程序 Short Link接口
- * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
- */
-@AllArgsConstructor
-public class WxMaShortLinkServiceImpl implements WxMaShortLinkService {
-
- private final WxMaService wxMaService;
-
- @Override
- public String generate(GenerateShortLinkRequest request) throws WxErrorException {
- String result = this.wxMaService.post(GENERATE_SHORT_LINK_URL,request);
- String linkField = "link";
- JsonObject jsonObject = GsonParser.parse(result);
- if(jsonObject.has(linkField)){
- return jsonObject.get(linkField).toString();
- }
- throw new WxErrorException("无link");
- }
- }
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java
index 68ca9b6214..c97e11077d 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java
@@ -1,6 +1,7 @@
package cn.binarywang.wx.miniapp.api.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
import cn.binarywang.wx.miniapp.test.ApiTestModule;
import com.google.inject.Inject;
@@ -8,24 +9,29 @@
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import static org.testng.Assert.*;
-
@Test
@Guice(modules = ApiTestModule.class)
public class WxMaLinkServiceImplTest {
-
@Inject
private WxMaService wxMaService;
@Test
- public void testGenerate() throws WxErrorException {
-
- GenerateUrlLinkRequest request = GenerateUrlLinkRequest.builder()
+ public void testGenerateUrlLink() throws WxErrorException {
+ String url = this.wxMaService.getLinkService().generateUrlLink(GenerateUrlLinkRequest.builder()
.path("pages/tabBar/home/home")
- .build();
-
- String url = this.wxMaService.getLinkService().generate(request);
+ .build());
System.out.println(url);
}
+
+ @Test
+ public void testGenerateShortLink() throws WxErrorException {
+ final String generate = this.wxMaService.getLinkService()
+ .generateShortLink(GenerateShortLinkRequest.builder().
+ pageUrl("pages/productView/editPhone/editPhone?id=31832")
+ .pageTitle("productView")
+ .isPermanent(false).build());
+ System.out.println("generate:");
+ System.out.println(generate);
+ }
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
deleted file mode 100644
index 4e6e1a9f62..0000000000
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package cn.binarywang.wx.miniapp.api.impl;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
-import cn.binarywang.wx.miniapp.test.ApiTestModule;
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.error.WxErrorException;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-@Test
-@Guice(modules = ApiTestModule.class)
-public class WxMaShortLinkServiceImplTest {
- @Inject
- private WxMaService wxService;
-
- @Test
- public void testGenerate() throws WxErrorException {
- final String generate = this.wxService.getShortLinkService().generate(GenerateShortLinkRequest.builder().
- pageUrl("pages/productView/editPhone/editPhone?id=31832").pageTitle("productView").isPermanent(false).build());
- System.out.println("generate:");
- System.out.println(generate);
- }
-}
From 6bba793f4fa0137155652d2456c5b35b020cb4dd Mon Sep 17 00:00:00 2001
From: xdtand <346570926@qq.com>
Date: Mon, 13 Sep 2021 23:22:57 +0800
Subject: [PATCH 0104/1235] =?UTF-8?q?:art:=20=E4=BF=AE=E6=94=B9=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E7=9A=84=E5=AD=97=E6=AE=B5=E5=AF=B9=E5=BA=94=E7=9A=84?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
index c33c99fec5..93e975508a 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
@@ -101,23 +101,23 @@ public class WxCpCheckinData implements Serializable {
* 标准打卡时间,指此次打卡时间对应的标准上班时间或标准下班时间
*/
@SerializedName("sch_checkin_time")
- private String schCheckinTime;
+ private Long schCheckinTime;
/**
* 规则id,表示打卡记录所属规则的id
*/
@SerializedName("groupid")
- private String groupId;
+ private Integer groupId;
/**
* 班次id,表示打卡记录所属规则中,所属班次的id
*/
@SerializedName("schedule_id")
- private String scheduleId;
+ private Integer scheduleId;
/**
* 时段id,表示打卡记录所属规则中,某一班次中的某一时段的id,如上下班时间为9:00-12:00、13:00-18:00的班次中,9:00-12:00为其中一组时段
*/
@SerializedName("timeline_id")
- private String timelineId;
+ private Integer timelineId;
}
From 941c47a19325713ecf4882f6e77a2286b5e14d8e Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 13 Sep 2021 23:44:46 +0800
Subject: [PATCH 0105/1235] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E5=B7=B2?=
=?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/binarywang/wx/miniapp/api/WxMaService.java | 9 +--------
.../wx/miniapp/api/impl/BaseWxMaServiceImpl.java | 6 ------
2 files changed, 1 insertion(+), 14 deletions(-)
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 fdbc3ec11e..d0b2dcf12b 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
@@ -450,19 +450,12 @@ public interface WxMaService extends WxService {
WxMaShopAuditService getShopAuditService();
/**
- * 获取小程序 URL Link服务接口
+ * 获取小程序Link服务接口
*
* @return
*/
WxMaLinkService getLinkService();
- /**
- * 获取小程序 Short Link服务接口
- *
- * @return
- */
- WxMaShortLinkService getShortLinkService();
-
/**
* 获取电子发票报销方服务接口
*
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 ebc96e8dfa..ecbce2ee05 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
@@ -74,7 +74,6 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaShopAfterSaleService shopAfterSaleService = new WxMaShopAfterSaleServiceImpl(this);
private final WxMaShopDeliveryService shopDeliveryService = new WxMaShopDeliveryServiceImpl(this);
private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
- private final WxMaShortLinkService shortlinkService = new WxMaShortLinkServiceImpl(this);
private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
private int retrySleepMillis = 1000;
@@ -570,11 +569,6 @@ public WxMaLinkService getLinkService() {
return this.linkService;
}
- @Override
- public WxMaShortLinkService getShortLinkService() {
- return this.shortlinkService;
- }
-
@Override
public WxMaReimburseInvoiceService getReimburseInvoiceService() {
return this.reimburseInvoiceService;
From 8faef7c8e25b46613b305265b420749e4ac73127 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 13 Sep 2021 23:32:05 +0800
Subject: [PATCH 0106/1235] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.9.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index b573e8b85e..842aae46f1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 9f867c34d5..85fe5094b0 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 5365e12b52..743650b256 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index 1a261b44f0..e62e70040c 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index c0c806020a..9545eb445f 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 64c7ff1020..074e202146 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 0dd830a4b4..fe8b29ecaa 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index f86fe25683..896a812b5a 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index a83cb838c0..665f0d7b87 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 6b034d30c1..90edd559fb 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index ef301b5071..1dba48165a 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 7a56d4fe1d..62ebb65b13 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index d84eea879c..2407c52146 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index c32188ba2f..097fd4cfc1 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index 35a6475d4a..f36c374918 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-qidian
From 18b49daf2b4f203bfc3b033ebc7410d7cd0e8523 Mon Sep 17 00:00:00 2001
From: Zerision <894477402@qq.com>
Date: Sun, 19 Sep 2021 10:30:35 +0800
Subject: [PATCH 0107/1235] =?UTF-8?q?:bug:=20#2314=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BF=AE=E5=A4=8D=E5=A4=9A?=
=?UTF-8?q?=E4=B8=AA=E4=B8=8D=E5=90=8C=E9=80=9A=E7=9F=A5=E6=B6=88=E6=81=AF?=
=?UTF-8?q?=E8=A2=AB=E8=AF=AF=E5=88=A4=E4=B8=BA=E5=90=8C=E4=B8=80=E6=B6=88?=
=?UTF-8?q?=E6=81=AF=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/message/WxCpMessageRouter.java | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
index 92de0c238a..a0464a7252 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
@@ -209,16 +209,20 @@ private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) {
.append("-").append(wxMessage.getCreateTime())
.append("-").append(wxMessage.getFromUserName());
}
+ append(messageId, wxMessage.getUserId());
+ append(messageId, wxMessage.getChangeType());
+ append(messageId, wxMessage.getTagId());
+ append(messageId, wxMessage.getId());
+ append(messageId, wxMessage.getChatId());
+ append(messageId, wxMessage.getExternalUserId());
- if (StringUtils.isNotEmpty(wxMessage.getUserId())) {
- messageId.append("-").append(wxMessage.getUserId());
- }
+ return this.messageDuplicateChecker.isDuplicate(messageId.toString());
+ }
- if (StringUtils.isNotEmpty(wxMessage.getChangeType())) {
- messageId.append("-").append(wxMessage.getChangeType());
+ private void append(StringBuilder sb, String value){
+ if(StringUtils.isNotEmpty(value)){
+ sb.append("-").append(value);
}
-
- return this.messageDuplicateChecker.isDuplicate(messageId.toString());
}
/**
From cabee0f70cbf6f8b3f83ab0e4afc0e0e8dda6529 Mon Sep 17 00:00:00 2001
From: laizuan <1032299142@qq.com>
Date: Sun, 19 Sep 2021 12:53:42 +0800
Subject: [PATCH 0108/1235] =?UTF-8?q?:art:=20=E9=BB=98=E8=AE=A4Apache=20ht?=
=?UTF-8?q?tp=EF=BC=8C=E6=8E=92=E9=99=A4jodd-http=E4=BE=9D=E8=B5=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
weixin-java-pay/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index 097fd4cfc1..acd179ce4b 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -27,7 +27,7 @@
org.jodd
jodd-http
- compile
+ provided
From 2019efffa3f188f15b2acb2f603f6441ee67a3a6 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 19 Sep 2021 12:59:03 +0800
Subject: [PATCH 0109/1235] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=E5=8F=82=E6=95=B0=E5=91=BD=E5=90=8D=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bean/request/WxPayRefundQueryV3Request.java | 16 +++++++---------
.../binarywang/wxpay/service/WxPayService.java | 4 ++--
.../wxpay/service/impl/BaseWxPayServiceImpl.java | 6 +++---
.../service/impl/BaseWxPayServiceImplTest.java | 4 ++--
4 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryV3Request.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryV3Request.java
index d29f41a4c0..e7d34e31f9 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryV3Request.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryV3Request.java
@@ -19,16 +19,14 @@ public class WxPayRefundQueryV3Request implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
- * 字段名:商户订单号
- * 变量名:out_trade_no
+ * 字段名:商户退款单号
+ * 变量名:out_refund_no
* 是否必填:是
- * 类型:string[1,32]
- * 描述:
- * 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。
- * 特殊规则:最小字符长度为6
- * 示例值:1217752501201407033233368018
+ * 类型:string[1, 64]
+ * 描述:商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
+ * 示例值:1217752501201407033233368018
*
*/
- @SerializedName(value = "out_trade_no")
- private String outTradeNo;
+ @SerializedName(value = "out_refund_no")
+ private String outRefundNo;
}
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 9b42bd75be..73dad0c9d2 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
@@ -697,11 +697,11 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
* 接口链接:https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/{out_refund_no}
*
*
- * @param outTradeNo 商户订单号
+ * @param outRefundNo 商户退款单号
* @return 退款信息 wx pay refund query result
* @throws WxPayException the wx pay exception
*/
- WxPayRefundQueryV3Result refundQueryV3(String outTradeNo) throws WxPayException;
+ WxPayRefundQueryV3Result refundQueryV3(String outRefundNo) throws WxPayException;
/**
*
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
index a80a7f4527..e5ef0be8be 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
@@ -305,15 +305,15 @@ public WxPayRefundQueryResult refundQueryV2(WxPayRefundQueryRequest request) thr
}
@Override
- public WxPayRefundQueryV3Result refundQueryV3(String outTradeNo) throws WxPayException {
- String url = String.format("%s/v3/refund/domestic/refunds/%s", this.getPayBaseUrl(), outTradeNo);
+ public WxPayRefundQueryV3Result refundQueryV3(String outRefundNo) throws WxPayException {
+ String url = String.format("%s/v3/refund/domestic/refunds/%s", this.getPayBaseUrl(), outRefundNo);
String response = this.getV3(url);
return GSON.fromJson(response, WxPayRefundQueryV3Result.class);
}
@Override
public WxPayRefundQueryV3Result refundQueryV3(WxPayRefundQueryV3Request request) throws WxPayException {
- String url = String.format("%s/v3/refund/domestic/refunds/%s", this.getPayBaseUrl(), request.getOutTradeNo());
+ String url = String.format("%s/v3/refund/domestic/refunds/%s", this.getPayBaseUrl(), request.getOutRefundNo());
String response = this.getV3(url);
return GSON.fromJson(response, WxPayRefundQueryV3Result.class);
}
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java
index e984b334fc..920d917ffc 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java
@@ -769,8 +769,8 @@ public void testRefundV3() throws WxPayException {
@Test
public void testRefundQueryV3() throws WxPayException {
WxPayRefundQueryV3Request request = new WxPayRefundQueryV3Request();
-// request.setOutTradeNo("n1ZvYqjAg3D7LUBa");
- request.setOutTradeNo("123456789011");
+// request.setOutRefundNo("n1ZvYqjAg3D7LUBa");
+ request.setOutRefundNo("123456789011");
WxPayRefundQueryV3Result result = this.payService.refundQueryV3(request);
System.out.println(GSON.toJson(result));
}
From abbfc85e24b16334426d13f114fab7b5c78cd786 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Tue, 21 Sep 2021 17:07:10 +0800
Subject: [PATCH 0110/1235] Update README.md
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 8f0a4f95b6..e8636426c8 100644
--- a/README.md
+++ b/README.md
@@ -28,9 +28,9 @@
- 1. 驰骋快速开发平台、工作流引擎、表单引擎采用GPL协议.
-2. 驰骋.net版称为ccflow, java版称为jflow,代码100%开源.
-3. 支持10多个国内外数据库. 单机版\集团版\SAAS版本.
+ 1. 驰骋快速开发平台、工作流/表单引擎采用GPL协议。
+ 2. 驰骋.NET版称为ccflow,Java版称为jflow,代码100%开源。
+ 3. 支持10多个国内外数据库,有单机版\集团版\SAAS版本。
|
From b45c626e8299c9992270382cd90baf2a4b517cd5 Mon Sep 17 00:00:00 2001
From: yearliny
Date: Sat, 25 Sep 2021 23:05:28 +0800
Subject: [PATCH 0111/1235] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E6=9F=90?=
=?UTF-8?q?=E4=BA=9B=E6=83=85=E5=86=B5=E4=B8=8B=E4=BC=9A=E6=8A=9B=E5=87=BA?=
=?UTF-8?q?CannotResolveClassException=E5=BC=82=E5=B8=B8=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
https://stackoverflow.com/questions/9508292/nodecom-thoughtworks-xstream-mapper-cannotresolveclassexception-while-using-xstr
---
.../com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
index 9f6f5e2700..6f66dfdd86 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
@@ -150,6 +150,7 @@ public static T fromXML(String xmlString, Class c
}
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(clz);
+ xstream.setClassLoader(BaseWxPayResult.class.getClassLoader());
T result = (T) xstream.fromXML(xmlString);
result.setXmlString(xmlString);
return result;
From cecdace1c59d28eaccecd15ae99801af305df6e0 Mon Sep 17 00:00:00 2001
From: nickname263
Date: Sat, 25 Sep 2021 23:06:19 +0800
Subject: [PATCH 0112/1235] =?UTF-8?q?:new:=20#2324=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E6=B7=BB=E5=8A=A0=E5=AF=B9?=
=?UTF-8?q?=E6=96=B0=E7=9A=84=E6=A8=A1=E7=89=88=E5=8D=A1=E7=89=87=E6=B6=88?=
=?UTF-8?q?=E6=81=AF=E7=9A=84=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/common/api/WxConsts.java | 31 ++
.../weixin/cp/bean/message/WxCpMessage.java | 281 ++++++++++++++++
.../messagebuilder/TemplateCardBuilder.java | 300 ++++++++++++++++++
.../cp/bean/templatecard/CheckboxOption.java | 49 +++
.../bean/templatecard/HorizontalContent.java | 66 ++++
.../cp/bean/templatecard/MultipleSelect.java | 68 ++++
.../bean/templatecard/TemplateCardButton.java | 49 +++
.../bean/templatecard/TemplateCardJump.java | 65 ++++
.../cp/bean/templatecard/VerticalContent.java | 44 +++
.../cp/bean/message/WxCpMessageTest.java | 283 +++++++++++++++++
10 files changed, 1236 insertions(+)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TemplateCardBuilder.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/CheckboxOption.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/HorizontalContent.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/MultipleSelect.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardJump.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/VerticalContent.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
index 3e08462017..c1e6d39910 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
@@ -120,6 +120,37 @@ public static class KefuMsgType {
* 小程序通知消息.
*/
public static final String MINIPROGRAM_NOTICE = "miniprogram_notice";
+
+ /**
+ * 模板卡片消息.
+ */
+ public static final String TEMPLATE_CARD = "template_card";
+ }
+
+ /**
+ * 企业微信模板卡片消息的卡片类型
+ */
+ public static class TemplateCardType {
+ /**
+ * 文本通知型卡片
+ */
+ public static final String TEXT_NOTICE = "text_notice";
+ /**
+ * 图文展示型卡片
+ */
+ public static final String NEWS_NOTICE = "news_notice";
+ /**
+ * 按钮交互型卡片
+ */
+ public static final String BUTTON_INTERACTION = "button_interaction";
+ /**
+ * 投票选择型卡片
+ */
+ public static final String VOTE_INTERACTION = "vote_interaction";
+ /**
+ * 多项选择型卡片
+ */
+ public static final String MULTIPLE_INTERACTION = "multiple_interaction";
}
/**
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java
index 244e7fed07..a2f6e6c5c6 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java
@@ -8,6 +8,7 @@
import me.chanjar.weixin.cp.bean.article.NewArticle;
import me.chanjar.weixin.cp.bean.messagebuilder.*;
import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton;
+import me.chanjar.weixin.cp.bean.templatecard.*;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
@@ -70,6 +71,134 @@ public class WxCpMessage implements Serializable {
private String taskId;
private List taskButtons = new ArrayList<>();
+ /**
+ * 模板型卡片特有属性
+ */
+ /**
+ * 模板卡片类型,文本通知型卡片填写 “text_notice”,
+ * 图文展示型卡片此处填写 “news_notice”,
+ * 按钮交互型卡片填写”button_interaction”,
+ * 投票选择型卡片填写”vote_interaction”,
+ * 多项选择型卡片填写 “multiple_interaction”
+ */
+ private String card_type;
+
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ * 来源图片的url
+ */
+ private String source_icon_url;
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ * 来源图片的描述,建议不超过20个字
+ */
+ private String source_desc;
+
+ /**
+ * 一级标题,建议不超过36个字
+ */
+ private String main_title_title;
+ /**
+ * 标题辅助信息,建议不超过44个字
+ */
+ private String main_title_desc;
+
+ /**
+ * 图文展示型的卡片必须有图片字段。
+ * 图片的url.
+ */
+ private String card_image_url;
+
+ /**
+ * 图片的宽高比,宽高比要小于2.25,大于1.3,不填该参数默认1.3
+ */
+ private Float card_image_aspect_ratio;
+ /**
+ * 关键数据样式
+ * 关键数据样式的数据内容,建议不超过14个字
+ */
+ private String emphasis_content_title;
+ /**
+ * 关键数据样式的数据描述内容,建议不超过22个字
+ */
+ private String emphasis_content_desc;
+
+ /**
+ * 二级普通文本,建议不超过160个字
+ */
+ private String sub_title_text;
+
+ /**
+ * 卡片二级垂直内容,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过4
+ */
+ private List vertical_contents;
+
+ /**
+ * 二级标题+文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List horizontal_contents;
+
+ /**
+ * 跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过3
+ */
+ private List jumps;
+
+ /**
+ * 整体卡片的点击跳转事件,text_notice必填本字段
+ * 跳转事件类型,1 代表跳转url,2 代表打开小程序。text_notice卡片模版中该字段取值范围为[1,2]
+ */
+ private Integer card_action_type;
+ /**
+ * 跳转事件的url,card_action.type是1时必填
+ */
+ private String card_action_url;
+
+ /**
+ * 跳转事件的小程序的appid,必须是与当前应用关联的小程序,card_action.type是2时必填
+ */
+ private String card_action_appid;
+
+ /**
+ * 跳转事件的小程序的pagepath,card_action.type是2时选填
+ */
+ private String card_action_pagepath;
+
+ /**
+ * 按钮交互型卡片需指定。
+ * 按钮列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List buttons;
+
+ /**
+ * 投票选择型卡片需要指定
+ * 选择题key值,用户提交选项后,会产生回调事件,回调事件会带上该key值表示该题,最长支持1024字节
+ */
+ private String checkbox_question_key;
+
+ /**
+ * 选择题模式,单选:0,多选:1,不填默认0
+ */
+ private Integer checkbox_mode;
+
+ /**
+ * 选项list,选项个数不超过 20 个,最少1个
+ */
+ private List options;
+
+ /**
+ * 提交按钮样式
+ * 按钮文案,建议不超过10个字,不填默认为提交
+ */
+ private String submit_button_text;
+ /**
+ * 提交按钮的key,会产生回调事件将本参数作为EventKey返回,最长支持1024字节
+ */
+ private String submit_button_key;
+ /**
+ * 下拉式的选择器列表,multiple_interaction类型的卡片该字段不可为空,一个消息最多支持 3 个选择器
+ */
+ private List selects;
+
/**
* 获得文本消息builder.
*/
@@ -140,6 +269,13 @@ public static TaskCardBuilder TASKCARD() {
return new TaskCardBuilder();
}
+ /**
+ * 获得任务卡片消息builder.
+ */
+ public static TemplateCardBuilder TEMPLATECARD() {
+ return new TemplateCardBuilder();
+ }
+
/**
* 获得小程序通知消息builder.
*/
@@ -160,6 +296,7 @@ public static MiniProgramNoticeMsgBuilder newMiniProgramNoticeBuilder() {
* {@link KefuMsgType#MARKDOWN}
* {@link KefuMsgType#TASKCARD}
* {@link KefuMsgType#MINIPROGRAM_NOTICE}
+ * {@link KefuMsgType#TEMPLATE_CARD}
*
*
* @param msgType 消息类型
@@ -328,6 +465,150 @@ private void handleMsgType(JsonObject messageJson) {
messageJson.add("miniprogram_notice", notice);
break;
}
+ case TEMPLATE_CARD: {
+ JsonObject template = new JsonObject();
+ template.addProperty("card_type", this.getCard_type());
+
+ if (StringUtils.isNotBlank(this.getSource_icon_url()) || StringUtils.isNotBlank(this.getSource_desc())) {
+ JsonObject source = new JsonObject();
+ if (StringUtils.isNotBlank(this.getSource_icon_url())) {
+ source.addProperty("icon_url", this.getSource_icon_url());
+ }
+ if (StringUtils.isNotBlank(this.getSource_desc())) {
+ source.addProperty("desc", this.getSource_desc());
+ }
+ template.add("source", source);
+ }
+
+ if (StringUtils.isNotBlank(this.getMain_title_title()) || StringUtils.isNotBlank(this.getMain_title_desc())) {
+ JsonObject main_title = new JsonObject();
+ if (StringUtils.isNotBlank(this.getMain_title_title())) {
+ main_title.addProperty("title", this.getMain_title_title());
+ }
+ if (StringUtils.isNotBlank(this.getMain_title_desc())) {
+ main_title.addProperty("desc", this.getMain_title_desc());
+ }
+ template.add("main_title", main_title);
+ }
+
+ if (StringUtils.isNotBlank(this.getEmphasis_content_title()) || StringUtils.isNotBlank(this.getEmphasis_content_desc())) {
+ JsonObject emphasis_content = new JsonObject();
+ if (StringUtils.isNotBlank(this.getEmphasis_content_title())) {
+ emphasis_content.addProperty("title", this.getEmphasis_content_title());
+ }
+ if (StringUtils.isNotBlank(this.getEmphasis_content_desc())) {
+ emphasis_content.addProperty("desc", this.getEmphasis_content_desc());
+ }
+ template.add("emphasis_content", emphasis_content);
+ }
+
+
+ if (StringUtils.isNotBlank(this.getSub_title_text())) {
+ template.addProperty("sub_title_text", this.getSub_title_text());
+ }
+
+ if (StringUtils.isNotBlank(this.getTaskId())) {
+ template.addProperty("task_id", this.getTaskId());
+ }
+
+ List verticalContents = this.getVertical_contents();
+ if(null != verticalContents && verticalContents.size() > 0) {
+ JsonArray vContentJsonArray = new JsonArray();
+ for (VerticalContent vContent : this.getVertical_contents()) {
+ JsonObject tempObject = vContent.toJson();
+ vContentJsonArray.add(tempObject);
+ }
+ template.add("vertical_content_list", vContentJsonArray);
+ }
+
+ List horizontalContents = this.getHorizontal_contents();
+ if(null != horizontalContents && horizontalContents.size() > 0) {
+ JsonArray hContentJsonArray = new JsonArray();
+ for (HorizontalContent hContent : this.getHorizontal_contents()) {
+ JsonObject tempObject = hContent.toJson();
+ hContentJsonArray.add(tempObject);
+ }
+ template.add("horizontal_content_list", hContentJsonArray);
+ }
+
+ List jumps = this.getJumps();
+ if(null != jumps && jumps.size() > 0) {
+ JsonArray jumpJsonArray = new JsonArray();
+ for (TemplateCardJump jump : this.getJumps()) {
+ JsonObject tempObject = jump.toJson();
+ jumpJsonArray.add(tempObject);
+ }
+ template.add("jump_list", jumpJsonArray);
+ }
+
+ if (null != this.getCard_action_type()) {
+ JsonObject cardAction = new JsonObject();
+ cardAction.addProperty("type", this.getCard_action_type());
+ if (StringUtils.isNotBlank(this.getCard_action_url())) {
+ cardAction.addProperty("url", this.getCard_action_url());
+ }
+ if (StringUtils.isNotBlank(this.getCard_action_appid())) {
+ cardAction.addProperty("appid", this.getCard_action_appid());
+ }
+ if (StringUtils.isNotBlank(this.getCard_action_pagepath())) {
+ cardAction.addProperty("pagepath", this.getCard_action_pagepath());
+ }
+ template.add("card_action", cardAction);
+ }
+
+ List buttons = this.getButtons();
+ if(null != buttons && buttons.size() > 0) {
+ JsonArray btnJsonArray = new JsonArray();
+ for (TemplateCardButton btn : this.getButtons()) {
+ JsonObject tempObject = btn.toJson();
+ btnJsonArray.add(tempObject);
+ }
+ template.add("button_list", btnJsonArray);
+ }
+
+ // checkbox
+ if (StringUtils.isNotBlank(this.getCheckbox_question_key())) {
+ JsonObject checkBox = new JsonObject();
+ checkBox.addProperty("question_key", this.getCheckbox_question_key());
+ if (null != this.getCheckbox_mode()) {
+ checkBox.addProperty("mode", this.getCheckbox_mode());
+ }
+ JsonArray optionArray = new JsonArray();
+ for (CheckboxOption option : this.getOptions()) {
+ JsonObject tempObject = option.toJson();
+ optionArray.add(tempObject);
+ }
+ checkBox.add("option_list", optionArray);
+
+ template.add("checkbox", checkBox);
+ }
+
+ // submit_button
+ if (StringUtils.isNotBlank(this.getSubmit_button_text()) || StringUtils.isNotBlank(this.getSubmit_button_key())) {
+ JsonObject submit_button = new JsonObject();
+ if (StringUtils.isNotBlank(this.getSubmit_button_text())) {
+ submit_button.addProperty("text", this.getSubmit_button_text());
+ }
+ if (StringUtils.isNotBlank(this.getSubmit_button_key())) {
+ submit_button.addProperty("key", this.getSubmit_button_key());
+ }
+ template.add("submit_button", submit_button);
+ }
+
+ // select_list
+ List selects = this.getSelects();
+ if(null != selects && selects.size() > 0) {
+ JsonArray selectJsonArray = new JsonArray();
+ for (MultipleSelect select : this.getSelects()) {
+ JsonObject tempObject = select.toJson();
+ selectJsonArray.add(tempObject);
+ }
+ template.add("select_list", selectJsonArray);
+ }
+
+ messageJson.add("template_card", template);
+ break;
+ }
default: {
// do nothing
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TemplateCardBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TemplateCardBuilder.java
new file mode 100644
index 0000000000..7a29491ab1
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TemplateCardBuilder.java
@@ -0,0 +1,300 @@
+package me.chanjar.weixin.cp.bean.messagebuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.cp.bean.message.WxCpMessage;
+import me.chanjar.weixin.cp.bean.templatecard.*;
+
+import java.util.List;
+/**
+ *
+ * 模板卡片消息Builder
+ * 用法: WxCustomMessage m = WxCustomMessage.TEMPLATECARD().title(...)....toUser(...).build();
+ *
+ *
+ * @author yzts
+ * @date 2019-05-16
+ */
+public class TemplateCardBuilder extends BaseBuilder{
+ /**
+ * 模板卡片类型,文本通知型卡片填写 “text_notice”,
+ * 图文展示型卡片此处填写 “news_notice”,
+ * 按钮交互型卡片填写”button_interaction”,
+ * 投票选择型卡片填写”vote_interaction”,
+ * 多项选择型卡片填写 “multiple_interaction”
+ */
+ private String card_type;
+
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ * 来源图片的url
+ */
+ private String source_icon_url;
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ * 来源图片的描述,建议不超过20个字
+ */
+ private String source_desc;
+
+ /**
+ * 一级标题,建议不超过36个字
+ */
+ private String main_title_title;
+ /**
+ * 标题辅助信息,建议不超过44个字
+ */
+ private String main_title_desc;
+
+ /**
+ * 图文展示型的卡片必须有图片字段。
+ * 图片的url.
+ */
+ private String card_image_url;
+
+ /**
+ * 图片的宽高比,宽高比要小于2.25,大于1.3,不填该参数默认1.3
+ */
+ private Float card_image_aspect_ratio;
+ /**
+ * 关键数据样式
+ * 关键数据样式的数据内容,建议不超过14个字
+ */
+ private String emphasis_content_title;
+ /**
+ * 关键数据样式的数据描述内容,建议不超过22个字
+ */
+ private String emphasis_content_desc;
+
+ /**
+ * 二级普通文本,建议不超过160个字
+ */
+ private String sub_title_text;
+
+ /**
+ * 卡片二级垂直内容,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过4
+ */
+ private List vertical_contents;
+
+ /**
+ * 二级标题+文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List horizontal_contents;
+
+ /**
+ * 跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过3
+ */
+ private List jumps;
+
+ /**
+ * 整体卡片的点击跳转事件,text_notice必填本字段
+ * 跳转事件类型,1 代表跳转url,2 代表打开小程序。text_notice卡片模版中该字段取值范围为[1,2]
+ */
+ private Integer card_action_type;
+ /**
+ * 跳转事件的url,card_action.type是1时必填
+ */
+ private String card_action_url;
+
+ /**
+ * 跳转事件的小程序的appid,必须是与当前应用关联的小程序,card_action.type是2时必填
+ */
+ private String card_action_appid;
+
+ /**
+ * 跳转事件的小程序的pagepath,card_action.type是2时选填
+ */
+ private String card_action_pagepath;
+
+ /**
+ * 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节
+ */
+ private String task_id;
+
+ /**
+ * 按钮交互型卡片需指定。
+ * 按钮列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List buttons;
+
+ /**
+ * 投票选择型卡片需要指定
+ * 选择题key值,用户提交选项后,会产生回调事件,回调事件会带上该key值表示该题,最长支持1024字节
+ */
+ private String checkbox_question_key;
+
+ /**
+ * 选择题模式,单选:0,多选:1,不填默认0
+ */
+ private Integer checkbox_mode;
+
+ /**
+ * 选项list,选项个数不超过 20 个,最少1个
+ */
+ private List options;
+
+ /**
+ * 提交按钮样式
+ * 按钮文案,建议不超过10个字,不填默认为提交
+ */
+ private String submit_button_text;
+ /**
+ * 提交按钮的key,会产生回调事件将本参数作为EventKey返回,最长支持1024字节
+ */
+ private String submit_button_key;
+
+ /**
+ * 下拉式的选择器列表,multiple_interaction类型的卡片该字段不可为空,一个消息最多支持 3 个选择器
+ */
+ private List selects;
+
+
+ public TemplateCardBuilder() {
+ this.msgType = WxConsts.KefuMsgType.TEMPLATE_CARD;
+ }
+
+ public TemplateCardBuilder card_type(String card_type) {
+ this.card_type = card_type;
+ return this;
+ }
+
+ public TemplateCardBuilder source_icon_url(String source_icon_url) {
+ this.source_icon_url = source_icon_url;
+ return this;
+ }
+
+ public TemplateCardBuilder source_desc(String source_desc) {
+ this.source_desc = source_desc;
+ return this;
+ }
+
+ public TemplateCardBuilder main_title_title(String main_title_title) {
+ this.main_title_title = main_title_title;
+ return this;
+ }
+
+ public TemplateCardBuilder main_title_desc(String mainTitleDesc) {
+ this.main_title_desc = mainTitleDesc;
+ return this;
+ }
+
+ public TemplateCardBuilder emphasis_content_title(String emphasis_content_title) {
+ this.emphasis_content_title = emphasis_content_title;
+ return this;
+ }
+
+ public TemplateCardBuilder emphasis_content_desc(String emphasis_content_desc) {
+ this.emphasis_content_desc = emphasis_content_desc;
+ return this;
+ }
+
+ public TemplateCardBuilder sub_title_text(String sub_title_text) {
+ this.sub_title_text = sub_title_text;
+ return this;
+ }
+
+ public TemplateCardBuilder vertical_contents(List vertical_contents) {
+ this.vertical_contents = vertical_contents;
+ return this;
+ }
+
+ public TemplateCardBuilder horizontal_contents(List horizontal_contents) {
+ this.horizontal_contents = horizontal_contents;
+ return this;
+ }
+
+ public TemplateCardBuilder jumps(List jumps) {
+ this.jumps = jumps;
+ return this;
+ }
+
+ public TemplateCardBuilder card_action_type(Integer card_action_type) {
+ this.card_action_type = card_action_type;
+ return this;
+ }
+
+ public TemplateCardBuilder card_action_url(String card_action_url) {
+ this.card_action_url = card_action_url;
+ return this;
+ }
+
+ public TemplateCardBuilder card_action_appid(String card_action_appid) {
+ this.card_action_appid = card_action_appid;
+ return this;
+ }
+
+ public TemplateCardBuilder card_action_pagepath(String card_action_pagepath) {
+ this.card_action_pagepath = card_action_pagepath;
+ return this;
+ }
+
+ public TemplateCardBuilder task_id(String taskId) {
+ this.task_id = taskId;
+ return this;
+ }
+
+ public TemplateCardBuilder buttons(List buttons) {
+ this.buttons = buttons;
+ return this;
+ }
+
+ public TemplateCardBuilder checkbox_question_key(String checkbox_question_key) {
+ this.checkbox_question_key = checkbox_question_key;
+ return this;
+ }
+
+ public TemplateCardBuilder checkbox_mode(Integer checkbox_mode) {
+ this.checkbox_mode = checkbox_mode;
+ return this;
+ }
+
+ public TemplateCardBuilder options(List options) {
+ this.options = options;
+ return this;
+ }
+
+ public TemplateCardBuilder submit_button_text(String submit_button_text) {
+ this.submit_button_text = submit_button_text;
+ return this;
+ }
+
+ public TemplateCardBuilder submit_button_key(String submit_button_key) {
+ this.submit_button_key = submit_button_key;
+ return this;
+ }
+
+ public TemplateCardBuilder selects(List selects) {
+ this.selects = selects;
+ return this;
+ }
+
+ @Override
+ public WxCpMessage build() {
+ WxCpMessage m = super.build();
+ m.setSafe(null);
+ m.setCard_type(this.card_type);
+ m.setSource_icon_url(this.source_icon_url);
+ m.setSource_desc(this.source_desc);
+ m.setMain_title_title(this.main_title_title);
+ m.setMain_title_desc(this.main_title_desc);
+ m.setCard_image_url(this.card_image_url);
+ m.setCard_image_aspect_ratio(this.card_image_aspect_ratio);
+ m.setEmphasis_content_title(this.emphasis_content_title);
+ m.setEmphasis_content_desc(this.emphasis_content_desc);
+ m.setSub_title_text(this.sub_title_text);
+ m.setVertical_contents(this.vertical_contents);
+ m.setHorizontal_contents(this.horizontal_contents);
+ m.setJumps(this.jumps);
+ m.setCard_action_type(this.card_action_type);
+ m.setCard_action_appid(this.card_action_appid);
+ m.setCard_action_pagepath(this.card_action_pagepath);
+ m.setCard_action_url(this.card_action_url);
+ m.setTaskId(this.task_id);
+ m.setButtons(this.buttons);
+ m.setCheckbox_mode(this.checkbox_mode);
+ m.setCheckbox_question_key(this.checkbox_question_key);
+ m.setOptions(this.options);
+ m.setSubmit_button_text(this.submit_button_text);
+ m.setSubmit_button_key(this.submit_button_key);
+ m.setSelects(this.selects);
+ return m;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/CheckboxOption.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/CheckboxOption.java
new file mode 100644
index 0000000000..2f6b5b1a97
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/CheckboxOption.java
@@ -0,0 +1,49 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 按钮列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CheckboxOption implements Serializable {
+ private static final long serialVersionUID = 5405702239190050250L;
+
+ /**
+ * 选项id,用户提交选项后,会产生回调事件,回调事件会带上该id值表示该选项,最长支持128字节,不可重复
+ * 必填
+ */
+ private String id;
+ /**
+ * 选项文案描述,建议不超过17个字.
+ * 必填
+ */
+ private String text;
+ /**
+ * 该选项是否要默认选中
+ * 必填
+ */
+ private Boolean is_checked;
+
+ public JsonObject toJson() {
+ JsonObject optionJson = new JsonObject();
+ optionJson.addProperty("id", this.getId());
+ optionJson.addProperty("text", this.getText());
+ if(null != this.getIs_checked()) {
+ optionJson.addProperty("is_checked", this.getIs_checked());
+ }
+ return optionJson;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/HorizontalContent.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/HorizontalContent.java
new file mode 100644
index 0000000000..4f1160e933
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/HorizontalContent.java
@@ -0,0 +1,66 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 二级标题+文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class HorizontalContent implements Serializable {
+
+ private static final long serialVersionUID = -2209656515382964372L;
+
+ /**
+ * 链接类型,0或不填代表不是链接,1 代表跳转url,2 代表下载附件
+ */
+ private Integer type;
+ /**
+ * 二级标题,建议不超过5个字
+ */
+ private String keyname;
+ /**
+ * 二级文本,如果horizontal_content_list.type是2,该字段代表文件名称(要包含文件类型),建议不超过30个字
+ */
+ private String value;
+ /**
+ * 链接跳转的url,horizontal_content_list.type是1时必填
+ */
+ private String url;
+ /**
+ * 附件的media_id,horizontal_content_list.type是2时必填
+ */
+ private String media_id;
+
+ public JsonObject toJson() {
+ JsonObject hContentJson = new JsonObject();
+
+ if(null != this.getType()){
+ hContentJson.addProperty("type", this.getType());
+ }
+ hContentJson.addProperty("keyname", this.getKeyname());
+
+ if (StringUtils.isNotBlank(this.getValue())) {
+ hContentJson.addProperty("value", this.getValue());
+ }
+ if (StringUtils.isNotBlank(this.getUrl())) {
+ hContentJson.addProperty("url", this.getUrl());
+ }
+ if (StringUtils.isNotBlank(this.getMedia_id())) {
+ hContentJson.addProperty("media_id", this.getMedia_id());
+ }
+ return hContentJson;
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/MultipleSelect.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/MultipleSelect.java
new file mode 100644
index 0000000000..145a6c4426
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/MultipleSelect.java
@@ -0,0 +1,68 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 下拉式的选择器列表,multiple_interaction类型的卡片该字段不可为空,一个消息最多支持 3 个选择器
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MultipleSelect implements Serializable {
+ private static final long serialVersionUID = 3446092543065698516L;
+
+ /**
+ * 下拉式的选择器题目的key,用户提交选项后,会产生回调事件,回调事件会带上该key值表示该题,最长支持1024字节,不可重复
+ */
+ private String question_key;
+ /**
+ * 下拉式的选择器上面的title
+ */
+ private String title;
+ /**
+ * 默认选定的id,不填或错填默认第一个
+ */
+ private String selected_id;
+
+ /**
+ * 选项列表,下拉选项不超过 10 个,最少1个
+ */
+ private List options;
+
+ public JsonObject toJson() {
+ JsonObject selectJson = new JsonObject();
+
+ selectJson.addProperty("question_key", this.getQuestion_key());
+
+ if (StringUtils.isNotBlank(this.getTitle())) {
+ selectJson.addProperty("title", this.getTitle());
+ }
+ if (StringUtils.isNotBlank(this.getSelected_id())) {
+ selectJson.addProperty("selected_id", this.getSelected_id());
+ }
+// select_list
+ List options = this.getOptions();
+ if(null != options && options.size() > 0) {
+ JsonArray optionJsonArray = new JsonArray();
+ for (CheckboxOption option : this.getOptions()) {
+ JsonObject tempObject = option.toJson();
+ optionJsonArray.add(tempObject);
+ }
+ selectJson.add("option_list", optionJsonArray);
+ }
+
+ return selectJson;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java
new file mode 100644
index 0000000000..4ac9e005e4
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java
@@ -0,0 +1,49 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 按钮列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TemplateCardButton implements Serializable {
+ private static final long serialVersionUID = -4826551822490837002L;
+
+ /**
+ * 按钮文案,建议不超过10个字
+ */
+ private String text;
+ /**
+ * 按钮样式,目前可填1~4,不填或错填默认1
+ */
+ private Integer style;
+ /**
+ * 按钮key值,用户点击后,会产生回调事件将本参数作为EventKey返回,回调事件会带上该key值,最长支持1024字节,不可重复
+ */
+ private String key;
+
+ public JsonObject toJson() {
+ JsonObject btnObject = new JsonObject();
+
+
+ btnObject.addProperty("text", this.getText());
+
+ if (null != this.getStyle()) {
+ btnObject.addProperty("style", this.getStyle());
+ }
+ btnObject.addProperty("key", this.getKey());
+ return btnObject;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardJump.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardJump.java
new file mode 100644
index 0000000000..6d297e9c0b
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardJump.java
@@ -0,0 +1,65 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过3
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TemplateCardJump implements Serializable {
+ private static final long serialVersionUID = 4440089247405968074L;
+
+ /**
+ * 跳转链接类型,0或不填代表不是链接,1 代表跳转url,2 代表跳转小程序
+ */
+ private Integer type;
+ /**
+ * 跳转链接样式的文案内容,建议不超过18个字
+ */
+ private String title;
+ /**
+ * 跳转链接的url,jump_list.type是1时必填
+ */
+ private String url;
+ /**
+ * 跳转链接的小程序的appid,必须是与当前应用关联的小程序,jump_list.type是2时必填
+ */
+ private String appid;
+ /**
+ * 跳转链接的小程序的pagepath,jump_list.type是2时选填
+ */
+ private String pagepath;
+
+ public JsonObject toJson() {
+ JsonObject hContentJson = new JsonObject();
+
+ if(null != this.getType()){
+ hContentJson.addProperty("type", this.getType());
+ }
+ hContentJson.addProperty("title", this.getTitle());
+
+ if (StringUtils.isNotBlank(this.getUrl())) {
+ hContentJson.addProperty("url", this.getUrl());
+ }
+ if (StringUtils.isNotBlank(this.getAppid())) {
+ hContentJson.addProperty("appid", this.getAppid());
+ }
+ if (StringUtils.isNotBlank(this.getPagepath())) {
+ hContentJson.addProperty("pagepath", this.getPagepath());
+ }
+ return hContentJson;
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/VerticalContent.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/VerticalContent.java
new file mode 100644
index 0000000000..7d364ff106
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/VerticalContent.java
@@ -0,0 +1,44 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import kotlin.text.UStringsKt;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 卡片二级垂直内容,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过4
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class VerticalContent implements Serializable {
+ private static final long serialVersionUID = -1383852553854573558L;
+
+ /**
+ * 卡片二级标题,建议不超过38个字.必填字段
+ */
+ private String title;
+ /**
+ * 二级普通文本,建议不超过160个字
+ */
+ private String desc;
+
+ public JsonObject toJson() {
+ JsonObject vContentJson = new JsonObject();
+
+ vContentJson.addProperty("title", this.getTitle());
+
+ if (StringUtils.isNotBlank(this.getDesc())) {
+ vContentJson.addProperty("desc", this.getDesc());
+ }
+ return vContentJson;
+ }
+}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpMessageTest.java
index 3f7859116e..a1cfee801b 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpMessageTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpMessageTest.java
@@ -1,9 +1,12 @@
package me.chanjar.weixin.cp.bean.message;
+import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
import me.chanjar.weixin.cp.bean.article.NewArticle;
import me.chanjar.weixin.cp.bean.message.WxCpMessage;
import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton;
+import me.chanjar.weixin.cp.bean.templatecard.*;
+import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.Arrays;
@@ -141,4 +144,284 @@ public void testTaskCardBuilder() {
.isEqualTo("{\"touser\":\"OPENID\",\"msgtype\":\"taskcard\",\"taskcard\":{\"title\":\"任务卡片\",\"description\":\"有一条待处理任务\",\"url\":\"http://www.qq.com\",\"task_id\":\"task_123\",\"btn\":[{\"key\":\"yes\",\"name\":\"批准\",\"replace_name\":\"已批准\",\"color\":\"blue\",\"is_bold\":true},{\"key\":\"yes\",\"name\":\"拒绝\",\"replace_name\":\"已拒绝\",\"color\":\"red\",\"is_bold\":false}]}}");
}
+ /**
+ * 测试模板卡片消息
+ * 文本通知型
+ */
+ public void TestTemplateCardBuilder_text_notice() {
+
+ HorizontalContent hContent1 = HorizontalContent.builder()
+ .keyname("邀请人")
+ .value("张三")
+ .build();
+ HorizontalContent hContent2 = HorizontalContent.builder()
+ .type(1)
+ .keyname("企业微信官网")
+ .value("点击访问")
+ .url("https://work.weixin.qq.com")
+ .build();
+ HorizontalContent hContent3 = HorizontalContent.builder()
+ .type(2)
+ .keyname("企业微信下载")
+ .value("企业微信.apk")
+ .media_id("文件的media_id")
+ .build();
+
+ TemplateCardJump jump1 = TemplateCardJump.builder()
+ .type(1)
+ .title("企业微信官网")
+ .url("https://work.weixin.qq.com")
+ .build();
+ TemplateCardJump jump2 = TemplateCardJump.builder()
+ .type(2)
+ .title("跳转小程序")
+ .appid("小程序的appid")
+ .pagepath("/index.html")
+ .build();
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.TEXT_NOTICE)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .emphasis_content_title("100")
+ .emphasis_content_desc("核心数据")
+ .sub_title_text("下载企业微信还能抢红包!")
+ .horizontal_contents(Arrays.asList(hContent1,hContent2,hContent3))
+ .jumps(Arrays.asList(jump1,jump2))
+ .card_action_type(2)
+ .card_action_appid("小程序的appid")
+ .card_action_url("https://work.weixin.qq.com")
+ .card_action_pagepath("/index.html")
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+// System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"text_notice\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"emphasis_content\":{\"title\":\"100\",\"desc\":\"核心数据\"},\"sub_title_text\":\"下载企业微信还能抢红包!\",\"horizontal_content_list\":[{\"keyname\":\"邀请人\",\"value\":\"张三\"},{\"type\":1,\"keyname\":\"企业微信官网\",\"value\":\"点击访问\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"keyname\":\"企业微信下载\",\"value\":\"企业微信.apk\",\"media_id\":\"文件的media_id\"}],\"jump_list\":[{\"type\":1,\"title\":\"企业微信官网\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"title\":\"跳转小程序\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"}],\"card_action\":{\"type\":2,\"url\":\"https://work.weixin.qq.com\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"}}}");
+
+ }
+
+ /**
+ * 测试模板卡片消息
+ * 图文展示型
+ */
+ public void TestTemplateCardBuilder_news_notice() {
+
+ VerticalContent vContent1 = VerticalContent.builder()
+ .title("惊喜红包等你来拿")
+ .desc("下载企业微信还能抢红包!")
+ .build();
+ VerticalContent vContent2 = VerticalContent.builder()
+ .title("二级垂直内容")
+ .desc("二级垂直内容!")
+ .build();
+
+ HorizontalContent hContent1 = HorizontalContent.builder()
+ .keyname("邀请人")
+ .value("张三")
+ .build();
+ HorizontalContent hContent2 = HorizontalContent.builder()
+ .type(1)
+ .keyname("企业微信官网")
+ .value("点击访问")
+ .url("https://work.weixin.qq.com")
+ .build();
+ HorizontalContent hContent3 = HorizontalContent.builder()
+ .type(2)
+ .keyname("企业微信下载")
+ .value("企业微信.apk")
+ .media_id("文件的media_id")
+ .build();
+
+ TemplateCardJump jump1 = TemplateCardJump.builder()
+ .type(1)
+ .title("企业微信官网")
+ .url("https://work.weixin.qq.com")
+ .build();
+ TemplateCardJump jump2 = TemplateCardJump.builder()
+ .type(2)
+ .title("跳转小程序")
+ .appid("小程序的appid")
+ .pagepath("/index.html")
+ .build();
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.NEWS_NOTICE)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .vertical_contents(Arrays.asList(vContent1,vContent2))
+ .horizontal_contents(Arrays.asList(hContent1,hContent2,hContent3))
+ .jumps(Arrays.asList(jump1,jump2))
+ .card_action_type(2)
+ .card_action_appid("小程序的appid")
+ .card_action_url("https://work.weixin.qq.com")
+ .card_action_pagepath("/index.html")
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+ System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"news_notice\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"vertical_content_list\":[{\"title\":\"惊喜红包等你来拿\",\"desc\":\"下载企业微信还能抢红包!\"},{\"title\":\"二级垂直内容\",\"desc\":\"二级垂直内容!\"}],\"horizontal_content_list\":[{\"keyname\":\"邀请人\",\"value\":\"张三\"},{\"type\":1,\"keyname\":\"企业微信官网\",\"value\":\"点击访问\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"keyname\":\"企业微信下载\",\"value\":\"企业微信.apk\",\"media_id\":\"文件的media_id\"}],\"jump_list\":[{\"type\":1,\"title\":\"企业微信官网\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"title\":\"跳转小程序\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"}],\"card_action\":{\"type\":2,\"url\":\"https://work.weixin.qq.com\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"}}}");
+ }
+
+ /**
+ * 测试模板卡片消息
+ * 按钮交互型
+ */
+ public void TestTemplateCardBuilder_button_interaction() {
+
+ TemplateCardButton tButton1 = TemplateCardButton.builder()
+ .text("按钮1")
+ .style(1)
+ .key("button_key_1")
+ .build();
+ TemplateCardButton tButton2 = TemplateCardButton.builder()
+ .text("按钮2")
+ .style(2)
+ .key("button_key_2")
+ .build();
+
+ HorizontalContent hContent1 = HorizontalContent.builder()
+ .keyname("邀请人")
+ .value("张三")
+ .build();
+ HorizontalContent hContent2 = HorizontalContent.builder()
+ .type(1)
+ .keyname("企业微信官网")
+ .value("点击访问")
+ .url("https://work.weixin.qq.com")
+ .build();
+ HorizontalContent hContent3 = HorizontalContent.builder()
+ .type(2)
+ .keyname("企业微信下载")
+ .value("企业微信.apk")
+ .media_id("文件的media_id")
+ .build();
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.BUTTON_INTERACTION)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .sub_title_text("下载企业微信还能抢红包!")
+ .horizontal_contents(Arrays.asList(hContent1,hContent2,hContent3))
+ .card_action_type(2)
+ .card_action_appid("小程序的appid")
+ .card_action_url("https://work.weixin.qq.com")
+ .card_action_pagepath("/index.html")
+ .task_id("task_id")
+ .buttons(Arrays.asList(tButton1,tButton2))
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+ System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"button_interaction\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"sub_title_text\":\"下载企业微信还能抢红包!\",\"task_id\":\"task_id\",\"horizontal_content_list\":[{\"keyname\":\"邀请人\",\"value\":\"张三\"},{\"type\":1,\"keyname\":\"企业微信官网\",\"value\":\"点击访问\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"keyname\":\"企业微信下载\",\"value\":\"企业微信.apk\",\"media_id\":\"文件的media_id\"}],\"card_action\":{\"type\":2,\"url\":\"https://work.weixin.qq.com\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"},\"button_list\":[{\"text\":\"按钮1\",\"style\":1,\"key\":\"button_key_1\"},{\"text\":\"按钮2\",\"style\":2,\"key\":\"button_key_2\"}]}}");
+ }
+
+ /**
+ * 测试模板卡片消息
+ * 投票选择型
+ */
+ public void TestTemplateCardBuilder_vote_interaction() {
+ CheckboxOption option1 = CheckboxOption.builder()
+ .id("option_id1")
+ .text("选择题选项1")
+ .is_checked(true)
+ .build();
+ CheckboxOption option2 = CheckboxOption.builder()
+ .id("option_id2")
+ .text("选择题选项2")
+ .is_checked(false)
+ .build();
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.VOTE_INTERACTION)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .task_id("task_id")
+ .checkbox_question_key("question_key1")
+ .checkbox_mode(1)
+ .options(Arrays.asList(option1,option2))
+ .submit_button_key("key")
+ .submit_button_text("提交")
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+ System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"vote_interaction\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"task_id\":\"task_id\",\"checkbox\":{\"question_key\":\"question_key1\",\"mode\":1,\"option_list\":[{\"id\":\"option_id1\",\"text\":\"选择题选项1\",\"is_checked\":true},{\"id\":\"option_id2\",\"text\":\"选择题选项2\",\"is_checked\":false}]},\"submit_button\":{\"text\":\"提交\",\"key\":\"key\"}}}");
+ }
+
+ /**
+ * 测试模板卡片消息
+ * 投票选择型
+ */
+ public void TestTemplateCardBuilder_multiple_interaction() {
+ CheckboxOption option1 = CheckboxOption.builder()
+ .id("selection_id1")
+ .text("选择器选项1")
+ .build();
+ CheckboxOption option2 = CheckboxOption.builder()
+ .id("selection_id2")
+ .text("选择题选项2")
+ .build();
+ CheckboxOption option3 = CheckboxOption.builder()
+ .id("selection_id3")
+ .text("选择器选项3")
+ .build();
+ CheckboxOption option4 = CheckboxOption.builder()
+ .id("selection_id4")
+ .text("选择题选项4")
+ .build();
+
+ MultipleSelect mSelect1 = MultipleSelect.builder()
+ .question_key("question_key1")
+ .title("选择器标签1")
+ .selected_id("selection_id1")
+ .options(Arrays.asList(option1,option2))
+ .build();
+ MultipleSelect mSelect2 = MultipleSelect.builder()
+ .question_key("question_key2")
+ .title("选择器标签2")
+ .selected_id("selection_id3")
+ .options(Arrays.asList(option3,option4))
+ .build();
+
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.MULTIPLE_INTERACTION)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .task_id("task_id")
+ .selects(Arrays.asList(mSelect1,mSelect2))
+ .submit_button_key("key")
+ .submit_button_text("提交")
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+ System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"multiple_interaction\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"task_id\":\"task_id\",\"submit_button\":{\"text\":\"提交\",\"key\":\"key\"},\"select_list\":[{\"question_key\":\"question_key1\",\"title\":\"选择器标签1\",\"selected_id\":\"selection_id1\",\"option_list\":[{\"id\":\"selection_id1\",\"text\":\"选择器选项1\"},{\"id\":\"selection_id2\",\"text\":\"选择题选项2\"}]},{\"question_key\":\"question_key2\",\"title\":\"选择器标签2\",\"selected_id\":\"selection_id3\",\"option_list\":[{\"id\":\"selection_id3\",\"text\":\"选择器选项3\"},{\"id\":\"selection_id4\",\"text\":\"选择题选项4\"}]}]}}");
+ }
+
}
From 56d2b5f57acb16502e393a285129c299b9478547 Mon Sep 17 00:00:00 2001
From: nickname263
Date: Mon, 27 Sep 2021 17:27:46 +0800
Subject: [PATCH 0113/1235] =?UTF-8?q?:new:=E3=80=90=E4=BC=81=E4=B8=9A?=
=?UTF-8?q?=E5=BE=AE=E4=BF=A1=E3=80=91=E6=B7=BB=E5=8A=A0=E5=AF=B9=E6=96=B0?=
=?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=E5=8D=A1=E7=89=87=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E6=B6=88=E6=81=AF=E2=80=9C=E6=9B=B4=E6=96=B0=E7=82=B9=E5=87=BB?=
=?UTF-8?q?=E7=94=A8=E6=88=B7=E7=9A=84=E6=8C=89=E9=92=AE=E7=82=B9=E5=87=BB?=
=?UTF-8?q?=E6=96=87=E6=A1=88=E6=B6=88=E6=81=AF=E2=80=9D=E7=9A=84=E6=94=AF?=
=?UTF-8?q?=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/common/api/WxConsts.java | 1 +
.../cp/bean/message/WxCpXmlOutMessage.java | 8 +++++
.../message/WxCpXmlOutUpdateBtnMessage.java | 33 +++++++++++++++++++
.../outxmlbuilder/UpdateButtonBuilder.java | 29 ++++++++++++++++
.../cp/util/xml/XStreamTransformer.java | 7 ++++
5 files changed, 78 insertions(+)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutUpdateBtnMessage.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/UpdateButtonBuilder.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
index c1e6d39910..01b1d36483 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
@@ -45,6 +45,7 @@ public static class XmlMsgType {
public static final String HARDWARE = "hardware";
public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
public static final String UPDATE_TASKCARD = "update_taskcard";
+ public static final String UPDATE_BUTTON = "update_button";
}
/**
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java
index ff036b4c0e..70882561b7 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java
@@ -78,6 +78,14 @@ public static NewsBuilder NEWS() {
public static TaskCardBuilder TASK_CARD() {
return new TaskCardBuilder();
}
+
+ /**
+ * 获得任务卡片消息builder.
+ */
+ public static UpdateButtonBuilder UPDATE_BUTTON() {
+ return new UpdateButtonBuilder();
+ }
+
protected String toXml() {
return XStreamTransformer.toXml((Class) this.getClass(), this);
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutUpdateBtnMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutUpdateBtnMessage.java
new file mode 100644
index 0000000000..b0428469f1
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutUpdateBtnMessage.java
@@ -0,0 +1,33 @@
+package me.chanjar.weixin.cp.bean.message;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamConverter;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
+import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter;
+import me.chanjar.weixin.common.util.xml.XStreamReplaceNameConverter;
+
+import java.io.Serializable;
+
+/**
+ * @author nickname263
+ * @date 2021-09-23
+ */
+@XStreamAlias("xml")
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WxCpXmlOutUpdateBtnMessage extends WxCpXmlOutMessage {
+ private static final long serialVersionUID = 976182367423048138L;
+ @XStreamAlias("Button")
+ @XStreamConverter(value = XStreamReplaceNameConverter.class)
+ private String replaceName;
+
+ public WxCpXmlOutUpdateBtnMessage() {
+ this.msgType = WxConsts.XmlMsgType.UPDATE_BUTTON;
+ }
+
+
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/UpdateButtonBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/UpdateButtonBuilder.java
new file mode 100644
index 0000000000..d4dd4b04d2
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/UpdateButtonBuilder.java
@@ -0,0 +1,29 @@
+package me.chanjar.weixin.cp.bean.outxmlbuilder;
+
+import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTaskCardMessage;
+import me.chanjar.weixin.cp.bean.message.WxCpXmlOutUpdateBtnMessage;
+
+/**
+ * 模板卡片更新点击用户的按钮点击文案消息builder
+ *
+ * @author nickname263
+ */
+public class UpdateButtonBuilder extends BaseBuilder {
+
+
+ private String replaceName;
+
+ public UpdateButtonBuilder replaceName(String replaceName) {
+ this.replaceName = replaceName;
+ return this;
+ }
+
+ @Override
+ public WxCpXmlOutUpdateBtnMessage build() {
+ WxCpXmlOutUpdateBtnMessage m = new WxCpXmlOutUpdateBtnMessage();
+ setCommon(m);
+ m.setReplaceName(this.replaceName);
+ return m;
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
index aa907b7288..421765bc0f 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
@@ -54,6 +54,7 @@ private static Map configXStreamInstance() {
map.put(WxCpXmlOutVideoMessage.class, configWxCpXmlOutVideoMessage());
map.put(WxCpXmlOutVoiceMessage.class, configWxCpXmlOutVoiceMessage());
map.put(WxCpXmlOutTaskCardMessage.class, configWxCpXmlOutTaskCardMessage());
+ map.put(WxCpXmlOutUpdateBtnMessage.class, configWxCpXmlOutUpdateBtnMessage());
map.put(WxCpTpXmlPackage.class, configWxCpTpXmlPackage());
map.put(WxCpTpXmlMessage.class, configWxCpTpXmlMessage());
return map;
@@ -119,6 +120,12 @@ private static XStream configWxCpXmlOutTaskCardMessage() {
xstream.processAnnotations(WxCpXmlOutTaskCardMessage.class);
return xstream;
}
+ private static XStream configWxCpXmlOutUpdateBtnMessage() {
+ XStream xstream = XStreamInitializer.getInstance();
+ xstream.processAnnotations(WxCpXmlOutMessage.class);
+ xstream.processAnnotations(WxCpXmlOutUpdateBtnMessage.class);
+ return xstream;
+ }
private static XStream configWxCpTpXmlPackage() {
XStream xstream = XStreamInitializer.getInstance();
From 3c4e749ea9d9abbb38a26bde62aaff530c0543a8 Mon Sep 17 00:00:00 2001
From: Lucas
Date: Wed, 6 Oct 2021 10:17:07 +0800
Subject: [PATCH 0114/1235] =?UTF-8?q?:bug:=20#2338=20=E3=80=90=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E3=80=91=E8=90=A5=E9=94=80=E4=BB=A3?=
=?UTF-8?q?=E9=87=91=E5=88=B8=E6=8E=A5=E5=8F=A3=E4=BF=AE=E5=A4=8Dpause?=
=?UTF-8?q?=E5=92=8Crestart=E5=AE=9E=E7=8E=B0=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../marketing/FavorStocksPauseResult.java | 37 +++++++++++++++++++
.../marketing/FavorStocksRestartResult.java | 37 +++++++++++++++++++
.../wxpay/service/MarketingFavorService.java | 8 ++--
.../impl/MarketingFavorServiceImpl.java | 12 +++---
.../impl/MarketingFavorServiceImplTest.java | 4 +-
5 files changed, 86 insertions(+), 12 deletions(-)
create mode 100755 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksPauseResult.java
create mode 100755 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksRestartResult.java
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksPauseResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksPauseResult.java
new file mode 100755
index 0000000000..91e10fbf28
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksPauseResult.java
@@ -0,0 +1,37 @@
+package com.github.binarywang.wxpay.bean.marketing;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 暂停代金券批次返回结果对象
+ *
+ * @author lichuang
+ */
+@NoArgsConstructor
+@Data
+public class FavorStocksPauseResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 生效时间
+ *
+ * 生效时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ * 示例值:2015-05-20T13:29:35.120+08:00
+ */
+ @SerializedName("pause_time")
+ private String pauseTime;
+
+ /**
+ * 批次号
+ *
+ * 微信为每个代金券批次分配的唯一ID。
+ * 示例值:98065001
+ */
+ @SerializedName("stock_id")
+ private String stockId;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksRestartResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksRestartResult.java
new file mode 100755
index 0000000000..b9078bca59
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksRestartResult.java
@@ -0,0 +1,37 @@
+package com.github.binarywang.wxpay.bean.marketing;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 重启代金券批次返回结果对象
+ *
+ * @author lichuang
+ */
+@NoArgsConstructor
+@Data
+public class FavorStocksRestartResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 生效时间
+ *
+ * 生效时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ * 示例值:2015-05-20T13:29:35.120+08:00
+ */
+ @SerializedName("restart_time")
+ private String restartTime;
+
+ /**
+ * 批次号
+ *
+ * 微信为每个代金券批次分配的唯一ID。
+ * 示例值:98065001
+ */
+ @SerializedName("stock_id")
+ private String stockId;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MarketingFavorService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MarketingFavorService.java
index 5da11aabf3..ac0ed5212f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MarketingFavorService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MarketingFavorService.java
@@ -187,10 +187,10 @@ public interface MarketingFavorService {
*
*
* @param request 请求对象
- * @return FavorCallbacksSaveResult 微信返回的结果信息。
+ * @return FavorStocksPauseResult 微信返回的结果信息。
* @throws WxPayException the wx pay exception
*/
- FavorStocksStartResult pauseFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException;
+ FavorStocksPauseResult pauseFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException;
/**
*
@@ -200,10 +200,10 @@ public interface MarketingFavorService {
*
*
* @param request 请求对象
- * @return FavorCallbacksSaveResult 微信返回的结果信息。
+ * @return FavorStocksRestartResult 微信返回的结果信息。
* @throws WxPayException the wx pay exception
*/
- FavorStocksStartResult restartFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException;
+ FavorStocksRestartResult restartFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException;
UseNotifyData parseNotifyData(String data, SignatureHeader header) throws WxPayException;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java
index 5923d0e106..a10bbbb085 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java
@@ -154,19 +154,19 @@ public FavorCallbacksSaveResult saveFavorCallbacksV3(FavorCallbacksSaveRequest r
}
@Override
- public FavorStocksStartResult pauseFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException {
- String url = String.format("%s/v3/marketing/favor/stocks/%s/start", this.payService.getPayBaseUrl(), stockId);
+ public FavorStocksPauseResult pauseFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException {
+ String url = String.format("%s/v3/marketing/favor/stocks/%s/pause", this.payService.getPayBaseUrl(), stockId);
RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
- return GSON.fromJson(result, FavorStocksStartResult.class);
+ return GSON.fromJson(result, FavorStocksPauseResult.class);
}
@Override
- public FavorStocksStartResult restartFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException {
- String url = String.format("%s/v3/marketing/favor/stocks/%s/start", this.payService.getPayBaseUrl(), stockId);
+ public FavorStocksRestartResult restartFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException {
+ String url = String.format("%s/v3/marketing/favor/stocks/%s/restart", this.payService.getPayBaseUrl(), stockId);
RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
- return GSON.fromJson(result, FavorStocksStartResult.class);
+ return GSON.fromJson(result, FavorStocksRestartResult.class);
}
/**
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImplTest.java
index 48fdf8c8e5..7a532d6bdb 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImplTest.java
@@ -175,7 +175,7 @@ public void testSaveFavorCallbacksV3() throws WxPayException {
public void testPauseFavorStocksV3() throws WxPayException {
FavorStocksSetRequest request = new FavorStocksSetRequest();
request.setStockCreatorMchid(wxPayService.getConfig().getMchId());
- FavorStocksStartResult result = wxPayService.getMarketingFavorService().pauseFavorStocksV3(stockId, request);
+ FavorStocksPauseResult result = wxPayService.getMarketingFavorService().pauseFavorStocksV3(stockId, request);
log.info("result: {}", GSON.toJson(result));
}
@@ -184,7 +184,7 @@ public void testPauseFavorStocksV3() throws WxPayException {
public void testRestartFavorStocksV3() throws WxPayException {
FavorStocksSetRequest request = new FavorStocksSetRequest();
request.setStockCreatorMchid(wxPayService.getConfig().getMchId());
- FavorStocksStartResult result = wxPayService.getMarketingFavorService().restartFavorStocksV3(stockId, request);
+ FavorStocksRestartResult result = wxPayService.getMarketingFavorService().restartFavorStocksV3(stockId, request);
log.info("result: {}", GSON.toJson(result));
}
From a5c141f7bebf65894ae64803d94c561de83da69a Mon Sep 17 00:00:00 2001
From: ArBing
Date: Wed, 13 Oct 2021 13:48:49 +0800
Subject: [PATCH 0115/1235] =?UTF-8?q?:art:=20=20#2344=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E6=B0=B8=E4=B9=85=E6=8E=88?=
=?UTF-8?q?=E6=9D=83=E7=A0=81=E4=BF=A1=E6=81=AF=E7=9B=B8=E5=85=B3=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=E5=A2=9E=E5=8A=A0authMode=E3=80=81isCustomizedApp?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java | 12 ++++++++++++
.../weixin/cp/bean/WxCpTpPermanentCodeInfo.java | 12 ++++++++++++
2 files changed, 24 insertions(+)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java
index 02d51095c8..9ca4971754 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java
@@ -152,6 +152,18 @@ public static class Agent implements Serializable {
@Deprecated
private String appid;
+ /**
+ * 授权模式,0为管理员授权;1为成员授权
+ */
+ @SerializedName("auth_mode")
+ private Integer authMode;
+
+ /**
+ * 是否为代开发自建应用
+ */
+ @SerializedName("is_customized_app")
+ private Boolean isCustomizedApp;
+
/**
* 应用权限
*/
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpPermanentCodeInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpPermanentCodeInfo.java
index 02793de14d..9774f6230b 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpPermanentCodeInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpPermanentCodeInfo.java
@@ -151,6 +151,18 @@ public static class Agent implements Serializable {
@Deprecated
private String appid;
+ /**
+ * 授权模式,0为管理员授权;1为成员授权
+ */
+ @SerializedName("auth_mode")
+ private Integer authMode;
+
+ /**
+ * 是否为代开发自建应用
+ */
+ @SerializedName("is_customized_app")
+ private Boolean isCustomizedApp;
+
/**
* 应用权限
*/
From fddb2f7a182df67ef98fdef1d20019ddd249a635 Mon Sep 17 00:00:00 2001
From: ArBing
Date: Wed, 13 Oct 2021 13:49:16 +0800
Subject: [PATCH 0116/1235] =?UTF-8?q?:new:=20#2345=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=A2=9E=E5=8A=A0=E5=88=9B?=
=?UTF-8?q?=E5=BB=BA=E8=B0=83=E7=94=A8wx.agentConfig=E6=97=B6=E6=89=80?=
=?UTF-8?q?=E9=9C=80=E8=A6=81=E7=9A=84=E7=AD=BE=E5=90=8D=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/cp/api/WxCpService.java | 13 ++++++++
.../cp/api/impl/BaseWxCpServiceImpl.java | 25 +++++++++++++++
.../cp/bean/WxCpAgentJsapiSignature.java | 31 +++++++++++++++++++
3 files changed, 69 insertions(+)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAgentJsapiSignature.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
index 345b3bb344..94cd212637 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
@@ -8,6 +8,7 @@
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.cp.bean.WxCpAgentJsapiSignature;
import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
import me.chanjar.weixin.cp.bean.WxCpProviderToken;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
@@ -124,6 +125,18 @@ public interface WxCpService extends WxService {
*/
WxJsapiSignature createJsapiSignature(String url) throws WxErrorException;
+ /**
+ *
+ * 创建调用wx.agentConfig时所需要的签名
+ *
+ * 详情请见:https://open.work.weixin.qq.com/api/doc/90000/90136/94313
+ *
+ *
+ * @param url url
+ * @return the agent jsapi signature
+ * @throws WxErrorException
+ */
+ WxCpAgentJsapiSignature createAgentJsapiSignature(String url) 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 0a06571c97..89221f1a1e 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
@@ -20,6 +20,7 @@
import me.chanjar.weixin.common.util.http.*;
import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.cp.api.*;
+import me.chanjar.weixin.cp.bean.WxCpAgentJsapiSignature;
import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
import me.chanjar.weixin.cp.bean.WxCpProviderToken;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
@@ -171,6 +172,30 @@ public WxJsapiSignature createJsapiSignature(String url) throws WxErrorException
return jsapiSignature;
}
+ @Override
+ public WxCpAgentJsapiSignature createAgentJsapiSignature(String url) throws WxErrorException {
+ long timestamp = System.currentTimeMillis() / 1000;
+ String noncestr = RandomUtils.getRandomStr();
+ String jsapiTicket = getAgentJsapiTicket(false);
+ String signature = SHA1.genWithAmple(
+ "jsapi_ticket=" + jsapiTicket,
+ "noncestr=" + noncestr,
+ "timestamp=" + timestamp,
+ "url=" + url
+ );
+
+ WxCpAgentJsapiSignature jsapiSignature = new WxCpAgentJsapiSignature();
+ jsapiSignature.setTimestamp(timestamp);
+ jsapiSignature.setNonceStr(noncestr);
+ jsapiSignature.setUrl(url);
+ jsapiSignature.setSignature(signature);
+
+ jsapiSignature.setCorpid(this.configStorage.getCorpId());
+ jsapiSignature.setAgentid(this.configStorage.getAgentId());
+
+ return jsapiSignature;
+ }
+
@Override
public WxCpMaJsCode2SessionResult jsCode2Session(String jsCode) throws WxErrorException {
Map params = new HashMap<>(2);
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAgentJsapiSignature.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAgentJsapiSignature.java
new file mode 100644
index 0000000000..4562d9b9b0
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAgentJsapiSignature.java
@@ -0,0 +1,31 @@
+package me.chanjar.weixin.cp.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 调用wx.agentConfig时所需要的签名信息
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxCpAgentJsapiSignature implements Serializable {
+ private static final long serialVersionUID = 2650119900835832545L;
+
+ private String url;
+
+ private String corpid;
+
+ private Integer agentid;
+
+ private long timestamp;
+
+ private String nonceStr;
+
+ private String signature;
+}
From 0bcba32ea40d2e8f60ff49d27b2747a0be86d8c3 Mon Sep 17 00:00:00 2001
From: Kyle Scully
Date: Tue, 12 Oct 2021 23:06:39 -0700
Subject: [PATCH 0117/1235] refactor: Use diamond operator
---
.../weixin/common/util/http/WxDnsResolver.java | 4 ++--
.../config/impl/AbstractWxMaRedisConfig.java | 2 +-
.../api/impl/WxMaShopAuditServiceImplTest.java | 16 ++++++++--------
.../open/api/impl/WxOpenMessageRouter.java | 2 +-
4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
index 6c6137089a..d0321af097 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
@@ -19,7 +19,7 @@
public class WxDnsResolver implements DnsResolver {
private final static String WECHAT_API_URL = "api.weixin.qq.com";
- private static Map MAPPINGS = new HashMap();
+ private static Map MAPPINGS = new HashMap<>();
protected final Logger log = LoggerFactory.getLogger(WxDnsResolver.class);
private String wxApiIp;
@@ -38,7 +38,7 @@ private void init() {
} catch (UnknownHostException e) {
//如果初始化DNS配置失败则使用默认配置,不影响服务的启动
log.error("init WxDnsResolver error", e);
- MAPPINGS = new HashMap();
+ MAPPINGS = new HashMap<>();
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/AbstractWxMaRedisConfig.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/AbstractWxMaRedisConfig.java
index 9b94a04bbb..19d3a00f69 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/AbstractWxMaRedisConfig.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/AbstractWxMaRedisConfig.java
@@ -79,7 +79,7 @@ private String getValueFromRedis(String key) {
private void setValueToRedis(String key, long expiresTime, String value) {
try (Jedis jedis = getConfiguredJedis()) {
- Map hash = new HashMap();
+ Map hash = new HashMap<>();
hash.put(HASH_VALUE_FIELD, value);
hash.put(HASH_EXPIRE_FIELD, String.valueOf(expiresTime));
jedis.hmset(getRedisKey(key), hash);
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java
index c8ec9f081c..117f052ac3 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java
@@ -33,23 +33,23 @@ public void testAuditBrand() throws WxErrorException {
WxMaShopAuditBrandRequest request = WxMaShopAuditBrandRequest.builder().build();
WxMaShopAuditBrandRequest.AuditReqBean auditReqBean = WxMaShopAuditBrandRequest.AuditReqBean.builder().build();
- auditReqBean.setLicense(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")));
+ auditReqBean.setLicense(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")));
auditReqBean.setBrandInfo(WxMaShopAuditBrandRequest.AuditReqBean.BrandInfoBean.builder()
.brandAuditType(1)
.trademarkType("29")
.brandManagementType(2)
.commodityOriginType(2)
.brandWording("346225226351203275")
- .saleAuthorization(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
- .trademarkRegistrationCertificate(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
- .trademarkChangeCertificate(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .saleAuthorization(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkRegistrationCertificate(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkChangeCertificate(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
.trademarkRegistrant("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")
.trademarkRegistrantNu("1249305")
.trademarkAuthorizationPeriod("2020-03-25 12:05:25")
- .trademarkRegistrationApplication(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkRegistrationApplication(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
.trademarkApplicant("张三")
.trademarkApplicationTime("2020-03-25 12:05:25")
- .importedGoodsForm(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .importedGoodsForm(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
.build());
request.setAuditReq(auditReqBean);
@@ -61,12 +61,12 @@ public void testAuditBrand() throws WxErrorException {
public void testAuditCategory() throws WxErrorException {
WxMaShopAuditCategoryRequest request = WxMaShopAuditCategoryRequest.builder().build();
WxMaShopAuditCategoryRequest.AuditReqBean auditReqBean = WxMaShopAuditCategoryRequest.AuditReqBean.builder().build();
- auditReqBean.setLicense(new ArrayList(Arrays.asList("www.xxxxx.com")));
+ auditReqBean.setLicense(new ArrayList<>(Arrays.asList("www.xxxxx.com")));
auditReqBean.setCategoryInfo(WxMaShopAuditCategoryRequest.AuditReqBean.CategoryInfoBean.builder()
.level1(7419)
.level2(7439)
.level3(7448)
- .certificate(new ArrayList(Arrays.asList("www.xxxxx.com")))
+ .certificate(new ArrayList<>(Arrays.asList("www.xxxxx.com")))
.build());
request.setAuditReq(auditReqBean);
WxMaShopAuditCategoryResponse response = wxService.getShopAuditService().auditCategory(request);
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMessageRouter.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMessageRouter.java
index 2e483fc0aa..7314bfd694 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMessageRouter.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMessageRouter.java
@@ -17,7 +17,7 @@ public WxOpenMessageRouter(WxOpenService wxOpenService) {
}
public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage, String appId) {
- return route(wxMessage, new HashMap(), appId);
+ return route(wxMessage, new HashMap<>(), appId);
}
public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage, final Map context, String appId) {
From e68477c26c48881f7aae52d241d89e7f46422e00 Mon Sep 17 00:00:00 2001
From: Kyle Scully
Date: Wed, 13 Oct 2021 23:20:08 -0700
Subject: [PATCH 0118/1235] refactor: Remove unnecessary parentheses
---
.../weixin/common/session/StandardSessionManager.java | 8 ++++----
.../qidian/api/impl/WxQidianDialServiceImplTest.java | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java
index 290a0c04f7..8d994b9c36 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java
@@ -98,7 +98,7 @@ public WxSession getSession(String sessionId, boolean create) {
// Create a new session if requested and the response is not committed
if (!create) {
- return (null);
+ return null;
}
session = createSession(sessionId);
@@ -127,7 +127,7 @@ public void remove(InternalSession session, boolean update) {
@Override
public InternalSession findSession(String id) {
if (id == null) {
- return (null);
+ return null;
}
return this.sessions.get(id);
}
@@ -251,7 +251,7 @@ public void processExpires() {
if (this.log.isDebugEnabled()) {
this.log.debug("End expire sessions {} processingTime {} expired sessions: {}", getName(), timeEnd - timeNow, expireHere);
}
- this.processingTime += (timeEnd - timeNow);
+ this.processingTime += timeEnd - timeNow;
}
@@ -289,7 +289,7 @@ public void setBackgroundProcessorDelay(int backgroundProcessorDelay) {
*/
public String getName() {
- return (name);
+ return name;
}
diff --git a/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/impl/WxQidianDialServiceImplTest.java b/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/impl/WxQidianDialServiceImplTest.java
index e91d471c15..43e7ba299d 100644
--- a/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/impl/WxQidianDialServiceImplTest.java
+++ b/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/impl/WxQidianDialServiceImplTest.java
@@ -32,7 +32,7 @@ public void dial() throws WxErrorException {
IVRListResponse iVRListResponse = this.wxService.getDialService().getIVRList();
Assert.assertEquals(iVRListResponse.getErrcode(), new Integer(0));
log.info("ivr size:" + iVRListResponse.getNode().size());
- Optional optional = iVRListResponse.getNode().stream().filter((o) -> o.getIvr_name().equals("自动接听需求测试"))
+ Optional optional = iVRListResponse.getNode().stream().filter(o -> o.getIvr_name().equals("自动接听需求测试"))
.findFirst();
Assert.assertTrue(optional.isPresent());
Ivr ivr = optional.get();
From 0c1258594ea2cbcb8e5f7b1aa2c5ad99bf0f4670 Mon Sep 17 00:00:00 2001
From: linlinjava
Date: Sun, 17 Oct 2021 20:05:46 +0800
Subject: [PATCH 0119/1235] =?UTF-8?q?=E4=BF=AE=E5=A4=8DWxMaShopPayInfo?=
=?UTF-8?q?=E7=9A=84=E6=94=AF=E4=BB=98=E6=96=B9=E5=BC=8F=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java
index c9a56a3aed..7ea749e197 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java
@@ -13,13 +13,13 @@ public class WxMaShopPayInfo implements Serializable {
private static final long serialVersionUID = 687488209024968647L;
/**
- * 支付方式(目前只有"微信支付")
+ * 支付方式(支付方式,0:微信支付,1: 货到付款,2:商家会员储蓄卡, 默认0)
*
* 是否必填:是
*
*/
- @SerializedName("pay_method")
- private String payMethod;
+ @SerializedName("pay_method_type")
+ private Integer payMethodType;
/**
* 预支付ID
From f4c18d7eb80f6bb4a74406fa9c9b948b55d7293f Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 17 Oct 2021 20:20:43 +0800
Subject: [PATCH 0120/1235] =?UTF-8?q?:art:=20=E8=A1=A5=E5=85=85=E9=94=99?=
=?UTF-8?q?=E8=AF=AF=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
index 486791986b..58dc4f345d 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
@@ -209,6 +209,10 @@ public enum WxMpErrorMsgEnum {
* 请勿添加其他公众号的主页链接.
*/
CODE_40155(40155, "请勿添加其他公众号的主页链接"),
+ /**
+ * oauth_code已使用
+ */
+ CODE_40163(40163, "oauth_code已使用"),
/**
* 缺少 access_token 参数.
*/
From 8c787d16389aff273e7bfe10d96a3c0966cb2c6f Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 17 Oct 2021 20:21:56 +0800
Subject: [PATCH 0121/1235] =?UTF-8?q?:art:=20=E8=A1=A5=E5=85=85=E7=BC=BA?=
=?UTF-8?q?=E5=A4=B1=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bean/profitsharing/ProfitSharingResult.java | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java
index ce6a1f8e95..ffa6d5a2af 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java
@@ -36,10 +36,24 @@ public class ProfitSharingResult extends BaseWxPayResult implements Serializable
@XStreamAlias("order_id")
private String orderId;
+ /**
+ * 分账单状态.
+ */
+ @XStreamAlias("status")
+ private String status;
+
+ /**
+ * 分账接收方列表.
+ */
+ @XStreamAlias("receivers")
+ private String receivers;
+
@Override
protected void loadXml(Document d) {
transactionId = readXmlString(d, "transaction_id");
outOrderNo = readXmlString(d, "out_order_no");
orderId = readXmlString(d, "order_id");
+ status = readXmlString(d, "status");
+ receivers = readXmlString(d, "receivers");
}
}
From 5755c293dfea25f16b30b8afb145aaaa4cf08f3a Mon Sep 17 00:00:00 2001
From: dragon
Date: Sat, 23 Oct 2021 23:23:18 +0800
Subject: [PATCH 0122/1235] =?UTF-8?q?:new:=20#2356=20=E3=80=90=E5=85=AC?=
=?UTF-8?q?=E4=BC=97=E5=8F=B7=E3=80=91=E6=96=B0=E5=A2=9E=E8=8D=89=E7=A8=BF?=
=?UTF-8?q?=E7=AE=B1=E5=92=8C=E5=8F=91=E5=B8=83=E7=9B=B8=E5=85=B3=E7=9A=84?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/mp/api/WxMpDraftService.java | 127 ++++++++++++++++++
.../weixin/mp/api/WxMpFreePublishService.java | 113 ++++++++++++++++
.../me/chanjar/weixin/mp/api/WxMpService.java | 28 ++++
.../mp/api/impl/BaseWxMpServiceImpl.java | 25 +++-
.../mp/api/impl/WxMpDraftServiceImpl.java | 84 ++++++++++++
.../api/impl/WxMpFreePublishServiceImpl.java | 72 ++++++++++
.../weixin/mp/bean/draft/WxMpAddDraft.java | 44 ++++++
.../mp/bean/draft/WxMpDraftArticles.java | 81 +++++++++++
.../weixin/mp/bean/draft/WxMpDraftInfo.java | 44 ++++++
.../weixin/mp/bean/draft/WxMpDraftItem.java | 33 +++++
.../weixin/mp/bean/draft/WxMpDraftList.java | 41 ++++++
.../weixin/mp/bean/draft/WxMpUpdateDraft.java | 55 ++++++++
.../freepublish/WxMpFreePublishArticles.java | 85 ++++++++++++
.../bean/freepublish/WxMpFreePublishInfo.java | 44 ++++++
.../bean/freepublish/WxMpFreePublishItem.java | 35 +++++
.../bean/freepublish/WxMpFreePublishList.java | 41 ++++++
.../freepublish/WxMpFreePublishStatus.java | 56 ++++++++
.../chanjar/weixin/mp/enums/WxMpApiUrl.java | 89 +++++++++++-
.../mp/api/impl/WxMpDraftServiceImplTest.java | 127 ++++++++++++++++++
.../impl/WxMpFreePublishServiceImplTest.java | 109 +++++++++++++++
20 files changed, 1330 insertions(+), 3 deletions(-)
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDraftService.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpFreePublishService.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImpl.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImpl.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpAddDraft.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftArticles.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftInfo.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftItem.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftList.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpUpdateDraft.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishArticles.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishInfo.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishItem.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishList.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishStatus.java
create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImplTest.java
create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImplTest.java
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDraftService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDraftService.java
new file mode 100644
index 0000000000..3e38410d5f
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDraftService.java
@@ -0,0 +1,127 @@
+package me.chanjar.weixin.mp.api;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.bean.draft.WxMpAddDraft;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftInfo;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftList;
+import me.chanjar.weixin.mp.bean.draft.WxMpUpdateDraft;
+
+/**
+ * 微信 草稿箱 接口.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+public interface WxMpDraftService {
+
+ /**
+ * 新建草稿 - 只有默认必填参数
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Add_draft.html
+ *
+ *
+ * @param title 标题
+ * @param content 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。
+ * @param thumbMediaId 图文消息的封面图片素材id(必须是永久MediaID)
+ * @throws WxErrorException .
+ */
+ String addDraft(String title, String content, String thumbMediaId) throws WxErrorException;
+
+ /**
+ * 新建草稿 - 完整参数
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Add_draft.html
+ *
+ *
+ * @param addDraft 新建草稿信息
+ * @throws WxErrorException .
+ */
+ String addDraft(WxMpAddDraft addDraft) throws WxErrorException;
+
+ /**
+ * 修改草稿 - 完整参数
+ * 正常情况下调用成功时,errcode将为0。错误时微信会返回错误码等信息,请根据错误码查询错误信息
+ *
+ * 请求地址: POST https://api.weixin.qq.com/cgi-bin/draft/update?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Update_draft.html
+ *
+ *
+ * @param updateDraftInfo 修改草稿信息
+ * @throws WxErrorException .
+ */
+ Boolean updateDraft(WxMpUpdateDraft updateDraftInfo) throws WxErrorException;
+
+ /**
+ * 获取草稿信息
+ *
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/get?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Get_draft.html
+ *
+ *
+ * @param mediaId 要获取的草稿的media_id
+ * @return 草稿信息
+ * @throws WxErrorException .
+ */
+ WxMpDraftInfo getDraft(String mediaId) throws WxErrorException;
+
+ /**
+ * 删除草稿
+ * 正常情况下调用成功时,errcode将为0。错误时微信会返回错误码等信息,请根据错误码查询错误信息。
+ * 多次删除同一篇草稿,也返回 0.
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/delete?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Delete_draft.html
+ *
+ *
+ * @param mediaId 要删除的草稿的media_id
+ * @throws WxErrorException .
+ */
+ Boolean delDraft(String mediaId) throws WxErrorException;
+
+ /**
+ * 获取草稿列表
+ *
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Get_draft_list.html
+ *
+ *
+ * @param offset 分页页数,从0开始 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
+ * @param count 每页数量 返回素材的数量,取值在1到20之间
+ * @param noContent 1 表示不返回 content 字段,0 表示正常返回,默认为 0
+ * @return 草稿信息列表
+ * @throws WxErrorException .
+ */
+ WxMpDraftList listDraft(int offset, int count, int noContent) throws WxErrorException;
+
+ /**
+ * 获取草稿列表
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Get_draft_list.html
+ *
+ *
+ * @param offset 分页页数,从0开始 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
+ * @param count 每页数量 返回素材的数量,取值在1到20之间
+ * @return
+ * @throws WxErrorException
+ */
+ WxMpDraftList listDraft(int offset, int count) throws WxErrorException;
+
+ /**
+ * 获取草稿数量
+ * 开发者可以根据本接口来获取草稿的总数。此接口只统计数量,不返回草稿的具体内容。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/count?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Count_drafts.html
+ *
+ *
+ * @return 草稿的总数
+ * @throws WxErrorException .
+ */
+ Long countDraft() throws WxErrorException;
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpFreePublishService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpFreePublishService.java
new file mode 100644
index 0000000000..c695942790
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpFreePublishService.java
@@ -0,0 +1,113 @@
+package me.chanjar.weixin.mp.api;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishInfo;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishList;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishStatus;
+
+/**
+ * 微信 发布能力 接口.
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+public interface WxMpFreePublishService {
+
+ /**
+ * 发布接口 - 只有默认必填参数
+ * 开发者需要先将图文素材以草稿的形式保存(见“草稿箱/新建草稿”,如需从已保存的草稿中选择,见“草稿箱/获取草稿列表”),选择要发布的草稿 media_id 进行发布
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Publish.html
+ *
+ *
+ * @param mediaId 要发布的草稿的media_id
+ * @throws WxErrorException .
+ */
+ String submit(String mediaId) throws WxErrorException;
+
+ /**
+ * 发布状态轮询接口
+ * 开发者可以尝试通过下面的发布状态轮询接口获知发布情况。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/get?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Get_status.html
+ *
+ *
+ * @param publishId 发布任务id
+ * @throws WxErrorException .
+ */
+ WxMpFreePublishStatus getPushStatus(String publishId) throws WxErrorException;
+
+ /**
+ * 删除发布
+ * 发布成功之后,随时可以通过该接口删除。此操作不可逆,请谨慎操作。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/delete?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Delete_posts.html
+ *
+ *
+ * @param articleId 成功发布时返回的 article_id
+ * @param index 要删除的文章在图文消息中的位置,第一篇编号为1,该字段不填或填0会删除全部文章
+ * @throws WxErrorException .
+ */
+ Boolean deletePush(String articleId, Integer index) throws WxErrorException;
+
+ /**
+ * 删除发布 - 此条发布的所有内容,不指定文章编号
+ * 发布成功之后,随时可以通过该接口删除。此操作不可逆,请谨慎操作。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/delete?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Delete_posts.html
+ *
+ *
+ * @param articleId 成功发布时返回的 article_id
+ * @throws WxErrorException .
+ */
+ Boolean deletePushAllArticle(String articleId) throws WxErrorException;
+
+ /**
+ * 通过 article_id 获取已发布文章
+ * 开发者可以通过 article_id 获取已发布的图文信息。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/getarticle?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Get_article_from_id.html
+ *
+ *
+ * @param articleId 要获取的草稿的article_id
+ * @return 已发布文章信息
+ * @throws WxErrorException .
+ */
+ WxMpFreePublishInfo getArticleFromId(String articleId) throws WxErrorException;
+
+ /**
+ * 获取成功发布列表 - 支持选择是否返回:图文消息的具体内容
+ *
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Get_publication_records.html
+ *
+ *
+ * @param offset 分页页数,从0开始 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
+ * @param count 每页数量 返回素材的数量,取值在1到20之间
+ * @param noContent 1 表示不返回 content 字段,0 表示正常返回,默认为 0
+ * @return 草稿信息列表
+ * @throws WxErrorException .
+ */
+ WxMpFreePublishList getPublicationRecords(int offset, int count, int noContent) throws WxErrorException;
+
+ /**
+ * 获取成功发布列表 - 默认返回 图文消息的具体内容
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Get_publication_records.html
+ *
+ *
+ * @param offset 分页页数,从0开始 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
+ * @param count 每页数量 返回素材的数量,取值在1到20之间
+ * @return
+ * @throws WxErrorException
+ */
+ WxMpFreePublishList getPublicationRecords(int offset, int count) throws WxErrorException;
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
index 6b6e30b7f3..fbe9e2d43a 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
@@ -567,6 +567,20 @@ public interface WxMpService extends WxService {
*/
WxMpReimburseInvoiceService getReimburseInvoiceService();
+ /**
+ * 返回草稿箱相关接口
+ *
+ * @return WxMpDraftService
+ */
+ WxMpDraftService getDraftService();
+
+ /**
+ * 返回发布能力接口
+ *
+ * @return WxMpFreePublishService
+ */
+ WxMpFreePublishService getFreePublishService();
+
/**
* .
*
@@ -818,4 +832,18 @@ public interface WxMpService extends WxService {
* @param merchantInvoiceService the merchant invoice service
*/
void setMerchantInvoiceService(WxMpMerchantInvoiceService merchantInvoiceService);
+
+ /**
+ * Sets draft service.
+ *
+ * @param draftService the draft service
+ */
+ void setDraftService(WxMpDraftService draftService);
+
+ /**
+ * Sets free publish service.
+ *
+ * @param freePublishService the free publish service
+ */
+ void setFreePublishService(WxMpFreePublishService freePublishService);
}
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 2b8d9bfd39..d11499bd4f 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
@@ -25,7 +25,11 @@
import me.chanjar.weixin.common.util.DataUtils;
import me.chanjar.weixin.common.util.RandomUtils;
import me.chanjar.weixin.common.util.crypto.SHA1;
-import me.chanjar.weixin.common.util.http.*;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
+import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
+import me.chanjar.weixin.common.util.http.URIUtil;
import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.api.*;
@@ -42,7 +46,16 @@
import java.util.Map;
import java.util.concurrent.locks.Lock;
-import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.*;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.CLEAR_QUOTA_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.FETCH_SHORTEN_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GEN_SHORTEN_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GET_CALLBACK_IP_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GET_CURRENT_AUTOREPLY_INFO_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GET_TICKET_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.NETCHECK_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.QRCONNECT_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.SEMANTIC_SEMPROXY_SEARCH_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.SHORTURL_API_URL;
/**
* 基础实现类.
@@ -146,6 +159,14 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
@Setter
private WxMpReimburseInvoiceService reimburseInvoiceService = new WxMpReimburseInvoiceServiceImpl(this);
+ @Getter
+ @Setter
+ private WxMpDraftService draftService = new WxMpDraftServiceImpl(this);
+
+ @Getter
+ @Setter
+ private WxMpFreePublishService freePublishService = new WxMpFreePublishServiceImpl(this);
+
private Map configStorageMap;
private int retrySleepMillis = 1000;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImpl.java
new file mode 100644
index 0000000000..96ff9f70b6
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImpl.java
@@ -0,0 +1,84 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.common.util.json.GsonParser;
+import me.chanjar.weixin.mp.api.WxMpDraftService;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.draft.WxMpAddDraft;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftArticles;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftInfo;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftList;
+import me.chanjar.weixin.mp.bean.draft.WxMpUpdateDraft;
+import me.chanjar.weixin.mp.enums.WxMpApiUrl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 草稿箱能力-service实现类.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@AllArgsConstructor
+public class WxMpDraftServiceImpl implements WxMpDraftService {
+
+ private static final String MEDIA_ID = "media_id";
+ private static final String ERRCODE_SUCCESS = "0";
+ private static final String ERRCODE = "errcode";
+ private final WxMpService mpService;
+
+ @Override
+ public String addDraft(String title, String content, String thumbMediaId) throws WxErrorException {
+ List draftArticleList = new ArrayList<>();
+ WxMpDraftArticles draftArticle = WxMpDraftArticles.builder()
+ .title(title).content(content).thumbMediaId(thumbMediaId).build();
+ WxMpAddDraft addDraft = WxMpAddDraft.builder().articles(draftArticleList).build();
+ draftArticleList.add(draftArticle);
+ return addDraft(addDraft);
+ }
+
+ @Override
+ public String addDraft(WxMpAddDraft addDraft) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.Draft.ADD_DRAFT, addDraft);
+ return GsonParser.parse(json).get(MEDIA_ID).toString();
+ }
+
+ @Override
+ public Boolean updateDraft(WxMpUpdateDraft updateDraftInfo) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.Draft.UPDATE_DRAFT, updateDraftInfo);
+ return GsonParser.parse(json).get(ERRCODE).toString().equals(ERRCODE_SUCCESS);
+ }
+
+ @Override
+ public WxMpDraftInfo getDraft(String mediaId) throws WxErrorException {
+ return WxMpDraftInfo.fromJson(this.mpService.post(WxMpApiUrl.Draft.GET_DRAFT,
+ GsonHelper.buildJsonObject(MEDIA_ID, mediaId)));
+ }
+
+ @Override
+ public Boolean delDraft(String mediaId) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.Draft.DEL_DRAFT,
+ GsonHelper.buildJsonObject(MEDIA_ID, mediaId));
+ return GsonParser.parse(json).get(ERRCODE).toString().equals(ERRCODE_SUCCESS);
+ }
+
+ @Override
+ public WxMpDraftList listDraft(int offset, int count, int noContent) throws WxErrorException {
+ return WxMpDraftList.fromJson(this.mpService.post(WxMpApiUrl.Draft.LIST_DRAFT,
+ GsonHelper.buildJsonObject("offset", offset, "count", count, "no_content", noContent)));
+ }
+
+ @Override
+ public WxMpDraftList listDraft(int offset, int count) throws WxErrorException {
+ return listDraft(offset, count, 0);
+ }
+
+ @Override
+ public Long countDraft() throws WxErrorException {
+ String json = this.mpService.get(WxMpApiUrl.Draft.COUNT_DRAFT, null);
+ return Long.valueOf(GsonParser.parse(json).get("total_count").toString());
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImpl.java
new file mode 100644
index 0000000000..f8f9b36843
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImpl.java
@@ -0,0 +1,72 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.common.util.json.GsonParser;
+import me.chanjar.weixin.mp.api.WxMpFreePublishService;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishInfo;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishList;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishStatus;
+import me.chanjar.weixin.mp.enums.WxMpApiUrl;
+
+/**
+ * 发布能力-service实现类.
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@AllArgsConstructor
+public class WxMpFreePublishServiceImpl implements WxMpFreePublishService {
+
+ private static final String MEDIA_ID = "media_id";
+ private static final String PUBLISH_ID = "publish_id";
+ private static final String ARTICLE_ID = "article_id";
+ private static final String ERRCODE_SUCCESS = "0";
+ private static final String ERRCODE = "errcode";
+ private final WxMpService mpService;
+
+ @Override
+ public String submit(String mediaId) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.FreePublish.SUBMIT,
+ GsonHelper.buildJsonObject(MEDIA_ID, mediaId));
+ return GsonParser.parse(json).get(PUBLISH_ID).toString();
+ }
+
+ @Override
+ public WxMpFreePublishStatus getPushStatus(String publishId) throws WxErrorException {
+ return WxMpFreePublishStatus.fromJson(this.mpService.post(WxMpApiUrl.FreePublish.GET_PUSH_STATUS,
+ GsonHelper.buildJsonObject(PUBLISH_ID, publishId)));
+ }
+
+ @Override
+ public Boolean deletePush(String articleId, Integer index) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.FreePublish.DEL_PUSH,
+ GsonHelper.buildJsonObject(ARTICLE_ID, articleId, "index", index));
+ return GsonParser.parse(json).get(ERRCODE).toString().equals(ERRCODE_SUCCESS);
+ }
+
+ @Override
+ public Boolean deletePushAllArticle(String articleId) throws WxErrorException {
+ // index字段不填或填0会删除全部文章
+ return deletePush(articleId, 0);
+ }
+
+ @Override
+ public WxMpFreePublishInfo getArticleFromId(String articleId) throws WxErrorException {
+ return WxMpFreePublishInfo.fromJson(this.mpService.post(WxMpApiUrl.FreePublish.GET_ARTICLE,
+ GsonHelper.buildJsonObject(ARTICLE_ID, articleId)));
+ }
+
+ @Override
+ public WxMpFreePublishList getPublicationRecords(int offset, int count, int noContent) throws WxErrorException {
+ return WxMpFreePublishList.fromJson(this.mpService.post(WxMpApiUrl.FreePublish.BATCH_GET,
+ GsonHelper.buildJsonObject("offset", offset, "count", count, "no_content", noContent)));
+ }
+
+ @Override
+ public WxMpFreePublishList getPublicationRecords(int offset, int count) throws WxErrorException {
+ return getPublicationRecords(offset, count, 0);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpAddDraft.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpAddDraft.java
new file mode 100644
index 0000000000..400b228c0b
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpAddDraft.java
@@ -0,0 +1,44 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 草稿箱能力-新建草稿.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpAddDraft implements ToJson, Serializable {
+ private static final long serialVersionUID = 2481699972367293721L;
+
+ /**
+ * 图文素材列表
+ */
+ @SerializedName("articles")
+ private List articles;
+
+ public static WxMpAddDraft fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpAddDraft.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftArticles.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftArticles.java
new file mode 100644
index 0000000000..fdcff5c293
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftArticles.java
@@ -0,0 +1,81 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 草稿箱能力-图文素材文章实体.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpDraftArticles implements ToJson, Serializable {
+ /**
+ * 标题
+ */
+ @SerializedName("title")
+ private String title;
+ /**
+ * 作者
+ */
+ @SerializedName("author")
+ private String author;
+ /**
+ * 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前54个字。
+ */
+ @SerializedName("digest")
+ private String digest;
+ /**
+ * 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。
+ */
+ @SerializedName("content")
+ private String content;
+ /**
+ * 图文消息的原文地址,即点击“阅读原文”后的URL
+ */
+ @SerializedName("content_source_url")
+ private String contentSourceUrl;
+ /**
+ * 图文消息的封面图片素材id(必须是永久MediaID)
+ */
+ @SerializedName("thumb_media_id")
+ private String thumbMediaId;
+ /**
+ * 是否显示封面,0为false,即不显示,1为true,即显示(默认)
+ */
+ @SerializedName("show_cover_pic")
+ private Integer showCoverPic;
+ /**
+ * 是否打开评论,0不打开(默认),1打开
+ */
+ @SerializedName("need_open_comment")
+ private Integer needOpenComment;
+ /**
+ * 是否粉丝才可评论,0所有人可评论(默认),1粉丝才可评论
+ */
+ @SerializedName("only_fans_can_comment")
+ private Integer onlyFansCanComment;
+
+ public static WxMpDraftArticles fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpDraftArticles.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftInfo.java
new file mode 100644
index 0000000000..92a0c928d9
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftInfo.java
@@ -0,0 +1,44 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 草稿箱能力-获取草稿详情.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpDraftInfo implements ToJson, Serializable {
+ private static final long serialVersionUID = 6111694033486314392L;
+
+ /**
+ * 文章列表
+ */
+ @SerializedName("news_item")
+ private List newsItem;
+
+ public static WxMpDraftInfo fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpDraftInfo.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftItem.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftItem.java
new file mode 100644
index 0000000000..05294cade5
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftItem.java
@@ -0,0 +1,33 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 一条草稿
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+public class WxMpDraftItem implements Serializable {
+ private static final long serialVersionUID = 214696458030935146L;
+
+ /**
+ * 图文消息的id
+ */
+ @SerializedName("media_id")
+ private String mediaId;
+ /**
+ * 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS。
+ */
+ @SerializedName("content")
+ private WxMpDraftInfo content;
+
+ public static WxMpDraftItem fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpDraftItem.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftList.java
new file mode 100644
index 0000000000..924ce4b048
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftList.java
@@ -0,0 +1,41 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 草稿箱能力-获取草稿列表.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+public class WxMpDraftList implements Serializable {
+ private static final long serialVersionUID = 7216822694952035295L;
+
+ /**
+ * 草稿素材的总数
+ */
+ @SerializedName("total_count")
+ private Integer totalCount;
+
+ /**
+ * 本次调用获取的素材的数量
+ */
+ @SerializedName("item_count")
+ private Integer itemCount;
+
+ /**
+ * 所有草稿列表
+ */
+ @SerializedName("item")
+ private List items;
+
+ public static WxMpDraftList fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpDraftList.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpUpdateDraft.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpUpdateDraft.java
new file mode 100644
index 0000000000..fa92a62397
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpUpdateDraft.java
@@ -0,0 +1,55 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 草稿箱能力-修改草稿.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpUpdateDraft implements ToJson, Serializable {
+
+ private static final long serialVersionUID = -8564521168423899915L;
+ /**
+ * 要修改的图文消息的id
+ */
+ @SerializedName("media_id")
+ private String mediaId;
+
+ /**
+ * 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0
+ */
+ @SerializedName("index")
+ private Integer index;
+
+ /**
+ * 图文素材列表
+ */
+ @SerializedName("articles")
+ private WxMpDraftArticles articles;
+
+ public static WxMpUpdateDraft fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpUpdateDraft.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishArticles.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishArticles.java
new file mode 100644
index 0000000000..20f915f195
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishArticles.java
@@ -0,0 +1,85 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 一条发布的图文记录
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@NoArgsConstructor
+@Data
+public class WxMpFreePublishArticles implements Serializable {
+ private static final long serialVersionUID = -6435229818150835883L;
+
+ /**
+ * 标题
+ */
+ @SerializedName("title")
+ private String title;
+ /**
+ * 作者
+ */
+ @SerializedName("author")
+ private String author;
+ /**
+ * 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。
+ */
+ @SerializedName("digest")
+ private String digest;
+ /**
+ * 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS
+ */
+ @SerializedName("content")
+ private String content;
+ /**
+ * 图文消息的原文地址,即点击“阅读原文”后的URL
+ */
+ @SerializedName("content_source_url")
+ private String contentSourceUrl;
+ /**
+ * 图文消息的封面图片素材id(一定是永久MediaID)
+ */
+ @SerializedName("thumb_media_id")
+ private String thumbMediaId;
+ /**
+ * 是否显示封面,0为false,即不显示,1为true,即显示(默认)
+ */
+ @SerializedName("show_cover_pic")
+ private Integer showCoverPic;
+ /**
+ * 是否打开评论,0不打开(默认),1打开
+ */
+ @SerializedName("need_open_comment")
+ private Integer needOpenComment;
+ /**
+ * 是否粉丝才可评论,0所有人可评论(默认),1粉丝才可评论
+ */
+ @SerializedName("only_fans_can_comment")
+ private Integer onlyFansCanComment;
+
+ /*
+ * ===== 上面的参数,就是草稿箱的内容的字段,为了后续扩展,单独写一份====
+ */
+
+ /**
+ * 草稿的临时链接
+ */
+ @SerializedName("url")
+ private String url;
+ /**
+ * 该图文是否被删除
+ */
+ @SerializedName("is_deleted")
+ private Boolean isDeleted;
+
+ public static WxMpFreePublishArticles fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishArticles.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishInfo.java
new file mode 100644
index 0000000000..79205aab98
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishInfo.java
@@ -0,0 +1,44 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 发布能力-通过 article_id 获取已发布文章.
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpFreePublishInfo implements ToJson, Serializable {
+ private static final long serialVersionUID = 3331288672996730705L;
+
+ /**
+ * 文章列表
+ */
+ @SerializedName("news_item")
+ private List newsItem;
+
+ public static WxMpFreePublishInfo fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishInfo.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishItem.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishItem.java
new file mode 100644
index 0000000000..f32b34a9ff
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishItem.java
@@ -0,0 +1,35 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 发布列表的一条记录
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@NoArgsConstructor
+@Data
+public class WxMpFreePublishItem implements Serializable {
+ private static final long serialVersionUID = -6435229818150835883L;
+
+ /**
+ * 成功发布的图文消息id
+ */
+ @SerializedName("article_id")
+ private String articleId;
+ /**
+ * 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS。
+ */
+ @SerializedName("content")
+ private WxMpFreePublishInfo content;
+
+ public static WxMpFreePublishItem fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishItem.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishList.java
new file mode 100644
index 0000000000..c0c2e2dfba
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishList.java
@@ -0,0 +1,41 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 发布能力-获取成功发布列表.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+public class WxMpFreePublishList implements Serializable {
+ private static final long serialVersionUID = 764054773431665250L;
+
+ /**
+ * 成功发布素材的总数
+ */
+ @SerializedName("total_count")
+ private Integer totalCount;
+
+ /**
+ * 本次调用获取的素材的数量
+ */
+ @SerializedName("item_count")
+ private Integer itemCount;
+
+ /**
+ * 所有成功发布列表
+ */
+ @SerializedName("item")
+ private List items;
+
+ public static WxMpFreePublishList fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishList.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishStatus.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishStatus.java
new file mode 100644
index 0000000000..5734123960
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishStatus.java
@@ -0,0 +1,56 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 发布能力-发布状态轮询接口,通过publishId返回 article_id(删除发布时需要用到).
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpFreePublishStatus implements ToJson, Serializable {
+
+ private static final long serialVersionUID = -7526369389476785732L;
+ private String publish_id;
+ private Integer publish_status;
+ private String article_id;
+ private ArticleDetail article_detail;
+ private List fail_idx;
+
+ public static WxMpFreePublishStatus fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishStatus.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+ @NoArgsConstructor
+ @Data
+ public static class ArticleDetail {
+ private Integer count;
+ private List- item;
+
+ @NoArgsConstructor
+ @Data
+ public static class Item {
+ private Integer idx;
+ private String article_url;
+ }
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
index 8f6cfeea4c..6ecf757549 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
@@ -5,7 +5,10 @@
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.config.WxMpHostConfig;
-import static me.chanjar.weixin.mp.config.WxMpHostConfig.*;
+import static me.chanjar.weixin.mp.config.WxMpHostConfig.API_DEFAULT_HOST_URL;
+import static me.chanjar.weixin.mp.config.WxMpHostConfig.MP_DEFAULT_HOST_URL;
+import static me.chanjar.weixin.mp.config.WxMpHostConfig.OPEN_DEFAULT_HOST_URL;
+import static me.chanjar.weixin.mp.config.WxMpHostConfig.buildUrl;
/**
*
@@ -1374,6 +1377,90 @@ enum Guide implements WxMpApiUrl {
;
+ private final String prefix;
+ private final String path;
+
+ }
+
+ /**
+ * 草稿箱 能力:
+ * 新建草稿
+ * 获取草稿
+ * 删除草稿
+ * 修改草稿
+ * 获取草稿总数
+ * 获取草稿列表
+ * MP端开关(仅内测期间使用)- 上线后废弃,没实现,可以自己去公众号后台开启草稿箱
+ */
+ @AllArgsConstructor
+ @Getter
+ enum Draft implements WxMpApiUrl {
+
+ /**
+ * 新建草稿
+ */
+ ADD_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/add"),
+ /**
+ * 修改草稿
+ */
+ UPDATE_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/update"),
+ /**
+ * 获取草稿
+ */
+ GET_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/get"),
+ /**
+ * 删除草稿
+ */
+ DEL_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/delete"),
+ /**
+ * 获取草稿列表
+ */
+ LIST_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/batchget"),
+ /**
+ * 获取草稿总数
+ */
+ COUNT_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/count");
+
+ private final String prefix;
+ private final String path;
+
+ }
+
+ /**
+ * 发布能力:
+ * 发布接口
+ * 发布状态轮询接口
+ * 事件推送发布结果 -- 是回调,没实现
+ * 删除发布
+ * 通过 article_id 获取已发布文章
+ * 获取成功发布列表
+ */
+ @AllArgsConstructor
+ @Getter
+ enum FreePublish implements WxMpApiUrl {
+
+ /**
+ * 发布接口
+ */
+ SUBMIT(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/submit"),
+ /**
+ * 通过 article_id 获取已发布文章
+ */
+ GET_ARTICLE(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/getarticle"),
+ /**
+ * 发布状态轮询接口
+ */
+ GET_PUSH_STATUS(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/get"),
+ /**
+ * 删除发布
+ */
+ DEL_PUSH(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/delete"),
+ /**
+ * 获取成功发布列表
+ */
+ BATCH_GET(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/batchget")
+ ;
+
private final String prefix;
private final String path;
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImplTest.java
new file mode 100644
index 0000000000..193580a9f1
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImplTest.java
@@ -0,0 +1,127 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.test.ApiTestModule;
+import me.chanjar.weixin.mp.bean.draft.WxMpAddDraft;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftArticles;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftInfo;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftList;
+import me.chanjar.weixin.mp.bean.draft.WxMpUpdateDraft;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * 草稿箱单元测试.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Guice(modules = ApiTestModule.class)
+public class WxMpDraftServiceImplTest {
+
+ /**
+ * 1.先上传一个永久图片素材:me.chanjar.weixin.mp.api.impl.WxMpMaterialServiceImplTest.testUploadMaterial
+ * 2.后续图文需要设置一个永久素材id
+ */
+ final String thumbMediaId = "zUUtT8ZYeXzZ4slFbtnAkh7Yd-f45DbFoF9ERzVC6s4";
+
+ /**
+ * 新增草稿后返回的id,后续查询、修改、删除,获取等需要使用
+ */
+ final String mediaId = "zUUtT8ZYeXzZ4slFbtnAkpgGKyqnTsjtUvMdVBRWJVk";
+
+ @Inject
+ protected WxMpService wxService;
+
+ @Test
+ public void testAddDraft() throws WxErrorException {
+ // {"mediaId":"zUUtT8ZYeXzZ4slFbtnAkh7Yd-f45DbFoF9ERzVC6s4","url":"http://mmbiz.qpic.cn/mmbiz_jpg/fLtyChQRfH84IyicNUbGt3l3IlHxJRibSFz7Tky0ibmzKykzVbo9tZGYhXQGJ2npFtDPbvPhKYxBz6JxkYIibTmUicQ/0?wx_fmt=jpeg"}
+ this.wxService.getDraftService().addDraft("标题", "图文消息的具体内容", thumbMediaId);
+ // 【响应数据】:{"media_id":"zUUtT8ZYeXzZ4slFbtnAks-nZeGiPQmwvhShTh72CqM","item":[]}
+ }
+
+ @Test
+ public void testAddGuide_another() throws WxErrorException {
+ List draftArticleList = new ArrayList<>();
+ WxMpDraftArticles draftArticle = WxMpDraftArticles.builder()
+ .title("新建草稿-对象形式")
+ .author("dragon")
+ .digest("图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空")
+ .content("图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS")
+ .contentSourceUrl("https://github.com/Wechat-Group/WxJava")
+ .thumbMediaId(thumbMediaId)
+ // 显示封面、打开评论、所有人可评论
+ .showCoverPic(1).needOpenComment(1).onlyFansCanComment(0)
+ .build();
+ draftArticleList.add(draftArticle);
+
+ WxMpAddDraft addDraft = WxMpAddDraft.builder().articles(draftArticleList).build();
+ String mediaId = this.wxService.getDraftService().addDraft(addDraft);
+ // 【响应数据】:{"media_id":"zUUtT8ZYeXzZ4slFbtnAkpgGKyqnTsjtUvMdVBRWJVk","item":[]}
+ assertThat(mediaId).isNotNull();
+ }
+
+ @Test
+ public void testGetDraft() throws WxErrorException {
+ final WxMpDraftInfo draftInfo = this.wxService.getDraftService().getDraft(mediaId);
+ assertThat(draftInfo).isNotNull();
+ // 【响应数据】:{"news_item":[{"title":"标题","author":"","digest":"图文消息的具体内容","content":"图文消息的具体内容","content_source_url":"","thumb_media_id":"zUUtT8ZYeXzZ4slFbtnAkh7Yd-f45DbFoF9ERzVC6s4","show_cover_pic":1,"url":"http:\/\/mp.weixin.qq.com\/s?__biz=Mzk0OTI5MzM1OQ==&mid=100000006&idx=1&sn=89903965ae5ebd6014903c7c5ca34daa&chksm=435bd946742c5050d18da32289904db5ede8bbd157d181438231a1762b85030419b3c0ed4c00#rd","thumb_url":"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/fLtyChQRfH84IyicNUbGt3l3IlHxJRibSFz7Tky0ibmzKykzVbo9tZGYhXQGJ2npFtDPbvPhKYxBz6JxkYIibTmUicQ\/0?wx_fmt=jpeg","need_open_comment":0,"only_fans_can_comment":0}],"create_time":1634886802,"update_time":1634886802}
+ }
+
+ @Test
+ public void testUpdateDraft() throws WxErrorException {
+ WxMpDraftArticles draftArticles = WxMpDraftArticles.builder()
+ .title("新标题").content("新图文消息的具体内容").thumbMediaId(thumbMediaId).build();
+ WxMpUpdateDraft updateDraft = WxMpUpdateDraft.builder()
+ .mediaId(mediaId)
+ .index(0)
+ .articles(draftArticles)
+ .build();
+ Boolean updateDraftResult = this.wxService.getDraftService().updateDraft(updateDraft);
+ // assertThat(updateDraftResult).isTrue();
+ assertThat(updateDraftResult).isTrue();
+ }
+
+ @Test
+ public void testDelDraft() throws WxErrorException {
+ Boolean delDraftResult = this.wxService.getDraftService().delDraft(mediaId);
+ // 【响应数据】:{"errcode":0,"errmsg":"ok"}
+ assertThat(delDraftResult).isTrue();
+ }
+
+ @Test
+ public void testListDraft() throws WxErrorException {
+ WxMpDraftList draftList = this.wxService.getDraftService().listDraft(0, 10);
+ /*
+ 【响应数据】:{"item":[{"media_id":"zUUtT8ZYeXzZ4slFbtnAks-nZeGiPQmwvhShTh72CqM",
+ "content":{
+ "news_item":
+ [
+ {"title":"标题","author":"","digest":"图文消息的具体内容","content":"图文消息的具体内容",
+ "content_source_url":"","thumb_media_id":"zUUtT8ZYeXzZ4slFbtnAkh7Yd-f45DbFoF9ERzVC6s4",
+ "show_cover_pic":1,"url":"http:\/\/mp.weixin.qq.com\/s?__biz=Mzk0OTI5MzM1?wx_fmt=jpeg",
+ "need_open_comment":0,"only_fans_can_comment":0}],
+ "create_time":1634886802,"update_time":1634886802},"update_time":1634886802}
+ ]
+ ,"total_count":1,"item_count":1}
+
+ */
+ assertThat(draftList).isNotNull();
+ }
+
+ @Test
+ public void testCountDraft() throws WxErrorException {
+ Long countDraft = this.wxService.getDraftService().countDraft();
+ // 【响应数据】:{"total_count":1}
+ assertThat(countDraft).isNotNull();
+ }
+
+}
+
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImplTest.java
new file mode 100644
index 0000000000..ff5cd0e5d3
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImplTest.java
@@ -0,0 +1,109 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.test.ApiTestModule;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishInfo;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishList;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishStatus;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * 发布能力-单元测试.
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@Guice(modules = ApiTestModule.class)
+public class WxMpFreePublishServiceImplTest {
+
+ /**
+ * 新增草稿后返回的id,发布需要使用
+ */
+ final String mediaId = "HKVdzjkDfooMqBqJtvSs2EEeRAJaM33gJgkii_JDOHg";
+
+ /**
+ * 发布后的id,后续查询等需要使用
+ */
+ final String publishId = "2650177669";
+
+ /**
+ * 图文的 article_id,后续查询图文详情、删除发布内容 需要使用
+ * 要根据 publishId 来获取 article_id
+ *
+ * @see this.testGetPushStatus
+ */
+ final String articleId = "zjMKVd1g66BkEkpetwml4ElbDdniE8JeI2Ec324Sjqg";
+
+ @Inject
+ protected WxMpService wxService;
+
+ @Test
+ public void testSubmit() throws WxErrorException {
+ String submit = this.wxService.getFreePublishService().submit(mediaId);
+ assertThat(submit).isNotBlank();
+ // 【响应数据】:{"errcode":0,"errmsg":"ok","publish_id":2650177668}
+ }
+
+ @Test
+ public void testGetPushStatus() throws WxErrorException {
+ WxMpFreePublishStatus pushStatus = this.wxService.getFreePublishService().getPushStatus(publishId);
+ assertThat(pushStatus).isNotNull();
+ // 【响应数据】:{"publish_id":2650177668,"publish_status":0,"article_id":"zjMKVd1g66BkEkpetwml4J-4gNf4I1nsh-B-r_inemw",
+ // "article_detail":{"count":1,"item":
+ // [{"idx":1,"article_url":
+ // "https://mp.weixin.qq.com/s?__biz=MzAwMTE2MzA1xxxxxxxxxx"
+ // }]},"fail_idx":[]}
+ // article_url -> 已发布内容可被自定义菜单、自动回复、话题引用,也可用于公开传播
+ }
+
+ @Test
+ public void testGetArticleFromId() throws WxErrorException {
+ WxMpFreePublishInfo articleFromId = this.wxService.getFreePublishService().getArticleFromId(articleId);
+ assertThat(articleFromId).isNotNull();
+ /* 【响应数据】:{"news_item":[{"title":"欢迎你加入啊~ 这是我的第一条文字消息草稿","author":"","digest":"","content":"欢迎你加入啊~ 这是我的第一条文字消息草稿",
+ "content_source_url":"","thumb_media_id":"","show_cover_pic":0,"url":"http:\/\/mp.weixin.qq
+ .com\/s?__biz=MzAwMTE2MzA1Mg==&mid=2650177668","thumb_url":"","need_open_comment":1,"only_fans_can_comment":1,"is_deleted":false}],
+ "create_time":1634961670,"update_time":1634961672}
+ */
+ }
+
+ @Test
+ public void testDelPush() throws WxErrorException {
+ Boolean deletePush = this.wxService.getFreePublishService().deletePush(articleId, 0);
+ // 【响应数据】:{"errcode":0,"errmsg":"ok"}
+ assertThat(deletePush).isTrue();
+ }
+
+ @Test
+ public void testDeletePushAllArticle() throws WxErrorException {
+ Boolean deletePush = this.wxService.getFreePublishService().deletePushAllArticle(articleId);
+ // 【响应数据】:{"errcode":0,"errmsg":"ok"}
+ assertThat(deletePush).isTrue();
+ }
+
+ @Test
+ public void testGetPublicationRecords() throws WxErrorException {
+ WxMpFreePublishList publicationRecords = this.wxService.getFreePublishService().getPublicationRecords(0, 10, 0);
+ /*
+ 【响应数据】:
+ {"item":[{"article_id":"zjMKVd1g66BkEkpetwml4BOSzatuEYNY3TFhCc0kSIE","content":{"news_item":[
+ {"title":"新建草稿-对象形式","author":"dragon","digest":"图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空",
+ "content":"图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS",
+ "content_source_url":"https:\/\/github.com\/Wechat-Group\/WxJava","thumb_media_id":"HKVdzjkDfooMqBqJtvSs2Ajz2v6L_vtGhyyr_mqKcPU",
+ "show_cover_pic":1,"url":"http:\/\/mp.weixin.qq.com\/s?__biz=MzAwMTE2MzA1Mg==&mid=26501776710e5adb91#rd",
+ "thumb_url":"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/0QSAUfroWrUmxHthQ\/0?wx_fmt=jpeg",
+ "need_open_comment":1,"only_fans_can_comment":0,"is_deleted":false}],
+ "create_time":1634976306,"update_time":1634976318}}
+ ]
+ ,"total_count":1,"item_count":1}
+ */
+ assertThat(publicationRecords).isNotNull();
+ }
+
+}
+
From a2042dd7c285e28c8da8080b67d9d630e7f3754c Mon Sep 17 00:00:00 2001
From: tt <30398051+zhentang3@users.noreply.github.com>
Date: Sat, 23 Oct 2021 23:25:58 +0800
Subject: [PATCH 0123/1235] =?UTF-8?q?:art:=20#2354=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91urlscheme=E5=A2=9E=E5=8A=A0=E8=A6=81?=
=?UTF-8?q?=E6=89=93=E5=BC=80=E7=9A=84=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=89=88?=
=?UTF-8?q?=E6=9C=AC=E5=AD=97=E6=AE=B5=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=80=BC?=
=?UTF-8?q?=E6=AD=A3=E5=BC=8F=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java
index 799a7390a6..80c5f90347 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java
@@ -39,6 +39,12 @@ public class WxMaGenerateSchemeRequest {
@SerializedName("expire_time")
private Long expireTime;
+ /**
+ * 要打开的小程序版本。正式版为"release",体验版为"trial",开发版为"develop"默认值:release
+ */
+ @SerializedName("env_version")
+ private String envVersion = "release";
+
@Data
@Builder(builderMethodName = "newBuilder")
public static class JumpWxa {
From 44e4ee44160e1a85723c0c93e0ad107ff1286892 Mon Sep 17 00:00:00 2001
From: Kyle Scully
Date: Sat, 23 Oct 2021 08:26:45 -0700
Subject: [PATCH 0124/1235] :art: modifier order
---
.../weixin/common/util/http/WxDnsResolver.java | 2 +-
.../cp/config/impl/WxCpRedissonConfigImpl.java | 8 ++++----
.../config/impl/WxMaRedissonConfigImpl.java | 8 ++++----
.../wx/miniapp/util/WxMaConfigHolder.java | 2 +-
.../weixin/mp/util/WxMpConfigStorageHolder.java | 2 +-
.../impl/AbstractWxOpenInRedisConfigStorage.java | 14 +++++++-------
.../wxpay/bean/request/BaseWxPayRequest.java | 2 +-
.../qidian/util/WxQidianConfigStorageHolder.java | 2 +-
8 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
index d0321af097..ff0977e8d8 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
@@ -18,7 +18,7 @@
*/
public class WxDnsResolver implements DnsResolver {
- private final static String WECHAT_API_URL = "api.weixin.qq.com";
+ private static final String WECHAT_API_URL = "api.weixin.qq.com";
private static Map MAPPINGS = new HashMap<>();
protected final Logger log = LoggerFactory.getLogger(WxDnsResolver.class);
private String wxApiIp;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedissonConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedissonConfigImpl.java
index 61894b7599..a449348ad7 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedissonConfigImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedissonConfigImpl.java
@@ -20,19 +20,19 @@ public class WxCpRedissonConfigImpl extends WxCpDefaultConfigImpl {
/**
* The constant LOCK_KEY.
*/
- protected final static String LOCK_KEY = "wechat_cp_lock:";
+ protected static final String LOCK_KEY = "wechat_cp_lock:";
/**
* The constant CP_ACCESS_TOKEN_KEY.
*/
- protected final static String CP_ACCESS_TOKEN_KEY = "wechat_cp_access_token_key:";
+ protected static final String CP_ACCESS_TOKEN_KEY = "wechat_cp_access_token_key:";
/**
* The constant CP_JSAPI_TICKET_KEY.
*/
- protected final static String CP_JSAPI_TICKET_KEY = "wechat_cp_jsapi_ticket_key:";
+ protected static final String CP_JSAPI_TICKET_KEY = "wechat_cp_jsapi_ticket_key:";
/**
* The constant CP_AGENT_JSAPI_TICKET_KEY.
*/
- protected final static String CP_AGENT_JSAPI_TICKET_KEY = "wechat_cp_agent_jsapi_ticket_key:";
+ protected static final String CP_AGENT_JSAPI_TICKET_KEY = "wechat_cp_agent_jsapi_ticket_key:";
private final WxRedisOps redisOps;
/**
* redis 存储的 key 的前缀,可为空
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java
index c45ad50946..b2d115fd26 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java
@@ -18,10 +18,10 @@
*/
public class WxMaRedissonConfigImpl extends WxMaDefaultConfigImpl {
- protected final static String LOCK_KEY = "wechat_ma_lock:";
- protected final static String MA_ACCESS_TOKEN_KEY = "wechat_ma_access_token_key:";
- protected final static String MA_JSAPI_TICKET_KEY = "wechat_ma_jsapi_ticket_key:";
- protected final static String MA_CARD_API_TICKET_KEY = "wechat_ma_card_api_ticket_key:";
+ protected static final String LOCK_KEY = "wechat_ma_lock:";
+ protected static final String MA_ACCESS_TOKEN_KEY = "wechat_ma_access_token_key:";
+ protected static final String MA_JSAPI_TICKET_KEY = "wechat_ma_jsapi_ticket_key:";
+ protected static final String MA_CARD_API_TICKET_KEY = "wechat_ma_card_api_ticket_key:";
/**
* redis 存储的 key 的前缀,可为空
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java
index e73cb2282d..f99e9616d8 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java
@@ -7,7 +7,7 @@
* @date 2020-08-16
*/
public class WxMaConfigHolder {
- private final static ThreadLocal THREAD_LOCAL = new ThreadLocal() {
+ private static final ThreadLocal THREAD_LOCAL = new ThreadLocal() {
@Override
protected String initialValue() {
return "default";
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java
index e844c4866b..bb3d8eb43c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java
@@ -5,7 +5,7 @@
* @date 2019-03-20 22:06
*/
public class WxMpConfigStorageHolder {
- private final static ThreadLocal THREAD_LOCAL = new ThreadLocal() {
+ private static final ThreadLocal THREAD_LOCAL = new ThreadLocal() {
@Override
protected String initialValue() {
return "default";
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java
index 52799da57c..5f21a94af3 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java
@@ -8,16 +8,16 @@
* @date 2020/01/09
**/
public abstract class AbstractWxOpenInRedisConfigStorage extends WxOpenInMemoryConfigStorage {
- protected final static String COMPONENT_VERIFY_TICKET_KEY = "wechat_component_verify_ticket:";
- protected final static String COMPONENT_ACCESS_TOKEN_KEY = "wechat_component_access_token:";
+ protected static final String COMPONENT_VERIFY_TICKET_KEY = "wechat_component_verify_ticket:";
+ protected static final String COMPONENT_ACCESS_TOKEN_KEY = "wechat_component_access_token:";
- protected final static String AUTHORIZER_REFRESH_TOKEN_KEY = "wechat_authorizer_refresh_token:";
- protected final static String AUTHORIZER_ACCESS_TOKEN_KEY = "wechat_authorizer_access_token:";
+ protected static final String AUTHORIZER_REFRESH_TOKEN_KEY = "wechat_authorizer_refresh_token:";
+ protected static final String AUTHORIZER_ACCESS_TOKEN_KEY = "wechat_authorizer_access_token:";
- protected final static String LOCK_KEY = "wechat_lock:";
+ protected static final String LOCK_KEY = "wechat_lock:";
- protected final static String JSAPI_TICKET_KEY = "wechat_jsapi_ticket:";
- protected final static String CARD_API_TICKET_KEY = "wechat_card_api_ticket:";
+ protected static final String JSAPI_TICKET_KEY = "wechat_jsapi_ticket:";
+ protected static final String CARD_API_TICKET_KEY = "wechat_card_api_ticket:";
/**
* redis 存储的 key 的前缀,可为空
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java
index 394bc8969b..fde7f7150f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java
@@ -322,7 +322,7 @@ public Map getSignParams() {
*
* @param map 传入的属性Map
*/
- abstract protected void storeMap(Map map);
+ protected abstract void storeMap(Map map);
/**
*
diff --git a/weixin-java-qidian/src/main/java/me/chanjar/weixin/qidian/util/WxQidianConfigStorageHolder.java b/weixin-java-qidian/src/main/java/me/chanjar/weixin/qidian/util/WxQidianConfigStorageHolder.java
index 1177ce4ac6..9ce4366b99 100644
--- a/weixin-java-qidian/src/main/java/me/chanjar/weixin/qidian/util/WxQidianConfigStorageHolder.java
+++ b/weixin-java-qidian/src/main/java/me/chanjar/weixin/qidian/util/WxQidianConfigStorageHolder.java
@@ -5,7 +5,7 @@
* @date 2020年12月26日
*/
public class WxQidianConfigStorageHolder {
- private final static ThreadLocal THREAD_LOCAL = new ThreadLocal() {
+ private static final ThreadLocal THREAD_LOCAL = new ThreadLocal() {
@Override
protected String initialValue() {
return "default";
From 3039dd018e3faa11230a44f842b43db9b3fabbda Mon Sep 17 00:00:00 2001
From: Kyle Scully
Date: Sat, 23 Oct 2021 08:27:14 -0700
Subject: [PATCH 0125/1235] :art: Use explicit types on lambda arguments
---
.../common/util/http/apache/ApacheHttpDnsClientBuilder.java | 2 +-
.../chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java | 2 +-
.../test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java | 6 +++---
.../binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java | 2 +-
.../chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java | 2 +-
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
index af3a32ff71..698eb47bb9 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
@@ -48,7 +48,7 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
private DnsResolver dnsResover;
- private HttpRequestRetryHandler httpRequestRetryHandler = (exception, executionCount, context) -> false;
+ private HttpRequestRetryHandler httpRequestRetryHandler = (IOException exception, int executionCount, HttpContext context) -> false;
private SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactory.getSocketFactory();
private PlainConnectionSocketFactory plainConnectionSocketFactory = PlainConnectionSocketFactory.getSocketFactory();
private String httpProxyHost;
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
index 739470a2d7..2e91aacbf4 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
@@ -92,7 +92,7 @@ public WxCpConfigStorage getWxCpConfigStorage() {
RequestExecutor